summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mack <daniel@zonque.org>2015-04-24 15:31:29 +0200
committerDaniel Mack <daniel@zonque.org>2015-04-24 17:48:12 +0200
commit99f710dde855f7ecb699ddac6ad77923c1f6bc85 (patch)
tree3fb5bb95bd9eeb0ad1839285b08ae0665cf76e50
parent8aaa023ae78f3cb28db3edd87f96b21486810b91 (diff)
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.
-rw-r--r--src/journal/journald-wall.c2
-rw-r--r--src/shared/utmp-wtmp.c19
-rw-r--r--src/shared/utmp-wtmp.h15
-rw-r--r--src/shutdownd/shutdownd.c2
-rw-r--r--src/systemctl/systemctl.c4
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c4
6 files changed, 32 insertions, 14 deletions
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;