From 71f11e6cf63289d51f152469a0da81a85fe2608c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= Date: Thu, 27 Jun 2024 13:19:16 -0600 Subject: [PATCH] set O_NONBLOCK flag to stdout --- dwl.c | 6 ++++++ util.c | 16 ++++++++++++++++ util.h | 1 + 3 files changed, 23 insertions(+) diff --git a/dwl.c b/dwl.c index 9fb50a7..3175e79 100644 --- a/dwl.c +++ b/dwl.c @@ -2190,6 +2190,12 @@ run(char *startup_cmd) close(piperw[1]); close(piperw[0]); } + + /* Mark stdout as non-blocking to avoid people who does not close stdin + * nor consumes it in their startup script getting dwl frozen */ + if (fd_set_nonblock(STDOUT_FILENO) < 0) + close(STDOUT_FILENO); + printstatus(); /* At this point the outputs are initialized, choose initial selmon based on diff --git a/util.c b/util.c index cca7c19..51130af 100644 --- a/util.c +++ b/util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "util.h" @@ -33,3 +34,18 @@ ecalloc(size_t nmemb, size_t size) die("calloc:"); return p; } + +int +fd_set_nonblock(int fd) { + int flags = fcntl(fd, F_GETFL); + if (flags < 0) { + perror("fcntl(F_GETFL):"); + return -1; + } + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) { + perror("fcntl(F_SETFL):"); + return -1; + } + + return 0; +} diff --git a/util.h b/util.h index 4c94117..226980d 100644 --- a/util.h +++ b/util.h @@ -2,3 +2,4 @@ void die(const char *fmt, ...); void *ecalloc(size_t nmemb, size_t size); +int fd_set_nonblock(int fd);