X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fwall-notify.c;h=ab1c868fdfa18245e03b38a716b02931c1e15643;hb=034afb1ec2f0079a0880a19871548b3f220b1d98;hp=80ae552dfb353665fe54fc44defd2c4cb718352c;hpb=ec6ca6047db22414a4daf22fa65c3dcd43ab59f2;p=wall-notify%2Fwall-notify.git diff --git a/src/wall-notify.c b/src/wall-notify.c index 80ae552..ab1c868 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -67,7 +67,7 @@ static void setup_signals(void) { sigaction(SIGUSR2, &action, NULL); } -static int open_tty(void) { +static int open_tty(int public) { int ptm; const char *name; @@ -81,6 +81,7 @@ static int open_tty(void) { /* Prevent write access for other users so they can't use wall to send * messages to this program. */ + if (!public) { name = ptsname(ptm); if (!name) { return -1; @@ -88,6 +89,7 @@ static int open_tty(void) { if (chmod(name, S_IRUSR | S_IWUSR) != 0) { return -1; } + } if (unlockpt(ptm) != 0) { return -1; @@ -359,10 +361,11 @@ static void *x11_event_loop_thread(void *unused) { #endif static void usage(const char *argv0) { - fprintf(stderr, "usage: %s [-X] \n", argv0); + fprintf(stderr, "usage: %s [-X] [-m] \n", argv0); fprintf(stderr, "Pass wall messages to .\n"); fprintf(stderr, "\n"); fprintf(stderr, "-X quit when the current X session terminates\n"); + fprintf(stderr, "-m allow messages from normal users (like `mesg y`)\n"); #ifdef DONT_USE_X11 fprintf(stderr, "\n"); fprintf(stderr, "compiled without X11 support, -X disabled\n"); @@ -372,33 +375,49 @@ static void usage(const char *argv0) { int main(int argc, char **argv) { - int enable_x11; + int option, enable_x11, mesg_yes; 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; - 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); + mesg_yes = 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, "+Xmh")) != -1) { + switch (option) { + case 'X': + enable_x11 = 1; + break; + case 'm': + mesg_yes = 1; + case 'h': + usage(argv[0]); + break; + default: + fprintf(stderr, "%s: unknown option '%s'!\n\n", + argv[0], argv[optind - 1]); + usage(argv[0]); + break; } - argc--; /* for usage */ } - if (argc < 2) { - usage(argv0); + /* No arguments remaining, abort. */ + if (!argv[optind]) { + usage(argv[0]); } + /* Arguments for notification program. */ + argv += optind; - ptm = open_tty(); + ptm = open_tty(mesg_yes); if (ptm < 0) { perror("open_tty"); exit(EXIT_FAILURE);