From: Masatake YAMATO Date: Sun, 18 Jun 2023 08:47:49 +0000 (+0900) Subject: test: (mkfds) add "make-regular-file" factory X-Git-Tag: v2.40-rc1~351^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=251319838d81e0325fdf87e43570dcba9fa29dde;p=thirdparty%2Futil-linux.git test: (mkfds) add "make-regular-file" factory With "delete" boolean parameter, you can delete the file just after making it. Signed-off-by: Masatake YAMATO --- diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index ff6e930874..1af163c034 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -381,6 +381,63 @@ static void *open_ro_regular_file(const struct factory *factory, struct fdesc fd return NULL; } +static void unlink_and_close_fdesc(int fd, void *data) +{ + char *fname = data; + + unlink(fname); + close(fd); +} + +static void *make_w_regular_file(const struct factory *factory, struct fdesc fdescs[], + int argc, char ** argv) +{ + int fd; + + struct arg file = decode_arg("file", factory->params, argc, argv); + char *fname = xstrdup(ARG_STRING(file)); + + struct arg delete = decode_arg("delete", factory->params, argc, argv); + bool bDelete = ARG_BOOLEAN(delete); + + free_arg(&delete); + free_arg(&file); + + fd = open(fname, O_CREAT|O_EXCL|O_WRONLY, S_IWUSR); + if (fd < 0) + err(EXIT_FAILURE, "failed to make: %s", fname); + + if (fd != fdescs[0].fd) { + if (dup2(fd, fdescs[0].fd) < 0) { + int e = errno; + close(fd); + free (fname); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); + } + close(fd); + } + + if (bDelete) { + if (unlink(fname) < 0) { + int e = errno; + close(fd); + errno = e; + err(EXIT_FAILURE, "failed to unlink %s", fname); + } + free(fname); + fname = NULL; + } + + fdescs[0] = (struct fdesc){ + .fd = fdescs[0].fd, + .close = bDelete? close_fdesc: unlink_and_close_fdesc, + .data = fname, + }; + + return NULL; +} + static void *make_pipe(const struct factory *factory, struct fdesc fdescs[], int argc, char ** argv) { @@ -2491,6 +2548,29 @@ static const struct factory factories[] = { PARAM_END }, }, + { + .name = "make-regular-file", + .desc = "regular file for writing", + .priv = false, + .N = 1, + .EX_N = 0, + .make = make_w_regular_file, + .params = (struct parameter []) { + { + .name = "file", + .type = PTYPE_STRING, + .desc = "file to be made", + .defv.string = "./test_mkfds_make_regular_file", + }, + { + .name = "delete", + .type = PTYPE_BOOLEAN, + .desc = "delete the file just after making it", + .defv.boolean = false, + }, + PARAM_END + }, + }, { .name = "pipe-no-fork", .desc = "making pair of fds with pipe(2)",