xref: /freebsd/contrib/libarchive/tar/test/test_option_U_upper.c (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
16c95142eSMartin Matuska /*-
2*bd66c1b4SMartin Matuska  * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska  *
46c95142eSMartin Matuska  * Copyright (c) 2010 Tim Kientzle
56c95142eSMartin Matuska  * All rights reserved.
66c95142eSMartin Matuska  */
76c95142eSMartin Matuska #include "test.h"
86c95142eSMartin Matuska 
DEFINE_TEST(test_option_U_upper)96c95142eSMartin Matuska DEFINE_TEST(test_option_U_upper)
106c95142eSMartin Matuska {
116c95142eSMartin Matuska 	int r;
126c95142eSMartin Matuska 
136c95142eSMartin Matuska 	assertMakeFile("file1", 0644, "file1");
146c95142eSMartin Matuska 	assertMakeDir("d1", 0755);
156c95142eSMartin Matuska 	assertMakeFile("d1/file1", 0644, "d1/file1");
166c95142eSMartin Matuska 	assertEqualInt(0, systemf("%s -cf archive.tar file1 d1/file1", testprog));
176c95142eSMartin Matuska 
186c95142eSMartin Matuska 	/*
196c95142eSMartin Matuska 	 * bsdtar's man page used to claim that -x without -U would
206c95142eSMartin Matuska 	 * not break hard links.  This was and is nonsense.  The first
216c95142eSMartin Matuska 	 * two tests here simply verify that existing hard links get
226c95142eSMartin Matuska 	 * broken regardless.
236c95142eSMartin Matuska 	 */
246c95142eSMartin Matuska 
256c95142eSMartin Matuska 	/* Test 1: -x without -U */
266c95142eSMartin Matuska 	assertMakeDir("test1", 0755);
276c95142eSMartin Matuska 	assertChdir("test1");
286c95142eSMartin Matuska 	assertMakeFile("file1", 0644, "file1new");
296c95142eSMartin Matuska 	assertMakeHardlink("file2", "file1");
306c95142eSMartin Matuska 	assertEqualInt(0,
316c95142eSMartin Matuska 	    systemf("%s -xf ../archive.tar >test.out 2>test.err", testprog));
326c95142eSMartin Matuska 	assertFileContents("file1", 5, "file1");
336c95142eSMartin Matuska 	assertFileContents("file1new", 8, "file2");
346c95142eSMartin Matuska 	assertEmptyFile("test.out");
356c95142eSMartin Matuska 	assertEmptyFile("test.err");
366c95142eSMartin Matuska 	assertChdir("..");
376c95142eSMartin Matuska 
386c95142eSMartin Matuska 
396c95142eSMartin Matuska 	/* Test 2: -x with -U */
406c95142eSMartin Matuska 	assertMakeDir("test2", 0755);
416c95142eSMartin Matuska 	assertChdir("test2");
426c95142eSMartin Matuska 	assertMakeFile("file1", 0644, "file1new");
436c95142eSMartin Matuska 	assertMakeHardlink("file2", "file1");
446c95142eSMartin Matuska 	assertEqualInt(0,
456c95142eSMartin Matuska 	    systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog));
466c95142eSMartin Matuska 	assertFileContents("file1", 5, "file1");
476c95142eSMartin Matuska 	assertFileContents("file1new", 8, "file2");
486c95142eSMartin Matuska 	assertEmptyFile("test.out");
496c95142eSMartin Matuska 	assertEmptyFile("test.err");
506c95142eSMartin Matuska 	assertChdir("..");
516c95142eSMartin Matuska 
526c95142eSMartin Matuska 	/*
536c95142eSMartin Matuska 	 * -U does make a difference in how bsdtar handles unwanted symlinks,
546c95142eSMartin Matuska 	 * though.  It interacts with -P.
556c95142eSMartin Matuska 	 */
566c95142eSMartin Matuska 	if (!canSymlink())
576c95142eSMartin Matuska 		return;
586c95142eSMartin Matuska 
596c95142eSMartin Matuska 	/* Test 3: Intermediate dir symlink causes error by default */
606c95142eSMartin Matuska 	assertMakeDir("test3", 0755);
616c95142eSMartin Matuska 	assertChdir("test3");
626c95142eSMartin Matuska 	assertMakeDir("realDir", 0755);
6352c2bb75SMartin Matuska 	assertMakeSymlink("d1", "realDir", 1);
646c95142eSMartin Matuska 	r = systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog);
656c95142eSMartin Matuska 	assert(r != 0);
6652c2bb75SMartin Matuska 	assertIsSymlink("d1", "realDir", 1);
676c95142eSMartin Matuska 	assertFileNotExists("d1/file1");
686c95142eSMartin Matuska 	assertEmptyFile("test.out");
696c95142eSMartin Matuska 	assertNonEmptyFile("test.err");
706c95142eSMartin Matuska 	assertChdir("..");
716c95142eSMartin Matuska 
726c95142eSMartin Matuska 	/* Test 4: Intermediate dir symlink gets removed with -U */
736c95142eSMartin Matuska 	assertMakeDir("test4", 0755);
746c95142eSMartin Matuska 	assertChdir("test4");
756c95142eSMartin Matuska 	assertMakeDir("realDir", 0755);
7652c2bb75SMartin Matuska 	assertMakeSymlink("d1", "realDir", 1);
776c95142eSMartin Matuska 	assertEqualInt(0,
786c95142eSMartin Matuska 	    systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog));
796c95142eSMartin Matuska 	assertIsDir("d1", -1);
806c95142eSMartin Matuska 	assertFileContents("d1/file1", 8, "d1/file1");
816c95142eSMartin Matuska 	assertEmptyFile("test.out");
826c95142eSMartin Matuska 	assertEmptyFile("test.err");
836c95142eSMartin Matuska 	assertChdir("..");
846c95142eSMartin Matuska 
856c95142eSMartin Matuska 	/* Test 5: Intermediate dir symlink is followed with -P */
866c95142eSMartin Matuska 	assertMakeDir("test5", 0755);
876c95142eSMartin Matuska 	assertChdir("test5");
886c95142eSMartin Matuska 	assertMakeDir("realDir", 0755);
8952c2bb75SMartin Matuska 	assertMakeSymlink("d1", "realDir", 1);
906c95142eSMartin Matuska 	assertEqualInt(0,
916c95142eSMartin Matuska 	    systemf("%s -xPf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
9252c2bb75SMartin Matuska 	assertIsSymlink("d1", "realDir", 1);
936c95142eSMartin Matuska 	assertFileContents("d1/file1", 8, "d1/file1");
946c95142eSMartin Matuska 	assertEmptyFile("test.out");
956c95142eSMartin Matuska 	assertEmptyFile("test.err");
966c95142eSMartin Matuska 	assertChdir("..");
976c95142eSMartin Matuska 
986c95142eSMartin Matuska 	/* Test 6: Intermediate dir symlink is followed with -PU */
996c95142eSMartin Matuska 	assertMakeDir("test6", 0755);
1006c95142eSMartin Matuska 	assertChdir("test6");
1016c95142eSMartin Matuska 	assertMakeDir("realDir", 0755);
10252c2bb75SMartin Matuska 	assertMakeSymlink("d1", "realDir", 1);
1036c95142eSMartin Matuska 	assertEqualInt(0,
1046c95142eSMartin Matuska 	    systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
10552c2bb75SMartin Matuska 	assertIsSymlink("d1", "realDir", 1);
1066c95142eSMartin Matuska 	assertFileContents("d1/file1", 8, "d1/file1");
1076c95142eSMartin Matuska 	assertEmptyFile("test.out");
1086c95142eSMartin Matuska 	assertEmptyFile("test.err");
1096c95142eSMartin Matuska 	assertChdir("..");
1106c95142eSMartin Matuska 
1116c95142eSMartin Matuska 	/* Test 7: Final file symlink replaced by default */
1126c95142eSMartin Matuska 	assertMakeDir("test7", 0755);
1136c95142eSMartin Matuska 	assertChdir("test7");
1146c95142eSMartin Matuska 	assertMakeDir("d1", 0755);
1156c95142eSMartin Matuska 	assertMakeFile("d1/realfile1", 0644, "realfile1");
11652c2bb75SMartin Matuska 	assertMakeSymlink("d1/file1", "d1/realfile1", 0);
1176c95142eSMartin Matuska 	assertEqualInt(0,
1186c95142eSMartin Matuska 	    systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
119f3e9b21aSMartin Matuska 	assertIsReg("d1/file1", umasked(0644));
1206c95142eSMartin Matuska 	assertFileContents("d1/file1", 8, "d1/file1");
1216c95142eSMartin Matuska 	assertFileContents("realfile1", 9, "d1/realfile1");
1226c95142eSMartin Matuska 	assertEmptyFile("test.out");
1236c95142eSMartin Matuska 	assertEmptyFile("test.err");
1246c95142eSMartin Matuska 	assertChdir("..");
1256c95142eSMartin Matuska 
1266c95142eSMartin Matuska 	/* Test 8: Final file symlink replaced with -PU */
1276c95142eSMartin Matuska 	assertMakeDir("test8", 0755);
1286c95142eSMartin Matuska 	assertChdir("test8");
1296c95142eSMartin Matuska 	assertMakeDir("d1", 0755);
1306c95142eSMartin Matuska 	assertMakeFile("d1/realfile1", 0644, "realfile1");
13152c2bb75SMartin Matuska 	assertMakeSymlink("d1/file1", "d1/realfile1", 0);
1326c95142eSMartin Matuska 	assertEqualInt(0,
1336c95142eSMartin Matuska 	    systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog));
134f3e9b21aSMartin Matuska 	assertIsReg("d1/file1", umasked(0644));
1356c95142eSMartin Matuska 	assertFileContents("d1/file1", 8, "d1/file1");
1366c95142eSMartin Matuska 	assertFileContents("realfile1", 9, "d1/realfile1");
1376c95142eSMartin Matuska 	assertEmptyFile("test.out");
1386c95142eSMartin Matuska 	assertEmptyFile("test.err");
1396c95142eSMartin Matuska 	assertChdir("..");
1406c95142eSMartin Matuska }
141