1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-02 02:21:44 +03:00

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.
This commit is contained in:
Lennart Poettering 2014-12-19 19:17:52 +01:00
parent cd61c3bfd7
commit 43343ee7c2

View File

@ -49,11 +49,10 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) {
return -EINVAL; return -EINVAL;
} }
if (name)
if (!name)
found = !!(verbs[i].flags & VERB_DEFAULT);
else
found = streq(name, verbs[i].verb); found = streq(name, verbs[i].verb);
else
found = !!(verbs[i].flags & VERB_DEFAULT);
if (found) { if (found) {
verb = &verbs[i]; 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 && if (verb->min_args != VERB_ANY &&
(unsigned) left < verb->min_args) { (unsigned) left < verb->min_args) {
log_error("Too few arguments."); log_error("Too few arguments.");
@ -73,5 +77,14 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) {
return -EINVAL; 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);
}
} }