]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
various: clean up isatty() handling 30585/head
authorMike Yuan <me@yhndnzj.com>
Fri, 22 Dec 2023 10:28:55 +0000 (18:28 +0800)
committerMike Yuan <me@yhndnzj.com>
Fri, 22 Dec 2023 15:06:49 +0000 (23:06 +0800)
As per https://github.com/systemd/systemd/pull/30547#discussion_r1434371627

12 files changed:
src/basic/fileio.c
src/basic/log.c
src/basic/terminal-util.c
src/busctl/busctl.c
src/core/exec-invoke.c
src/core/execute.c
src/creds/creds.c
src/getty-generator/getty-generator.c
src/journal/journald.c
src/nspawn/nspawn.c
src/shared/wall.c
src/storagetm/storagetm.c

index a050b61db45eb58df18c0dcb0f4f81d3fd55ea0e..752a65646f596a56906292181c55bf769560999a 100644 (file)
@@ -28,6 +28,7 @@
 #include "stdio-util.h"
 #include "string-util.h"
 #include "sync-util.h"
+#include "terminal-util.h"
 #include "tmpfile-util.h"
 
 /* The maximum size of the file we'll read in one go in read_full_file() (64M). */
@@ -1459,7 +1460,7 @@ int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) {
                                                      * and don't call isatty() on an invalid fd */
                                                 flags |= READ_LINE_NOT_A_TTY;
                                         else
-                                                flags |= isatty(fd) ? READ_LINE_IS_A_TTY : READ_LINE_NOT_A_TTY;
+                                                flags |= isatty_safe(fd) ? READ_LINE_IS_A_TTY : READ_LINE_NOT_A_TTY;
                                 }
                                 if (FLAGS_SET(flags, READ_LINE_IS_A_TTY))
                                         break;
index 1470611a75d00eed22896a1aa8921b087ca7d2a3..34e0ccd9560611ca3763dc205abd1be14b51b65e 100644 (file)
@@ -414,7 +414,7 @@ static bool check_console_fd_is_tty(void) {
                 return false;
 
         if (console_fd_is_tty < 0)
-                console_fd_is_tty = isatty(console_fd) > 0;
+                console_fd_is_tty = isatty_safe(console_fd);
 
         return console_fd_is_tty;
 }
