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 <errno.h> 10 #include <glob.h> 11 12 #include <atf-c.h> 13 14 static int glob_callback_invoked; 15 16 ATF_TC_WITHOUT_HEAD(glob_b_callback_test); 17 ATF_TC_BODY(glob_b_callback_test, tc) 18 { 19 int rv; 20 glob_t g; 21 22 glob_callback_invoked = 0; 23 ATF_REQUIRE_EQ(0, mkdir("test", 0007)); 24 int (^errblk)(const char *, int) = 25 ^(const char *path, int err) { 26 ATF_REQUIRE_STREQ(path, "test/"); 27 ATF_REQUIRE(err == EACCES); 28 glob_callback_invoked = 1; 29 /* Suppress EACCES errors. */ 30 return (0); 31 }; 32 33 rv = glob_b("test/*", 0, errblk, &g); 34 ATF_REQUIRE_MSG(glob_callback_invoked == 1, 35 "glob(3) failed to invoke callback block"); 36 ATF_REQUIRE_MSG(rv == GLOB_NOMATCH, 37 "error callback function failed to suppress EACCES"); 38 39 /* GLOB_ERR should ignore the suppressed error. */ 40 rv = glob_b("test/*", GLOB_ERR, errblk, &g); 41 ATF_REQUIRE_MSG(rv == GLOB_ABORTED, 42 "GLOB_ERR didn't override error callback block"); 43 } 44 45 ATF_TP_ADD_TCS(tp) 46 { 47 ATF_TP_ADD_TC(tp, glob_b_callback_test); 48 return (atf_no_error()); 49 } 50