summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2016-07-23 13:28:08 +0200
committerStephen Hemminger <shemming@brocade.com>2016-07-25 08:10:43 -0700
commit53aadc5286261fecb6e994918db8371515f9dd99 (patch)
tree8f6e2a533b0c8d8b3fa5dcf0e60f34ad361a19db
parent9ffc80b1e49c4264fb20851e179aaa8ec0bc0766 (diff)
tc: util: bore up action_a2n()
It's a pitty this function is used nowhere, so let's polish it for use: * Loop over branch names, makes it clear that every former conditional was exactly identical. * Support 'pipe' branch name, too. * Make number parsing optional. Signed-off-by: Phil Sutter <phil@nwl.cc>
-rw-r--r--tc/tc_util.c56
-rw-r--r--tc/tc_util.h2
2 files changed, 36 insertions, 22 deletions
diff --git a/tc/tc_util.c b/tc/tc_util.c
index fd6669f2..cd7b40b0 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -435,29 +435,43 @@ char *action_n2a(int action, char *buf, int len)
}
}
-int action_a2n(char *arg, int *result)
+/* Convert action branch name into numeric format.
+ *
+ * Parameters:
+ * @arg - string to parse
+ * @result - pointer to output variable
+ * @allow_num - whether @arg may be in numeric format already
+ *
+ * In error case, returns -1 and does not touch @result. Otherwise returns 0.
+ */
+int action_a2n(char *arg, int *result, bool allow_num)
{
- int res;
-
- if (matches(arg, "continue") == 0)
- res = -1;
- else if (matches(arg, "drop") == 0)
- res = TC_ACT_SHOT;
- else if (matches(arg, "shot") == 0)
- res = TC_ACT_SHOT;
- else if (matches(arg, "pass") == 0)
- res = TC_ACT_OK;
- else if (strcmp(arg, "ok") == 0)
- res = TC_ACT_OK;
- else if (matches(arg, "reclassify") == 0)
- res = TC_ACT_RECLASSIFY;
- else {
- char dummy;
-
- if (sscanf(arg, "%d%c", &res, &dummy) != 1)
- return -1;
+ int n;
+ char dummy;
+ struct {
+ const char *a;
+ int n;
+ } a2n[] = {
+ {"continue", TC_ACT_UNSPEC},
+ {"drop", TC_ACT_SHOT},
+ {"shot", TC_ACT_SHOT},
+ {"pass", TC_ACT_OK},
+ {"ok", TC_ACT_OK},
+ {"reclassify", TC_ACT_RECLASSIFY},
+ {"pipe", TC_ACT_PIPE},
+ { NULL },
+ }, *iter;
+
+ for (iter = a2n; iter->a; iter++) {
+ if (matches(arg, iter->a) != 0)
+ continue;
+ *result = iter->n;
+ return 0;
}
- *result = res;
+ if (!allow_num || sscanf(arg, "%d%c", &n, &dummy) != 1)
+ return -1;
+
+ *result = n;
return 0;
}
diff --git a/tc/tc_util.h b/tc/tc_util.h
index 744f18fd..e7613ab1 100644
--- a/tc/tc_util.h
+++ b/tc/tc_util.h
@@ -100,7 +100,7 @@ int tc_print_police(FILE *f, struct rtattr *tb);
int parse_police(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n);
char *action_n2a(int action, char *buf, int len);
-int action_a2n(char *arg, int *result);
+int action_a2n(char *arg, int *result, bool allow_num);
int act_parse_police(struct action_util *a, int *argc_p,
char ***argv_p, int tca_id, struct nlmsghdr *n);
int print_police(struct action_util *a, FILE *f, struct rtattr *tb);