xref: /freebsd/lib/libc/tests/gen/glob_blocks_test.c (revision b670c9bafc0e31c7609969bf374b2e80bdc00211)
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