From 43343ee7c298dad8db0698b4c181a42ecb7bb216 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 19 Dec 2014 19:17:52 +0100 Subject: [PATCH] verbs: when invoking the default verb, pass a faked argv array, with just the verb in it That way the dispatcher calls know how they got called. --- src/shared/verbs.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/shared/verbs.c b/src/shared/verbs.c index ead2ff6..bc1ae43 100644 --- a/src/shared/verbs.c +++ b/src/shared/verbs.c @@ -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); + } } -- 2.7.4