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.
This commit is contained in:
parent
8aaa023ae7
commit
99f710dde8
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue