Path: blob/main/lib/libc/tests/gen/scandir_blocks_test.c
39535 views
/*-1* Copyright (c) 2025 Klara, Inc.2*3* SPDX-License-Identifier: BSD-2-Clause4*/56#include <sys/stat.h>78#include <dirent.h>9#include <fcntl.h>10#include <stdlib.h>1112#include <atf-c.h>1314static void15scandir_blocks_prepare(const struct atf_tc *tc)16{17ATF_REQUIRE_EQ(0, mkdir("dir", 0755));18ATF_REQUIRE_EQ(0, mkdir("dir/dir", 0755));19ATF_REQUIRE_EQ(0, close(creat("dir/file", 0644)));20ATF_REQUIRE_EQ(0, symlink("file", "dir/link"));21ATF_REQUIRE_EQ(0, mkdir("dir/skip", 0755));22}2324static void25scandir_blocks_verify(const struct atf_tc *tc, int n, struct dirent **namelist)26{27ATF_REQUIRE_EQ_MSG(5, n, "return value is %d", n);28ATF_CHECK_STREQ("link", namelist[0]->d_name);29ATF_CHECK_STREQ("file", namelist[1]->d_name);30ATF_CHECK_STREQ("dir", namelist[2]->d_name);31ATF_CHECK_STREQ("..", namelist[3]->d_name);32ATF_CHECK_STREQ(".", namelist[4]->d_name);33}3435ATF_TC(scandir_b_test);36ATF_TC_HEAD(scandir_b_test, tc)37{38atf_tc_set_md_var(tc, "descr", "Test scandir_b()");39}40ATF_TC_BODY(scandir_b_test, tc)41{42struct dirent **namelist = NULL;43int i, ret;4445scandir_blocks_prepare(tc);46ret = scandir_b("dir", &namelist,47^(const struct dirent *ent) {48return (strcmp(ent->d_name, "skip") != 0);49},50^(const struct dirent **a, const struct dirent **b) {51return (strcmp((*b)->d_name, (*a)->d_name));52});53scandir_blocks_verify(tc, ret, namelist);54for (i = 0; i < ret; i++)55free(namelist[i]);56free(namelist);57}5859ATF_TC(fdscandir_b_test);60ATF_TC_HEAD(fdscandir_b_test, tc)61{62atf_tc_set_md_var(tc, "descr", "Test fdscandir_b()");63}64ATF_TC_BODY(fdscandir_b_test, tc)65{66struct dirent **namelist = NULL;67int fd, i, ret;6869scandir_blocks_prepare(tc);70ATF_REQUIRE((fd = open("dir", O_DIRECTORY | O_RDONLY)) >= 0);71ret = fdscandir_b(fd, &namelist,72^(const struct dirent *ent) {73return (strcmp(ent->d_name, "skip") != 0);74},75^(const struct dirent **a, const struct dirent **b) {76return (strcmp((*b)->d_name, (*a)->d_name));77});78scandir_blocks_verify(tc, ret, namelist);79for (i = 0; i < ret; i++)80free(namelist[i]);81free(namelist);82ATF_REQUIRE_EQ(0, close(fd));83}8485ATF_TC(scandirat_b_test);86ATF_TC_HEAD(scandirat_b_test, tc)87{88atf_tc_set_md_var(tc, "descr", "Test scandirat_b()");89}90ATF_TC_BODY(scandirat_b_test, tc)91{92struct dirent **namelist = NULL;93int fd, i, ret;9495scandir_blocks_prepare(tc);96ATF_REQUIRE((fd = open("dir", O_DIRECTORY | O_SEARCH)) >= 0);97ret = scandirat_b(fd, ".", &namelist,98^(const struct dirent *ent) {99return (strcmp(ent->d_name, "skip") != 0);100},101^(const struct dirent **a, const struct dirent **b) {102return (strcmp((*b)->d_name, (*a)->d_name));103});104scandir_blocks_verify(tc, ret, namelist);105for (i = 0; i < ret; i++)106free(namelist[i]);107free(namelist);108ATF_REQUIRE_EQ(0, close(fd));109}110111ATF_TP_ADD_TCS(tp)112{113ATF_TP_ADD_TC(tp, scandir_b_test);114ATF_TP_ADD_TC(tp, fdscandir_b_test);115ATF_TP_ADD_TC(tp, scandirat_b_test);116return (atf_no_error());117}118119120