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