]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
rework dumpfd2fd to make fallback more easily testable
authorBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 10 Jan 2023 12:52:19 +0000 (13:52 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Tue, 10 Jan 2023 12:52:19 +0000 (13:52 +0100)
shm are not easy to use in a portable manner

include/wrappers.h
src/dumpfd2fd.c
tests/mlmmj.c

index ab56037cbac81a6a66cdc85a3f431a1141b9c30b..8567c97ed8e0c7f7408a2c3f65dafca3bf9b598b 100644 (file)
@@ -29,5 +29,6 @@
 ssize_t readn(int fd, void *vptr, size_t n);
 int random_int(void);
 int dumpfd2fd(int infd, int outfd);
+int copy_file(int infd, int outfd, size_t bufsiz);
 
 #endif /* WRAPPERS_H */
index bd2724469cae4a563966fced9b09c03d6044d528..542f82d3b6b217a134b116d28f4d649b6a0b10e2 100644 (file)
 #include <unistd.h>
 #include <errno.h>
 #include <stdbool.h>
+#include <limits.h>
 
 #include "config.h"
 
 #define DUMPBUF 4096
 
-static int
-_copy_file(int from, int to)
+int
+copy_file(int from, int to, size_t bufsiz)
 {
-       char buf[DUMPBUF];
+       char buf[bufsiz];
        ssize_t r, wresid, w = 0;
        char *bufp;
-       r = read(from, buf, DUMPBUF);
+       r = read(from, buf, bufsiz);
        if (r < 0)
                return (r);
        for (bufp = buf, wresid = r; ; bufp += w, wresid -= w) {
@@ -52,25 +53,24 @@ _copy_file(int from, int to)
 
 int dumpfd2fd(int from, int to)
 {
-#ifdef HAVE_COPY_FILE_RANGE2
+#ifdef HAVE_COPY_FILE_RANGE
        bool cfr = true;
 #endif
        int r;
 
        do {
-#ifdef HAVE_COPY_FILE_RANGE2
+#ifdef HAVE_COPY_FILE_RANGE
                if (cfr) {
                        r = copy_file_range(from, NULL, to, NULL, SSIZE_MAX, 0);
                        if (r < 0 && errno == EINVAL) {
-                               printf("la\n");
                                /* probably a non seekable FD */
                                cfr = false;
                        }
                }
                if (!cfr) {
 #endif
-                       r = _copy_file(from, to);
-#ifdef HAVE_COPY_FILE_RANGE2
+                       r = copy_file(from, to, DUMPBUF);
+#ifdef HAVE_COPY_FILE_RANGE
                }
 #endif
        } while (r > 0);
index f931a8d10515bc40ed3de438b95627105003d787..4eff084fa7eebe41737eb63dbf93260a00eb161a 100644 (file)
@@ -118,9 +118,9 @@ ATF_TC_WITHOUT_HEAD(statctrl);
 ATF_TC_WITHOUT_HEAD(is_subbed_in);
 ATF_TC_WITHOUT_HEAD(getaddrsfromfile);
 ATF_TC_WITHOUT_HEAD(dumpfd2fd);
-ATF_TC_WITHOUT_HEAD(dumpfd2fd_0);
-ATF_TC_WITHOUT_HEAD(dumpfd2fd_1);
-ATF_TC_WITHOUT_HEAD(dumpfd2fd_2);
+ATF_TC_WITHOUT_HEAD(copy_file);
+ATF_TC_WITHOUT_HEAD(copy_file_1);
+ATF_TC_WITHOUT_HEAD(copy_file_2);
 ATF_TC_WITHOUT_HEAD(controls);
 ATF_TC_WITHOUT_HEAD(incindexfile);
 ATF_TC_WITHOUT_HEAD(log_oper);
@@ -1736,60 +1736,50 @@ ATF_TC_BODY(dumpfd2fd, tc)
        }
 }
 
-ATF_TC_BODY(dumpfd2fd_0, tc)
+ATF_TC_BODY(copy_file, tc)
 {
-       /* non seekable */
-       int shm = shm_open("/tmp/myshm", O_RDWR | O_CREAT, 0644);
-       ftruncate(shm, strlen("bla\n"));
-       dprintf(shm, "bla\n");
-       close(shm);
-       int from = shm_open("/tmp/myshm", O_RDONLY, 0644);
+       FILE * f = fopen("from.txt", "w+");
+       fprintf(f, "bla\n");
+       fclose(f);
+       int from = open("from.txt", O_RDONLY);
        int to = open("to.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
-       int ret = dumpfd2fd(from, to);
+       int ret = copy_file(from, to, BUFSIZ);
        close(from);
        close(to);
-       shm_unlink("/tmp/myshm");
-       ATF_REQUIRE_EQ_MSG(ret, 0, "Invalid simple copy %d", ret);
+       ATF_REQUIRE_EQ_MSG(ret, 4, "Invalid simple copy");
        if (!atf_utils_compare_file("to.txt", "bla\n")) {
                atf_utils_cat_file("to.txt", ">>");
                atf_tc_fail("Unexpected output");
        }
 }
 
-ATF_TC_BODY(dumpfd2fd_1, tc)
+ATF_TC_BODY(copy_file_1, tc)
 {
-       /* empty non seekable */
+       fclose(fopen("from.txt", "w+"));
        int to = open("to.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
-       int from = shm_open("/tmp/myshm", O_RDONLY, 0644);
-       int ret = dumpfd2fd(from, to);
+       int from = open("from.txt", O_RDONLY);
+       int ret = copy_file(from, to, BUFSIZ);
        close(from);
        close(to);
-       ATF_REQUIRE_EQ_MSG(ret, -1, "Invalid simple copy %d", ret);
+       ATF_REQUIRE_EQ_MSG(ret, 0, "Invalid simple copy");
        if (!atf_utils_compare_file("to.txt", "")) {
                atf_utils_cat_file("to.txt", ">>");
                atf_tc_fail("Unexpected output");
        }
 }
 
-ATF_TC_BODY(dumpfd2fd_2, tc)
+ATF_TC_BODY(copy_file_2, tc)
 {
-       /* large non seekable */
-       int shm = shm_open("/tmp/myshm", O_RDWR | O_CREAT, 0644);
-       char buf[5000];
-       for (int i = 0; i < 5000; i++)
-               buf[i]= 'a';
-       buf[4999] = '\0';
-       ftruncate(shm, strlen(buf));
-       write(shm, buf, 5000);
-       close(shm);
-       int from = shm_open("/tmp/myshm", O_RDONLY, 0644);
+       FILE *f = fopen("from.txt", "w+");
+       fprintf(f, "bla\n");
+       fclose(f);
+       int from = open("from.txt", O_RDONLY);
        int to = open("to.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
-       int ret = dumpfd2fd(from, to);
+       int ret = copy_file(from, to, 3);
        close(from);
        close(to);
-       shm_unlink("/tmp/myshm");
-       ATF_REQUIRE_EQ_MSG(ret, 0, "Invalid simple copy %d", ret);
-       if (!atf_utils_compare_file("to.txt", buf)) {
+       ATF_REQUIRE_EQ_MSG(ret, 3, "Invalid simple copy");
+       if (!atf_utils_compare_file("to.txt", "bla")) {
                atf_utils_cat_file("to.txt", ">");
                atf_tc_fail("Unexpected output");
        }
@@ -1931,9 +1921,9 @@ ATF_TP_ADD_TCS(tp)
        ATF_TP_ADD_TC(tp, is_subbed_in);
        ATF_TP_ADD_TC(tp, getaddrsfromfile);
        ATF_TP_ADD_TC(tp, dumpfd2fd);
-       ATF_TP_ADD_TC(tp, dumpfd2fd_0);
-       ATF_TP_ADD_TC(tp, dumpfd2fd_1);
-       ATF_TP_ADD_TC(tp, dumpfd2fd_2);
+       ATF_TP_ADD_TC(tp, copy_file);
+       ATF_TP_ADD_TC(tp, copy_file_1);
+       ATF_TP_ADD_TC(tp, copy_file_2);
        ATF_TP_ADD_TC(tp, controls);
        ATF_TP_ADD_TC(tp, incindexfile);
        ATF_TP_ADD_TC(tp, log_oper);