From 6dc5490141b4e1726a13570b1bab606d5f2d2199 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 16 Nov 2017 13:38:27 +0100 Subject: [PATCH] vsh: Make self-test more robust 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 Reviewed-by: Erik Skultety --- tools/vsh.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tools/vsh.c b/tools/vsh.c index 10a65c39f9..472438ead0 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -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 "), 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 "), 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] "), opt->name); break;