]> ruderich.org/simon Gitweb - wall-notify/wall-notify.git/commitdiff
use getopt() to parse options
authorSimon Ruderich <simon@ruderich.org>
Sat, 17 May 2014 20:30:38 +0000 (22:30 +0200)
committerSimon Ruderich <simon@ruderich.org>
Sat, 17 May 2014 20:30:38 +0000 (22:30 +0200)
src/wall-notify.c

index 806204e09c975c27c6885b3785724c6e0662162e..bbc783b5e884514ca1f793da674ba22d71bc5415 100644 (file)
@@ -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) {