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:
Daniel Mack
2015-04-24 17:48:12 +02:00
parent 8aaa023ae7
commit 99f710dde8
6 changed files with 32 additions and 14 deletions
+14 -5
View File
@@ -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;
+12 -3
View File
@@ -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;
}