1/*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25#include "test.h"
26__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tar.c 201247 2009-12-30 05:59:21Z kientzle $");
27
28/*
29 * Each of these archives is a short archive with a single entry.  The
30 * corresponding verify function verifies the entry structure returned
31 * from libarchive is what it should be.  The support functions pad with
32 * lots of zeros, so we can trim trailing zero bytes from each hardcoded
33 * archive to save space.
34 *
35 * The naming here follows the tar file type flags.  E.g. '1' is a hardlink,
36 * '2' is a symlink, '5' is a dir, etc.
37 */
38
39/* Empty archive. */
40static unsigned char archiveEmpty[] = {
41	/* 512 zero bytes */
42	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
43	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
44	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
45	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
46
47	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
48	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
49	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
50	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
51
52	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
53	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
54	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
55	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
56
57	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
58	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
59	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
60	0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
61};
62
63static void verifyEmpty(void)
64{
65	struct archive_entry *ae;
66	struct archive *a;
67
68	assert((a = archive_read_new()) != NULL);
69	assertA(0 == archive_read_support_compression_all(a));
70	assertA(0 == archive_read_support_format_all(a));
71	assertA(0 == archive_read_open_memory(a, archiveEmpty, 512));
72	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
73	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE);
74	assertEqualString(archive_compression_name(a), "none");
75	failure("512 zero bytes should be recognized as a tar archive.");
76	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR);
77
78	assert(0 == archive_read_close(a));
79#if ARCHIVE_VERSION_NUMBER < 2000000
80	archive_read_finish(a);
81#else
82	assert(0 == archive_read_finish(a));
83#endif
84}
85
86/* Single entry with a hardlink. */
87static unsigned char archive1[] = {
88'h','a','r','d','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0',
91'0','6','4','4',' ',0,'0','0','1','7','5','0',' ',0,'0','0','1','7','5','0',
92' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4','6',
93'0','5','2','6','6','2',' ','0','1','3','0','5','7',0,' ','1','f','i','l',
94'e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,'0',
97'0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
98't','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0',
99'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' '};
100
101static void verify1(struct archive_entry *ae)
102{
103	/* A hardlink is not a symlink. */
104	assert(archive_entry_filetype(ae) != AE_IFLNK);
105	/* Nor is it a directory. */
106	assert(archive_entry_filetype(ae) != AE_IFDIR);
107	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
108	assertEqualInt(archive_entry_uid(ae), 1000);
109	assertEqualInt(archive_entry_gid(ae), 1000);
110	assertEqualString(archive_entry_uname(ae), "tim");
111	assertEqualString(archive_entry_gname(ae), "tim");
112	assertEqualString(archive_entry_pathname(ae), "hardlink");
113	assertEqualString(archive_entry_hardlink(ae), "file");
114	assert(archive_entry_symlink(ae) == NULL);
115	assertEqualInt(archive_entry_mtime(ae), 1184388530);
116}
117
118/* Verify that symlinks are read correctly. */
119static unsigned char archive2[] = {
120's','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0',
123'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7',
124'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4',
125'6','0','5','4','1','0','1',' ','0','0','1','3','3','2','3',' ','2','f','i',
126'l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
129'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1300,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
131'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '};
132
133static void verify2(struct archive_entry *ae)
134{
135	assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
136	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
137	assertEqualInt(archive_entry_uid(ae), 1000);
138	assertEqualInt(archive_entry_gid(ae), 1000);
139	assertEqualString(archive_entry_uname(ae), "tim");
140	assertEqualString(archive_entry_gname(ae), "tim");
141	assertEqualString(archive_entry_pathname(ae), "symlink");
142	assertEqualString(archive_entry_symlink(ae), "file");
143	assert(archive_entry_hardlink(ae) == NULL);
144	assertEqualInt(archive_entry_mtime(ae), 1184389185);
145}
146
147/* Character device node. */
148static unsigned char archive3[] = {
149'd','e','v','c','h','a','r',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0',
152'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7',
153'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4',
154'6','0','5','4','1','0','1',' ','0','0','1','2','4','1','2',' ','3',0,0,
1550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
158'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1590,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '};
161
162static void verify3(struct archive_entry *ae)
163{
164	assertEqualInt(archive_entry_filetype(ae), AE_IFCHR);
165	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
166	assertEqualInt(archive_entry_uid(ae), 1000);
167	assertEqualInt(archive_entry_gid(ae), 1000);
168	assertEqualString(archive_entry_uname(ae), "tim");
169	assertEqualString(archive_entry_gname(ae), "tim");
170	assertEqualString(archive_entry_pathname(ae), "devchar");
171	assert(archive_entry_symlink(ae) == NULL);
172	assert(archive_entry_hardlink(ae) == NULL);
173	assertEqualInt(archive_entry_mtime(ae), 1184389185);
174}
175
176/* Block device node. */
177static unsigned char archive4[] = {
178'd','e','v','b','l','o','c','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1790,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0',
181'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7',
182'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4',
183'6','0','5','4','1','0','1',' ','0','0','1','2','5','7','0',' ','4',0,0,
1840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
187'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1880,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '};
190
191static void verify4(struct archive_entry *ae)
192{
193	assertEqualInt(archive_entry_filetype(ae), AE_IFBLK);
194	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
195	assertEqualInt(archive_entry_uid(ae), 1000);
196	assertEqualInt(archive_entry_gid(ae), 1000);
197	assertEqualString(archive_entry_uname(ae), "tim");
198	assertEqualString(archive_entry_gname(ae), "tim");
199	assertEqualString(archive_entry_pathname(ae), "devblock");
200	assert(archive_entry_symlink(ae) == NULL);
201	assert(archive_entry_hardlink(ae) == NULL);
202	assertEqualInt(archive_entry_mtime(ae), 1184389185);
203}
204
205/* Directory. */
206static unsigned char archive5[] = {
207'.',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0',
210'7','5','5',' ',0,'0','0','1','7','5','0',' ',0,'0','0','1','7','5','0',
211' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','1','0','3','3',
212'4','0','4','1','7','3','6',' ','0','1','0','5','6','1',0,' ','5',0,0,0,
2130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
216'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2170,0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2180,0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0',' '};
219
220static void verify5(struct archive_entry *ae)
221{
222	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
223	assertEqualInt(archive_entry_mtime(ae), 1131430878);
224	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
225	assertEqualInt(archive_entry_uid(ae), 1000);
226	assertEqualInt(archive_entry_gid(ae), 1000);
227	assertEqualString(archive_entry_uname(ae), "tim");
228	assertEqualString(archive_entry_gname(ae), "tim");
229}
230
231/* fifo */
232static unsigned char archive6[] = {
233'f','i','f','o',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0',
236'0','0','7','5','5',' ','0','0','0','1','7','5','0',' ','0','0','0','1','7',
237'5','0',' ','0','0','0','0','0','0','0','0','0','0','0',' ','1','0','6','4',
238'6','0','5','4','1','0','1',' ','0','0','1','1','7','2','4',' ','6',0,0,
2390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
242'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2430,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
244'0','0','0','0','0','0','0',' ','0','0','0','0','0','0','0',' '};
245
246static void verify6(struct archive_entry *ae)
247{
248	assertEqualInt(archive_entry_filetype(ae), AE_IFIFO);
249	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
250	assertEqualInt(archive_entry_uid(ae), 1000);
251	assertEqualInt(archive_entry_gid(ae), 1000);
252	assertEqualString(archive_entry_uname(ae), "tim");
253	assertEqualString(archive_entry_gname(ae), "tim");
254	assertEqualString(archive_entry_pathname(ae), "fifo");
255	assert(archive_entry_symlink(ae) == NULL);
256	assert(archive_entry_hardlink(ae) == NULL);
257	assertEqualInt(archive_entry_mtime(ae), 1184389185);
258}
259
260/* GNU long link name */
261static unsigned char archiveK[] = {
262'.','/','.','/','@','L','o','n','g','L','i','n','k',0,0,0,0,0,0,0,0,0,0,0,
2630,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2650,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0',0,'0','0','0',
266'0','0','0','0',0,'0','0','0','0','0','0','0','0','6','6','6',0,'0','0','0',
267'0','0','0','0','0','0','0','0',0,'0','1','1','7','1','5',0,' ','K',0,0,0,
2680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2690,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2700,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',' ',' ',
2710,'r','o','o','t',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
272'w','h','e','e','l',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2730,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'t',
278'h','i','s','_','i','s','_','a','_','v','e','r','y','_','l','o','n','g','_',
279's','y','m','l','i','n','k','_','b','o','d','y','_','a','b','c','d','e','f',
280'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y',
281'z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
282'r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i',
283'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a',
284'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
285'u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l',
286'm','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d',
287'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w',
288'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
289'p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g',
290'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
291'_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',
292's','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j',
293'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b',
294'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u',
295'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m',
296'n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e',
297'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
298'y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
299'q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h',
300'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',0,
3010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
303's','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','1',
306'2','0','7','5','5',0,'0','0','0','1','7','5','0',0,'0','0','0','1','7','5',
307'0',0,'0','0','0','0','0','0','0','0','0','0','0',0,'1','0','6','4','6','0',
308'5','6','7','7','0',0,'0','3','5','4','4','7',0,' ','2','t','h','i','s','_',
309'i','s','_','a','_','v','e','r','y','_','l','o','n','g','_','s','y','m','l',
310'i','n','k','_','b','o','d','y','_','a','b','c','d','e','f','g','h','i','j',
311'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b',
312'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u',
313'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l',0,
314'u','s','t','a','r',' ',' ',0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3150,0,0,0,0,0,0,0,0,0,0,0,0,'t','i','m'};
316
317static void verifyK(struct archive_entry *ae)
318{
319	assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
320	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
321	assertEqualInt(archive_entry_uid(ae), 1000);
322	assertEqualInt(archive_entry_gid(ae), 1000);
323	assertEqualString(archive_entry_uname(ae), "tim");
324	assertEqualString(archive_entry_gname(ae), "tim");
325	assertEqualString(archive_entry_pathname(ae), "symlink");
326	assertEqualString(archive_entry_symlink(ae),
327	    "this_is_a_very_long_symlink_body_abcdefghijklmnopqrstuvwxyz_"
328	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
329	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
330	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
331	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
332	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
333	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
334	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz");
335	assert(archive_entry_hardlink(ae) == NULL);
336	assertEqualInt(archive_entry_mtime(ae), 1184390648);
337}
338
339/* TODO: GNU long name */
340
341/* TODO: Solaris ACL */
342
343/* Pax extended long link name */
344static unsigned char archivexL[] = {
345'.','/','P','a','x','H','e','a','d','e','r','s','.','8','6','9','7','5','/',
346's','y','m','l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3480,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0','0','6','4','4',0,'0','0','0','1',
349'7','5','0',0,'0','0','0','1','7','5','0',0,'0','0','0','0','0','0','0','0',
350'7','5','3',0,'1','0','6','4','6','0','5','7','6','1','1',0,'0','1','3','7',
351'1','4',0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u',
354's','t','a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3560,0,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0',0,0,0,0,0,
3570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3590,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'4','5','1',' ','l','i','n','k','p','a','t',
362'h','=','t','h','i','s','_','i','s','_','a','_','v','e','r','y','_','l','o',
363'n','g','_','s','y','m','l','i','n','k','_','b','o','d','y','_','a','b','c',
364'd','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
365'w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
366'o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f',
367'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y',
368'z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
369'r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i',
370'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a',
371'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
372'u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l',
373'm','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d',
374'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w',
375'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
376'p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g',
377'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
378'_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',
379's','t','u','v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j',
380'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b',
381'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u',
382'v','w','x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m',
383'n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d','e',
384'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
385'y','z',10,'2','0',' ','a','t','i','m','e','=','1','1','8','4','3','9','1',
386'0','2','5',10,'2','0',' ','c','t','i','m','e','=','1','1','8','4','3','9',
387'0','6','4','8',10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'s','y','m',
388'l','i','n','k',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0','0','7',
391'5','5',0,'0','0','0','1','7','5','0',0,'0','0','0','1','7','5','0',0,'0',
392'0','0','0','0','0','0','0','0','0','0',0,'1','0','6','4','6','0','5','6',
393'7','7','0',0,'0','3','7','1','2','1',0,' ','2','t','h','i','s','_','i','s',
394'_','a','_','v','e','r','y','_','l','o','n','g','_','s','y','m','l','i','n',
395'k','_','b','o','d','y','_','a','b','c','d','e','f','g','h','i','j','k','l',
396'm','n','o','p','q','r','s','t','u','v','w','x','y','z','_','a','b','c','d',
397'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w',
398'x','y','z','_','a','b','c','d','e','f','g','h','i','j','k','l','m','u','s',
399't','a','r',0,'0','0','t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4000,0,0,0,0,0,0,0,0,'t','i','m',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4010,0,0,0,0,0,0,'0','0','0','0','0','0','0',0,'0','0','0','0','0','0','0'};
402
403static void verifyxL(struct archive_entry *ae)
404{
405	assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
406	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
407	assertEqualInt(archive_entry_uid(ae), 1000);
408	assertEqualInt(archive_entry_gid(ae), 1000);
409	assertEqualString(archive_entry_uname(ae), "tim");
410	assertEqualString(archive_entry_gname(ae), "tim");
411	assertEqualString(archive_entry_pathname(ae), "symlink");
412	assertEqualString(archive_entry_symlink(ae),
413	    "this_is_a_very_long_symlink_body_abcdefghijklmnopqrstuvwxyz_"
414	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
415	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
416	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
417	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
418	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
419	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_"
420	    "abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz");
421	assert(archive_entry_hardlink(ae) == NULL);
422	assertEqualInt(archive_entry_mtime(ae), 1184390648);
423}
424
425
426/* TODO: Any other types of headers? */
427
428static void verify(unsigned char *d, size_t s,
429    void (*f)(struct archive_entry *),
430    int compression, int format)
431{
432	struct archive_entry *ae;
433	struct archive *a;
434	unsigned char *buff = malloc(100000);
435
436	memcpy(buff, d, s);
437	memset(buff + s, 0, 2048);
438
439	assert((a = archive_read_new()) != NULL);
440	assertA(0 == archive_read_support_compression_all(a));
441	assertA(0 == archive_read_support_format_all(a));
442	assertA(0 == archive_read_open_memory(a, buff, s + 1024));
443	assertA(0 == archive_read_next_header(a, &ae));
444	assertEqualInt(archive_compression(a), compression);
445	assertEqualInt(archive_format(a), format);
446
447	/* Verify the only entry. */
448	f(ae);
449
450	assert(0 == archive_read_close(a));
451#if ARCHIVE_VERSION_NUMBER < 2000000
452	archive_read_finish(a);
453#else
454	assert(0 == archive_read_finish(a));
455#endif
456	free(buff);
457}
458
459DEFINE_TEST(test_read_format_tar)
460{
461	verifyEmpty();
462	verify(archive1, sizeof(archive1), verify1,
463	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
464	verify(archive2, sizeof(archive2), verify2,
465	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
466	verify(archive3, sizeof(archive3), verify3,
467	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
468	verify(archive4, sizeof(archive4), verify4,
469	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
470	verify(archive5, sizeof(archive5), verify5,
471	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
472	verify(archive6, sizeof(archive6), verify6,
473	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_USTAR);
474	verify(archiveK, sizeof(archiveK), verifyK,
475	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_GNUTAR);
476	verify(archivexL, sizeof(archivexL), verifyxL,
477	    ARCHIVE_COMPRESSION_NONE, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE);
478}
479
480
481