xref: /freebsd/lib/libc/tests/gen/fts_misc_test.c (revision cb2887746f8b9dd4ad6b1e757cdc053a08b25a2e)
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);
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 }
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);
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 }
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 
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