X-Git-Url: https://ruderich.org/simon/gitweb/?p=wall-notify%2Fwall-notify.git;a=blobdiff_plain;f=src%2Fwall-notify.c;h=bbc783b5e884514ca1f793da674ba22d71bc5415;hp=292b71a1d9d026208db979be56cc5c03bdffb4d0;hb=0177f8bdc6769e800ee986dec1b069be893f19e6;hpb=3553a29a54f7755debfa189db830c4b8de51826f diff --git a/src/wall-notify.c b/src/wall-notify.c index 292b71a..bbc783b 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -359,23 +359,57 @@ 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 option, enable_x11; int ptm, pts; char *name; - const char *argv0; - argv0 = argv[0]; - /* Don't pass our argv[0] to the notification program. */ - argv++; + /* Don't display error messages for unknown options. */ + opterr = 0; + + enable_x11 = 0; + + /* + * Glibc violates POSIX by default and skips over non-option arguments and + * parses later arguments which look like options as well. But we want to + * pass everything except the options unmodified to execvp(). Prefixing + * the optstring with "+" fixes this behaver. This is not POSIX + * compatible, but the option should be ignored on other systems. + */ + while ((option = getopt(argc, argv, "+Xh")) != -1) { + switch (option) { + case 'X': + enable_x11 = 1; + break; + case 'h': + usage(argv[0]); + break; + default: + fprintf(stderr, "%s: unknown option '%s'!\n\n", + argv[0], argv[optind - 1]); + usage(argv[0]); + break; + } + } - if (argc < 2) { - usage(argv0); + /* No arguments remaining, abort. */ + if (!argv[optind]) { + usage(argv[0]); } + /* Arguments for notification program. */ + argv += optind; ptm = open_tty(); if (ptm < 0) { @@ -400,18 +434,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();