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