]> xenbits.xensource.com Git - libvirt.git/commitdiff
vsh: Make self-test more robust
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 16 Nov 2017 12:38:27 +0000 (13:38 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 21 Nov 2017 11:46:06 +0000 (12:46 +0100)
There are couple of limitations when it comes to option types and
flags for the options. For instance, VSH_OT_STRING cannot have
VSH_OFLAG_REQ set (commit c7543a728). For some reason this is
checked in vshCmddefHelp() but not in vshCmddefCheckInternals().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
tools/vsh.c

index 10a65c39f960c747c92117077de234b75bf9f870..472438ead043291d6bf032374b7c281169ac9e6b 100644 (file)
@@ -363,12 +363,15 @@ vshCmddefCheckInternals(const vshCmdDef *cmd)
 
         if (i > 63)
             return -1; /* too many options */
-        if (opt->type == VSH_OT_BOOL) {
+
+        switch (opt->type) {
+        case VSH_OT_STRING:
+        case VSH_OT_BOOL:
             if (opt->flags & VSH_OFLAG_REQ)
-                return -1; /* bool options can't be mandatory */
-            continue;
-        }
-        if (opt->type == VSH_OT_ALIAS) {
+                return -1; /* nor bool nor string options can't be mandatory */
+            break;
+
+        case VSH_OT_ALIAS: {
             size_t j;
             char *name = (char *)opt->help; /* cast away const */
             char *p;
@@ -391,10 +394,21 @@ vshCmddefCheckInternals(const vshCmdDef *cmd)
             }
             if (!cmd->opts[j].name)
                 return -1; /* alias option must map to a later option name */
-            continue;
         }
-        if (opt->type == VSH_OT_ARGV && cmd->opts[i + 1].name)
-            return -1; /* argv option must be listed last */
+            break;
+        case VSH_OT_ARGV:
+            if (cmd->opts[i + 1].name)
+                return -1; /* argv option must be listed last */
+            break;
+
+        case VSH_OT_DATA:
+            if (!(opt->flags & VSH_OFLAG_REQ))
+                return -1; /* OT_DATA should always be required. */
+            break;
+
+        case VSH_OT_INT:
+            break;
+        }
     }
     return 0;
 }
@@ -733,23 +747,9 @@ vshCmddefHelp(vshControl *ctl, const char *cmdname)
                          : _("--%s <number>"), opt->name);
                 break;
             case VSH_OT_STRING:
-                /* OT_STRING should never be VSH_OFLAG_REQ */
-                if (opt->flags & VSH_OFLAG_REQ) {
-                    vshError(ctl,
-                             _("internal error: bad options in command: '%s'"),
-                             def->name);
-                    return false;
-                }
                 snprintf(buf, sizeof(buf), _("--%s <string>"), opt->name);
                 break;
             case VSH_OT_DATA:
-                /* OT_DATA should always be VSH_OFLAG_REQ */
-                if (!(opt->flags & VSH_OFLAG_REQ)) {
-                    vshError(ctl,
-                             _("internal error: bad options in command: '%s'"),
-                             def->name);
-                    return false;
-                }
                 snprintf(buf, sizeof(buf), _("[--%s] <string>"),
                          opt->name);
                 break;