]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
test: (mkfds) add "make-regular-file" factory
authorMasatake YAMATO <yamato@redhat.com>
Sun, 18 Jun 2023 08:47:49 +0000 (17:47 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Thu, 22 Jun 2023 00:01:13 +0000 (09:01 +0900)
With "delete" boolean parameter, you can delete the file just
after making it.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/helpers/test_mkfds.c

index ff6e930874968fe9766a61899bb0d6cfd0eebdfe..1af163c034b448092fc46d3bb291c7056c326655 100644 (file)
@@ -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)",