From 99f710dde855f7ecb699ddac6ad77923c1f6bc85 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Fri, 24 Apr 2015 15:31:29 +0200 Subject: shared/utmp-wtmp: add parameter for origin tty and callback userdata Instead of looking up the tty from STDIN, let utmp_wall() take an argument to specify an origin tty for the wall message. Only if that argument is NULL do the STDIN lookup. Also add an void *userdata argument that is handed back to the callback function. --- src/journal/journald-wall.c | 2 +- src/shared/utmp-wtmp.c | 19 ++++++++++++++----- src/shared/utmp-wtmp.h | 15 ++++++++++++--- src/shutdownd/shutdownd.c | 2 +- src/systemctl/systemctl.c | 4 ++-- src/tty-ask-password-agent/tty-ask-password-agent.c | 4 ++-- 6 files changed, 32 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/journal/journald-wall.c b/src/journal/journald-wall.c index 5298e45be9..7863766ae7 100644 --- a/src/journal/journald-wall.c +++ b/src/journal/journald-wall.c @@ -65,7 +65,7 @@ void server_forward_wall( } else l = message; - r = utmp_wall(l, "systemd-journald", NULL); + r = utmp_wall(l, "systemd-journald", NULL, NULL, NULL); if (r < 0) log_debug_errno(r, "Failed to send wall message: %m"); } diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c index d6c4cc81b3..aaf249dd20 100644 --- a/src/shared/utmp-wtmp.c +++ b/src/shared/utmp-wtmp.c @@ -347,8 +347,14 @@ static int write_to_terminal(const char *tty, const char *message) { return 0; } -int utmp_wall(const char *message, const char *username, bool (*match_tty)(const char *tty)) { - _cleanup_free_ char *text = NULL, *hn = NULL, *un = NULL, *tty = NULL; +int utmp_wall( + const char *message, + const char *username, + const char *origin_tty, + bool (*match_tty)(const char *tty, void *userdata), + void *userdata) { + + _cleanup_free_ char *text = NULL, *hn = NULL, *un = NULL, *stdin_tty = NULL; char date[FORMAT_TIMESTAMP_MAX]; struct utmpx *u; int r; @@ -362,14 +368,17 @@ int utmp_wall(const char *message, const char *username, bool (*match_tty)(const return -ENOMEM; } - getttyname_harder(STDIN_FILENO, &tty); + if (!origin_tty) { + getttyname_harder(STDIN_FILENO, &stdin_tty); + origin_tty = stdin_tty; + } if (asprintf(&text, "\a\r\n" "Broadcast message from %s@%s%s%s (%s):\r\n\r\n" "%s\r\n\r\n", un ?: username, hn, - tty ? " on " : "", strempty(tty), + origin_tty ? " on " : "", strempty(origin_tty), format_timestamp(date, sizeof(date), now(CLOCK_REALTIME)), message) < 0) return -ENOMEM; @@ -396,7 +405,7 @@ int utmp_wall(const char *message, const char *username, bool (*match_tty)(const path = buf; } - if (!match_tty || match_tty(path)) { + if (!match_tty || match_tty(path, 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 87d004e615..6ac2c7b1c7 100644 --- a/src/shared/utmp-wtmp.h +++ b/src/shared/utmp-wtmp.h @@ -33,7 +33,12 @@ int utmp_put_runlevel(int runlevel, int previous); int utmp_put_dead_process(const char *id, pid_t pid, int code, int status); int utmp_put_init_process(const char *id, pid_t pid, pid_t sid, const char *line); -int utmp_wall(const char *message, const char *username, bool (*match_tty)(const char *tty)); +int utmp_wall( + const char *message, + const char *username, + const char *origin_tty, + bool (*match_tty)(const char *tty, void *userdata), + void *userdata); #else /* HAVE_UTMP */ @@ -55,8 +60,12 @@ static inline int utmp_put_dead_process(const char *id, pid_t pid, int code, int static inline int utmp_put_init_process(const char *id, pid_t pid, pid_t sid, const char *line) { return 0; } -static inline int utmp_wall(const char *message, const char *username, - bool (*match_tty)(const char *tty)) { +static inline int utmp_wall( + const char *message, + const char *username, + const char *origin_tty, + bool (*match_tty)(const char *tty, void *userdata), + void *userdata); return 0; } diff --git a/src/shutdownd/shutdownd.c b/src/shutdownd/shutdownd.c index a05cddceb2..8b857b55cb 100644 --- a/src/shutdownd/shutdownd.c +++ b/src/shutdownd/shutdownd.c @@ -142,7 +142,7 @@ static void warn_wall(usec_t n, struct sd_shutdown_command *c) { if (asprintf(&l, "%s%s%s%s!", c->wall_message, c->wall_message[0] ? "\n" : "", prefix, format_timestamp(date, sizeof(date), c->usec)) >= 0) - utmp_wall(l, NULL, NULL); + utmp_wall(l, NULL, NULL, NULL, NULL); else log_error("Failed to allocate wall message"); } diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 4e702fb8bc..38d15ff4ed 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -251,7 +251,7 @@ static void warn_wall(enum action a) { } if (*p) { - utmp_wall(p, NULL, NULL); + utmp_wall(p, NULL, NULL, NULL, NULL); return; } } @@ -259,7 +259,7 @@ static void warn_wall(enum action a) { if (!table[a]) return; - utmp_wall(table[a], NULL, NULL); + utmp_wall(table[a], NULL, NULL, NULL, NULL); } static bool avoid_bus(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 8cd6cabb18..c440170f95 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -381,7 +381,7 @@ static int wall_tty_block(void) { return fd; } -static bool wall_tty_match(const char *path) { +static bool wall_tty_match(const char *path, void *userdata) { int fd, r; struct stat st; _cleanup_free_ char *p = NULL; @@ -455,7 +455,7 @@ static int show_passwords(void) { r = q; if (wall) - utmp_wall(wall, NULL, wall_tty_match); + utmp_wall(wall, NULL, NULL, wall_tty_match, NULL); } return r; -- cgit v1.2.3-54-g00ecf