index c6ced3f7c10c3c90be3f3fce89273d11494781c0..488541ed23be3bd20866cf012d5fce26f1e416ff 100644 (file)
@@ -252,7 +252,7 @@ int reset_terminal_fd(int fd, bool switch_to_text) {
 
         assert(fd >= 0);
 
-        if (isatty(fd) < 1)
+        if (!isatty_safe(fd))
                 return log_debug_errno(errno, "Asked to reset a terminal that actually isn't a terminal: %m");
 
         /* We leave locked terminal attributes untouched, so that Plymouth may set whatever it wants to set,
@@ -359,7 +359,7 @@ int open_terminal(const char *name, int mode) {
                 c++;
         }
 
-        if (isatty(fd) < 1)
+        if (!isatty_safe(fd))
                 return negative_errno();
 
         return TAKE_FD(fd);
@@ -1468,7 +1468,7 @@ int vt_restore(int fd) {
 
         assert(fd >= 0);
 
-        if (isatty(fd) < 1)
+        if (!isatty_safe(fd))
                 return log_debug_errno(errno, "Asked to restore the VT for an fd that does not refer to a terminal: %m");
 
         if (ioctl(fd, KDSETMODE, KD_TEXT) < 0)
@@ -1495,7 +1495,7 @@ int vt_release(int fd, bool restore) {
          * sent by the kernel and optionally reset the VT in text and auto
          * VT-switching modes. */
 
-        if (isatty(fd) < 1)
+        if (!isatty_safe(fd))
                 return log_debug_errno(errno, "Asked to release the VT for an fd that does not refer to a terminal: %m");
 
         if (ioctl(fd, VT_RELDISP, 1) < 0)
@@ -1705,7 +1705,7 @@ int get_default_background_color(double *ret_red, double *ret_green, double *ret
         if (!colors_enabled())
                 return -EOPNOTSUPP;
 
-        if (isatty(STDOUT_FILENO) < 1 || isatty(STDIN_FILENO) < 1)
+        if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO))
                 return -EOPNOTSUPP;
 
         if (streq_ptr(getenv("TERM"), "linux")) {
index 9f82198f2f1389cc8d1480940e2ecb8656f7db94..d233fc55adba4f2e735b0a8728fb985ca5f3c6e0 100644 (file)
@@ -1369,7 +1369,7 @@ static int verb_capture(int argc, char **argv, void *userdata) {
                 "busctl (systemd) " STRINGIFY(PROJECT_VERSION) " (Git " GIT_VERSION ")";
         int r;
 
-        if (isatty(fileno(stdout)) > 0)
+        if (isatty(STDOUT_FILENO))
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                        "Refusing to write message data to console, please redirect output to a file.");
 
index 61f66b6914a65b913ec9b3acc611cdb7fd7b7079..0475a3cc3cacd28991659f79cf9e148acf358358 100644 (file)
@@ -670,12 +670,8 @@ static int chown_terminal(int fd, uid_t uid) {
         assert(fd >= 0);
 
         /* Before we chown/chmod the TTY, let's ensure this is actually a tty */
-        if (isatty(fd) < 1) {
-                if (IN_SET(errno, EINVAL, ENOTTY))
-                        return 0; /* not a tty */
-
-                return -errno;
-        }
+        if (!isatty_safe(fd))
+                return 0;
 
         /* This might fail. What matters are the results. */
         r = fchmod_and_chown(fd, TTY_MODE, uid, GID_INVALID);
index 7b661d70c9f02894aacb449092a75fa1653b416e..e400d800847109c03eb96da84937779e9757f6c0 100644 (file)
@@ -147,7 +147,7 @@ void exec_context_tty_reset(const ExecContext *context, const ExecParameters *p)
 
         const char *path = exec_context_tty_path(context);
 
-        if (p && p->stdin_fd >= 0 && isatty(p->stdin_fd))
+        if (p && p->stdin_fd >= 0 && isatty_safe(p->stdin_fd))
                 fd = p->stdin_fd;
         else if (path && (context->tty_path || is_terminal_input(context->std_input) ||
                         is_terminal_output(context->std_output) || is_terminal_output(context->std_error))) {
index c9bf2e1e36cee4dba373f5db14977bea47a1a775..b53e8d3b3654ac6442d99ca2dfa61c05863d9288 100644 (file)
@@ -315,7 +315,7 @@ static int print_newline(FILE *f, const char *data, size_t l) {
 
         /* Don't bother unless this is a tty */
         fd = fileno(f);
-        if (fd >= 0 && isatty(fd) <= 0)
+        if (fd >= 0 && !isatty_safe(fd))
                 return 0;
 
         if (fputc('\n', f) != '\n')
index 7486118365f1b7814ccacacd5c7c148529024d1a..288f91cedf52716605c82facee5b53f8d5e9b515 100644 (file)
@@ -94,9 +94,8 @@ static int verify_tty(const char *name) {
         if (fd < 0)
                 return -errno;
 
-        errno = 0;
-        if (isatty(fd) <= 0)
-                return errno_or_else(EIO);
+        if (!isatty_safe(fd))
+                return -errno;
 
         return 0;
 }
index dab0879d333d32837a3d950d41dff910a116ef75..2f013c2ab2b2d4d04d089fca544186d891ef37eb 100644 (file)
@@ -13,6 +13,7 @@
 #include "main-func.h"
 #include "process-util.h"
 #include "sigbus.h"
+#include "terminal-util.h"
 
 static int run(int argc, char *argv[]) {
         _cleanup_(server_freep) Server *s = NULL;
@@ -35,7 +36,7 @@ static int run(int argc, char *argv[]) {
                  * daemon when it comes to logging hence LOG_TARGET_AUTO won't do the right thing for
                  * us. Hence explicitly log to the console if we're started from a console or to kmsg
                  * otherwise. */
-                log_target = isatty(STDERR_FILENO) > 0 ? LOG_TARGET_CONSOLE : LOG_TARGET_KMSG;
+                log_target = isatty(STDERR_FILENO) ? LOG_TARGET_CONSOLE : LOG_TARGET_KMSG;
 
                 log_set_prohibit_ipc(true); /* better safe than sorry */
                 log_set_target(log_target);
index b4a74a1e4375052f8f8e9ec59583ec001315a4b6..fb9df3d053f7f1fe08e7207e94f1886b79ca52d9 100644 (file)
@@ -289,7 +289,7 @@ static int handle_arg_console(const char *arg) {
         else if (streq(arg, "passive"))
                 arg_console_mode = CONSOLE_PASSIVE;
         else if (streq(arg, "pipe")) {
-                if (isatty(STDIN_FILENO) > 0 && isatty(STDOUT_FILENO) > 0)
+                if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO))
                         log_full(arg_quiet ? LOG_DEBUG : LOG_NOTICE,
                                  "Console mode 'pipe' selected, but standard input/output are connected to an interactive TTY. "
                                  "Most likely you want to use 'interactive' console mode for proper interactivity and shell job control. "
@@ -297,7 +297,7 @@ static int handle_arg_console(const char *arg) {
 
                 arg_console_mode = CONSOLE_PIPE;
         } else if (streq(arg, "autopipe")) {
-                if (isatty(STDIN_FILENO) > 0 && isatty(STDOUT_FILENO) > 0)
+                if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO))
                         arg_console_mode = CONSOLE_INTERACTIVE;
                 else
                         arg_console_mode = CONSOLE_PIPE;
@@ -5766,9 +5766,8 @@ static int run(int argc, char *argv[]) {
                 goto finish;
 
         if (arg_console_mode < 0)
-                arg_console_mode =
-                        isatty(STDIN_FILENO) > 0 &&
-                        isatty(STDOUT_FILENO) > 0 ? CONSOLE_INTERACTIVE : CONSOLE_READ_ONLY;
+                arg_console_mode = isatty(STDIN_FILENO) && isatty(STDOUT_FILENO) ?
+                                   CONSOLE_INTERACTIVE : CONSOLE_READ_ONLY;
 
         if (arg_console_mode == CONSOLE_PIPE) /* if we pass STDERR on to the container, don't add our own logs into it too */
                 arg_quiet = true;
index d5900ef019d81699724b1acedbab51434243acda..c5d6439db67405e1ff840c97ef2cae34c7174f9d 100644 (file)
@@ -30,8 +30,9 @@ static int write_to_terminal(const char *tty, const char *message) {
         fd = open(tty, O_WRONLY|O_NONBLOCK|O_NOCTTY|O_CLOEXEC);
         if (fd < 0)
                 return -errno;
-        if (!isatty(fd))
-                return -ENOTTY;
+
+        if (!isatty_safe(fd))
+                return -errno;
 
         return loop_write_full(fd, message, SIZE_MAX, TIMEOUT_USEC);
 }
index ae63baaf792a11b1de5e63f6fba1a64f0783815b..a482daabefb076a9b104ac725abacb9e1a47b30b 100644 (file)
@@ -1043,7 +1043,7 @@ static int on_display_refresh(sd_event_source *s, uint64_t usec, void *userdata)
 
         c->display_refresh_scheduled = false;
 
-        if (isatty(STDERR_FILENO) > 0)
+        if (isatty(STDERR_FILENO))
                 fputs(ANSI_HOME_CLEAR, stderr);
 
         /* If we have both IPv4 and IPv6, we display IPv4 info via Plymouth, since it doesn't have much
@@ -1224,7 +1224,7 @@ static int run(int argc, char* argv[]) {
         if (r < 0)
                 return log_error_errno(r, "Failed to subscribe to RTM_DELADDR events: %m");
 
-        if (isatty(0) > 0)
+        if (isatty(STDIN_FILENO))
                 log_info("Hit Ctrl-C to exit target mode.");
 
         _unused_ _cleanup_(notify_on_cleanup) const char *notify_message =