diff options
-rw-r--r-- | src/login/logind-utmp.c | 2 | ||||
-rw-r--r-- | src/login/logind.h | 2 | ||||
-rw-r--r-- | src/shared/utmp-wtmp.c | 11 | ||||
-rw-r--r-- | src/shared/utmp-wtmp.h | 2 | ||||
-rw-r--r-- | src/tty-ask-password-agent/tty-ask-password-agent.c | 2 |
5 files changed, 11 insertions, 8 deletions
diff --git a/src/login/logind-utmp.c b/src/login/logind-utmp.c index 1db5050c3b..ccea8f968f 100644 --- a/src/login/logind-utmp.c +++ b/src/login/logind-utmp.c @@ -42,7 +42,7 @@ _const_ static usec_t when_wall(usec_t n, usec_t elapse) { return left % USEC_PER_HOUR; } -bool logind_wall_tty_filter(const char *tty, void *userdata) { +bool logind_wall_tty_filter(const char *tty, bool is_local, void *userdata) { Manager *m = userdata; const char *p; diff --git a/src/login/logind.h b/src/login/logind.h index 2136486c60..27f9e9729f 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -180,6 +180,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_n_autovts); CONFIG_PARSER_PROTOTYPE(config_parse_tmpfs_size); int manager_setup_wall_message_timer(Manager *m); -bool logind_wall_tty_filter(const char *tty, void *userdata); +bool logind_wall_tty_filter(const char *tty, bool is_local, void *userdata); int manager_read_efi_boot_loader_entries(Manager *m); diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c index f2f53380ad..c7e89ba6a6 100644 --- a/src/shared/utmp-wtmp.c +++ b/src/shared/utmp-wtmp.c @@ -337,7 +337,7 @@ int utmp_wall( const char *message, const char *username, const char *origin_tty, - bool (*match_tty)(const char *tty, void *userdata), + bool (*match_tty)(const char *tty, bool is_local, void *userdata), void *userdata) { _unused_ _cleanup_(utxent_cleanup) bool utmpx = false; @@ -381,17 +381,20 @@ int utmp_wall( if (u->ut_type != USER_PROCESS || u->ut_user[0] == 0) continue; - /* this access is fine, because STRLEN("/dev/") << 32 (UT_LINESIZE) */ + /* This access is fine, because strlen("/dev/") < 32 (UT_LINESIZE) */ if (path_startswith(u->ut_line, "/dev/")) path = u->ut_line; else { if (asprintf(&buf, "/dev/%.*s", (int) sizeof(u->ut_line), u->ut_line) < 0) return -ENOMEM; - path = buf; } - if (!match_tty || match_tty(path, userdata)) { + /* It seems that the address field is always set for remote logins. + * For local logins and other local entries, we get [0,0,0,0]. */ + bool is_local = memeqzero(u->ut_addr_v6, sizeof(u->ut_addr_v6)); + + if (!match_tty || match_tty(path, is_local, userdata)) { q = write_to_terminal(path, text); if (q < 0) r = q; diff --git a/src/shared/utmp-wtmp.h b/src/shared/utmp-wtmp.h index 3e71f76b27..36e4203b4f 100644 --- a/src/shared/utmp-wtmp.h +++ b/src/shared/utmp-wtmp.h @@ -23,7 +23,7 @@ int utmp_wall( const char *message, const char *username, const char *origin_tty, - bool (*match_tty)(const char *tty, void *userdata), + bool (*match_tty)(const char *tty, bool is_local, void *userdata), void *userdata); static inline bool utxent_start(void) { diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 09835ca903..b7d279cc22 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -94,7 +94,7 @@ static int send_passwords(const char *socket_name, char **passwords) { return (int) n; } -static bool wall_tty_match(const char *path, void *userdata) { +static bool wall_tty_match(const char *path, bool is_local, void *userdata) { _cleanup_free_ char *p = NULL; _cleanup_close_ int fd = -1; struct stat st; |