]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: log: don't mark log FDs as non-blocking on terminals
authorWilly Tarreau <w@1wt.eu>
Wed, 2 Jan 2019 19:09:33 +0000 (20:09 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 2 Jan 2019 19:12:02 +0000 (20:12 +0100)
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

index debacbfffb0049e586e1ba3b748dcea89dd6f34c..a4cedcc5af2f5c5b4fe924748833919e68fc0077 100644 (file)
--- 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;
                        }
                }