1228753Smm/*-
2228753Smm * Copyright (c) 2003-2007 Tim Kientzle
3228753Smm * Copyright (c) 2009 Michihiro NAKAJIMA
4228753Smm * All rights reserved.
5228753Smm *
6228753Smm * Redistribution and use in source and binary forms, with or without
7228753Smm * modification, are permitted provided that the following conditions
8228753Smm * are met:
9228753Smm * 1. Redistributions of source code must retain the above copyright
10228753Smm *    notice, this list of conditions and the following disclaimer.
11228753Smm * 2. Redistributions in binary form must reproduce the above copyright
12228753Smm *    notice, this list of conditions and the following disclaimer in the
13228753Smm *    documentation and/or other materials provided with the distribution.
14228753Smm *
15228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25228753Smm */
26228753Smm#include "test.h"
27228753Smm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_read_format_xar.c 346105 2019-04-10 21:46:28Z mm $");
28228753Smm
29228753Smm#define UID	1001
30228753Smm#define UNAME	"cue"
31228753Smm#define GID	1001
32228753Smm#define GNAME	"cue"
33228753Smm
34228753Smm/* Verify that a file records with hardlink.
35228753Smm#How to make
36228753Smmecho "hellohellohello" > f1
37228753Smmchown $UNAME:$GNAME f1
38228753Smmchmod 0644 f1
39228753Smmln f1 hardlink
40228753Smmchown $UNAME:$GNAME hardlink
41228753Smmchmod 0644 hardlink
42228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1 hardlink
43228753Smmxar -cf archive1.xar f1 hardlink
44228753Smmod -t x1 archive1.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive1.xar.txt
45228753Smm*/
46228753Smmstatic unsigned char archive1[] = {
47228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc6,
48228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x70,0x00,0x00,0x00,0x01,0x78,0xda,0xc4,0x54,
49228753Smm0xc9,0x6e,0xdb,0x30,0x14,0xbc,0xe7,0x2b,0x08,0xdd,0x55,0xae,0xb6,0x45,0x83,0x56,
50228753Smm0xd0,0x4b,0xd1,0x7b,0xd3,0x4b,0x6f,0x34,0x17,0x89,0x88,0x36,0x48,0x54,0xe0,0xe4,
51228753Smm0xeb,0x4b,0x52,0x52,0x0c,0xa7,0x71,0x6f,0x45,0x01,0x01,0x1a,0x0e,0x87,0xa3,0xa7,
52228753Smm0xf7,0x06,0x14,0x8f,0x97,0xb6,0x01,0x2f,0x66,0x9c,0x5c,0xdf,0x9d,0x32,0xfc,0x05,
53228753Smm0x65,0xc0,0x74,0xaa,0xd7,0xae,0xab,0x4e,0xd9,0xcf,0xa7,0x6f,0x79,0x91,0x3d,0x96,
54228753Smm0x0f,0xe2,0x22,0xc7,0xf2,0x01,0x08,0xdf,0xab,0xf0,0x02,0x42,0x8d,0x46,0xfa,0x70,
55228753Smm0x22,0xf7,0xae,0x35,0x25,0x41,0x88,0xe7,0x98,0xe4,0x88,0x3c,0x61,0x7a,0xa4,0xe8,
56228753Smm0x48,0xb9,0x80,0xb7,0x92,0x74,0xa8,0x36,0xea,0x79,0x9a,0x5b,0x30,0xf9,0xd7,0xc6,
57228753Smm0x9c,0xb2,0xa9,0x96,0x38,0x8b,0x3b,0x40,0xf4,0xd6,0x4e,0xc6,0x97,0x48,0xc0,0x15,
58228753Smm0x25,0x76,0x72,0x6f,0xd1,0x5c,0xc0,0x04,0xa2,0x05,0xdc,0x3c,0xd2,0xca,0xba,0xc6,
59228753Smm0x00,0xa7,0x4f,0x19,0x59,0x6d,0xd4,0x9d,0x72,0xd8,0xaf,0x70,0x72,0xab,0x03,0x88,
60228753Smm0x36,0x41,0xcc,0x0f,0x28,0x47,0x38,0xca,0x10,0x3a,0xc6,0x07,0x07,0x59,0x7b,0x95,
61228753Smm0xc9,0x7b,0x3f,0x17,0x64,0xf2,0x2a,0xab,0xc6,0x7e,0x1e,0x4a,0x35,0x1b,0x01,0x17,
62228753Smm0xb8,0xb0,0x4e,0x97,0x18,0x21,0x1c,0xc8,0x80,0x12,0x35,0x4f,0x66,0x5c,0x74,0x09,
63228753Smm0x2d,0xdc,0xbb,0x6c,0xde,0x64,0x6d,0xaf,0x4d,0x89,0xf6,0x8c,0x85,0x62,0x22,0x4c,
64228753Smm0xa4,0x7f,0x1d,0x0c,0x68,0x5c,0xf7,0x1c,0x66,0x94,0x95,0xb5,0x1c,0x75,0x5c,0x08,
65228753Smm0x18,0xf9,0x45,0xd1,0xc9,0x50,0xd0,0x75,0x23,0x2d,0x53,0xcb,0x62,0x97,0x6e,0xdb,
66228753Smm0xb5,0x75,0x5d,0x4b,0x2f,0x13,0x02,0xa2,0x31,0x5d,0xe5,0xeb,0x92,0x50,0x01,0x57,
67228753Smm0xb8,0xf0,0xeb,0x38,0xc8,0xed,0x64,0xd6,0xd1,0xe0,0xfd,0x75,0x34,0x81,0xdb,0x72,
68228753Smm0xb3,0xcd,0x57,0x0e,0x43,0xe3,0x54,0x0a,0x01,0xbc,0xe4,0xd5,0x9b,0x1b,0x32,0xb8,
69228753Smm0x4a,0xe5,0xa8,0x6a,0xf7,0x62,0x74,0xfe,0x31,0x13,0x3f,0xbe,0x7f,0x0d,0xd5,0xd9,
70228753Smm0x82,0x52,0x4d,0xac,0x56,0x98,0x53,0xc6,0xa9,0x3c,0xb3,0x82,0x4b,0x2d,0x09,0xb5,
71228753Smm0x85,0x3d,0x70,0x6c,0xf7,0xc4,0x2a,0xba,0xe7,0x45,0x98,0xc3,0x47,0xa3,0xad,0x96,
72228753Smm0x8b,0x1f,0xa5,0xf2,0x77,0xbf,0xb0,0xd3,0x07,0x76,0x56,0x67,0x75,0xe0,0x9a,0x5a,
73228753Smm0x7e,0xb6,0x4c,0xda,0xe0,0xcd,0x8a,0xa2,0x40,0x86,0xed,0xc8,0x7e,0xc7,0xac,0x41,
74228753Smm0x8a,0x87,0x1c,0xff,0xe9,0xb4,0x34,0x0f,0xbe,0x77,0xef,0x9f,0xc4,0xee,0x73,0xd9,
75228753Smm0x7f,0x8c,0x5d,0x3f,0xba,0xca,0x75,0xb2,0xf9,0x4b,0xfa,0x2c,0xfe,0x24,0x77,0x41,
76228753Smm0x15,0x2f,0x0d,0x01,0xd3,0x15,0xf2,0x1b,0x00,0x00,0xff,0xff,0x03,0x00,0x88,0x32,
77228753Smm0x49,0x7b,0x67,0xbf,0xc6,0x01,0x29,0xf2,0x1c,0x40,0x05,0x3c,0x49,0x25,0x9f,0xab,
78228753Smm0x7c,0x8e,0xc5,0xa5,0x79,0xe0,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,0x80,0x13,
79228753Smm0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
80228753Smm};
81228753Smm
82228753Smmstatic void verify0(struct archive *a, struct archive_entry *ae)
83228753Smm{
84228753Smm	const void *p;
85228753Smm	size_t size;
86232153Smm	int64_t offset;
87228753Smm
88228753Smm	assert(archive_entry_filetype(ae) == AE_IFREG);
89228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
90228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
91228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
92228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
93228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
94228753Smm	assertEqualString(archive_entry_pathname(ae), "f1");
95228753Smm	assert(archive_entry_hardlink(ae) == NULL);
96228753Smm	assert(archive_entry_symlink(ae) == NULL);
97228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
98228753Smm	assertEqualInt(archive_entry_size(ae), 16);
99228753Smm	assertEqualInt(archive_read_data_block(a, &p, &size, &offset), 0);
100228753Smm	assertEqualInt((int)size, 16);
101228753Smm	assertEqualInt((int)offset, 0);
102232153Smm	assertEqualMem(p, "hellohellohello\n", 16);
103228753Smm}
104228753Smm
105228753Smmstatic void verify1(struct archive *a, struct archive_entry *ae)
106228753Smm{
107228753Smm	(void)a; /* UNUSED */
108228753Smm	/* A hardlink is not a symlink. */
109228753Smm	assert(archive_entry_filetype(ae) != AE_IFLNK);
110228753Smm	/* Nor is it a directory. */
111228753Smm	assert(archive_entry_filetype(ae) != AE_IFDIR);
112228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
113228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
114228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
115228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
116228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
117228753Smm	assertEqualString(archive_entry_pathname(ae), "hardlink");
118228753Smm	assertEqualString(archive_entry_hardlink(ae), "f1");
119228753Smm	assert(archive_entry_symlink(ae) == NULL);
120228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
121228753Smm	assertEqualInt(archive_entry_nlink(ae), 2);
122228753Smm}
123228753Smm
124228753Smm/* Verify that symlinks are read correctly.
125228753Smm#How to make
126228753Smmecho "hellohellohello" > f1
127228753Smmchown $UNAME:$GNAME f1
128228753Smmchmod 0644 f1
129228753Smmln -s f1 symlink
130228753Smmchown $UNAME:$GNAME symlink
131228753Smmchmod 0644 symlink
132228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1 symlink
133228753Smmxar -cf archive2.xar f1 symlink
134228753Smmod -t x1 archive2.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive2.xar.txt
135228753Smm*/
136228753Smmstatic unsigned char archive2[] = {
137228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe8,
138228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x84,0x00,0x00,0x00,0x01,0x78,0xda,0xb4,0x54,
139228753Smm0xcb,0x6e,0xa3,0x30,0x14,0xdd,0xf7,0x2b,0x90,0xf7,0x8c,0x1f,0x40,0x82,0x23,0xe3,
140228753Smm0xaa,0x9b,0x6a,0xf6,0xd3,0xd9,0xcc,0xce,0xf1,0x83,0x58,0xe5,0x25,0x70,0xaa,0xa4,
141228753Smm0x5f,0x3f,0xb6,0x09,0x4d,0xd3,0x30,0xdd,0x8d,0x84,0xc4,0xf5,0xf1,0xb9,0xc7,0x97,
142228753Smm0x7b,0x0f,0x66,0x8f,0xa7,0xb6,0x49,0xde,0xf4,0x38,0xd9,0xbe,0xab,0x00,0xfe,0x81,
143228753Smm0x40,0xa2,0x3b,0xd9,0x2b,0xdb,0xd5,0x15,0xf8,0xfd,0xf2,0x9c,0x96,0xe0,0x91,0x3f,
144228753Smm0xb0,0x93,0x18,0xf9,0x43,0xc2,0x5c,0x2f,0xfd,0x2b,0x61,0x72,0xd4,0xc2,0xf9,0x8c,
145228753Smm0xd4,0xd9,0x56,0x73,0x82,0x10,0x4d,0x31,0x49,0x11,0x79,0xc1,0xd9,0x2e,0x2b,0x76,
146228753Smm0xb8,0x60,0xf0,0x96,0x12,0x93,0x0e,0x5a,0xbe,0x4e,0xc7,0x36,0x99,0xdc,0xb9,0xd1,
147228753Smm0x15,0x98,0x0e,0x02,0x83,0xb0,0x93,0xb0,0xde,0x98,0x49,0x3b,0x8e,0x18,0xbc,0x44,
148228753Smm0x11,0x9d,0xec,0x7b,0x10,0x67,0x30,0x06,0x41,0x02,0x2e,0x1a,0x71,0x65,0x6c,0xa3,
149228753Smm0x13,0xab,0x2a,0x40,0x2e,0x32,0xf2,0xae,0x1c,0xb4,0xcb,0xd1,0x0e,0xd1,0x3f,0x3e,
150228753Smm0x73,0xa9,0x23,0x61,0xed,0x37,0xb4,0xf6,0x4a,0x13,0xdf,0xd0,0xc4,0x95,0x56,0x8f,
151228753Smm0xfd,0x71,0xe0,0xf2,0xa8,0x19,0x9c,0xc3,0x19,0xb5,0x8a,0x63,0x84,0xb0,0x07,0x7d,
152228753Smm0x14,0xa1,0xe3,0xa4,0xc7,0x99,0x17,0xa3,0x19,0xfb,0xa0,0x1d,0x17,0x5a,0xdb,0x2b,
153228753Smm0xcd,0xd1,0xb6,0xf0,0x3d,0x8c,0x61,0x04,0x1b,0xdb,0xbd,0x26,0xee,0x3c,0xf8,0xb6,
154228753Smm0x85,0xaf,0x06,0xdc,0xf8,0x94,0x00,0xce,0xdb,0x61,0x87,0x4f,0xe7,0x36,0x20,0x0c,
155228753Smm0xc6,0x55,0xc4,0x3b,0xd1,0x7e,0xc2,0xe3,0x2a,0xb6,0x31,0x68,0xdc,0xb6,0x70,0x99,
156228753Smm0x84,0x12,0x4e,0xc4,0xc8,0x9f,0xa9,0xbb,0xda,0x1d,0x38,0xc9,0xfc,0x49,0x73,0x38,
157228753Smm0xe3,0x97,0x11,0x91,0xdb,0x69,0x5d,0xc6,0x85,0x37,0xd7,0x71,0x79,0x6c,0xf1,0xd2,
158228753Smm0x32,0x73,0x31,0x0c,0x8d,0x95,0xd1,0x18,0xf0,0x94,0xd6,0xef,0x76,0x00,0xf0,0x42,
159228753Smm0x15,0xa3,0x3c,0xd8,0x37,0xad,0xd2,0xaf,0x3e,0xf9,0xf5,0xf3,0xc9,0x57,0x67,0xca,
160228753Smm0x2c,0x53,0xc4,0x28,0x89,0x69,0x96,0xd3,0x4c,0xec,0xf3,0x92,0x0a,0x25,0x48,0x66,
161228753Smm0x4a,0xb3,0xa5,0xd8,0x6c,0x88,0x91,0xd9,0x86,0x96,0x7e,0x36,0x5f,0x85,0x96,0x5a,
162228753Smm0x4e,0x6e,0x14,0xd2,0xfd,0xf3,0x84,0x42,0x6d,0xf3,0xbd,0xdc,0xcb,0x2d,0x55,0x99,
163228753Smm0xa1,0x7b,0x93,0x0b,0xe3,0xb5,0xf3,0xb2,0x2c,0x91,0xce,0x0b,0xb2,0x29,0x72,0xa3,
164228753Smm0x91,0xa4,0x94,0xc1,0x7b,0xa5,0xb9,0x79,0xf0,0xa3,0x7b,0x2b,0x56,0x9c,0xff,0x0c,
165228753Smm0xb2,0x66,0x45,0x4c,0xb7,0x28,0x45,0x38,0xd0,0x90,0x37,0x98,0x7f,0xf0,0x9a,0x15,
166228753Smm0xd7,0x69,0xff,0xdd,0x8a,0x9b,0x3c,0xff,0x6c,0xc5,0xe0,0xae,0x24,0x18,0xaa,0x02,
167228753Smm0xfd,0x68,0x6b,0xdb,0x89,0x06,0xf0,0x83,0x18,0xd5,0xaa,0xf9,0x82,0x4f,0xef,0x7c,
168228753Smm0xe7,0x59,0xe1,0x22,0x61,0x30,0x5e,0x2b,0x7f,0x01,0x00,0x00,0xff,0xff,0x03,0x00,
169228753Smm0x2b,0xab,0x4f,0xf9,0xbb,0xf7,0x90,0xb5,0x34,0x8f,0x7c,0xae,0x72,0xa0,0x80,0xd2,
170228753Smm0x69,0xc7,0xa2,0xe7,0x44,0x53,0xeb,0x75,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,
171228753Smm0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
172228753Smm};
173228753Smm
174228753Smmstatic void verify2(struct archive *a, struct archive_entry *ae)
175228753Smm{
176228753Smm	(void)a; /* UNUSED */
177228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
178228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
179228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
180228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
181228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
182228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
183228753Smm	assertEqualString(archive_entry_pathname(ae), "symlink");
184228753Smm	assertEqualString(archive_entry_symlink(ae), "f1");
185228753Smm	assert(archive_entry_hardlink(ae) == NULL);
186228753Smm}
187228753Smm
188228753Smm/* Character device node.
189228753Smm#How to make
190228753Smmmknod devchar c 0 30
191228753Smmchown $UNAME:$GNAME devchar
192228753Smmchmod 0644 devchar
193228753Smmenv TZ=utc touch -afm -t 197001020000.01 devchar
194228753Smmxar -cf archive3.xar devchar
195228753Smmod -t x1 archive3.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive3.xar.txt
196228753Smm*/
197228753Smmstatic unsigned char archive3[] = {
198228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x38,
199228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x3b,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x92,
200228753Smm0x4d,0x6e,0xc3,0x20,0x10,0x85,0xf7,0x39,0x05,0xf2,0xde,0x05,0x9c,0x9f,0x36,0xd6,
201228753Smm0x84,0xec,0x7a,0x82,0x74,0xd3,0x1d,0xc2,0x93,0x98,0xd4,0x36,0x11,0xe0,0x28,0xe9,
202228753Smm0xe9,0x0b,0xe3,0xa4,0x69,0xa5,0xaa,0x92,0x25,0x1e,0x8f,0xef,0x8d,0x86,0xc1,0xb0,
203228753Smm0xbd,0xf4,0x1d,0x3b,0xa3,0x0f,0xd6,0x0d,0x9b,0x42,0x3e,0x89,0x82,0xe1,0x60,0x5c,
204228753Smm0x63,0x87,0xc3,0xa6,0x78,0xdb,0xbd,0x96,0x2f,0xc5,0x56,0xcd,0xe0,0xa2,0xbd,0x9a,
205228753Smm0x31,0x88,0xce,0xa4,0x85,0x81,0xf1,0xa8,0x63,0x4a,0x94,0xd1,0xf6,0xa8,0x2a,0x21,
206228753Smm0xd6,0xa5,0xac,0x4a,0x51,0xed,0xa4,0xa8,0xab,0x79,0x2d,0x57,0xc0,0x7f,0x23,0x14,
207228753Smm0x6a,0xd1,0x7c,0x84,0xb1,0x67,0x21,0x5e,0x3b,0xdc,0x14,0xa1,0xd5,0xb2,0xc8,0x27,
208228753Smm0x0c,0xdc,0x7e,0x1f,0x30,0x2a,0x01,0xfc,0xa6,0xc8,0x0d,0xf6,0x33,0x17,0x07,0x4e,
209228753Smm0x22,0x97,0xe0,0xf7,0x1a,0xb4,0xdb,0xdb,0x0e,0x99,0x6d,0x52,0xdb,0xb7,0x32,0xe6,
210228753Smm0xaf,0x76,0xaa,0x7a,0xb9,0x7c,0x4f,0xc9,0x7b,0x1f,0x0c,0x7a,0x92,0x72,0xfd,0x2c,
211228753Smm0x4a,0x21,0x33,0x26,0x44,0x9d,0x3f,0x99,0xb0,0xfe,0x81,0xe9,0x7f,0x30,0xfd,0xc0,
212228753Smm0x0e,0xde,0x8d,0x27,0x65,0x46,0x04,0x3e,0xc9,0xc9,0xb5,0x8d,0x92,0x42,0xc8,0x64,
213228753Smm0x26,0x45,0xd6,0x18,0xd0,0x4f,0x1c,0xa9,0xc9,0xfb,0xc6,0xc6,0x3b,0xd6,0xbb,0x06,
214228753Smm0x95,0x58,0x2d,0x16,0xa9,0x99,0x2c,0xc9,0x6c,0xf0,0x6c,0xcd,0xa4,0x13,0x61,0x07,
215228753Smm0xe7,0xd5,0x3c,0x0d,0x66,0x52,0x37,0x57,0x1f,0x93,0xce,0x26,0x09,0x8a,0xf1,0x1f,
216228753Smm0x39,0x88,0xd7,0x13,0x2a,0xd3,0x6a,0xaf,0x4d,0x44,0xcf,0xc2,0x09,0x8d,0xd5,0x1d,
217228753Smm0x70,0xf2,0x89,0x18,0x74,0xba,0x54,0x8a,0x64,0x08,0x38,0xed,0x68,0xea,0x79,0xd0,
218228753Smm0xf9,0xf9,0x39,0xbd,0x3f,0x70,0xfa,0x1b,0xbe,0x00,0x00,0x00,0xff,0xff,0x03,0x00,
219228753Smm0xab,0x43,0xa3,0xac,0x76,0x40,0x1e,0x8b,0x95,0x0d,0x28,0x79,0x79,0x43,0x49,0x4e,
220228753Smm0x16,0xa1,0x56,0x99,0x1f,0x83,0x77,0x41
221228753Smm};
222228753Smm
223228753Smmstatic void verify3(struct archive *a, struct archive_entry *ae)
224228753Smm{
225228753Smm	(void)a; /* UNUSED */
226228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFCHR);
227228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
228228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
229228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
230228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
231228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
232228753Smm	assertEqualString(archive_entry_pathname(ae), "devchar");
233228753Smm	assert(archive_entry_symlink(ae) == NULL);
234228753Smm	assert(archive_entry_hardlink(ae) == NULL);
235228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
236228753Smm}
237228753Smm
238228753Smm/* Block device node.
239228753Smm#How to make
240228753Smmmknod devblock b 0 30
241228753Smmchown $UNAME:$GNAME devblock
242228753Smmchmod 0644 devblock
243228753Smmenv TZ=utc touch -afm -t 197001020000.01 devblock
244228753Smmxar -cf archive4.xar devblock
245228753Smmod -t x1 archive4.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive4.xar.txt
246228753Smm*/
247228753Smmstatic unsigned char archive4[] = {
248228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x34,
249228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x92,
250228753Smm0xc1,0x6e,0xc2,0x30,0x0c,0x86,0xef,0x3c,0x45,0xd4,0x7b,0x17,0x07,0xd0,0x0a,0x95,
251228753Smm0x09,0xb7,0x3d,0x01,0xbb,0xec,0x96,0xa5,0x06,0x32,0xda,0xa6,0x6a,0x5a,0x04,0x7b,
252228753Smm0xfa,0x25,0x2e,0x8c,0x4d,0x9a,0x26,0x55,0xea,0x97,0x3f,0x9f,0x2d,0x37,0x29,0x6e,
253228753Smm0x2f,0x4d,0x2d,0xce,0xd4,0x07,0xe7,0xdb,0x4d,0xa6,0x9e,0x20,0x13,0xd4,0x5a,0x5f,
254228753Smm0xb9,0xf6,0xb0,0xc9,0x5e,0x77,0x2f,0xf9,0x2a,0xdb,0xea,0x19,0x5e,0x4c,0xaf,0x67,
255228753Smm0x02,0x07,0x6f,0xe3,0x4b,0xa0,0xed,0xc9,0x0c,0xb1,0x22,0x1f,0x5c,0x43,0x7a,0x0e,
256228753Smm0xb0,0xce,0xd5,0x3c,0x87,0xf9,0x4e,0x41,0xb9,0x58,0x95,0xaa,0x40,0xf9,0x5b,0xe1,
257228753Smm0xa2,0x23,0xd9,0x53,0x18,0x1b,0x11,0x86,0x6b,0x4d,0x9b,0x2c,0x1c,0x8d,0xca,0xd2,
258228753Smm0x8e,0x40,0xbf,0xdf,0x07,0x1a,0x34,0xa0,0xbc,0x11,0xa7,0xc1,0x7d,0xa6,0xe6,0x28,
259228753Smm0x19,0x52,0x0b,0x79,0xef,0xc1,0xab,0xbd,0xab,0x49,0xb8,0x2a,0x8e,0x7d,0x6b,0x63,
260228753Smm0xff,0x1e,0x07,0x8a,0xb7,0x58,0x79,0x9f,0x43,0x60,0xc3,0xa8,0xd6,0x05,0xe4,0xa0,
261228753Smm0x92,0x06,0x50,0xa6,0x47,0x45,0xad,0x79,0x68,0xe6,0x1f,0xcd,0x3c,0xb4,0x43,0xef,
262228753Smm0xc7,0x4e,0xdb,0x91,0x50,0x4e,0x38,0xa5,0xae,0xd2,0x0a,0x40,0xc5,0x30,0x12,0x47,
263228753Smm0x63,0xa0,0x7e,0xf2,0x98,0xa6,0xec,0x5b,0x1b,0xef,0x5a,0xe3,0x2b,0xd2,0xf0,0xbc,
264228753Smm0x5c,0xc6,0x61,0x12,0x72,0x58,0xd1,0xd9,0xd9,0x89,0xa3,0xe1,0x5a,0xdf,0xeb,0x45,
265228753Smm0x3c,0x98,0x89,0x6e,0xa9,0xf9,0x88,0x9c,0x42,0x06,0x2e,0x93,0x3f,0xea,0x70,0xb8,
266228753Smm0x76,0xa4,0xdf,0x6b,0x6f,0x4f,0x22,0x74,0x64,0x9d,0xa9,0x51,0x72,0xc6,0xbb,0xad,
267228753Smm0x89,0x1f,0x14,0x75,0x16,0x50,0xf2,0x92,0x8f,0x3c,0x9d,0x72,0xba,0x7b,0xc9,0x97,
268228753Smm0x8f,0x92,0x7f,0x85,0x2f,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0xbe,0x66,0xa2,0x82,
269228753Smm0x3a,0x54,0xd3,0x61,0xaa,0x8e,0x30,0x4c,0xc8,0x36,0x3b,0x7a,0xa4,0xb9,0xef,0xfc,
270228753Smm0x7a,0x5d,0x21,0xde
271228753Smm};
272228753Smm
273228753Smmstatic void verify4(struct archive *a, struct archive_entry *ae)
274228753Smm{
275228753Smm	(void)a; /* UNUSED */
276228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFBLK);
277228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
278228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
279228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
280228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
281228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
282228753Smm	assertEqualString(archive_entry_pathname(ae), "devblock");
283228753Smm	assert(archive_entry_symlink(ae) == NULL);
284228753Smm	assert(archive_entry_hardlink(ae) == NULL);
285228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
286228753Smm}
287228753Smm
288228753Smm/* Directory.
289228753Smm#How to make
290228753Smmmkdir dir1
291228753Smmchown $UNAME:$GNAME dir1
292228753Smmchmod 0755 dir1
293228753Smmenv TZ=utc touch -afm -t 197001020000.01 dir1
294228753Smmxar -cf archive5.xar dir1
295228753Smmod -t x1 archive5.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive5.xar.txt
296228753Smm*/
297228753Smmstatic unsigned char archive5[] = {
298228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x16,
299228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xec,0x00,0x00,0x00,0x01,0x78,0xda,0x74,0x91,
300228753Smm0xc1,0x6e,0xc2,0x30,0x0c,0x86,0xef,0x3c,0x45,0xd4,0x7b,0x17,0xa7,0x83,0x31,0xaa,
301228753Smm0x34,0xdc,0xf6,0x04,0xec,0xb2,0x5b,0x95,0x1a,0x88,0x68,0x1a,0x94,0xa4,0x13,0xdd,
302228753Smm0xd3,0x2f,0x71,0xe9,0xd0,0xa4,0x4d,0xaa,0xd4,0x3f,0xbf,0x3f,0xff,0xb2,0x6c,0xb9,
303228753Smm0xbf,0xd9,0x9e,0x7d,0xa2,0x0f,0xc6,0x0d,0x4d,0x21,0x9e,0xa0,0x60,0x38,0x68,0xd7,
304228753Smm0x99,0xe1,0xd4,0x14,0xef,0x87,0xb7,0xf2,0xb5,0xd8,0xab,0x95,0xbc,0xb5,0x5e,0xad,
305228753Smm0x98,0x8c,0x4e,0xa7,0x1f,0x93,0xda,0x63,0x1b,0x53,0x47,0x19,0x8d,0x45,0x55,0x01,
306228753Smm0xec,0x4a,0x51,0x95,0x50,0x1d,0x04,0xd4,0x6b,0x51,0xaf,0x37,0x92,0xff,0x46,0xa8,
307228753Smm0xe9,0x8c,0xfa,0x12,0x46,0xcb,0x42,0x9c,0x7a,0x6c,0x8a,0x70,0x6e,0x45,0x91,0x2b,
308228753Smm0x4c,0xba,0xe3,0x31,0x60,0x54,0x20,0xf9,0x5d,0x91,0x1b,0xcc,0x57,0x0e,0x97,0x9c,
309228753Smm0x44,0x8e,0xe0,0x4b,0x06,0xbd,0x8e,0xa6,0x47,0x66,0xba,0x34,0xf6,0x3d,0x46,0xff,
310228753Smm0x3d,0xce,0x33,0x7c,0xa4,0xce,0x65,0x0e,0x26,0x2d,0x49,0xb1,0xdb,0x42,0x09,0x22,
311228753Smm0x63,0x00,0x75,0xfe,0x44,0xc2,0xec,0x03,0x6b,0xff,0x49,0x7b,0x49,0x58,0xfb,0xc0,
312228753Smm0x4e,0xde,0x8d,0x57,0xa5,0x47,0x94,0x7c,0x96,0xb3,0x6b,0x3a,0x25,0x00,0x44,0x32,
313228753Smm0x93,0x22,0x6b,0x0c,0xe8,0x67,0x8e,0xd4,0xec,0xfd,0x60,0xe3,0x82,0x59,0xd7,0xa1,
314228753Smm0x82,0xed,0x26,0xed,0x90,0x24,0x99,0x71,0xba,0xa2,0xea,0x8c,0x47,0x1d,0x9d,0x9f,
315228753Smm0x24,0xa7,0x37,0x55,0x86,0xd6,0x52,0x25,0x45,0x90,0xa4,0x35,0xe5,0xcd,0xe4,0x7b,
316228753Smm0x71,0x3a,0x98,0xe4,0x74,0xbe,0x6f,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x23,0x7a,
317228753Smm0x8c,0x2f,0x78,0xe9,0x69,0x28,0x93,0x14,0x72,0x68,0x8d,0xeb,0x42,0x7b,0xf6,0x0f,
318228753Smm0x70,0x64,0xa3,0xff,0xb9,0x35
319228753Smm};
320228753Smm
321228753Smmstatic void verify5(struct archive *a, struct archive_entry *ae)
322228753Smm{
323228753Smm	(void)a; /* UNUSED */
324228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
325228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
326228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
327228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
328228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
329228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
330228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
331228753Smm}
332228753Smm
333228753Smm/* fifo
334228753Smm#How to make
335228753Smmmkfifo -m 0755 fifo
336228753Smmchown $UNAME:$GNAME fifo
337228753Smmenv TZ=utc touch -afm -t 197001020000.01 fifo
338228753Smmxar -cf archive6.xar fifo
339228753Smmod -t x1 archive6.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive6.xar.txt
340228753Smm*/
341228753Smmstatic unsigned char archive6[] = {
342228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0e,
343228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe7,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x91,
344228753Smm0xc1,0x6e,0xc3,0x20,0x0c,0x86,0xef,0x7d,0x0a,0xc4,0x3d,0xc3,0x64,0xab,0xda,0x46,
345228753Smm0x94,0xde,0xf6,0x04,0xdd,0x65,0x37,0x44,0x9c,0x16,0x2d,0x84,0x2a,0x90,0xa9,0xdd,
346228753Smm0xd3,0x0f,0x9c,0x66,0xd5,0xa4,0x69,0x12,0x52,0xbe,0xfc,0x7c,0xb6,0x2c,0xac,0x0e,
347228753Smm0x57,0xdf,0xb3,0x4f,0x1c,0xa3,0x0b,0xc3,0x9e,0xcb,0x27,0xe0,0x0c,0x07,0x1b,0x5a,
348228753Smm0x37,0x9c,0xf6,0xfc,0xed,0xf8,0x5a,0x6d,0xf9,0x41,0xaf,0xd4,0xd5,0x8c,0x7a,0xc5,
349228753Smm0x54,0x0a,0x36,0x7f,0x98,0xb2,0x23,0x9a,0x94,0x2b,0xaa,0xe4,0x3c,0xea,0x1a,0x60,
350228753Smm0x57,0xc9,0xba,0x82,0xfa,0x28,0x65,0xf3,0x02,0x4d,0xbd,0x55,0xe2,0xb7,0x42,0x45,
351228753Smm0x67,0xb4,0x1f,0x71,0xf2,0x2c,0xa6,0x5b,0x8f,0x7b,0x1e,0xcf,0x46,0xf2,0x72,0xc3,
352228753Smm0x54,0xe8,0xba,0x88,0x49,0x83,0x12,0x77,0xa2,0x34,0xba,0xaf,0xd2,0x5c,0x09,0x82,
353228753Smm0xd2,0x42,0x2c,0x3d,0xe8,0xaf,0x73,0x3d,0x32,0xd7,0xe6,0xb1,0xef,0x6d,0xec,0xdf,
354228753Smm0xe3,0xc8,0xe7,0xf7,0x5c,0xb9,0xcc,0xc1,0x94,0x27,0x94,0xbb,0x0d,0x54,0x20,0x8b,
355228753Smm0x06,0xd0,0x94,0x23,0xb3,0xe6,0x1f,0x9a,0xf9,0x47,0x33,0x0f,0xed,0x34,0x86,0xe9,
356228753Smm0xa2,0xed,0x84,0x4a,0xcc,0x38,0xa7,0xae,0xd5,0x12,0x40,0xe6,0x30,0x13,0x45,0x53,
357228753Smm0xc4,0x71,0xf6,0x88,0xe6,0xec,0x47,0x9b,0x16,0xcd,0x87,0x16,0x35,0x6c,0xd6,0xeb,
358228753Smm0x3c,0x4c,0x41,0x0a,0xd3,0xed,0x82,0xba,0x73,0x5d,0x50,0x82,0x90,0xc2,0xc1,0xf8,
359228753Smm0x25,0x24,0xa4,0x17,0x2a,0x8f,0x52,0x56,0x25,0x68,0x57,0x4a,0xd0,0xe6,0xbe,0x01,
360228753Smm0x00,0x00,0xff,0xff,0x03,0x00,0x44,0x19,0x8a,0x2a,0x82,0xbc,0x8c,0xae,0x97,0xa7,
361228753Smm0x7d,0x65,0xa5,0x82,0xdb,0xaa,0xc2,0xcb,0xbe,0xf0,0x1f,0xd1,0xf9,0x56
362228753Smm};
363228753Smm
364228753Smmstatic void verify6(struct archive *a, struct archive_entry *ae)
365228753Smm{
366228753Smm	(void)a; /* UNUSED */
367228753Smm	assertEqualInt(archive_entry_filetype(ae), AE_IFIFO);
368228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0755);
369228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
370228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
371228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
372228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
373228753Smm	assertEqualString(archive_entry_pathname(ae), "fifo");
374228753Smm	assert(archive_entry_symlink(ae) == NULL);
375228753Smm	assert(archive_entry_hardlink(ae) == NULL);
376228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
377228753Smm}
378228753Smm
379228753Smm/* Verify that a file records with directory name.
380228753Smm#How to make
381228753Smmmkdir dir1
382228753Smmecho "hellohellohello" > dir1/f1
383228753Smmchown $UNAME:$GNAME dir1/f1
384228753Smmchmod 0644 dir1/f1
385228753Smmenv TZ=utc touch -afm -t 197001020000.01 dir1/f1
386228753Smmxar -cf archive7.xar dir1/f1
387228753Smmod -t x1 archive7.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive7.xar.txt
388228753Smm*/
389228753Smm
390228753Smmstatic unsigned char archive7[] = {
391228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xbb,
392228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x8a,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x53,
393228753Smm0xc9,0x6e,0xdb,0x30,0x14,0xbc,0xe7,0x2b,0x04,0xdd,0x55,0x2e,0xa2,0x16,0x1a,0xb4,
394228753Smm0x82,0x5e,0x8a,0xdc,0x93,0x5e,0x7a,0xa3,0xb9,0xd8,0x44,0xb5,0x41,0xa2,0x02,0x3b,
395228753Smm0x5f,0x5f,0x92,0xa2,0x1c,0xbb,0x59,0x00,0x01,0x1a,0x3e,0xce,0x1b,0x0d,0x9f,0x86,
396228753Smm0xec,0xf1,0xdc,0xb5,0xc9,0xab,0x9a,0x66,0x33,0xf4,0xfb,0x14,0xfd,0x80,0x69,0xa2,
397228753Smm0x7a,0x31,0x48,0xd3,0x1f,0xf7,0xe9,0xef,0x97,0x5f,0x59,0x9d,0x3e,0x36,0x0f,0xec,
398228753Smm0xcc,0xa7,0xe6,0x21,0x61,0x76,0x10,0xee,0x95,0x30,0x31,0x29,0x6e,0x5d,0x47,0x66,
399228753Smm0x4d,0xa7,0x1a,0x0c,0x21,0xcd,0x10,0xce,0x20,0x7e,0x41,0x68,0x57,0xe0,0x5d,0x51,
400228753Smm0x31,0x70,0x4f,0x09,0x4d,0x27,0x25,0xfe,0xce,0x4b,0x97,0xcc,0xf6,0xd2,0xaa,0x7d,
401228753Smm0x3a,0x9f,0x38,0x4a,0xfd,0x4e,0xc2,0x06,0xad,0x67,0x65,0x1b,0xc8,0x40,0x44,0xa1,
402228753Smm0x3a,0x9b,0x37,0x2f,0xce,0x40,0x00,0x5e,0x02,0x6c,0x1a,0x61,0xa5,0x4d,0xab,0x12,
403228753Smm0x23,0x9d,0xed,0x28,0x63,0x2f,0xa3,0x6a,0xa4,0x99,0x94,0xb0,0xc3,0x74,0x61,0x20,
404228753Smm0xac,0xc3,0x4e,0xcf,0xbb,0xb0,0x83,0x18,0x08,0x30,0x14,0xaf,0xfd,0x78,0xed,0x4f,
405228753Smm0x98,0xe4,0x96,0xaf,0x30,0x61,0xad,0xea,0x8f,0xf6,0xd4,0xe0,0x9c,0x81,0x08,0xe3,
406228753Smm0x46,0xb4,0x88,0xef,0xdd,0x6e,0x7e,0x51,0xf9,0xee,0xd7,0x17,0xb7,0x69,0x6e,0xa7,
407228753Smm0xe6,0xe3,0xd8,0x1a,0x11,0x46,0x03,0xce,0xd9,0xf1,0xcd,0x8c,0x29,0xd8,0xb8,0x7c,
408228753Smm0x12,0x27,0xf3,0xaa,0x64,0xf6,0xff,0xa8,0x9e,0x9f,0x7e,0xba,0x33,0xea,0x3a,0xcf,
409228753Smm0x25,0xd6,0x52,0x20,0x9a,0x13,0x9a,0xf3,0x03,0xa9,0x29,0x97,0x1c,0xe7,0xba,0xd6,
410228753Smm0x15,0x45,0xba,0xc4,0x5a,0xe4,0x25,0xad,0x19,0xf8,0x20,0x74,0x75,0x73,0xb6,0x13,
411228753Smm0x17,0xf6,0xcb,0x4f,0x14,0xb2,0x22,0x07,0x71,0x10,0x15,0x95,0xb9,0xa6,0x07,0x4d,
412228753Smm0xb8,0x76,0xe2,0xa4,0xae,0x6b,0xa8,0x48,0x81,0xcb,0x82,0x68,0x05,0x05,0xa5,0x0c,
413228753Smm0x7c,0x54,0x8a,0x33,0x04,0xef,0x43,0x64,0xe2,0xf3,0x7c,0x90,0xfa,0x8f,0xfb,0x95,
414228753Smm0x5b,0x30,0x1c,0xaf,0x0b,0x18,0xd1,0x0a,0x66,0x10,0x79,0x1e,0x84,0x3b,0xff,0x20,
415228753Smm0xc7,0xeb,0x6e,0x78,0xfc,0x1b,0x1e,0xbf,0xe1,0x1d,0xa7,0x61,0x19,0x1b,0xb1,0x28,
416228753Smm0x06,0x56,0x18,0xcb,0x46,0x36,0x08,0x42,0x17,0x02,0x8f,0xd6,0xda,0x32,0xab,0x69,
417228753Smm0x65,0x06,0x14,0x8b,0x57,0xe2,0x72,0x25,0x76,0x83,0x54,0x0d,0x2c,0x09,0x71,0x96,
418228753Smm0x3c,0x5c,0xab,0x21,0x62,0x3e,0x48,0x37,0x69,0x8b,0x71,0xd3,0x77,0x61,0x03,0x9e,
419228753Smm0xb4,0x86,0x38,0x22,0xd7,0xe1,0xaf,0x13,0x03,0xe1,0x72,0xfd,0x03,0x00,0x00,0xff,
420228753Smm0xff,0x03,0x00,0x8d,0xb1,0x06,0x76,0xa6,0x7a,0xc3,0xbb,0x13,0x3d,0x45,0xe2,0x2b,
421228753Smm0x3b,0xd0,0x88,0xc7,0x58,0x7b,0xbd,0x30,0x9d,0x01,0x44,0x78,0xda,0xca,0x48,0xcd,
422228753Smm0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,
423228753Smm0x06,0x47
424228753Smm};
425228753Smm
426228753Smmstatic void verify7(struct archive *a, struct archive_entry *ae)
427228753Smm{
428228753Smm	(void)a; /* UNUSED */
429228753Smm	assert(archive_entry_filetype(ae) == AE_IFREG);
430228753Smm	assertEqualInt(archive_entry_mode(ae) & 0777, 0644);
431228753Smm	assertEqualInt(archive_entry_uid(ae), UID);
432228753Smm	assertEqualInt(archive_entry_gid(ae), GID);
433228753Smm	assertEqualString(archive_entry_uname(ae), UNAME);
434228753Smm	assertEqualString(archive_entry_gname(ae), GNAME);
435228753Smm	assertEqualString(archive_entry_pathname(ae), "dir1/f1");
436228753Smm	assert(archive_entry_hardlink(ae) == NULL);
437228753Smm	assert(archive_entry_symlink(ae) == NULL);
438228753Smm	assertEqualInt(archive_entry_mtime(ae), 86401);
439228753Smm}
440228753Smm
441228753Smm/* Verify that a file records with bzip2 compression
442228753Smm#How to make
443228753Smmecho "hellohellohello" > f1
444228753Smmchown $UNAME:$GNAME f1
445228753Smmchmod 0644 f1
446228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1
447228753Smmxar --compression bzip2 -cf archive8.xar f1
448228753Smmod -t x1 archive8.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive8.xar.txt
449228753Smm*/
450228753Smm
451228753Smmstatic unsigned char archive8[] = {
452228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xb1,
453228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x42,0x00,0x00,0x00,0x01,0x78,0xda,0x7c,0x53,
454228753Smm0xcb,0x6e,0xdc,0x20,0x14,0xdd,0xe7,0x2b,0x90,0xf7,0x0e,0x60,0xe3,0x07,0x23,0x86,
455228753Smm0xa8,0x9b,0xa8,0xfb,0x4e,0x37,0xdd,0x61,0x1e,0x63,0x14,0xbf,0x64,0xe3,0x68,0x92,
456228753Smm0xaf,0x2f,0x60,0x3b,0xa3,0x34,0x6d,0x25,0x4b,0x3e,0x1c,0x0e,0xe7,0x5e,0xee,0xe5,
457228753Smm0xb2,0xa7,0x5b,0xdf,0x81,0x57,0x3d,0x2f,0x76,0x1c,0xce,0x09,0x7e,0x44,0x09,0xd0,
458228753Smm0x83,0x1c,0x95,0x1d,0xae,0xe7,0xe4,0xe7,0xe5,0x39,0xad,0x93,0x27,0xfe,0xc0,0x6e,
459228753Smm0x62,0xe6,0x0f,0x80,0xb9,0x51,0xfa,0x1f,0x60,0x72,0xd6,0xc2,0xf9,0x13,0xa9,0xb3,
460228753Smm0xbd,0xe6,0x19,0x42,0x34,0xc5,0x59,0x8a,0xc8,0x05,0xd1,0x13,0xc6,0x27,0x9c,0x33,
461228753Smm0xf8,0x59,0x12,0x0f,0xb5,0x5a,0xbe,0x2c,0x6b,0x0f,0x16,0xf7,0xd6,0xe9,0x73,0xb2,
462228753Smm0xb4,0x02,0x27,0x61,0x07,0xb0,0xd1,0x98,0x45,0x3b,0x8e,0x18,0xdc,0x51,0x64,0x17,
463228753Smm0xfb,0x1e,0xcc,0x19,0x8c,0x20,0x58,0xc0,0xc3,0x23,0xae,0x8c,0xed,0x34,0xb0,0xca,
464228753Smm0xa7,0xbd,0xdb,0x28,0xe1,0x44,0x44,0x80,0x75,0x7a,0xb8,0xba,0x96,0x13,0xc2,0xe0,
465228753Smm0x0e,0x37,0x7e,0xf7,0xcf,0x3e,0x87,0xda,0x63,0xe1,0xf2,0x1e,0xcb,0x73,0x47,0x21,
466228753Smm0x8e,0x84,0xc5,0x34,0x75,0x56,0xc6,0x5b,0xc1,0x5b,0xda,0xbc,0xdb,0x29,0x4b,0xe0,
467228753Smm0xae,0x15,0xb3,0x6c,0xed,0xab,0x56,0xe9,0x9f,0xb7,0xfc,0xf1,0xfd,0x9b,0x4f,0xcf,
468228753Smm0xe4,0xa4,0x28,0x4a,0x94,0xcb,0x3a,0xcf,0x9b,0x26,0x93,0xaa,0x92,0xba,0x29,0xa8,
469228753Smm0x2a,0x89,0x29,0xa8,0x50,0x22,0x97,0x45,0xa1,0x71,0xe5,0xeb,0xf6,0xc5,0xe8,0x48,
470228753Smm0xe6,0xe6,0x66,0x21,0xdd,0x3f,0x23,0x14,0xaa,0x22,0x8d,0x6c,0x64,0x45,0x55,0x6e,
471228753Smm0x68,0x63,0x88,0x30,0xa6,0x36,0xa4,0xae,0x6b,0xa4,0x49,0x91,0x95,0x05,0x31,0x1a,
472228753Smm0x49,0x4a,0x19,0xfc,0xea,0xb4,0x55,0x0f,0x7e,0x94,0x8f,0xc9,0xbf,0xf7,0x15,0xd5,
473228753Smm0xbf,0x7c,0x0b,0x8e,0x86,0x02,0xd6,0x47,0x88,0x69,0x85,0x52,0x84,0x53,0x94,0x5d,
474228753Smm0x10,0x3a,0x85,0x0f,0x7b,0x59,0x7f,0x97,0x89,0xff,0xc8,0xc4,0x5d,0x76,0x9d,0xc7,
475228753Smm0x75,0xe2,0x72,0xd5,0x0c,0x6e,0x70,0x63,0xad,0xe2,0x18,0x21,0xec,0x49,0x8f,0x22,
476228753Smm0xb5,0x2e,0x7a,0xde,0x74,0x11,0x6d,0xdc,0x87,0x6c,0x3d,0x64,0xfd,0xa8,0x34,0x47,
477228753Smm0x65,0x78,0x02,0x11,0x46,0xd2,0xbd,0x4d,0x1a,0x74,0x76,0x78,0x39,0x27,0xe3,0x6c,
478228753Smm0xaf,0x76,0x10,0x5d,0xc2,0x5b,0x31,0xab,0xc0,0x31,0x18,0xb6,0x37,0xe1,0x20,0x7c,
479228753Smm0x5e,0xc6,0xfb,0x45,0x10,0x1f,0x5f,0x78,0x6f,0x61,0x0a,0x60,0x1c,0x03,0x06,0xe3,
480228753Smm0x50,0xfc,0x06,0x00,0x00,0xff,0xff,0x03,0x00,0x19,0xcf,0xf5,0xc0,0xf9,0x65,0xe8,
481228753Smm0x78,0xc3,0xfa,0x5f,0x0a,0xf6,0x09,0x17,0xd8,0xb0,0x54,0xb9,0x02,0x8d,0x91,0x31,
482228753Smm0x9c,0x42,0x5a,0x68,0x39,0x31,0x41,0x59,0x26,0x53,0x59,0xc1,0x52,0x36,0xf7,0x00,
483228753Smm0x00,0x03,0x41,0x00,0x00,0x10,0x02,0x44,0xa0,0x00,0x21,0xb4,0x01,0x9a,0x0d,0x46,
484228753Smm0xa5,0x32,0x38,0xbb,0x92,0x29,0xc2,0x84,0x86,0x0a,0x91,0xb7,0xb8
485228753Smm};
486228753Smm
487228753Smm/* Verify that a file records with no compression
488228753Smm#How to make
489228753Smmecho "hellohellohello" > f1
490228753Smmchown $UNAME:$GNAME f1
491228753Smmchmod 0644 f1
492228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1
493228753Smmxar --compression none -cf archive9.xar f1
494228753Smmod -t x1 archive9.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive9.xar.txt
495228753Smm*/
496228753Smm
497228753Smmstatic unsigned char archive9[] = {
498228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x98,
499228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x47,0x00,0x00,0x00,0x01,0x78,0xda,0xa4,0x53,
500228753Smm0x4d,0x6f,0xe3,0x20,0x14,0xbc,0xf7,0x57,0x20,0xee,0x5e,0xc0,0x25,0x89,0x1d,0x11,
501228753Smm0xaa,0x5e,0xaa,0xbd,0x6f,0xf6,0xb2,0x37,0x02,0x8f,0x18,0xc5,0x1f,0x11,0xc6,0x55,
502228753Smm0xba,0xbf,0x7e,0x01,0xdb,0xad,0xba,0x55,0x7b,0xa9,0x64,0xc9,0xe3,0x61,0xde,0x78,
503228753Smm0x78,0xf0,0xc4,0xc3,0xad,0x6b,0xd1,0x33,0xf8,0xd1,0x0d,0xfd,0x01,0xb3,0x1f,0x14,
504228753Smm0x23,0xe8,0xf5,0x60,0x5c,0x7f,0x3e,0xe0,0xdf,0xc7,0xa7,0xa2,0xc2,0x0f,0xf2,0x4e,
505228753Smm0xdc,0x94,0x97,0x77,0x48,0x84,0x41,0xc7,0x17,0x12,0xda,0x83,0x0a,0xb1,0xa2,0x08,
506228753Smm0xae,0x03,0x59,0x52,0x5a,0x17,0xac,0x2c,0x28,0x3f,0xd2,0x7a,0xcf,0xaa,0x3d,0xaf,
507228753Smm0x05,0x79,0x2f,0xc9,0x45,0x0d,0xe8,0xcb,0x38,0x75,0x68,0x0c,0x2f,0x2d,0x1c,0xf0,
508228753Smm0xd8,0x28,0x86,0xd3,0x0a,0x12,0x83,0xb5,0x23,0x04,0x49,0x05,0x59,0x50,0x66,0x47,
509228753Smm0xf7,0x37,0x99,0x0b,0x92,0x41,0xb2,0x20,0xab,0x47,0xfe,0xb2,0xae,0x05,0xe4,0x4c,
510228753Smm0x8c,0xbd,0xd8,0x18,0x15,0x54,0x46,0x48,0xb4,0xd0,0x9f,0x43,0x23,0xd9,0x56,0x90,
511228753Smm0x05,0xce,0xfc,0xba,0xb9,0x35,0x84,0xba,0x5e,0x5b,0xa7,0x73,0x52,0x32,0xe8,0x00,
512228753Smm0xa1,0x18,0x43,0x4c,0xde,0x61,0xb2,0x14,0x2c,0x81,0xca,0xf7,0xd9,0x96,0x70,0xc9,
513228753Smm0x7e,0x0d,0x17,0x39,0xe5,0x75,0xe3,0x9e,0xc1,0x14,0xff,0x6f,0xf5,0xd7,0xcf,0xc7,
514228753Smm0x98,0x71,0x63,0x76,0xfc,0xa4,0x4f,0x7a,0x57,0x9b,0x7b,0x5b,0x9f,0x2c,0x57,0xd6,
515228753Smm0x56,0x96,0x57,0x55,0x45,0x81,0x6f,0xca,0xed,0x86,0x5b,0xa0,0xba,0x8e,0xcd,0xfb,
516228753Smm0x60,0xb4,0xa6,0xbf,0x05,0xaf,0x62,0xca,0xef,0xff,0xe1,0xa3,0xd3,0xdc,0x42,0xf2,
517228753Smm0xda,0x43,0xa1,0x3f,0x39,0xdc,0xed,0x9f,0x78,0x0e,0xeb,0xa9,0x22,0xd1,0x65,0xc8,
518228753Smm0xea,0x1d,0x2d,0x28,0x2b,0x68,0x79,0xa4,0x74,0x9f,0x1e,0x16,0x65,0xdd,0x9b,0x4c,
519228753Smm0x7d,0x21,0x53,0x6f,0xb2,0xb3,0x1f,0xa6,0xab,0xd4,0x13,0x08,0x32,0xc3,0x99,0x75,
520228753Smm0x46,0x32,0x4a,0x59,0x24,0x23,0xca,0xd4,0x34,0x82,0x9f,0x75,0x19,0xcd,0xdc,0xab,
521228753Smm0x6c,0x5a,0x65,0xdd,0x60,0x40,0xd2,0x2d,0xe7,0x31,0x4c,0x82,0x99,0x0c,0x2f,0x57,
522228753Smm0x40,0xad,0xeb,0x2f,0x07,0x3c,0x78,0x77,0x76,0xbd,0x6a,0xb1,0x6c,0x94,0x37,0x89,
523228753Smm0x13,0x24,0x2d,0xcf,0xc2,0x5e,0xc5,0x5c,0x36,0xfa,0x65,0x90,0x6f,0x60,0xba,0x74,
524228753Smm0x69,0x14,0x48,0x9e,0x05,0x41,0xf2,0x64,0xfc,0x03,0x00,0x00,0xff,0xff,0x03,0x00,
525228753Smm0xee,0x8e,0xf8,0x75,0xa1,0xaf,0x74,0x71,0x3f,0x40,0x08,0xab,0x13,0x7d,0xc0,0x82,
526228753Smm0x3a,0x56,0xeb,0x4e,0x35,0xf1,0x35,0xb7,0x68,0x65,0x6c,0x6c,0x6f,0x68,0x65,0x6c,
527228753Smm0x6c,0x6f,0x68,0x65,0x6c,0x6c,0x6f,0x0a
528228753Smm};
529228753Smm
530228753Smm/* Verify that a file records with md5 hashing algorithm
531228753Smm#How to make
532228753Smmecho "hellohellohello" > f1
533228753Smmchown $UNAME:$GNAME f1
534228753Smmchmod 0644 f1
535228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1
536228753Smmxar --toc-cksum md5 -cf archive10.xar f1
537228753Smmod -t x1 archive10.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive10.xar.txt
538228753Smm*/
539228753Smm
540228753Smmstatic unsigned char archive10[] = {
541228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xaf,
542228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x40,0x00,0x00,0x00,0x02,0x78,0xda,0x7c,0x53,
543228753Smm0x4d,0x6f,0xdc,0x20,0x10,0xbd,0xe7,0x57,0x20,0xee,0x0e,0x60,0xb3,0xb6,0x59,0xb1,
544228753Smm0x44,0xbd,0x44,0xbd,0x77,0x7b,0xe9,0x8d,0xe5,0xc3,0x8b,0xe2,0x2f,0x61,0x1c,0x6d,
545228753Smm0xf2,0xeb,0x8b,0xb1,0x9d,0xb4,0x4d,0x52,0xc9,0x92,0x1f,0x8f,0xc7,0x9b,0x61,0x86,
546228753Smm0xe1,0x0f,0xb7,0xae,0x05,0xcf,0xc6,0x4f,0x6e,0xe8,0x4f,0x90,0xdc,0x63,0x08,0x4c,
547228753Smm0xaf,0x06,0xed,0xfa,0xe6,0x04,0x7f,0x9e,0x1f,0xb3,0x1a,0x3e,0x88,0x3b,0x7e,0x93,
548228753Smm0x5e,0xdc,0x01,0x1e,0x06,0x15,0x7f,0x80,0x2b,0x6f,0x64,0x88,0x27,0xb2,0xe0,0x3a,
549228753Smm0x23,0x72,0x8c,0x59,0x46,0xf2,0x0c,0xd3,0x33,0x66,0xc7,0x02,0x1f,0x69,0xcd,0xd1,
550228753Smm0xdf,0x92,0x74,0xe8,0x6a,0xd4,0xd3,0x34,0x77,0x60,0x0a,0x2f,0xad,0x39,0xc1,0x4e,
551228753Smm0x1f,0xe0,0xb2,0x01,0xf8,0x60,0xed,0x64,0x82,0xc0,0x1c,0x6d,0x28,0xb1,0x93,0x7b,
552228753Smm0x35,0x82,0x94,0x1c,0x25,0xb0,0x38,0xa0,0xdd,0x22,0xad,0xac,0x6b,0x0d,0x70,0x3a,
553228753Smm0x66,0xbd,0xd9,0x68,0x19,0x64,0x42,0x80,0xb7,0xa6,0x6f,0xc2,0x55,0xe4,0x05,0x47,
554228753Smm0x1b,0x5c,0xf9,0xcd,0x7f,0x71,0xfd,0x23,0xd4,0x27,0xb1,0x22,0xb7,0xd7,0x61,0xcf,
555228753Smm0x57,0x8e,0x63,0xeb,0x54,0xba,0x14,0xba,0x65,0xcd,0xab,0x1b,0x21,0xda,0xa4,0xd2,
556228753Smm0xab,0xab,0x7b,0x36,0x3a,0xfb,0xf7,0x8e,0x3f,0xbe,0x7f,0x8b,0xd9,0xd9,0xba,0x28,
557228753Smm0x74,0x6e,0xb5,0x22,0xac,0xa0,0xac,0x90,0x17,0x5a,0x33,0xa9,0x65,0x5e,0xd8,0xda,
558228753Smm0x56,0x8c,0xd8,0x32,0xb7,0xaa,0x28,0x59,0xac,0xda,0x07,0xa3,0x3d,0x97,0x5b,0xf0,
559228753Smm0x52,0x85,0x2f,0x23,0x1c,0x74,0x45,0x2f,0xea,0xa2,0x2a,0xa6,0x0b,0xcb,0x2e,0x96,
560228753Smm0x4a,0x1b,0xbd,0x69,0x5d,0xd7,0xd8,0xd0,0x43,0x5e,0x1e,0xa8,0x35,0x58,0x31,0xc6,
561228753Smm0xd1,0x47,0xa7,0xb5,0x78,0xe8,0xad,0x7a,0x5c,0x7d,0xd1,0xd5,0xea,0x57,0xec,0xc0,
562228753Smm0xde,0x4e,0xc0,0xbb,0x04,0x09,0xab,0x70,0x86,0x49,0x86,0xf3,0x33,0xc6,0xc7,0xe5,
563228753Smm0x23,0x51,0xd6,0xbd,0xcb,0xe4,0x7f,0x64,0xf2,0x5d,0xd6,0xf8,0x61,0x1e,0x85,0x9a,
564228753Smm0x0d,0x47,0x2b,0x5c,0x59,0xa7,0x05,0xc1,0x98,0x44,0x32,0xa2,0x44,0xcd,0x93,0xf1,
565228753Smm0xab,0x2e,0xa1,0x95,0x7b,0x93,0xcd,0xbb,0xac,0x1b,0xb4,0x11,0xb8,0xa4,0x34,0x26,
566228753Smm0xb3,0xc0,0x44,0x86,0x97,0xd1,0x80,0xd6,0xf5,0x4f,0x27,0x38,0x78,0xd7,0xb8,0x5e,
567228753Smm0xb6,0x50,0x5c,0xa5,0xd7,0x0b,0xc7,0xd1,0xb2,0xbd,0x0a,0x7b,0x19,0xf3,0xb2,0xd1,
568228753Smm0x2f,0x81,0xf4,0xf6,0x96,0xe7,0xb6,0xcc,0x00,0x4a,0x43,0xc0,0x51,0x1a,0x89,0xdf,
569228753Smm0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x27,0xf8,0xf5,0x28,0x87,0x01,0xb1,0xb7,0x18,
570228753Smm0xe8,0x34,0x20,0x06,0x5c,0x66,0x9a,0x43,0x26,0xe7,0x94,0x78,0xda,0xca,0x48,0xcd,
571228753Smm0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,
572228753Smm0x06,0x47
573228753Smm};
574228753Smm
575228753Smm/* Verify that a file records with no hashing algorithm
576228753Smm#How to make
577228753Smmecho "hellohellohello" > f1
578228753Smmchown $UNAME:$GNAME f1
579228753Smmchmod 0644 f1
580228753Smmenv TZ=utc touch -afm -t 197001020000.01 f1
581228753Smmxar --toc-cksum none -cf archive11.xar f1
582228753Smmod -t x1 archive11.xar | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D' >  archive11.xar.txt
583228753Smm*/
584228753Smm
585228753Smmstatic unsigned char archive11[] = {
586228753Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x98,
587228753Smm0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xef,0x00,0x00,0x00,0x00,0x78,0xda,0x7c,0x52,
588228753Smm0xcb,0x6e,0xeb,0x20,0x14,0xdc,0xf7,0x2b,0x10,0x7b,0x17,0xb0,0x89,0x63,0x22,0x42,
589228753Smm0x75,0x37,0x55,0xf7,0xcd,0xdd,0x74,0x47,0x78,0x38,0xa8,0x7e,0xc9,0xc6,0x55,0xda,
590228753Smm0xaf,0xbf,0x3c,0xe2,0x56,0x55,0xd5,0x2b,0x21,0x79,0x3c,0xcc,0x39,0x67,0x74,0x18,
591228753Smm0xfe,0x70,0xed,0x3b,0xf0,0x66,0xe6,0xc5,0x8d,0xc3,0x11,0x92,0x7b,0x0c,0x81,0x19,
592228753Smm0xd4,0xa8,0xdd,0xd0,0x1e,0xe1,0xdf,0xd3,0x63,0xd1,0xc0,0x07,0x71,0xc7,0xaf,0x72,
593228753Smm0x16,0x77,0x80,0xfb,0x51,0x85,0x0f,0xe0,0x6a,0x36,0xd2,0x87,0x8a,0xc2,0xbb,0xde,
594228753Smm0x88,0x12,0x63,0x56,0x90,0xb2,0xc0,0xf4,0x44,0xf0,0x81,0x54,0x07,0x5a,0x73,0xf4,
595228753Smm0x5d,0x12,0x8b,0xac,0xeb,0x0c,0x70,0x3a,0x4c,0x81,0xf1,0x1f,0x70,0x2d,0xbd,0x4c,
596228753Smm0x08,0xf0,0xce,0x0c,0xad,0xbf,0x88,0xb2,0xe2,0xe8,0x06,0x33,0x3f,0x5a,0xbb,0x18,
597228753Smm0x2f,0x30,0x47,0x37,0x94,0xe9,0xc5,0x7d,0x18,0x41,0xc2,0x94,0x04,0x32,0xb7,0xd9,
598228753Smm0x06,0x8b,0x7f,0xef,0xcc,0x11,0xca,0x69,0xea,0x9c,0x4a,0x1e,0xd0,0xb5,0x68,0x3f,
599228753Smm0xdc,0x04,0xd1,0x4d,0x2a,0x67,0x75,0x71,0x6f,0x46,0x17,0xea,0x62,0xd4,0xeb,0xb2,
600228753Smm0xf6,0x5b,0xcd,0xf3,0xd3,0x9f,0x60,0xce,0x36,0x55,0xa5,0x4b,0xab,0x15,0x61,0x15,
601228753Smm0x65,0x95,0x3c,0xd3,0x86,0x49,0x2d,0xcb,0xca,0x36,0x76,0xcf,0x88,0xad,0x4b,0xab,
602228753Smm0xaa,0x9a,0x35,0x1c,0xfd,0x68,0xb4,0x79,0xb9,0xfa,0x59,0x2a,0xff,0xeb,0x84,0x9d,
603228753Smm0xde,0xd3,0xb3,0x3a,0xab,0x3d,0xd3,0x95,0x65,0x67,0x4b,0xa5,0x0d,0xbd,0x69,0xd3,
604228753Smm0x34,0xd8,0xd0,0x5d,0x59,0xef,0xa8,0x35,0x58,0x31,0xc6,0xd1,0xcf,0x4e,0x79,0x77,
605228753Smm0xe8,0x73,0x79,0x5c,0xfd,0xf2,0x08,0xe4,0x25,0xbc,0xc2,0xb6,0x7d,0xc0,0xfb,0x04,
606228753Smm0x09,0xdb,0xe3,0x02,0x93,0x02,0x97,0x27,0x8c,0x0f,0xf1,0x44,0x59,0xff,0x25,0x93,
607228753Smm0xff,0x91,0xc9,0x2f,0x59,0x3b,0x8f,0xeb,0x24,0xd4,0x6a,0x38,0xca,0x30,0xb3,0x4e,
608228753Smm0x0b,0x82,0x31,0x09,0x64,0x40,0x89,0x5a,0x17,0x33,0x67,0x5d,0x42,0x99,0xfb,0x94,
609228753Smm0xad,0x9b,0xac,0x1f,0xb5,0x11,0xb8,0xa6,0x34,0x98,0x89,0x30,0x91,0xfe,0x7d,0x32,
610228753Smm0xa0,0x73,0xc3,0xeb,0x11,0x8e,0xb3,0x6b,0xdd,0x20,0x3b,0x28,0x2e,0x72,0xd6,0x91,
611228753Smm0xe3,0x28,0x5e,0x67,0xe1,0x20,0x83,0x2f,0x1b,0xfa,0x25,0x10,0xc3,0x86,0x62,0xda,
612228753Smm0x62,0x64,0x51,0xca,0x2c,0x47,0x29,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0x03,0x00,
613228753Smm0xf1,0x18,0xdc,0x71,0x78,0xda,0xca,0x48,0xcd,0xc9,0xc9,0xcf,0x80,0x13,0x5c,0x00,
614228753Smm0x00,0x00,0x00,0xff,0xff,0x03,0x00,0x37,0xf7,0x06,0x47
615228753Smm};
616228753Smm
617342361Smm/* Verify that a file which is missing timestamp information
618342361Smmhas the corresponding timestamps unset.
619342361Smm#How to make e.g.
620342361Smm  struct archive *a = archive_write_new();
621342361Smm  archive_write_set_format_xar(a);
622342361Smm  archive_write_add_filter_none(a);
623342361Smm  size_t used, buffsize = 1500;
624342361Smm  char *buff = (char*) malloc(buffsize);
625342361Smm  archive_write_open_memory(a, buff, buffsize, &used);
626342361Smm
627342361Smm  struct archive_entry *ae = archive_entry_new();
628342361Smm  archive_entry_copy_pathname(ae, "file");
629342361Smm  archive_entry_set_size(ae, 8);
630342361Smm  archive_write_header(a, ae);
631342361Smm  archive_entry_free(ae);
632342361Smm  archive_write_data(a, "12345678", 9);
633342361Smm  archive_write_free(a);
634342361Smm
635342361Smm  std::cout << std::string(buff, used);
636342361Smm  free(buff);
637342361Smm
638342361Smm$./a.out > f12.xar
639342361SmmVerify toc has no mtime/atime sections
640342361Smm$ xar --dump-toc=- -f f12.xar
641342361SmmDump contents
642342361Smm$ ./a.out | od -t x1 | sed -E -e 's/^0[0-9]+//;s/^  //;s/(  )([0-9a-f]{2})/0x\2,/g;$ D'
643342361Smm*/
644342361Smm
645342361Smmstatic unsigned char archive12[] = {
646342361Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,
647342361Smm0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x56,0x00,0x00,0x00,0x01,0x78,0x9c,0x55,0x90,
648342361Smm0x41,0x8e,0xc2,0x30,0x0c,0x45,0xf7,0x9c,0x22,0xca,0xbe,0x38,0x2d,0x2c,0x10,0x72,
649342361Smm0xdb,0xdd,0x9c,0x00,0x0e,0x50,0xb5,0x6e,0x89,0x68,0x12,0xd4,0x84,0x11,0x70,0x7a,
650342361Smm0x62,0x17,0x46,0x9a,0x28,0x92,0xbf,0x5f,0xec,0xef,0xc8,0xd8,0x3e,0xdc,0xac,0x7e,
651342361Smm0x69,0x89,0x36,0xf8,0x5a,0x97,0x5b,0xa3,0x15,0xf9,0x3e,0x0c,0xd6,0x4f,0xb5,0x3e,
652342361Smm0x9f,0x7e,0x8a,0x83,0x6e,0x9b,0x0d,0x3e,0xba,0xa5,0xd9,0x28,0x4c,0xa1,0xcf,0x41,
653342361Smm0x61,0xbf,0x50,0x97,0x72,0x47,0x91,0xac,0xa3,0xa6,0x32,0xe5,0xa1,0x28,0x4d,0x61,
654342361Smm0xaa,0x53,0x65,0x8e,0xf9,0xee,0x77,0x08,0xff,0x4b,0xa4,0xe9,0x42,0xfd,0x35,0xde,
655342361Smm0x9d,0x8a,0xe9,0x39,0x53,0xad,0xe3,0xa5,0x2b,0x35,0xbf,0x28,0x0c,0xe3,0x18,0x29,
656342361Smm0x35,0x06,0xe1,0xa3,0x84,0x46,0xfb,0x62,0x73,0x04,0x11,0x6c,0x01,0x5f,0x0f,0xc9,
657342361Smm0x46,0x3b,0x93,0xb2,0x43,0xfe,0xf6,0xc7,0xc6,0x77,0x79,0x14,0x53,0x04,0x91,0x02,
658342361Smm0xd3,0xf3,0xf6,0x85,0x22,0x05,0x5a,0x1f,0x06,0xe2,0x79,0xab,0x10,0xe6,0x04,0xe5,
659342361Smm0x83,0xe0,0xfe,0xe0,0xdd,0x0e,0x5c,0xc6,0x41,0xf2,0x69,0xcd,0xa7,0x35,0x47,0x60,
660342361Smm0x63,0xde,0x0c,0xc8,0x6a,0x10,0x64,0x51,0x6f,0x2a,0x6b,0x63,0x9a,0x01,0x79,0x57,
661342361Smm0x93,0xd4,0x55,0xd4,0x06,0x1c,0x76,0x99,0x10,0x31,0x87,0x52,0x2b,0x16,0xff,0x5b,
662342361Smm0x36,0x78,0x9c,0x55,0x90,0x41,0x8e,0xc2,0x30,0x0c,0x45,0xf7,0x9c,0x22,0xca,0xbe,
663342361Smm0x38,0x2d,0x2c,0x10,0x72
664342361Smm};
665342361Smm
666342361Smmstatic void verify12(struct archive *a, struct archive_entry *ae)
667342361Smm{
668342361Smm	(void)a; /* UNUSED */
669342361Smm        assertEqualInt(archive_entry_mtime_is_set(ae), 0);
670342361Smm        assertEqualInt(archive_entry_atime_is_set(ae), 0);
671342361Smm	assertEqualInt(archive_entry_mtime(ae), 0);
672342361Smm	assertEqualInt(archive_entry_atime(ae), 0);
673342361Smm}
674342361Smm
675342361Smm
676342361Smm/*
677342361Smm#How to make
678342361Smmecho "onetwothree" > f1
679342361Smmecho "fourfivesize" > f2
680342361Smmxar -cf archive13.xar f1 f2
681342361Smmod -t x1 archive13.xar | sed -E -e 's/^0[0-9]+//' | sed -E -e 's/^  //' | sed -E -e 's/( )([0-9a-f]{2})/0x\2,/g;$ D'
682342361Smm*/
683342361Smm
684342361Smmstatic unsigned char archive13[] = {
685342361Smm0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x31,
686342361Smm0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xaa,0x00,0x00,0x00,0x01,0x78,0xda,0xcc,0x95,
687342361Smm0xcb,0x8e,0x9b,0x30,0x14,0x86,0xf7,0x79,0x0a,0xc4,0x9e,0xe2,0x0b,0xbe,0x10,0x39,
688342361Smm0xcc,0xae,0x4f,0x30,0xdd,0x74,0x67,0xec,0x43,0x82,0x86,0x4b,0x04,0x24,0xcd,0xcc,
689342361Smm0xd3,0xd7,0x36,0x30,0x69,0x34,0xd3,0x51,0xda,0x4a,0xa3,0x8a,0x05,0xbf,0x8f,0x7f,
690342361Smm0x9f,0xe3,0x63,0x3e,0x64,0xf5,0x70,0x69,0x9b,0xe8,0x0c,0xc3,0x58,0xf7,0xdd,0x2e,
691342361Smm0xc6,0x5f,0x50,0x1c,0x41,0x67,0x7a,0x5b,0x77,0xfb,0x5d,0xfc,0xed,0xf1,0x6b,0x22,
692342361Smm0xe3,0x87,0x62,0xa3,0x2e,0x7a,0x28,0x36,0x91,0x9a,0x7a,0xe3,0x5e,0x91,0x32,0x03,
693342361Smm0xe8,0xc9,0xad,0x48,0xa6,0xba,0x85,0x82,0x20,0x2c,0x13,0x44,0x12,0xc2,0x1f,0x71,
694342361Smm0xbe,0xc5,0x68,0x4b,0xf3,0xef,0x2a,0xbd,0xf5,0x84,0x55,0x07,0x30,0x4f,0xe3,0xa9,
695342361Smm0x8d,0xc6,0xe9,0xb9,0x81,0x5d,0x3c,0x1e,0x34,0x8e,0xfd,0x4c,0xa4,0xfa,0xaa,0x1a,
696342361Smm0x61,0x2a,0x90,0x4a,0x17,0x15,0xa2,0x63,0xfd,0xe2,0xb3,0xab,0x34,0x08,0x9f,0x22,
697342361Smm0x5d,0x73,0x84,0x51,0x55,0x37,0x10,0xd5,0x76,0x17,0x93,0x25,0x8d,0xd5,0x93,0x0e,
698342361Smm0x2a,0x52,0x0d,0x74,0xfb,0xe9,0x10,0x56,0x2f,0x72,0x8e,0x2f,0xf9,0xb3,0xdb,0x52,
699342361Smm0x4b,0x2d,0x4c,0xae,0xb5,0x5c,0x6c,0x3d,0x89,0x75,0xc3,0xfa,0x78,0x6c,0x6a,0x13,
700342361Smm0xba,0x4a,0x2f,0xc9,0xfe,0xa5,0x3e,0xc6,0xe9,0x62,0xd5,0x83,0x39,0xd4,0x67,0xb0,
701342361Smm0xc9,0xfb,0x4d,0x66,0x92,0x96,0x58,0x70,0x4e,0x09,0xa3,0x02,0x73,0x28,0x05,0xa9,
702342361Smm0x20,0xe7,0xb9,0x34,0x98,0x94,0x0c,0x33,0x8c,0xa4,0xd5,0x22,0xd3,0x2a,0x7d,0x93,
703342361Smm0x68,0xdd,0xcb,0x65,0x1a,0xb4,0x99,0x7e,0x5b,0x81,0xcb,0x9c,0xba,0x22,0x3a,0x93,
704342361Smm0x40,0xb8,0x70,0x0f,0xd7,0x39,0x42,0x34,0x77,0xe9,0x89,0x28,0x2d,0xe7,0x6e,0x20,
705342361Smm0xb4,0xc1,0x2a,0x7d,0x9b,0x69,0x3e,0xbc,0xf4,0xf5,0xf4,0x7c,0x31,0xf2,0x0b,0x15,
706342361Smm0x8c,0x0b,0x21,0x08,0x47,0xd9,0xd2,0xae,0xd2,0xa6,0x59,0xfb,0x36,0x06,0xc6,0xb1,
707342361Smm0x38,0x8d,0x30,0x6c,0xb7,0xc3,0x8f,0x64,0xb3,0x1f,0xfa,0xd3,0xd1,0xc9,0x24,0xd9,
708342361Smm0xf4,0xd3,0x21,0x44,0x9d,0x74,0x7d,0xcd,0xc6,0xb9,0xd2,0xba,0x5e,0x99,0x77,0x00,
709342361Smm0x42,0x72,0x8b,0x99,0x07,0x68,0x05,0x27,0x52,0xed,0x07,0xb6,0xf6,0x6a,0xd3,0x1f,
710342361Smm0xd8,0xf4,0xd5,0xb6,0xaf,0x6d,0x81,0x11,0x72,0x04,0x78,0x15,0x42,0x7e,0xff,0x85,
711342361Smm0xee,0x26,0x78,0x52,0x69,0xd0,0x73,0xf4,0xd5,0x78,0x5a,0x8d,0x6d,0x6f,0xa1,0x40,
712342361Smm0x3c,0xcb,0x5c,0x61,0x2f,0x67,0xec,0xe0,0x5c,0x1b,0xe8,0x7a,0x57,0x9a,0x51,0x77,
713342361Smm0x8e,0xeb,0x30,0x4c,0xd6,0x9d,0xf7,0xe5,0x88,0xe5,0xc2,0xc3,0x38,0x0f,0xc3,0xcc,
714342361Smm0xf4,0x7c,0x84,0xc2,0x33,0xac,0xd2,0x20,0x43,0xb0,0xd3,0x6e,0x9b,0x95,0xe3,0x30,
715342361Smm0x88,0xc0,0xbc,0xb7,0xdc,0xf2,0x8e,0xff,0x98,0x77,0xf2,0xc9,0xbc,0x3b,0x98,0x31,
716342361Smm0x94,0x3c,0x67,0x8e,0xfb,0x8c,0x49,0xc0,0xd2,0x20,0xcc,0x40,0x0b,0x69,0x08,0x35,
717342361Smm0xbc,0x92,0xc2,0x7d,0x25,0x66,0xff,0x9e,0x77,0x60,0x19,0xa6,0xd6,0xd2,0x4c,0xd3,
718342361Smm0x8a,0x72,0x6b,0x44,0x25,0x01,0xa8,0x75,0xbf,0x81,0x81,0x32,0xd3,0xbc,0xd2,0xa2,
719342361Smm0xc4,0xc4,0xfe,0x13,0xef,0xf4,0xd3,0x78,0x47,0xf7,0xf1,0x8e,0xee,0xe3,0x1d,0xfd,
720342361Smm0x27,0xbc,0xe3,0xfc,0x5e,0xde,0xf1,0x3b,0xbc,0x3b,0x97,0xbf,0x6e,0x54,0x1a,0x2e,
721342361Smm0x9f,0x9f,0x00,0x00,0x00,0xff,0xff,0x03,0x00,0xe5,0xbe,0xed,0xcc,0x2a,0x10,0x73,
722342361Smm0x9e,0x84,0x13,0x2e,0x27,0xe1,0x8d,0x6f,0xf8,0x9e,0xae,0xd0,0x0a,0x8f,0x2a,0xca,
723342361Smm0xf7,0x78,0xda,0xcb,0xcf,0x4b,0x2d,0x29,0xcf,0x2f,0xc9,0x28,0x4a,0x4d,0xe5,0x02,
724342361Smm0x00,0x21,0x4c,0x04,0xbf,0x78,0xda,0x4b,0xcb,0x2f,0x2d,0x4a,0xcb,0x2c,0x4b,0x2d,
725342361Smm0xce,0xac,0xe0,0x02,0x00,0x20,0xfa,0x04,0xc5
726342361Smm};
727342361Smm
728228753Smmenum enc {
729228753Smm    GZIP,
730228753Smm    BZIP2
731228753Smm};
732228753Smm
733228753Smmstatic void verify(unsigned char *d, size_t s,
734228753Smm    void (*f1)(struct archive *, struct archive_entry *),
735228753Smm    void (*f2)(struct archive *, struct archive_entry *),
736228753Smm    enum enc etype)
737228753Smm{
738228753Smm	struct archive_entry *ae;
739228753Smm	struct archive *a;
740228753Smm	unsigned char *buff;
741228753Smm	int r;
742228753Smm
743228753Smm	assert((a = archive_read_new()) != NULL);
744228753Smm	switch (etype) {
745228753Smm	case BZIP2:
746228753Smm		/* This is only check whether bzip is supported or not.
747228753Smm		 * This filter won't be used this test.  */
748232153Smm		if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
749228753Smm			skipping("Unsupported bzip2");
750232153Smm			assertEqualInt(ARCHIVE_OK, archive_read_free(a));
751228753Smm			return;
752228753Smm		}
753228753Smm		break;
754228753Smm	case GZIP:
755228753Smm		/* This gzip must be needed. archive_read_support_format_xar()
756228753Smm		 * will return a warning if gzip is unsupported. */
757228753Smm		break;
758228753Smm	}
759232153Smm	assertA(0 == archive_read_support_filter_all(a));
760228753Smm	r = archive_read_support_format_xar(a);
761228753Smm	if (r == ARCHIVE_WARN) {
762228753Smm		skipping("xar reading not fully supported on this platform");
763232153Smm		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
764228753Smm		return;
765228753Smm	}
766228753Smm	assert((buff = malloc(100000)) != NULL);
767228753Smm	if (buff == NULL)
768228753Smm		return;
769228753Smm	memcpy(buff, d, s);
770228753Smm	memset(buff + s, 0, 2048);
771228753Smm
772228753Smm	assertA(0 == archive_read_support_format_all(a));
773228753Smm	assertA(0 == archive_read_open_memory(a, buff, s + 1024));
774228753Smm	assertA(0 == archive_read_next_header(a, &ae));
775248616Smm	assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE);
776228753Smm	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_XAR);
777302001Smm	assertEqualInt(archive_entry_is_encrypted(ae), 0);
778302001Smm	assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
779228753Smm	/* Verify the only entry. */
780228753Smm	f1(a, ae);
781228753Smm	if (f2) {
782228753Smm		assertA(0 == archive_read_next_header(a, &ae));
783248616Smm		assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE);
784228753Smm		assertEqualInt(archive_format(a), ARCHIVE_FORMAT_XAR);
785228753Smm		/* Verify the only entry. */
786228753Smm		f2(a, ae);
787232153Smm		assertEqualInt(2, archive_file_count(a));
788232153Smm	} else {
789232153Smm		assertEqualInt(1, archive_file_count(a));
790228753Smm	}
791228753Smm	/* End of archive. */
792228753Smm	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
793228753Smm
794232153Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
795232153Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
796228753Smm	free(buff);
797228753Smm}
798228753Smm
799342361Smmstatic void verifyB(unsigned char *d, size_t s) {
800342361Smm	struct archive* a;
801342361Smm	struct archive_entry *entry = NULL;
802346105Smm	size_t buf_size;
803342361Smm	unsigned char *buf;
804342361Smm
805342361Smm	assert((a = archive_read_new()) != NULL);
806342361Smm
807342361Smm	if(ARCHIVE_OK != archive_read_support_filter_gzip(a)) {
808342361Smm		skipping("Unsupported gzip");
809342361Smm		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
810342361Smm		return;
811342361Smm	}
812342361Smm
813342361Smm	if(ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
814342361Smm		skipping("Unsupported bzip2");
815342361Smm		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
816342361Smm		return;
817342361Smm	}
818342361Smm
819342361Smm	if(ARCHIVE_OK != archive_read_support_format_xar(a)) {
820342361Smm		skipping("Unsupported xar");
821342361Smm		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
822342361Smm		return;
823342361Smm	}
824342361Smm
825342361Smm	assertA(0 == archive_read_open_memory(a, d, s));
826342361Smm
827342361Smm	// f1, content "onetwothree\n", size 12 bytes
828342361Smm	assertA(0 == archive_read_next_header(a, &entry));
829346105Smm	buf_size = (size_t) archive_entry_size(entry);
830342361Smm	assertA(buf_size == 12);
831342361Smm	buf = (unsigned char*) malloc(buf_size);
832342361Smm	assertA(NULL != buf);
833346105Smm	assertA(buf_size == (size_t) archive_read_data(a, buf, buf_size));
834342361Smm	free(buf);
835342361Smm
836342361Smm	// f2, content "fourfivesix\n", size 12 bytes
837342361Smm	assertA(0 == archive_read_next_header(a, &entry));
838346105Smm	buf_size = (size_t) archive_entry_size(entry);
839342361Smm	assertA(buf_size == 12);
840342361Smm	buf = (unsigned char*) malloc(buf_size);
841342361Smm	assertA(NULL != buf);
842346105Smm	assertA(buf_size == (size_t) archive_read_data(a, buf, buf_size));
843342361Smm	free(buf);
844342361Smm
845342361Smm	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
846342361Smm}
847342361Smm
848228753SmmDEFINE_TEST(test_read_format_xar)
849228753Smm{
850228753Smm	verify(archive1, sizeof(archive1), verify0, verify1, GZIP);
851228753Smm	verify(archive2, sizeof(archive2), verify0, verify2, GZIP);
852228753Smm	verify(archive3, sizeof(archive3), verify3, NULL, GZIP);
853228753Smm	verify(archive4, sizeof(archive4), verify4, NULL, GZIP);
854228753Smm	verify(archive5, sizeof(archive5), verify5, NULL, GZIP);
855228753Smm	verify(archive6, sizeof(archive6), verify6, NULL, GZIP);
856228753Smm	verify(archive7, sizeof(archive7), verify7, NULL, GZIP);
857228753Smm	verify(archive8, sizeof(archive8), verify0, NULL, BZIP2);
858228753Smm	verify(archive9, sizeof(archive9), verify0, NULL, GZIP);
859228753Smm	verify(archive10, sizeof(archive10), verify0, NULL, GZIP);
860228753Smm	verify(archive11, sizeof(archive11), verify0, NULL, GZIP);
861342361Smm        verify(archive12, sizeof(archive12), verify12, NULL, GZIP);
862342361Smm	verifyB(archive13, sizeof(archive13));
863228753Smm}
864