In preparation for splitting virsh-interface.c, I found these functions need to be declared in virsh.h, as well as one that belongs more properly in virsh-domain.h. * tools/virsh.h (vshNameSorter, vshCmdHasOption): Declare. (vshCommandOptDomainBy): Move... * tools/virsh-domain.h): ...here. * tools/virsh.c: (vshNameSorter): Export. (cmd_has_option): Rename... (vshCmdHasOption): ...and export. (vshCommandOptDomainBy): Move... * tools/virsh-domain.c (vshCommandOptDomainBy): ...here. * tools/virsh-network.c (vshCommandOptNetworkBy): Update callers. * tools/virsh-nwfilter.c (vshCommandOptNWFilterBy): Likewise. * tools/virsh-secret.c (vshCommandOptSecret): Likewise. * tools/virsh-domain-monitor.c (includes): Likewise. * tools/virsh-host.c (includes): Likewise. --- tools/virsh-domain-monitor.c | 1 + tools/virsh-domain.c | 48 +++++++++++++++++++++++++++++++++++++++ tools/virsh-domain.h | 12 ++++++++++ tools/virsh-host.c | 1 + tools/virsh-interface.c | 2 +- tools/virsh-network.c | 2 +- tools/virsh-nwfilter.c | 2 +- tools/virsh-secret.c | 2 +- tools/virsh.c | 54 +++----------------------------------------- tools/virsh.h | 14 ++---------- 10 files changed, 71 insertions(+), 67 deletions(-) diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 4f00e65..44f65ad 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -36,6 +36,7 @@ #include "intprops.h" #include "memory.h" #include "virmacaddr.h" +#include "virsh-domain.h" #include "xml.h" static const char * diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index e949dcf..31f15dc 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -58,6 +58,54 @@ # define SA_SIGINFO 0 #endif +virDomainPtr +vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd, + const char **name, int flag) +{ + virDomainPtr dom = NULL; + const char *n = NULL; + int id; + const char *optname = "domain"; + if (!vshCmdHasOption(ctl, cmd, optname)) + return NULL; + + if (vshCommandOptString(cmd, optname, &n) <= 0) + return NULL; + + vshDebug(ctl, VSH_ERR_INFO, "%s: found option <%s>: %s\n", + cmd->def->name, optname, n); + + if (name) + *name = n; + + /* try it by ID */ + if (flag & VSH_BYID) { + if (virStrToLong_i(n, NULL, 10, &id) == 0 && id >= 0) { + vshDebug(ctl, VSH_ERR_DEBUG, + "%s: <%s> seems like domain ID\n", + cmd->def->name, optname); + dom = virDomainLookupByID(ctl->conn, id); + } + } + /* try it by UUID */ + if (dom==NULL && (flag & VSH_BYUUID) && strlen(n)==VIR_UUID_STRING_BUFLEN-1) { + vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as domain UUID\n", + cmd->def->name, optname); + dom = virDomainLookupByUUIDString(ctl->conn, n); + } + /* try it by NAME */ + if (dom==NULL && (flag & VSH_BYNAME)) { + vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as domain NAME\n", + cmd->def->name, optname); + dom = virDomainLookupByName(ctl->conn, n); + } + + if (!dom) + vshError(ctl, _("failed to get domain '%s'"), n); + + return dom; +} + static const char * vshDomainVcpuStateToString(int state) { diff --git a/tools/virsh-domain.h b/tools/virsh-domain.h index b1b7930..21672e7 100644 --- a/tools/virsh-domain.h +++ b/tools/virsh-domain.h @@ -28,6 +28,18 @@ # include "virsh.h" +# define VSH_BYID (1 << 1) +# define VSH_BYUUID (1 << 2) +# define VSH_BYNAME (1 << 3) +# define VSH_BYMAC (1 << 4) + +virDomainPtr vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd, + const char **name, int flag); + +/* default is lookup by Id, Name and UUID */ +# define vshCommandOptDomain(_ctl, _cmd, _name) \ + vshCommandOptDomainBy(_ctl, _cmd, _name, VSH_BYID|VSH_BYUUID|VSH_BYNAME) + extern const vshCmdDef domManagementCmds[]; #endif /* VIRSH_DOMAIN_H */ diff --git a/tools/virsh-host.c b/tools/virsh-host.c index e3cff8e..3c44969 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -35,6 +35,7 @@ #include "buf.h" #include "memory.h" #include "util.h" +#include "virsh-domain.h" #include "xml.h" /* diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c index ad080a1..e43aa91 100644 --- a/tools/virsh-interface.c +++ b/tools/virsh-interface.c @@ -38,7 +38,7 @@ vshCommandOptInterfaceBy(vshControl *ctl, const vshCmd *cmd, if (!optname) optname = "interface"; - if (!cmd_has_option(ctl, cmd, optname)) + if (!vshCmdHasOption(ctl, cmd, optname)) return NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) diff --git a/tools/virsh-network.c b/tools/virsh-network.c index b33e2d6..b891c91 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -35,7 +35,7 @@ vshCommandOptNetworkBy(vshControl *ctl, const vshCmd *cmd, virNetworkPtr network = NULL; const char *n = NULL; const char *optname = "network"; - if (!cmd_has_option(ctl, cmd, optname)) + if (!vshCmdHasOption(ctl, cmd, optname)) return NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) diff --git a/tools/virsh-nwfilter.c b/tools/virsh-nwfilter.c index 501e20d..a6ef233 100644 --- a/tools/virsh-nwfilter.c +++ b/tools/virsh-nwfilter.c @@ -35,7 +35,7 @@ vshCommandOptNWFilterBy(vshControl *ctl, const vshCmd *cmd, virNWFilterPtr nwfilter = NULL; const char *n = NULL; const char *optname = "nwfilter"; - if (!cmd_has_option(ctl, cmd, optname)) + if (!vshCmdHasOption(ctl, cmd, optname)) return NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c index 049ead5..6f971da 100644 --- a/tools/virsh-secret.c +++ b/tools/virsh-secret.c @@ -30,7 +30,7 @@ vshCommandOptSecret(vshControl *ctl, const vshCmd *cmd, const char **name) const char *n = NULL; const char *optname = "secret"; - if (!cmd_has_option(ctl, cmd, optname)) + if (!vshCmdHasOption(ctl, cmd, optname)) return NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) diff --git a/tools/virsh.c b/tools/virsh.c index 793a357..fe79b7c 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -128,7 +128,7 @@ _vshStrdup(vshControl *ctl, const char *s, const char *filename, int line) /* Poison the raw allocating identifiers in favor of our vsh variants. */ #define strdup use_vshStrdup_instead_of_strdup -static int +int vshNameSorter(const void *a, const void *b) { const char **sa = (const char**)a; @@ -1441,8 +1441,8 @@ vshCommandOptArgv(const vshCmd *cmd, const vshCmdOpt *opt) /* Determine whether CMD->opts includes an option with name OPTNAME. If not, give a diagnostic and return false. If so, return true. */ -static bool -cmd_has_option(vshControl *ctl, const vshCmd *cmd, const char *optname) +bool +vshCmdHasOption(vshControl *ctl, const vshCmd *cmd, const char *optname) { /* Iterate through cmd->opts, to ensure that there is an entry with name OPTNAME and type VSH_OT_DATA. */ @@ -1461,54 +1461,6 @@ cmd_has_option(vshControl *ctl, const vshCmd *cmd, const char *optname) return found; } -virDomainPtr -vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd, - const char **name, int flag) -{ - virDomainPtr dom = NULL; - const char *n = NULL; - int id; - const char *optname = "domain"; - if (!cmd_has_option(ctl, cmd, optname)) - return NULL; - - if (vshCommandOptString(cmd, optname, &n) <= 0) - return NULL; - - vshDebug(ctl, VSH_ERR_INFO, "%s: found option <%s>: %s\n", - cmd->def->name, optname, n); - - if (name) - *name = n; - - /* try it by ID */ - if (flag & VSH_BYID) { - if (virStrToLong_i(n, NULL, 10, &id) == 0 && id >= 0) { - vshDebug(ctl, VSH_ERR_DEBUG, - "%s: <%s> seems like domain ID\n", - cmd->def->name, optname); - dom = virDomainLookupByID(ctl->conn, id); - } - } - /* try it by UUID */ - if (dom==NULL && (flag & VSH_BYUUID) && strlen(n)==VIR_UUID_STRING_BUFLEN-1) { - vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as domain UUID\n", - cmd->def->name, optname); - dom = virDomainLookupByUUIDString(ctl->conn, n); - } - /* try it by NAME */ - if (dom==NULL && (flag & VSH_BYNAME)) { - vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as domain NAME\n", - cmd->def->name, optname); - dom = virDomainLookupByName(ctl->conn, n); - } - - if (!dom) - vshError(ctl, _("failed to get domain '%s'"), n); - - return dom; -} - /* * Executes command(s) and returns return code from last command */ diff --git a/tools/virsh.h b/tools/virsh.h index 24d2020..58a2dcd 100644 --- a/tools/virsh.h +++ b/tools/virsh.h @@ -286,18 +286,7 @@ int vshCommandOptScaledInt(const vshCmd *cmd, const char *name, bool vshCommandOptBool(const vshCmd *cmd, const char *name); const vshCmdOpt *vshCommandOptArgv(const vshCmd *cmd, const vshCmdOpt *opt); - -# define VSH_BYID (1 << 1) -# define VSH_BYUUID (1 << 2) -# define VSH_BYNAME (1 << 3) -# define VSH_BYMAC (1 << 4) - -virDomainPtr vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd, - const char **name, int flag); - -/* default is lookup by Id, Name and UUID */ -# define vshCommandOptDomain(_ctl, _cmd, _name) \ - vshCommandOptDomainBy(_ctl, _cmd, _name, VSH_BYID|VSH_BYUUID|VSH_BYNAME) +bool vshCmdHasOption(vshControl *ctl, const vshCmd *cmd, const char *optname); void vshPrintExtra(vshControl *ctl, const char *format, ...) ATTRIBUTE_FMT_PRINTF(2, 3); @@ -309,6 +298,7 @@ void vshDebug(vshControl *ctl, int level, const char *format, ...) /* User visible sort, so we want locale-specific case comparison. */ # define vshStrcasecmp(S1, S2) strcasecmp(S1, S2) +int vshNameSorter(const void *a, const void *b); int vshDomainState(vshControl *ctl, virDomainPtr dom, int *reason); bool vshConnectionUsability(vshControl *ctl, virConnectPtr conn); -- 1.7.11.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list