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.
master
Lubomir Rintel 2019-11-11 17:12:34 +01:00 committed by Daniel Molkentin
parent f5d48a31db
commit 10f8438c1e
2 changed files with 23 additions and 4 deletions

View File

@ -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"} \

View File

@ -1,5 +1,6 @@
#define _GNU_SOURCE
#include <fcntl.h>
#include <poll.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@ -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 <file>\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);
}
}