From: Lubomir Rintel Date: Mon, 11 Nov 2019 16:12:34 +0000 (+0100) Subject: logtee: time out after a period of no output X-Git-Tag: 050~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10f8438c1e16c2184b282d10f5939834bff03761;p=thirdparty%2Fdracut.git logtee: time out after a period of no output Travis cuts us short after 10 minutes of slience, giving us no chance to puke out the output. Be faster. --- diff --git a/fedora-test.sh b/fedora-test.sh index e897c325c..62725a325 100755 --- a/fedora-test.sh +++ b/fedora-test.sh @@ -53,7 +53,7 @@ else cd test - time sudo make \ + time sudo LOGTEE_TIMEOUT_MS=590000 make \ KVERSION=$(rpm -qa kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n' | sort -rn | head -1) \ TEST_RUN_ID=$RUN_ID \ ${TESTS:+TESTS="$TESTS"} \ diff --git a/logtee.c b/logtee.c index 2690e72d1..d32fa0372 100644 --- a/logtee.c +++ b/logtee.c @@ -1,5 +1,6 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -13,13 +14,26 @@ main(int argc, char *argv[]) { int fd; int len, slen; + int ret; + int timeout; + char *timeout_env; + struct pollfd fds[] = {{ + .fd = STDIN_FILENO, + .events = POLLIN | POLLERR, + }}; + + timeout_env = getenv("LOGTEE_TIMEOUT_MS"); + if (timeout_env) + timeout = atoi(timeout_env); + else + timeout = -1; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } - fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644); + fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, 0644); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); @@ -30,8 +44,13 @@ main(int argc, char *argv[]) slen = 0; do { + ret = poll (fds, sizeof(fds) / sizeof(fds[0]), timeout); + if (ret == 0) { + fprintf (stderr, "Timed out after %d milliseconds of no output.\n", timeout); + exit(EXIT_FAILURE); + } len = splice(STDIN_FILENO, NULL, fd, NULL, - BUFLEN, SPLICE_F_MOVE); + BUFLEN, SPLICE_F_MOVE | SPLICE_F_NONBLOCK); if (len < 0) { if (errno == EAGAIN) @@ -51,4 +70,4 @@ main(int argc, char *argv[]) close(fd); fprintf(stderr, "\n"); exit(EXIT_SUCCESS); -} \ No newline at end of file +}