From 5c26570564823affce974bd1ebb51ca22beb38c8 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Fri, 15 Oct 2021 00:17:43 +0900 Subject: [PATCH] lsfd: (helper) add "dentries" parameter to directory factory Signed-off-by: Masatake YAMATO --- tests/helpers/test_mkfds.c | 43 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index 5b5b39de9f..2af66bdbb9 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include #include #include #include @@ -277,10 +278,21 @@ static void make_pipe(const struct factory *factory _U_, struct fdesc fdescs[], } } +static void close_dir(int fd, void *data) +{ + DIR *dp = data; + if (dp) + closedir(dp); + else + close_fdesc(fd, NULL); +} + static void open_directory(const struct factory *factory, struct fdesc fdescs[], pid_t * child _U_, int argc, char ** argv) { struct arg dir = decode_arg("dir", factory->params, argc, argv); + struct arg dentries = decode_arg("dentries", factory->params, argc, argv); + DIR *dp = NULL; int fd = open(ARG_STRING(dir), O_RDONLY|O_DIRECTORY); if (fd < 0) @@ -294,10 +306,31 @@ static void open_directory(const struct factory *factory, struct fdesc fdescs[], err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); } + if (ARG_INTEGER(dentries) > 0) { + dp = fdopendir(fdescs[0].fd); + if (dp == NULL) { + int e = errno; + close(fdescs[0].fd); + errno = e; + err(EXIT_FAILURE, "failed to make DIR* from fd: %s", ARG_STRING(dir)); + } + for (int i = 0; i < ARG_INTEGER(dentries); i++) { + struct dirent *d = readdir(dp); + if (!d) { + int e = errno; + closedir(dp); + errno = e; + err(EXIT_FAILURE, "failed in readdir(3)"); + } + } + } + free_arg(&dentries); + + fdescs[0] = (struct fdesc){ .fd = fdescs[0].fd, - .close = close_fdesc, - .data = NULL + .close = close_dir, + .data = dp }; } @@ -348,6 +381,12 @@ static const struct factory factories[] = { .desc = "directory to be opened", .defv.string = "/", }, + { + .name = "dentries", + .type = PTYPE_INTEGER, + .desc = "read the number of dentries after open with readdir(3)", + .defv.integer = 0, + }, PARAM_END }, }, -- 2.47.3