summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-05-31 15:10:18 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-05-31 15:54:16 +0200
commit16618332388442f2f1c3e52b0a9fde00121564a3 (patch)
treeae0f658c927bb57ac7792f88fa108ed9153bdf5b
parentb5cb2d2847a3516ba794acf07d08f70d988ff7c2 (diff)
downloadsystemd-16618332388442f2f1c3e52b0a9fde00121564a3.tar.gz
shared/utmp-wtmp: pass information if entry is local to filter function
This just adds an unused parameter for future use. No change in behaviour.
-rw-r--r--src/login/logind-utmp.c2
-rw-r--r--src/login/logind.h2
-rw-r--r--src/shared/utmp-wtmp.c11
-rw-r--r--src/shared/utmp-wtmp.h2
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c2
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;