From 3ecb5424ae417ff3b2b6fa379e76b85b5f68e94b Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Thu, 12 Sep 2019 08:49:30 +0000 Subject: log: set nonblocking mode for stderr Glib can print error messages to stderr and blocking write freezes Profanity if the buffer is full. Move stderr to nonblocking mode in hope that glib will skip printing on EWOULDBLOCK error. In this case we lose some error messages, but Profanity continues working. --- src/log.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/log.c b/src/log.c index c1c46a75..932c402d 100644 --- a/src/log.c +++ b/src/log.c @@ -790,26 +790,36 @@ log_stderr_handler(void) } } +static int log_stderr_nonblock_set(int fd) +{ + int rc; + + rc = fcntl(fd, F_GETFL); + if (rc >= 0) + rc = fcntl(fd, F_SETFL, rc | O_NONBLOCK); + + return rc; +} + void log_stderr_init(log_level_t level) { int rc; - int flags; rc = pipe(stderr_pipe); if (rc != 0) goto err; - flags = fcntl(stderr_pipe[0], F_GETFL); - rc = fcntl(stderr_pipe[0], F_SETFL, flags | O_NONBLOCK); - if (rc != 0) - goto err_close; - close(STDERR_FILENO); rc = dup2(stderr_pipe[1], STDERR_FILENO); if (rc < 0) goto err_close; + rc = log_stderr_nonblock_set(stderr_pipe[0]) + ?: log_stderr_nonblock_set(stderr_pipe[1]); + if (rc != 0) + goto err_close; + stderr_buf = malloc(STDERR_BUFSIZE); stderr_msg = g_string_sized_new(STDERR_BUFSIZE); stderr_level = level; -- cgit 1.4.1-2-gfad0