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_isorr_new_bz2.c 201247 2009-12-30 05:59:21Z kientzle $");
27*543adbedSBen Gras 
28*543adbedSBen Gras 
29*543adbedSBen Gras /*
30*543adbedSBen Gras PLEASE use latest cdrtools at least mkisofs version is 2.01.01a63 or later.
31*543adbedSBen Gras Old version mkisofs made wrong "SL" System Use Entry of RRIP.
32*543adbedSBen Gras 
33*543adbedSBen Gras Execute the following command to rebuild the data for this program:
34*543adbedSBen Gras    tail -n +34 test_read_format_isorr_new_bz2.c | /bin/sh
35*543adbedSBen Gras 
36*543adbedSBen Gras rm -rf /tmp/iso
37*543adbedSBen Gras mkdir /tmp/iso
38*543adbedSBen Gras mkdir /tmp/iso/dir
39*543adbedSBen Gras echo "hello" >/tmp/iso/file
40*543adbedSBen Gras dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file
41*543adbedSBen Gras ln /tmp/iso/file /tmp/iso/hardlink
42*543adbedSBen Gras (cd /tmp/iso; ln -s file symlink)
43*543adbedSBen Gras (cd /tmp/iso; ln -s /tmp/ symlink2)
44*543adbedSBen Gras (cd /tmp/iso; ln -s /tmp/../ symlink3)
45*543adbedSBen Gras (cd /tmp/iso; ln -s .././../tmp/ symlink4)
46*543adbedSBen Gras (cd /tmp/iso; ln -s .///file symlink5)
47*543adbedSBen Gras (cd /tmp/iso; ln -s /tmp//../ symlink6)
48*543adbedSBen Gras TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
49*543adbedSBen Gras TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
50*543adbedSBen Gras F=test_read_format_iso_rockridge_new.iso.Z
51*543adbedSBen Gras mkhybrid -R -uid 1 -gid 2 /tmp/iso | compress > $F
52*543adbedSBen Gras uuencode $F $F > $F.uu
53*543adbedSBen Gras exit 1
54*543adbedSBen Gras  */
55*543adbedSBen Gras 
DEFINE_TEST(test_read_format_isorr_new_bz2)56*543adbedSBen Gras DEFINE_TEST(test_read_format_isorr_new_bz2)
57*543adbedSBen Gras {
58*543adbedSBen Gras 	const char *refname = "test_read_format_iso_rockridge_new.iso.Z";
59*543adbedSBen Gras 	struct archive_entry *ae;
60*543adbedSBen Gras 	struct archive *a;
61*543adbedSBen Gras 	const void *p;
62*543adbedSBen Gras 	size_t size;
63*543adbedSBen Gras 	off_t offset;
64*543adbedSBen Gras 	int i;
65*543adbedSBen Gras 
66*543adbedSBen Gras 	extract_reference_file(refname);
67*543adbedSBen Gras 	assert((a = archive_read_new()) != NULL);
68*543adbedSBen Gras 	assertEqualInt(0, archive_read_support_compression_all(a));
69*543adbedSBen Gras 	assertEqualInt(0, archive_read_support_format_all(a));
70*543adbedSBen Gras 	assertEqualInt(ARCHIVE_OK,
71*543adbedSBen Gras 	    archive_read_open_filename(a, refname, 10240));
72*543adbedSBen Gras 
73*543adbedSBen Gras 	/* Retrieve each of the 8 files on the ISO image and
74*543adbedSBen Gras 	 * verify that each one is what we expect. */
75*543adbedSBen Gras 	for (i = 0; i < 10; ++i) {
76*543adbedSBen Gras 		assertEqualInt(0, archive_read_next_header(a, &ae));
77*543adbedSBen Gras 
78*543adbedSBen Gras 		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
79*543adbedSBen Gras 			/* '.' root directory. */
80*543adbedSBen Gras 			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
81*543adbedSBen Gras 			assertEqualInt(2048, archive_entry_size(ae));
82*543adbedSBen Gras 			/* Now, we read timestamp recorded by RRIP "TF". */
83*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_mtime(ae));
84*543adbedSBen Gras 			assertEqualInt(0, archive_entry_mtime_nsec(ae));
85*543adbedSBen Gras 			/* Now, we read links recorded by RRIP "PX". */
86*543adbedSBen Gras 			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
87*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
88*543adbedSBen Gras 			assertEqualIntA(a, ARCHIVE_EOF,
89*543adbedSBen Gras 			    archive_read_data_block(a, &p, &size, &offset));
90*543adbedSBen Gras 			assertEqualInt((int)size, 0);
91*543adbedSBen Gras 		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
92*543adbedSBen Gras 			/* A directory. */
93*543adbedSBen Gras 			assertEqualString("dir", archive_entry_pathname(ae));
94*543adbedSBen Gras 			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
95*543adbedSBen Gras 			assertEqualInt(2048, archive_entry_size(ae));
96*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_mtime(ae));
97*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_atime(ae));
98*543adbedSBen Gras 			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
99*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
100*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
101*543adbedSBen Gras 		} else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) {
102*543adbedSBen Gras 			/* A regular file. */
103*543adbedSBen Gras 			assertEqualString("hardlink", archive_entry_pathname(ae));
104*543adbedSBen Gras 			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
105*543adbedSBen Gras 			assertEqualInt(12345684, archive_entry_size(ae));
106*543adbedSBen Gras 			assertEqualInt(0,
107*543adbedSBen Gras 			    archive_read_data_block(a, &p, &size, &offset));
108*543adbedSBen Gras 			assertEqualInt(0, offset);
109*543adbedSBen Gras 			assertEqualMem(p, "hello\n", 6);
110*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_mtime(ae));
111*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_atime(ae));
112*543adbedSBen Gras 			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
113*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
114*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
115*543adbedSBen Gras 		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
116*543adbedSBen Gras 			/* A hardlink to the regular file. */
117*543adbedSBen Gras 			/* Note: If "hardlink" gets returned before "file",
118*543adbedSBen Gras 			 * then "hardlink" will get returned as a regular file
119*543adbedSBen Gras 			 * and "file" will get returned as the hardlink.
120*543adbedSBen Gras 			 * This test should tolerate that, since it's a
121*543adbedSBen Gras 			 * perfectly permissible thing for libarchive to do. */
122*543adbedSBen Gras 			assertEqualString("file", archive_entry_pathname(ae));
123*543adbedSBen Gras 			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
124*543adbedSBen Gras 			assertEqualString("hardlink", archive_entry_hardlink(ae));
125*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size_is_set(ae));
126*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
127*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_mtime(ae));
128*543adbedSBen Gras 			assertEqualInt(86401, archive_entry_atime(ae));
129*543adbedSBen Gras 			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
130*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
131*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
132*543adbedSBen Gras 		} else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) {
133*543adbedSBen Gras 			/* A symlink to the regular file. */
134*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
135*543adbedSBen Gras 			assertEqualString("file", archive_entry_symlink(ae));
136*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
137*543adbedSBen Gras 			assertEqualInt(172802, archive_entry_mtime(ae));
138*543adbedSBen Gras 			assertEqualInt(172802, archive_entry_atime(ae));
139*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
140*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
141*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
142*543adbedSBen Gras 		} else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) {
143*543adbedSBen Gras 			/* A symlink to /tmp/ (an absolute path) */
144*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
145*543adbedSBen Gras 			assertEqualString("/tmp/", archive_entry_symlink(ae));
146*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
147*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
148*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
149*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
150*543adbedSBen Gras 		} else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) {
151*543adbedSBen Gras 			/* A symlink to /tmp/../ (with a ".." component) */
152*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
153*543adbedSBen Gras 			assertEqualString("/tmp/../", archive_entry_symlink(ae));
154*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
155*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
156*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
157*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
158*543adbedSBen Gras 		} else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) {
159*543adbedSBen Gras 			/* A symlink to a path with ".." and "." components */
160*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
161*543adbedSBen Gras 			assertEqualString(".././../tmp/",
162*543adbedSBen Gras 			    archive_entry_symlink(ae));
163*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
164*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
165*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
166*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
167*543adbedSBen Gras 		} else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) {
168*543adbedSBen Gras 			/* A symlink to the regular file with "/" components. */
169*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
170*543adbedSBen Gras 			assertEqualString(".///file", archive_entry_symlink(ae));
171*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
172*543adbedSBen Gras 			assertEqualInt(172802, archive_entry_mtime(ae));
173*543adbedSBen Gras 			assertEqualInt(172802, archive_entry_atime(ae));
174*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
175*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
176*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
177*543adbedSBen Gras 		} else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) {
178*543adbedSBen Gras 			/* A symlink to /tmp//../
179*543adbedSBen Gras 			 * (with "/" and ".." components) */
180*543adbedSBen Gras 			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
181*543adbedSBen Gras 			assertEqualString("/tmp//../", archive_entry_symlink(ae));
182*543adbedSBen Gras 			assertEqualInt(0, archive_entry_size(ae));
183*543adbedSBen Gras 			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
184*543adbedSBen Gras 			assertEqualInt(1, archive_entry_uid(ae));
185*543adbedSBen Gras 			assertEqualInt(2, archive_entry_gid(ae));
186*543adbedSBen Gras 		} else {
187*543adbedSBen Gras 			failure("Saw a file that shouldn't have been there");
188*543adbedSBen Gras 			assertEqualString(archive_entry_pathname(ae), "");
189*543adbedSBen Gras 		}
190*543adbedSBen Gras 	}
191*543adbedSBen Gras 
192*543adbedSBen Gras 	/* End of archive. */
193*543adbedSBen Gras 	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
194*543adbedSBen Gras 
195*543adbedSBen Gras 	/* Verify archive format. */
196*543adbedSBen Gras 	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
197*543adbedSBen Gras 	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
198*543adbedSBen Gras 
199*543adbedSBen Gras 	/* Close the archive. */
200*543adbedSBen Gras 	assertEqualInt(0, archive_read_close(a));
201*543adbedSBen Gras 	assertEqualInt(0, archive_read_finish(a));
202*543adbedSBen Gras }
203*543adbedSBen Gras 
204*543adbedSBen Gras 
205