xref: /freebsd/contrib/libarchive/tar/test/test_option_mtime.c (revision 2e113ef82465598b8c26e0ca415fbe90677fbd47)
1*2e113ef8SMartin Matuska /*-
2*2e113ef8SMartin Matuska  * SPDX-License-Identifier: BSD-2-Clause
3*2e113ef8SMartin Matuska  *
4*2e113ef8SMartin Matuska  * Copyright (c) 2025 Zhaofeng Li
5*2e113ef8SMartin Matuska  * All rights reserved.
6*2e113ef8SMartin Matuska  */
7*2e113ef8SMartin Matuska #include "test.h"
8*2e113ef8SMartin Matuska 
9*2e113ef8SMartin Matuska #if defined(_WIN32) && !defined(__CYGWIN__)
10*2e113ef8SMartin Matuska /* system() on Windows runs its arguments through CMD.EXE, which has
11*2e113ef8SMartin Matuska  * notoriously unfriendly quoting rules. The current best documented way around
12*2e113ef8SMartin Matuska  * them is to wrap your *entire commandline* in sacrificial quotes.
13*2e113ef8SMartin Matuska  *
14*2e113ef8SMartin Matuska  * See CMD.EXE /? for more information. Excerpted here:
15*2e113ef8SMartin Matuska  * | Otherwise, old behavior is to see if the first character is
16*2e113ef8SMartin Matuska  * | a quote character and if so, strip the leading character and
17*2e113ef8SMartin Matuska  * | remove the last quote character on the command line, preserving
18*2e113ef8SMartin Matuska  * | any text after the last quote character.
19*2e113ef8SMartin Matuska  *
20*2e113ef8SMartin Matuska  * Since this test makes heavy use of systemf() with quoted arguments inside
21*2e113ef8SMartin Matuska  * the commandline, this macro is unfortunately an easier workaround.
22*2e113ef8SMartin Matuska  */
23*2e113ef8SMartin Matuska #define systemf(command, ...) systemf("\"" command "\"", __VA_ARGS__)
24*2e113ef8SMartin Matuska #endif
25*2e113ef8SMartin Matuska 
DEFINE_TEST(test_option_mtime)26*2e113ef8SMartin Matuska DEFINE_TEST(test_option_mtime)
27*2e113ef8SMartin Matuska {
28*2e113ef8SMartin Matuska 	/* Create three files with different mtimes. */
29*2e113ef8SMartin Matuska 	assertMakeDir("in", 0755);
30*2e113ef8SMartin Matuska 	assertChdir("in");
31*2e113ef8SMartin Matuska 	assertMakeFile("new_mtime", 0666, "new");
32*2e113ef8SMartin Matuska 	assertUtimes("new_mtime", 100000, 0, 100000, 0);
33*2e113ef8SMartin Matuska 	assertMakeFile("mid_mtime", 0666, "mid");
34*2e113ef8SMartin Matuska 	assertUtimes("mid_mtime", 10000, 0, 10000, 0);
35*2e113ef8SMartin Matuska 	assertMakeFile("old_mtime", 0666, "old");
36*2e113ef8SMartin Matuska 	// assertion_utimes silently discards 0 :(
37*2e113ef8SMartin Matuska 	assertUtimes("old_mtime", 1, 0, 1, 0);
38*2e113ef8SMartin Matuska 
39*2e113ef8SMartin Matuska 	/* Archive with --mtime 86400 */
40*2e113ef8SMartin Matuska 	assertEqualInt(0,
41*2e113ef8SMartin Matuska 		systemf("%s --format pax -cf ../noclamp.tar "
42*2e113ef8SMartin Matuska 			"--mtime \"1970/1/2 0:0:0 UTC\" .",
43*2e113ef8SMartin Matuska 			testprog));
44*2e113ef8SMartin Matuska 	assertChdir("..");
45*2e113ef8SMartin Matuska 
46*2e113ef8SMartin Matuska 	assertMakeDir("out.noclamp", 0755);
47*2e113ef8SMartin Matuska 	assertChdir("out.noclamp");
48*2e113ef8SMartin Matuska 	assertEqualInt(0, systemf("%s xf ../noclamp.tar", testprog));
49*2e113ef8SMartin Matuska 	assertFileMtime("new_mtime", 86400, 0);
50*2e113ef8SMartin Matuska 	assertFileMtime("mid_mtime", 86400, 0);
51*2e113ef8SMartin Matuska 	assertFileMtime("old_mtime", 86400, 0);
52*2e113ef8SMartin Matuska 	assertChdir("..");
53*2e113ef8SMartin Matuska 
54*2e113ef8SMartin Matuska 	/* Archive with --mtime 86400 --clamp-mtime */
55*2e113ef8SMartin Matuska 	assertChdir("in");
56*2e113ef8SMartin Matuska 	assertEqualInt(0,
57*2e113ef8SMartin Matuska 		systemf("%s --format pax -cf ../clamp.tar "
58*2e113ef8SMartin Matuska 			"--mtime \"1970/1/2 0:0:0 UTC\" --clamp-mtime .",
59*2e113ef8SMartin Matuska 			testprog));
60*2e113ef8SMartin Matuska 	assertChdir("..");
61*2e113ef8SMartin Matuska 
62*2e113ef8SMartin Matuska 	assertMakeDir("out.clamp", 0755);
63*2e113ef8SMartin Matuska 	assertChdir("out.clamp");
64*2e113ef8SMartin Matuska 	assertEqualInt(0, systemf("%s xf ../clamp.tar", testprog));
65*2e113ef8SMartin Matuska 	assertFileMtime("new_mtime", 86400, 0);
66*2e113ef8SMartin Matuska 	assertFileMtime("mid_mtime", 10000, 0);
67*2e113ef8SMartin Matuska 	assertFileMtime("old_mtime", 1, 0);
68*2e113ef8SMartin Matuska 	assertChdir("..");
69*2e113ef8SMartin Matuska 
70*2e113ef8SMartin Matuska 	/* Archive-to-archive copy with --mtime 0 */
71*2e113ef8SMartin Matuska 	assertEqualInt(0,
72*2e113ef8SMartin Matuska 		systemf("%s --format pax -cf ./archive2archive.tar "
73*2e113ef8SMartin Matuska 			"--mtime \"1970/1/1 0:0:0 UTC\" @noclamp.tar",
74*2e113ef8SMartin Matuska 			testprog));
75*2e113ef8SMartin Matuska 	assertMakeDir("out.archive2archive", 0755);
76*2e113ef8SMartin Matuska 	assertChdir("out.archive2archive");
77*2e113ef8SMartin Matuska 	assertEqualInt(0, systemf("%s xf ../archive2archive.tar", testprog));
78*2e113ef8SMartin Matuska 	assertFileMtime("new_mtime", 0, 0);
79*2e113ef8SMartin Matuska 	assertFileMtime("mid_mtime", 0, 0);
80*2e113ef8SMartin Matuska 	assertFileMtime("old_mtime", 0, 0);
81*2e113ef8SMartin Matuska 	assertChdir("..");
82*2e113ef8SMartin Matuska }
83