[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCHv2 9/4] virsh: declare more common functions



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.  Also, since we
use the VSH_BY* flags in more than one function, I improved
how they are used.

* tools/virsh.h	(vshNameSorter, vshCmdHasOption): Declare.
(VSH_BYID): Turn into enum.
(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, adjust
signature, and check flags.
* 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.
---

v2: keep VSH_BYID in virsh.h after all, but convert to enum and add
virCheckFlags sanity checking

 tools/virsh-domain-monitor.c |  1 +
 tools/virsh-domain.c         | 51 +++++++++++++++++++++++++++++++++++++++++
 tools/virsh-domain.h         |  7 ++++++
 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                | 20 ++++++++--------
 10 files changed, 76 insertions(+), 66 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..6a87d49 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -58,6 +58,57 @@
 # define SA_SIGINFO 0
 #endif

+virDomainPtr
+vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd,
+                      const char **name, unsigned int flags)
+{
+    virDomainPtr dom = NULL;
+    const char *n = NULL;
+    int id;
+    const char *optname = "domain";
+    virCheckFlags(VSH_BYID | VSH_BYUUID | VSH_BYNAME, NULL);
+
+    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 (flags & 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 && (flags & 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 && (flags & 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..cd51b57 100644
--- a/tools/virsh-domain.h
+++ b/tools/virsh-domain.h
@@ -28,6 +28,13 @@

 # include "virsh.h"

+virDomainPtr vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd,
+                                   const char **name, unsigned int flags);
+
+/* 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..818d515 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -286,18 +286,15 @@ 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);
+bool vshCmdHasOption(vshControl *ctl, const vshCmd *cmd, const char *optname);

-# 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)
+/* Filter flags for various vshCommandOpt*By() functions */
+typedef enum {
+    VSH_BYID   = (1 << 1),
+    VSH_BYUUID = (1 << 2),
+    VSH_BYNAME = (1 << 3),
+    VSH_BYMAC  = (1 << 4),
+} vshLookupByFlags;

 void vshPrintExtra(vshControl *ctl, const char *format, ...)
     ATTRIBUTE_FMT_PRINTF(2, 3);
@@ -309,6 +306,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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]