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