From ec6ca6047db22414a4daf22fa65c3dcd43ab59f2 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Thu, 15 May 2014 18:56:15 +0200 Subject: [PATCH] use -X command line option to enable X11 support --- README | 13 +++++++++++++ src/wall-notify.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/README b/README index f6eb3de..783e59a 100644 --- a/README +++ b/README @@ -11,6 +11,9 @@ wall messages are either directly created by root with the `wall` command or sent by other programs like `reboot`, `shutdown` or other processes like NFS to warn users when the NFS server terminates. +Optionally X11 can be used to automatically terminate wall-notify when the +current X11 session terminates, i.e. when the user logs out. See below. + wall-notify is licensed under GPL 3 (or later). @@ -20,6 +23,8 @@ DEPENDENCIES - C89 compiler - libutempter or utmpx.h (utmpx.x requires a setgid utmp binary) +- optional: X11 headers and library, necessary for X11 support + INSTALLATION ------------ @@ -52,6 +57,14 @@ in the message. For a simple wrapper script which removes those, see The shell is not used when running the program. +If X11 support is compiled in then the '-X' option can be used to terminate +wall-notify automatically when the X session quits. This is useful when +wall-notify is started in `.xinitrc` and should quit when the X session ends, +i.e the user logs out: + + ./src/wall-notify -X cat + + BUGS ---- diff --git a/src/wall-notify.c b/src/wall-notify.c index 292b71a..80ae552 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -359,12 +359,20 @@ static void *x11_event_loop_thread(void *unused) { #endif static void usage(const char *argv0) { - fprintf(stderr, "usage: %s \n", argv0); + fprintf(stderr, "usage: %s [-X] \n", argv0); + fprintf(stderr, "Pass wall messages to .\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "-X quit when the current X session terminates\n"); +#ifdef DONT_USE_X11 + fprintf(stderr, "\n"); + fprintf(stderr, "compiled without X11 support, -X disabled\n"); +#endif exit(EXIT_FAILURE); } int main(int argc, char **argv) { + int enable_x11; int ptm, pts; char *name; const char *argv0; @@ -373,6 +381,19 @@ int main(int argc, char **argv) { /* Don't pass our argv[0] to the notification program. */ argv++; + enable_x11 = 0; + if (argc > 1 && argv[0][0] == '-') { + if (!strcmp("-X", argv[0])) { + enable_x11 = 1; + } else { + if (strcmp("-h", argv[0])) { + fprintf(stderr, "%s: unknown option '%s'!\n\n", argv0, argv[0]); + } + usage(argv0); + } + argc--; /* for usage */ + } + if (argc < 2) { usage(argv0); } @@ -400,18 +421,21 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } -#ifndef DONT_USE_X11 /* Start a thread which connects to X11. This way we die if the user logs * out of its X11 session. */ - { + if (enable_x11) { +#ifdef DONT_USE_X11 + fprintf(stderr, "%s: option -X is disabled!\n\n", argv0); + usage(argv0); +#else pthread_t tid; if (pthread_create(&tid, NULL, x11_event_loop_thread, NULL) != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } - } #endif + } /* Cleanup on signals. Necessary before login(). */ setup_signals(); -- 2.45.2