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>
This commit is contained in:
Phil Sutter 2016-07-23 13:28:08 +02:00 committed by Stephen Hemminger
parent 9ffc80b1e4
commit 53aadc5286
2 changed files with 35 additions and 21 deletions

View File

@ -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;
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;
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;
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;
}

View File

@ -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);