From c14b5694b7ba69c4e92a528734ac5873d57184d9 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Sun, 30 Dec 2018 05:28:04 +0100 Subject: [PATCH] virsh: Add virshDomainShutdownModeCompleter This completer is used to offer shutdown/reboot modes. Signed-off-by: Michal Privoznik Reviewed-by: Cole Robinson --- tools/virsh-completer.c | 56 +++++++++++++++++++++++++++++++++++++++++ tools/virsh-completer.h | 4 +++ tools/virsh-domain.c | 2 ++ 3 files changed, 62 insertions(+) diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c index aac4579d1f..918e409890 100644 --- a/tools/virsh-completer.c +++ b/tools/virsh-completer.c @@ -936,3 +936,59 @@ virshDomainDeviceAliasCompleter(vshControl *ctl, VIR_STEAL_PTR(ret, tmp); return ret; } + + +char ** +virshDomainShutdownModeCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags) +{ + const char *modes[] = {"acpi", "agent", "initctl", "signal", "paravirt"}; + size_t i; + char **ret = NULL; + size_t ntmp = 0; + VIR_AUTOSTRINGLIST tmp = NULL; + const char *modeConst = NULL; + VIR_AUTOFREE(char *) mode = NULL; + VIR_AUTOSTRINGLIST modesSpecified = NULL; + + virCheckFlags(0, NULL); + + if (vshCommandOptStringQuiet(ctl, cmd, "mode", &modeConst) < 0) + return NULL; + + if (STREQ_NULLABLE(modeConst, " ")) + modeConst = NULL; + + if (modeConst) { + char *modeTmp = NULL; + + if (VIR_STRDUP(mode, modeConst) < 0) + return NULL; + + if ((modeTmp = strrchr(mode, ','))) + *modeTmp = '\0'; + else + VIR_FREE(mode); + } + + if (mode && !(modesSpecified = virStringSplit(mode, ",", 0))) + return NULL; + + if (VIR_ALLOC_N(tmp, ARRAY_CARDINALITY(modes) + 1) < 0) + return NULL; + + for (i = 0; i < ARRAY_CARDINALITY(modes); i++) { + if (virStringListHasString((const char **)modesSpecified, modes[i])) + continue; + + if ((mode && virAsprintf(&tmp[ntmp], "%s,%s", mode, modes[i]) < 0) || + (!mode && VIR_STRDUP(tmp[ntmp], modes[i]) < 0)) + return NULL; + + ntmp++; + } + + VIR_STEAL_PTR(ret, tmp); + return ret; +} diff --git a/tools/virsh-completer.h b/tools/virsh-completer.h index 2e2e1edafb..ed37a26cc9 100644 --- a/tools/virsh-completer.h +++ b/tools/virsh-completer.h @@ -110,4 +110,8 @@ char ** virshDomainDeviceAliasCompleter(vshControl *ctl, char ** virshCellnoCompleter(vshControl *ctl, const vshCmd *cmd, unsigned int flags); + +char ** virshDomainShutdownModeCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags); #endif /* LIBVIRT_VIRSH_COMPLETER_H */ diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index da087b74ae..b5d44d6909 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -5830,6 +5830,7 @@ static const vshCmdOptDef opts_shutdown[] = { VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE), {.name = "mode", .type = VSH_OT_STRING, + .completer = virshDomainShutdownModeCompleter, .help = N_("shutdown mode: acpi|agent|initctl|signal|paravirt") }, {.name = NULL} @@ -5914,6 +5915,7 @@ static const vshCmdOptDef opts_reboot[] = { VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE), {.name = "mode", .type = VSH_OT_STRING, + .completer = virshDomainShutdownModeCompleter, .help = N_("shutdown mode: acpi|agent|initctl|signal|paravirt") }, {.name = NULL} -- GitLab