cgi-io: merge changes from luci2-io-helper
authorDaniel Golle <daniel@makrotopia.org>
Mon, 19 Jun 2017 10:48:32 +0000 (12:48 +0200)
committerDaniel Golle <daniel@makrotopia.org>
Mon, 19 Jun 2017 10:49:59 +0000 (12:49 +0200)
luci2-io-helper: bugfix buckup script read timeout

Reading files from stdin will block for ever. The uhttpd is killing the
backup process after script_timeout.

Switching read to non blocking mode and add a waitpid for the slave
process does not end in a script_timeout anymore.

Signed-off-by: Florian Eckert <Eckert.Florian@googlemail.com>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Makefile
src/main.c

index 3032ca49b92e8e0673f805b702e6f37aed762f50..34c5359dd7bf03ec017cfcec8fab1e2ef35e1738 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=cgi-io
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_LICENSE:=GPL-2.0+
 
index 69df2d66a4996eeb4b7f7db3c20f85b0e4f818c8..019bdf16016eda6c42d7505da8322294dd9ac45c 100644 (file)
@@ -577,6 +577,7 @@ main_backup(int argc, char **argv)
        pid_t pid;
        time_t now;
        int len;
+       int status;
        int fds[2];
        char buf[4096];
        char datestr[16] = { 0 };
@@ -610,6 +611,7 @@ main_backup(int argc, char **argv)
                return -1;
 
        default:
+               fcntl(fds[0], F_SETFL, fcntl(fds[0], F_GETFL) | O_NONBLOCK);
                now = time(NULL);
                strftime(datestr, sizeof(datestr) - 1, "%Y-%m-%d", localtime(&now));
 
@@ -621,10 +623,15 @@ main_backup(int argc, char **argv)
                printf("Content-Disposition: attachment; "
                       "filename=\"backup-%s-%s.tar.gz\"\r\n\r\n", hostname, datestr);
 
-               while ((len = read(fds[0], buf, sizeof(buf))) > 0)
-                       fwrite(buf, len, 1, stdout);
+               do {
+                       waitpid(pid, &status, 0);
 
-               waitpid(pid, NULL, 0);
+                       while ((len = read(fds[0], buf, sizeof(buf))) > 0) {
+                               fwrite(buf, len, 1, stdout);
+                               fflush(stdout);
+                       }
+
+               } while (!WIFEXITED(status));
 
                close(fds[0]);
                close(fds[1]);