xref: /freebsd/contrib/libarchive/cpio/test/test_passthrough_reverse.c (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
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