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
96c95142eSMartin Matuska #ifdef HAVE_LOCALE_H
106c95142eSMartin Matuska #include <locale.h>
116c95142eSMartin Matuska #endif
12caf54c4fSMartin Matuska
DEFINE_TEST(test_option_t)13caf54c4fSMartin Matuska DEFINE_TEST(test_option_t)
14caf54c4fSMartin Matuska {
15caf54c4fSMartin Matuska char *p;
16caf54c4fSMartin Matuska int r;
176c95142eSMartin Matuska time_t mtime;
18*bd66c1b4SMartin Matuska char date[48];
196c95142eSMartin Matuska char date2[32];
20bd5e624aSMartin Matuska struct tm *tmptr;
21e64fe029SMartin Matuska #if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S)
22bd5e624aSMartin Matuska struct tm tmbuf;
23bd5e624aSMartin Matuska #endif
24caf54c4fSMartin Matuska
25caf54c4fSMartin Matuska /* List reference archive, make sure the TOC is correct. */
26caf54c4fSMartin Matuska extract_reference_file("test_option_t.cpio");
27caf54c4fSMartin Matuska r = systemf("%s -it < test_option_t.cpio >it.out 2>it.err", testprog);
28caf54c4fSMartin Matuska assertEqualInt(r, 0);
29caf54c4fSMartin Matuska assertTextFileContents("1 block\n", "it.err");
30caf54c4fSMartin Matuska extract_reference_file("test_option_t.stdout");
31caf54c4fSMartin Matuska p = slurpfile(NULL, "test_option_t.stdout");
32caf54c4fSMartin Matuska assertTextFileContents(p, "it.out");
33caf54c4fSMartin Matuska free(p);
34caf54c4fSMartin Matuska
35caf54c4fSMartin Matuska /* We accept plain "-t" as a synonym for "-it" */
36caf54c4fSMartin Matuska r = systemf("%s -t < test_option_t.cpio >t.out 2>t.err", testprog);
37caf54c4fSMartin Matuska assertEqualInt(r, 0);
38caf54c4fSMartin Matuska assertTextFileContents("1 block\n", "t.err");
39caf54c4fSMartin Matuska extract_reference_file("test_option_t.stdout");
40caf54c4fSMartin Matuska p = slurpfile(NULL, "test_option_t.stdout");
41caf54c4fSMartin Matuska assertTextFileContents(p, "t.out");
42caf54c4fSMartin Matuska free(p);
43caf54c4fSMartin Matuska
44caf54c4fSMartin Matuska /* But "-ot" is an error. */
45caf54c4fSMartin Matuska assert(0 != systemf("%s -ot < test_option_t.cpio >ot.out 2>ot.err",
46caf54c4fSMartin Matuska testprog));
47caf54c4fSMartin Matuska assertEmptyFile("ot.out");
48caf54c4fSMartin Matuska
49caf54c4fSMartin Matuska /* List reference archive verbosely, make sure the TOC is correct. */
50caf54c4fSMartin Matuska r = systemf("%s -itv < test_option_t.cpio >tv.out 2>tv.err", testprog);
51caf54c4fSMartin Matuska assertEqualInt(r, 0);
52caf54c4fSMartin Matuska assertTextFileContents("1 block\n", "tv.err");
53caf54c4fSMartin Matuska extract_reference_file("test_option_tv.stdout");
54caf54c4fSMartin Matuska
55caf54c4fSMartin Matuska /* This doesn't work because the usernames on different systems
56caf54c4fSMartin Matuska * are different and cpio now looks up numeric UIDs on
57caf54c4fSMartin Matuska * the local system. */
58caf54c4fSMartin Matuska /* assertEqualFile("tv.out", "test_option_tv.stdout"); */
59caf54c4fSMartin Matuska
60caf54c4fSMartin Matuska /* List reference archive with numeric IDs, verify TOC is correct. */
61caf54c4fSMartin Matuska r = systemf("%s -itnv < test_option_t.cpio >itnv.out 2>itnv.err",
62caf54c4fSMartin Matuska testprog);
63caf54c4fSMartin Matuska assertEqualInt(r, 0);
64caf54c4fSMartin Matuska assertTextFileContents("1 block\n", "itnv.err");
65caf54c4fSMartin Matuska p = slurpfile(NULL, "itnv.out");
66caf54c4fSMartin Matuska /* Since -n uses numeric UID/GID, this part should be the
67caf54c4fSMartin Matuska * same on every system. */
68caf54c4fSMartin Matuska assertEqualMem(p, "-rw-r--r-- 1 1000 1000 0 ",42);
696c95142eSMartin Matuska
706c95142eSMartin Matuska /* Date varies depending on local timezone and locale. */
716c95142eSMartin Matuska mtime = 1;
726c95142eSMartin Matuska #ifdef HAVE_LOCALE_H
736c95142eSMartin Matuska setlocale(LC_ALL, "");
74*bd66c1b4SMartin Matuska setlocale(LC_TIME, "");
756c95142eSMartin Matuska #endif
76e64fe029SMartin Matuska #if defined(HAVE_LOCALTIME_S)
77e64fe029SMartin Matuska tmptr = localtime_s(&tmbuf, &mtime) ? NULL : &tmbuf;
78e64fe029SMartin Matuska #elif defined(HAVE_LOCALTIME_R)
79bd5e624aSMartin Matuska tmptr = localtime_r(&mtime, &tmbuf);
80bd5e624aSMartin Matuska #else
81bd5e624aSMartin Matuska tmptr = localtime(&mtime);
82bd5e624aSMartin Matuska #endif
836c95142eSMartin Matuska #if defined(_WIN32) && !defined(__CYGWIN__)
84bd5e624aSMartin Matuska strftime(date2, sizeof(date2)-1, "%b %d %Y", tmptr);
85*bd66c1b4SMartin Matuska _snprintf(date, sizeof(date)-1, "%12s file", date2);
866c95142eSMartin Matuska #else
87bd5e624aSMartin Matuska strftime(date2, sizeof(date2)-1, "%b %e %Y", tmptr);
88*bd66c1b4SMartin Matuska snprintf(date, sizeof(date)-1, "%12s file", date2);
896c95142eSMartin Matuska #endif
906c95142eSMartin Matuska assertEqualMem(p + 42, date, strlen(date));
91caf54c4fSMartin Matuska free(p);
92caf54c4fSMartin Matuska
93caf54c4fSMartin Matuska /* But "-n" without "-t" is an error. */
94caf54c4fSMartin Matuska assert(0 != systemf("%s -in < test_option_t.cpio >in.out 2>in.err",
95caf54c4fSMartin Matuska testprog));
96caf54c4fSMartin Matuska assertEmptyFile("in.out");
97caf54c4fSMartin Matuska }
98