From b77ac3951932d2ea8bdba2b800380b3e70f8eca2 Mon Sep 17 00:00:00 2001 From: tamz Date: Thu, 6 Jan 2022 11:56:58 +0100 Subject: agetty: resolve tty name even if stdin is specified [kzak@redhat.com: - use "const" for options->tty (and friends) as expected by get_terminal_name()] Addresses: https://github.com/util-linux/util-linux/issues/1546 Signed-off-by: tamz Signed-off-by: Karel Zak Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2156946 Upstream: http://github.com/util-linux/util-linux/commit/47831cc02ac0d71c335caecef1753f4c8861277c --- term-utils/agetty.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/term-utils/agetty.c b/term-utils/agetty.c index 3b3d5101a..e65cbdeaf 100644 --- a/term-utils/agetty.c +++ b/term-utils/agetty.c @@ -186,8 +186,8 @@ struct options { char *chroot; /* Chroot before the login */ char *login; /* login program */ char *logopt; /* options for login program */ - char *tty; /* name of tty */ - char *vcline; /* line of virtual console */ + const char *tty; /* name of tty */ + const char *vcline; /* line of virtual console */ char *term; /* terminal type */ char *initstring; /* modem init string */ char *issue; /* alternative issue file or directory */ @@ -199,6 +199,7 @@ struct options { int numspeed; /* number of baud rates to try */ int clocal; /* CLOCAL_MODE_* */ int kbmode; /* Keyboard mode if virtual console */ + int tty_is_stdin; /* is the tty the standard input stream */ speed_t speeds[MAX_SPEED]; /* baud rates to be tried */ }; @@ -315,7 +316,7 @@ static void init_special_char(char* arg, struct options *op); static void parse_args(int argc, char **argv, struct options *op); static void parse_speeds(struct options *op, char *arg); static void update_utmp(struct options *op); -static void open_tty(char *tty, struct termios *tp, struct options *op); +static void open_tty(const char *tty, struct termios *tp, struct options *op); static void termio_init(struct options *op, struct termios *tp); static void reset_vc(const struct options *op, struct termios *tp, int canon); static void auto_baud(struct termios *tp); @@ -918,6 +919,15 @@ static void parse_args(int argc, char **argv, struct options *op) } } + /* resolve the tty path in case it was provided as stdin */ + if (strcmp(op->tty, "-") == 0) { + op->tty_is_stdin = 1; + int fd = get_terminal_name(NULL, &op->tty, NULL); + if (fd < 0) { + log_warn(_("could not get terminal name: %d"), fd); + } + } + /* On virtual console remember the line which is used for */ if (strncmp(op->tty, "tty", 3) == 0 && strspn(op->tty + 3, "0123456789") == strlen(op->tty+3)) @@ -958,8 +968,8 @@ static void update_utmp(struct options *op) time_t t; pid_t pid = getpid(); pid_t sid = getsid(0); - char *vcline = op->vcline; - char *line = op->tty; + const char *vcline = op->vcline; + const char *line = op->tty; struct utmpx *utp; /* @@ -998,7 +1008,7 @@ static void update_utmp(struct options *op) str2memcpy(ut.ut_id, vcline, sizeof(ut.ut_id)); else { size_t len = strlen(line); - char * ptr; + const char * ptr; if (len >= sizeof(ut.ut_id)) ptr = line + len - sizeof(ut.ut_id); else @@ -1026,7 +1036,7 @@ static void update_utmp(struct options *op) #endif /* SYSV_STYLE */ /* Set up tty as stdin, stdout & stderr. */ -static void open_tty(char *tty, struct termios *tp, struct options *op) +static void open_tty(const char *tty, struct termios *tp, struct options *op) { const pid_t pid = getpid(); int closed = 0; @@ -1036,7 +1046,7 @@ static void open_tty(char *tty, struct termios *tp, struct options *op) /* Set up new standard input, unless we are given an already opened port. */ - if (strcmp(tty, "-") != 0) { + if (!op->tty_is_stdin) { char buf[PATH_MAX+1]; struct group *gr = NULL; struct stat st; -- 2.39.1