From 0177f8bdc6769e800ee986dec1b069be893f19e6 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Sat, 17 May 2014 22:30:38 +0200 Subject: [PATCH] use getopt() to parse options --- src/wall-notify.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/wall-notify.c b/src/wall-notify.c index 806204e..bbc783b 100644 --- a/src/wall-notify.c +++ b/src/wall-notify.c @@ -372,32 +372,44 @@ static void usage(const char *argv0) { int main(int argc, char **argv) { - int enable_x11; + 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; - 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); + + /* + * 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; } - argc--; /* for usage */ - argv++; } - 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) { -- 2.43.2