diff --git a/fedora-test.sh b/fedora-test.sh index e897c325..62725a32 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 2690e72d..d32fa037 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 +}