Path: blob/main/lib/libc/tests/gen/glob_blocks_test.c
39491 views
/*-1* Copyright (c) 2025 Klara, Inc.2*3* SPDX-License-Identifier: BSD-2-Clause4*/56#include <sys/stat.h>78#include <errno.h>9#include <glob.h>10#include <stdbool.h>1112#include <atf-c.h>1314ATF_TC(glob_b_callback);15ATF_TC_HEAD(glob_b_callback, tc)16{17atf_tc_set_md_var(tc, "descr",18"Test ability of callback block to suppress errors");19atf_tc_set_md_var(tc, "require.user", "unprivileged");20}21ATF_TC_BODY(glob_b_callback, tc)22{23static bool glob_callback_invoked;24static int (^errblk)(const char *, int) =25^(const char *path, int err) {26ATF_CHECK_STREQ(path, "test/");27ATF_CHECK(err == EACCES);28glob_callback_invoked = true;29/* Suppress EACCES errors. */30return (0);31};32glob_t g;33int rv;3435ATF_REQUIRE_EQ(0, mkdir("test", 0755));36ATF_REQUIRE_EQ(0, symlink("foo", "test/foo"));37ATF_REQUIRE_EQ(0, chmod("test", 0));3839glob_callback_invoked = false;40rv = glob_b("test/*", 0, errblk, &g);41ATF_CHECK_MSG(glob_callback_invoked,42"glob(3) failed to invoke callback block");43ATF_CHECK_EQ_MSG(GLOB_NOMATCH, rv,44"callback function failed to suppress EACCES");45globfree(&g);4647/* GLOB_ERR should ignore the suppressed error. */48glob_callback_invoked = false;49rv = glob_b("test/*", GLOB_ERR, errblk, &g);50ATF_CHECK_MSG(glob_callback_invoked,51"glob(3) failed to invoke callback block");52ATF_CHECK_EQ_MSG(GLOB_ABORTED, rv,53"GLOB_ERR didn't override callback block");54globfree(&g);55}5657ATF_TP_ADD_TCS(tp)58{59ATF_TP_ADD_TC(tp, glob_b_callback);60return (atf_no_error());61}626364