From: Jo-Philipp Wich Date: Fri, 13 Sep 2019 07:17:58 +0000 (+0200) Subject: cgi-io: use splice() to stream backup archive X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;ds=sidebyside;h=156b7112ab38e7caa2f6488e6fbe73c5b8edda41;p=project%2Fcgi-io.git cgi-io: use splice() to stream backup archive This improves the I/O performance when outputting large backups. Signed-off-by: Jo-Philipp Wich --- diff --git a/Makefile b/Makefile index eaf03b4..2113609 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cgi-io -PKG_RELEASE:=11 +PKG_RELEASE:=12 PKG_LICENSE:=GPL-2.0-or-later diff --git a/src/main.c b/src/main.c index d19277d..ca15758 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define _GNU_SOURCE /* splice(), SPLICE_F_MORE */ + #include #include #include @@ -736,7 +738,6 @@ main_backup(int argc, char **argv) int len; int status; int fds[2]; - char buf[4096]; char datestr[16] = { 0 }; char hostname[64] = { 0 }; char *fields[] = { "sessionid", NULL }; @@ -768,7 +769,6 @@ 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)); @@ -780,15 +780,13 @@ main_backup(int argc, char **argv) printf("Content-Disposition: attachment; " "filename=\"backup-%s-%s.tar.gz\"\r\n\r\n", hostname, datestr); - do { - waitpid(pid, &status, 0); + fflush(stdout); - while ((len = read(fds[0], buf, sizeof(buf))) > 0) { - fwrite(buf, len, 1, stdout); - fflush(stdout); - } + do { + len = splice(fds[0], NULL, 1, NULL, 4096, SPLICE_F_MORE); + } while (len > 0); - } while (!WIFEXITED(status)); + waitpid(pid, &status, 0); close(fds[0]); close(fds[1]);