From 76270f5c090ef103e2f75a73fa9fba8b213828ea Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Fri, 22 Dec 2023 17:59:39 +0800 Subject: [PATCH] terminal-util: introduce isatty_safe that rejects EBADF --- src/basic/terminal-util.c | 12 ++++++++++++ src/basic/terminal-util.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 89823ab795..c6ced3f7c1 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -54,6 +54,18 @@ static volatile int cached_on_dev_null = -1; static volatile int cached_color_mode = _COLOR_INVALID; static volatile int cached_underline_enabled = -1; +bool isatty_safe(int fd) { + assert(fd >= 0); + + if (isatty(fd)) + return true; + + /* Be resilient if we're working on stdio, since they're set up by parent process. */ + assert(errno != EBADF || IN_SET(fd, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO)); + + return false; +} + int chvt(int vt) { _cleanup_close_ int fd = -EBADF; diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index 1ec057c2dd..ee60ff4840 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -86,6 +86,8 @@ /* Set cursor to top left corner and clear screen */ #define ANSI_HOME_CLEAR "\x1B[H\x1B[2J" +bool isatty_safe(int fd); + int reset_terminal_fd(int fd, bool switch_to_text); int reset_terminal(const char *name); int set_terminal_cursor_position(int fd, unsigned int row, unsigned int column);