1 /*-
2 * Copyright (c) 2025 Klara, Inc.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7 #include <sys/stat.h>
8
9 #include <fcntl.h>
10 #include <fts.h>
11 #include <stdbool.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15
16 #include <atf-c.h>
17
18 #include "fts_test.h"
19
20 ATF_TC(fts_unrdir);
ATF_TC_HEAD(fts_unrdir,tc)21 ATF_TC_HEAD(fts_unrdir, tc)
22 {
23 atf_tc_set_md_var(tc, "descr", "unreadable directories");
24 atf_tc_set_md_var(tc, "require.user", "unprivileged");
25 }
ATF_TC_BODY(fts_unrdir,tc)26 ATF_TC_BODY(fts_unrdir, tc)
27 {
28 ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
29 ATF_REQUIRE_EQ(0, mkdir("dir/unr", 0100));
30 ATF_REQUIRE_EQ(0, mkdir("dir/unx", 0400));
31 fts_test(tc, &(struct fts_testcase){
32 (char *[]){ "dir", NULL },
33 FTS_PHYSICAL,
34 (struct fts_expect[]){
35 { FTS_D, "dir", "dir" },
36 { FTS_D, "unr", "unr" },
37 { FTS_DNR, "unr", "unr" },
38 { FTS_D, "unx", "unx" },
39 { FTS_DP, "unx", "unx" },
40 { FTS_DP, "dir", "dir" },
41 { 0 }
42 },
43 });
44 }
45
46 ATF_TC(fts_unrdir_nochdir);
ATF_TC_HEAD(fts_unrdir_nochdir,tc)47 ATF_TC_HEAD(fts_unrdir_nochdir, tc)
48 {
49 atf_tc_set_md_var(tc, "descr", "unreadable directories (nochdir)");
50 atf_tc_set_md_var(tc, "require.user", "unprivileged");
51 }
ATF_TC_BODY(fts_unrdir_nochdir,tc)52 ATF_TC_BODY(fts_unrdir_nochdir, tc)
53 {
54 ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
55 ATF_REQUIRE_EQ(0, mkdir("dir/unr", 0100));
56 ATF_REQUIRE_EQ(0, mkdir("dir/unx", 0400));
57 fts_test(tc, &(struct fts_testcase){
58 (char *[]){ "dir", NULL },
59 FTS_PHYSICAL | FTS_NOCHDIR,
60 (struct fts_expect[]){
61 { FTS_D, "dir", "dir" },
62 { FTS_D, "unr", "dir/unr" },
63 { FTS_DNR, "unr", "dir/unr" },
64 { FTS_D, "unx", "dir/unx" },
65 { FTS_DP, "unx", "dir/unx" },
66 { FTS_DP, "dir", "dir" },
67 { 0 }
68 },
69 });
70 }
71
ATF_TP_ADD_TCS(tp)72 ATF_TP_ADD_TCS(tp)
73 {
74 fts_check_debug();
75 ATF_TP_ADD_TC(tp, fts_unrdir);
76 ATF_TP_ADD_TC(tp, fts_unrdir_nochdir);
77 return (atf_no_error());
78 }
79