xref: /freebsd/contrib/libarchive/tar/test/test_option_T_upper.c (revision b64c5a0ace59af62eff52bfe110a521dc73c937b)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2003-2008 Tim Kientzle
5  * All rights reserved.
6  */
7 #include "test.h"
8 
9 static int
10 tryMakeFile(const char *fn)
11 {
12 	FILE *f = fopen(fn, "w");
13 	if (f == NULL)
14 		return (0);
15 	fclose(f);
16 	return (1);
17 }
18 
19 DEFINE_TEST(test_option_T_upper)
20 {
21 	FILE *f;
22 	int r;
23 	int gnarlyFilesSupported;
24 
25 	/* Create a simple dir hierarchy; bail if anything fails. */
26 	if (!assertMakeDir("d1", 0755)) return;
27 	if (!assertMakeDir("d1/d2", 0755))	return;
28 	if (!assertMakeFile("f", 0644, "")) return;
29 	if (!assertMakeFile("d1/f1", 0644, "")) return;
30 	if (!assertMakeFile("d1/f2", 0644, "")) return;
31 	if (!assertMakeFile("d1/d2/f3", 0644, "")) return;
32 	if (!assertMakeFile("d1/d2/f4", 0644, "")) return;
33 	if (!assertMakeFile("d1/d2/f5", 0644, "")) return;
34 	if (!assertMakeFile("d1/d2/f6", 0644, "")) return;
35 	/* Some platforms don't permit such things; just skip it. */
36 	gnarlyFilesSupported = tryMakeFile("d1/d2/f\x0a");
37 
38 	/* Populate a file list */
39 	f = fopen("filelist", "w+");
40 	if (!assert(f != NULL))
41 		return;
42 	/* Use a variety of text line endings. */
43 	fprintf(f, "f\x0d"); /* CR */
44 	fprintf(f, "d1/f1\x0d\x0a"); /* CRLF */
45 	fprintf(f, "d1/d2/f4\x0a"); /* NL */
46 	fprintf(f, "d1/d2/f6"); /* EOF */
47 	fclose(f);
48 
49 	/* Populate a second file list */
50 	f = fopen("filelist2", "w+");
51 	if (!assert(f != NULL))
52 		return;
53 	/* Use null-terminated names. */
54 	fprintf(f, "d1/d2/f3");
55 	assertEqualInt(1, fwrite("\0", 1, 1, f));
56 	fprintf(f, "d1/d2/f5");
57 	assertEqualInt(1, fwrite("\0", 1, 1, f));
58 	if (gnarlyFilesSupported) {
59 		fprintf(f, "d1/d2/f\x0a");
60 		assertEqualInt(1, fwrite("\0", 1, 1, f));
61 	}
62 	fclose(f);
63 
64 	/* Use -c -T to archive up the files. */
65 	r = systemf("%s -c -f test1.tar -T filelist > test1.out 2> test1.err",
66 	    testprog);
67 	assert(r == 0);
68 	assertEmptyFile("test1.out");
69 	assertEmptyFile("test1.err");
70 
71 	/* Use -x -T to dearchive the files */
72 	if (!assertMakeDir("test1", 0755)) return;
73 	systemf("%s -x -f test1.tar -T filelist -C test1"
74 	    " > test1b.out 2> test1b.err", testprog);
75 	assertEmptyFile("test1b.out");
76 	assertEmptyFile("test1b.err");
77 
78 	/* Verify the files were extracted. */
79 	assertFileExists("test1/f");
80 	assertFileExists("test1/d1/f1");
81 	assertFileNotExists("test1/d1/f2");
82 	assertFileNotExists("test1/d1/d2/f3");
83 	assertFileExists("test1/d1/d2/f4");
84 	assertFileNotExists("test1/d1/d2/f5");
85 	assertFileExists("test1/d1/d2/f6");
86 	if (gnarlyFilesSupported) {
87 		assertFileNotExists("test1/d1/d2/f\x0a");
88 	}
89 
90 	/* Use -r -T to add more files to the archive. */
91 	systemf("%s -r -f test1.tar --null -T filelist2 > test2.out 2> test2.err",
92 	    testprog);
93 	assertEmptyFile("test2.out");
94 	assertEmptyFile("test2.err");
95 
96 	/* Use -x without -T to dearchive the files (ensure -r worked) */
97 	if (!assertMakeDir("test3", 0755)) return;
98 	systemf("%s -x -f test1.tar -C test3"
99 	    " > test3.out 2> test3.err", testprog);
100 	assertEmptyFile("test3.out");
101 	assertEmptyFile("test3.err");
102 	/* Verify the files were extracted.*/
103 	assertFileExists("test3/f");
104 	assertFileExists("test3/d1/f1");
105 	assertFileNotExists("test3/d1/f2");
106 	assertFileExists("test3/d1/d2/f3");
107 	assertFileExists("test3/d1/d2/f4");
108 	assertFileExists("test3/d1/d2/f5");
109 	assertFileExists("test3/d1/d2/f6");
110 	if (gnarlyFilesSupported) {
111 		assertFileExists("test3/d1/d2/f\x0a");
112 	}
113 
114 	/* Use -x -T to dearchive the files (verify -x -T together) */
115 	if (!assertMakeDir("test2", 0755)) return;
116 	systemf("%s -x -f test1.tar -T filelist -C test2"
117 	    " > test2b.out 2> test2b.err", testprog);
118 	assertEmptyFile("test2b.out");
119 	assertEmptyFile("test2b.err");
120 	/* Verify the files were extracted.*/
121 	assertFileExists("test2/f");
122 	assertFileExists("test2/d1/f1");
123 	assertFileNotExists("test2/d1/f2");
124 	assertFileNotExists("test2/d1/d2/f3");
125 	assertFileExists("test2/d1/d2/f4");
126 	assertFileNotExists("test2/d1/d2/f5");
127 	assertFileExists("test2/d1/d2/f6");
128 	if (gnarlyFilesSupported) {
129 		assertFileNotExists("test2/d1/d2/f\x0a");
130 	}
131 
132 	assertMakeDir("test4", 0755);
133 	assertMakeDir("test4_out", 0755);
134 	assertMakeDir("test4_out2", 0755);
135 	assertMakeDir("test4/d1", 0755);
136 	assertMakeFile("test4/d1/foo", 0644, "");
137 
138 
139 	/* TODO: Include some use of -C directory-changing within the filelist. */
140 	/* I'm pretty sure -C within the filelist is broken on extract. */
141 }
142