1caf54c4fSMartin Matuska /*-
2*bd66c1b4SMartin Matuska * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska *
4caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle
5caf54c4fSMartin Matuska * All rights reserved.
6caf54c4fSMartin Matuska */
7caf54c4fSMartin Matuska #include "test.h"
8caf54c4fSMartin Matuska
9caf54c4fSMartin Matuska /*
10caf54c4fSMartin Matuska * As reported by Bernd Walter: Some people are in the habit of
11caf54c4fSMartin Matuska * using "find -d" to generate a list for cpio -p because that
12caf54c4fSMartin Matuska * copies the top-level dir last, which preserves owner and mode
13caf54c4fSMartin Matuska * information. That's not necessary for bsdcpio (libarchive defers
14caf54c4fSMartin Matuska * restoring directory information), but bsdcpio should still generate
15caf54c4fSMartin Matuska * the correct results with this usage.
16caf54c4fSMartin Matuska */
17caf54c4fSMartin Matuska
DEFINE_TEST(test_passthrough_reverse)18caf54c4fSMartin Matuska DEFINE_TEST(test_passthrough_reverse)
19caf54c4fSMartin Matuska {
20caf54c4fSMartin Matuska int r;
21caf54c4fSMartin Matuska FILE *filelist;
22caf54c4fSMartin Matuska
23caf54c4fSMartin Matuska assertUmask(0);
24caf54c4fSMartin Matuska
25caf54c4fSMartin Matuska /*
26caf54c4fSMartin Matuska * Create an assortment of files on disk.
27caf54c4fSMartin Matuska */
28caf54c4fSMartin Matuska filelist = fopen("filelist", "w");
29caf54c4fSMartin Matuska
30caf54c4fSMartin Matuska /* Directory. */
31caf54c4fSMartin Matuska assertMakeDir("dir", 0743);
32caf54c4fSMartin Matuska
33caf54c4fSMartin Matuska /* File with 10 bytes content. */
34caf54c4fSMartin Matuska assertMakeFile("dir/file", 0644, "1234567890");
35caf54c4fSMartin Matuska fprintf(filelist, "dir/file\n");
36caf54c4fSMartin Matuska
37caf54c4fSMartin Matuska /* Write dir last. */
38caf54c4fSMartin Matuska fprintf(filelist, "dir\n");
39caf54c4fSMartin Matuska
40caf54c4fSMartin Matuska /* All done. */
41caf54c4fSMartin Matuska fclose(filelist);
42caf54c4fSMartin Matuska
43caf54c4fSMartin Matuska
44caf54c4fSMartin Matuska /*
45caf54c4fSMartin Matuska * Use cpio passthrough mode to copy files to another directory.
46caf54c4fSMartin Matuska */
47caf54c4fSMartin Matuska r = systemf("%s -pdvm out <filelist >stdout 2>stderr", testprog);
48caf54c4fSMartin Matuska failure("Error invoking %s -pd out", testprog);
49caf54c4fSMartin Matuska assertEqualInt(r, 0);
50caf54c4fSMartin Matuska
51caf54c4fSMartin Matuska assertChdir("out");
52caf54c4fSMartin Matuska
53caf54c4fSMartin Matuska /* Verify stderr and stdout. */
54caf54c4fSMartin Matuska assertTextFileContents("out/dir/file\nout/dir\n1 block\n",
55caf54c4fSMartin Matuska "../stderr");
56caf54c4fSMartin Matuska assertEmptyFile("../stdout");
57caf54c4fSMartin Matuska
58caf54c4fSMartin Matuska /* dir */
59caf54c4fSMartin Matuska assertIsDir("dir", 0743);
60caf54c4fSMartin Matuska
61caf54c4fSMartin Matuska
62caf54c4fSMartin Matuska /* Regular file. */
63caf54c4fSMartin Matuska assertIsReg("dir/file", 0644);
64caf54c4fSMartin Matuska assertFileSize("dir/file", 10);
65caf54c4fSMartin Matuska assertFileNLinks("dir/file", 1);
66caf54c4fSMartin Matuska }
67