chiark / gitweb /
verbs: when invoking the default verb, pass a faked argv array, with just the verb...
[elogind.git] / src / shared / verbs.c
index ead2ff6..bc1ae43 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);
+        }
 }