1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2010 Tim Kientzle 5 * All rights reserved. 6 */ 7 #include "test.h" 8 9 DEFINE_TEST(test_option_U_upper) 10 { 11 int r; 12 13 assertMakeFile("file1", 0644, "file1"); 14 assertMakeDir("d1", 0755); 15 assertMakeFile("d1/file1", 0644, "d1/file1"); 16 assertEqualInt(0, systemf("%s -cf archive.tar file1 d1/file1", testprog)); 17 18 /* 19 * bsdtar's man page used to claim that -x without -U would 20 * not break hard links. This was and is nonsense. The first 21 * two tests here simply verify that existing hard links get 22 * broken regardless. 23 */ 24 25 /* Test 1: -x without -U */ 26 assertMakeDir("test1", 0755); 27 assertChdir("test1"); 28 assertMakeFile("file1", 0644, "file1new"); 29 assertMakeHardlink("file2", "file1"); 30 assertEqualInt(0, 31 systemf("%s -xf ../archive.tar >test.out 2>test.err", testprog)); 32 assertFileContents("file1", 5, "file1"); 33 assertFileContents("file1new", 8, "file2"); 34 assertEmptyFile("test.out"); 35 assertEmptyFile("test.err"); 36 assertChdir(".."); 37 38 39 /* Test 2: -x with -U */ 40 assertMakeDir("test2", 0755); 41 assertChdir("test2"); 42 assertMakeFile("file1", 0644, "file1new"); 43 assertMakeHardlink("file2", "file1"); 44 assertEqualInt(0, 45 systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog)); 46 assertFileContents("file1", 5, "file1"); 47 assertFileContents("file1new", 8, "file2"); 48 assertEmptyFile("test.out"); 49 assertEmptyFile("test.err"); 50 assertChdir(".."); 51 52 /* 53 * -U does make a difference in how bsdtar handles unwanted symlinks, 54 * though. It interacts with -P. 55 */ 56 if (!canSymlink()) 57 return; 58 59 /* Test 3: Intermediate dir symlink causes error by default */ 60 assertMakeDir("test3", 0755); 61 assertChdir("test3"); 62 assertMakeDir("realDir", 0755); 63 assertMakeSymlink("d1", "realDir", 1); 64 r = systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog); 65 assert(r != 0); 66 assertIsSymlink("d1", "realDir", 1); 67 assertFileNotExists("d1/file1"); 68 assertEmptyFile("test.out"); 69 assertNonEmptyFile("test.err"); 70 assertChdir(".."); 71 72 /* Test 4: Intermediate dir symlink gets removed with -U */ 73 assertMakeDir("test4", 0755); 74 assertChdir("test4"); 75 assertMakeDir("realDir", 0755); 76 assertMakeSymlink("d1", "realDir", 1); 77 assertEqualInt(0, 78 systemf("%s -xUf ../archive.tar >test.out 2>test.err", testprog)); 79 assertIsDir("d1", -1); 80 assertFileContents("d1/file1", 8, "d1/file1"); 81 assertEmptyFile("test.out"); 82 assertEmptyFile("test.err"); 83 assertChdir(".."); 84 85 /* Test 5: Intermediate dir symlink is followed with -P */ 86 assertMakeDir("test5", 0755); 87 assertChdir("test5"); 88 assertMakeDir("realDir", 0755); 89 assertMakeSymlink("d1", "realDir", 1); 90 assertEqualInt(0, 91 systemf("%s -xPf ../archive.tar d1/file1 >test.out 2>test.err", testprog)); 92 assertIsSymlink("d1", "realDir", 1); 93 assertFileContents("d1/file1", 8, "d1/file1"); 94 assertEmptyFile("test.out"); 95 assertEmptyFile("test.err"); 96 assertChdir(".."); 97 98 /* Test 6: Intermediate dir symlink is followed with -PU */ 99 assertMakeDir("test6", 0755); 100 assertChdir("test6"); 101 assertMakeDir("realDir", 0755); 102 assertMakeSymlink("d1", "realDir", 1); 103 assertEqualInt(0, 104 systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog)); 105 assertIsSymlink("d1", "realDir", 1); 106 assertFileContents("d1/file1", 8, "d1/file1"); 107 assertEmptyFile("test.out"); 108 assertEmptyFile("test.err"); 109 assertChdir(".."); 110 111 /* Test 7: Final file symlink replaced by default */ 112 assertMakeDir("test7", 0755); 113 assertChdir("test7"); 114 assertMakeDir("d1", 0755); 115 assertMakeFile("d1/realfile1", 0644, "realfile1"); 116 assertMakeSymlink("d1/file1", "d1/realfile1", 0); 117 assertEqualInt(0, 118 systemf("%s -xf ../archive.tar d1/file1 >test.out 2>test.err", testprog)); 119 assertIsReg("d1/file1", umasked(0644)); 120 assertFileContents("d1/file1", 8, "d1/file1"); 121 assertFileContents("realfile1", 9, "d1/realfile1"); 122 assertEmptyFile("test.out"); 123 assertEmptyFile("test.err"); 124 assertChdir(".."); 125 126 /* Test 8: Final file symlink replaced with -PU */ 127 assertMakeDir("test8", 0755); 128 assertChdir("test8"); 129 assertMakeDir("d1", 0755); 130 assertMakeFile("d1/realfile1", 0644, "realfile1"); 131 assertMakeSymlink("d1/file1", "d1/realfile1", 0); 132 assertEqualInt(0, 133 systemf("%s -xPUf ../archive.tar d1/file1 >test.out 2>test.err", testprog)); 134 assertIsReg("d1/file1", umasked(0644)); 135 assertFileContents("d1/file1", 8, "d1/file1"); 136 assertFileContents("realfile1", 9, "d1/realfile1"); 137 assertEmptyFile("test.out"); 138 assertEmptyFile("test.err"); 139 assertChdir(".."); 140 } 141