X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fverbs.c;h=c7beccc2dc291c762307a3f7ccb87200c0fdf9eb;hb=374c22b351e43ce4ef70ef0ad1bd1e4e520f9a28;hp=ead2ff60f4cd448b1f3f5748349814cb49eb3aad;hpb=dca59f62666c2d37d1a68ed332ba7985c1141f82;p=elogind.git diff --git a/src/shared/verbs.c b/src/shared/verbs.c index ead2ff60f..c7beccc2d 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."); @@ -69,9 +73,18 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) { if (verb->max_args != VERB_ANY && (unsigned) left > verb->max_args) { - log_error("Too many argument.s"); + log_error("Too many arguments."); 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); + } }