From b77ac3951932d2ea8bdba2b800380b3e70f8eca2 Mon Sep 17 00:00:00 2001
From: tamz <totemz@protonmail.com>
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 <totemz@protonmail.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
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