From b1d7b700bbbb02134b85ef252282a672ddf27e29 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 2 Jan 2019 20:09:33 +0100 Subject: [PATCH] BUG/MEDIUM: log: don't mark log FDs as non-blocking on terminals With the new ability to log to a terminal, it's convenient to be able to use "log stdout" in a config file, except that it now results in setting the terminal to non-blocking mode, breaking every utility relying on stdin afterwards. Since the only reason for logging to a terminal is to debug, do not set the FD to non-blocking mode when it's a terminal. This fix must be backported to 1.9. --- src/log.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/log.c b/src/log.c index debacbfff..a4cedcc5a 100644 --- a/src/log.c +++ b/src/log.c @@ -1378,8 +1378,11 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd /* the socket's address is a file descriptor */ plogfd = (int *)&((struct sockaddr_in *)&logsrv->addr)->sin_addr.s_addr; if (unlikely(!((struct sockaddr_in *)&logsrv->addr)->sin_port)) { - /* FD not yet initialized to non-blocking mode */ - fcntl(*plogfd, F_SETFL, O_NONBLOCK); + /* FD not yet initialized to non-blocking mode. + * DON'T DO IT ON A TERMINAL! + */ + if (!isatty(*plogfd)) + fcntl(*plogfd, F_SETFL, O_NONBLOCK); ((struct sockaddr_in *)&logsrv->addr)->sin_port = 1; } }