chiark / gitweb /
verbs: when invoking the default verb, pass a faked argv array, with just the verb...
authorLennart Poettering <lennart@poettering.net>
Fri, 19 Dec 2014 18:17:52 +0000 (19:17 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 19 Dec 2014 18:19:29 +0000 (19:19 +0100)
That way the dispatcher calls know how they got called.

src/shared/verbs.c

index ead2ff60f4cd448b1f3f5748349814cb49eb3aad..bc1ae4353524c1c69eaf24330aca38c6db0191af 100644 (file)
@@ -49,11 +49,10 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) {
                         return -EINVAL;
                 }
 
-
-                if (!name)
-                        found = !!(verbs[i].flags & VERB_DEFAULT);
-                else
+                if (name)
                         found = streq(name, verbs[i].verb);
+                else
+                        found = !!(verbs[i].flags & VERB_DEFAULT);
 
                 if (found) {
                         verb = &verbs[i];
@@ -61,6 +60,11 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) {
                 }
         }
 
+        assert(verb);
+
+        if (!name)
+                left = 1;
+
         if (verb->min_args != VERB_ANY &&
             (unsigned) left < verb->min_args) {
                 log_error("Too few arguments.");
@@ -73,5 +77,14 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) {
                 return -EINVAL;
         }
 
-        return verb->dispatch(left, argv + optind, userdata);
+        if (name)
+                return verb->dispatch(left, argv + optind, userdata);
+        else {
+                char* fake[2] = {
+                        (char*) verb->verb,
+                        NULL
+                };
+
+                return verb->dispatch(1, fake, userdata);
+        }
 }