Path: blob/main/lib/libc/tests/gen/opendir_test.c
105174 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 <errno.h>10#include <fcntl.h>11#include <stdio.h>12#include <stdlib.h>1314#include <atf-c.h>1516/*17* Create a directory with a single subdirectory.18*/19static void20opendir_prepare(const struct atf_tc *tc)21{22ATF_REQUIRE_EQ(0, mkdir("dir", 0755));23ATF_REQUIRE_EQ(0, mkdir("dir/subdir", 0755));24}2526/*27* Assuming dirp represents the directory created by opendir_prepare(),28* verify that readdir() returns what we expected to see there.29*/30static void31opendir_check(const struct atf_tc *tc, DIR *dirp)32{33struct dirent *ent;3435ATF_REQUIRE((ent = readdir(dirp)) != NULL);36ATF_CHECK_EQ(1, ent->d_namlen);37ATF_CHECK_STREQ(".", ent->d_name);38ATF_CHECK_EQ(DT_DIR, ent->d_type);39ATF_REQUIRE((ent = readdir(dirp)) != NULL);40ATF_CHECK_EQ(2, ent->d_namlen);41ATF_CHECK_STREQ("..", ent->d_name);42ATF_CHECK_EQ(DT_DIR, ent->d_type);43ATF_REQUIRE((ent = readdir(dirp)) != NULL);44ATF_CHECK_EQ(sizeof("subdir") - 1, ent->d_namlen);45ATF_CHECK_STREQ("subdir", ent->d_name);46ATF_CHECK_EQ(DT_DIR, ent->d_type);47ATF_CHECK(readdir(dirp) == NULL);48ATF_CHECK(readdir(dirp) == NULL);49}5051ATF_TC(opendir_ok);52ATF_TC_HEAD(opendir_ok, tc)53{54atf_tc_set_md_var(tc, "descr", "Open a directory.");55}56ATF_TC_BODY(opendir_ok, tc)57{58DIR *dirp;5960opendir_prepare(tc);61ATF_REQUIRE((dirp = opendir("dir")) != NULL);62opendir_check(tc, dirp);63ATF_CHECK_EQ(0, closedir(dirp));64}6566ATF_TC(opendir_fifo);67ATF_TC_HEAD(opendir_fifo, tc)68{69atf_tc_set_md_var(tc, "descr", "Do not hang if given a named pipe.");70}71ATF_TC_BODY(opendir_fifo, tc)72{73DIR *dirp;74int fd;7576ATF_REQUIRE((fd = mkfifo("fifo", 0644)) >= 0);77ATF_REQUIRE_EQ(0, close(fd));78ATF_REQUIRE((dirp = opendir("fifo")) == NULL);79ATF_CHECK_EQ(ENOTDIR, errno);80}8182ATF_TC(fdopendir_ok);83ATF_TC_HEAD(fdopendir_ok, tc)84{85atf_tc_set_md_var(tc, "descr",86"Open a directory from a directory descriptor.");87}88ATF_TC_BODY(fdopendir_ok, tc)89{90DIR *dirp;91int dd;9293opendir_prepare(tc);94ATF_REQUIRE((dd = open("dir", O_DIRECTORY | O_RDONLY)) >= 0);95ATF_REQUIRE((dirp = fdopendir(dd)) != NULL);96opendir_check(tc, dirp);97ATF_CHECK_EQ(dd, fdclosedir(dirp));98ATF_CHECK_EQ(0, close(dd));99}100101ATF_TC(fdopendir_ebadf);102ATF_TC_HEAD(fdopendir_ebadf, tc)103{104atf_tc_set_md_var(tc, "descr",105"Open a directory from an invalid descriptor.");106}107ATF_TC_BODY(fdopendir_ebadf, tc)108{109DIR *dirp;110int dd;111112ATF_REQUIRE_EQ(0, mkdir("dir", 0755));113ATF_REQUIRE((dd = open("dir", O_DIRECTORY | O_RDONLY)) >= 0);114ATF_CHECK_EQ(0, close(dd));115ATF_REQUIRE((dirp = fdopendir(dd)) == NULL);116ATF_CHECK_EQ(EBADF, errno);117}118119ATF_TC(fdopendir_enotdir);120ATF_TC_HEAD(fdopendir_enotdir, tc)121{122atf_tc_set_md_var(tc, "descr",123"Open a directory from a non-directory descriptor.");124}125ATF_TC_BODY(fdopendir_enotdir, tc)126{127DIR *dirp;128int fd;129130ATF_REQUIRE((fd = open("file", O_CREAT | O_RDWR, 0644)) >= 0);131ATF_REQUIRE((dirp = fdopendir(fd)) == NULL);132ATF_CHECK_EQ(ENOTDIR, errno);133ATF_CHECK_EQ(0, close(fd));134}135136ATF_TP_ADD_TCS(tp)137{138ATF_TP_ADD_TC(tp, opendir_ok);139ATF_TP_ADD_TC(tp, fdopendir_ok);140ATF_TP_ADD_TC(tp, fdopendir_ebadf);141ATF_TP_ADD_TC(tp, fdopendir_enotdir);142ATF_TP_ADD_TC(tp, opendir_fifo);143return (atf_no_error());144}145146147