X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-parse.c;h=de7cd9c72e17603dc096a21c330e7113baf2ab67;hb=14cff48183cfd6ea939d4d8012fde192b03eeca1;hp=3fac4749c0106924a21ffd936f65bb51ded29743;hpb=685a51a5b89750cead1b2934c2079d2bb9c52a4a;p=sliver-openvswitch.git diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 3fac4749c..de7cd9c72 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -43,7 +43,7 @@ str_to_u32(const char *str) char *tail; uint32_t value; - if (!str) { + if (!str[0]) { ovs_fatal(0, "missing required numeric argument"); } @@ -61,6 +61,10 @@ str_to_u64(const char *str) char *tail; uint64_t value; + if (!str[0]) { + ovs_fatal(0, "missing required numeric argument"); + } + errno = 0; value = strtoull(str, &tail, 0); if (errno == EINVAL || errno == ERANGE || *tail) { @@ -271,6 +275,7 @@ str_to_action(char *str, struct ofpbuf *b) pos = str; n_actions = 0; for (;;) { + char empty_string[] = ""; char *act, *arg; size_t actlen; uint16_t port; @@ -320,7 +325,7 @@ str_to_action(char *str, struct ofpbuf *b) pos = arg + arglen; } else { /* There might be no argument at all. */ - arg = NULL; + arg = empty_string; pos = act + actlen + (act[actlen] != '\0'); } act[actlen] = '\0'; @@ -410,7 +415,7 @@ str_to_action(char *str, struct ofpbuf *b) nan->subtype = htons(NXAST_NOTE); b->size -= sizeof nan->note; - while (arg && *arg != '\0') { + while (*arg != '\0') { uint8_t byte; bool ok; @@ -472,7 +477,7 @@ str_to_action(char *str, struct ofpbuf *b) /* Unless a numeric argument is specified, we send the whole * packet to the controller. */ - if (arg && (strspn(arg, "0123456789") == strlen(arg))) { + if (arg[0] && (strspn(arg, "0123456789") == strlen(arg))) { oao->max_len = htons(str_to_u32(arg)); } else { oao->max_len = htons(UINT16_MAX); @@ -721,7 +726,7 @@ parse_reg_value(struct cls_rule *rule, int reg_idx, const char *value) /* Convert 'string' (as described in the Flow Syntax section of the ovs-ofctl * man page) into 'pf'. If 'actions' is specified, an action must be in * 'string' and may be expanded or reallocated. */ -static void +void parse_ofp_str(struct flow_mod *fm, uint8_t *table_idx, struct ofpbuf *actions, char *string) { @@ -866,30 +871,16 @@ parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format, * 'stream' and the command is always OFPFC_ADD. Returns false if end-of-file * is reached before reading a flow, otherwise true. */ bool -parse_ofp_add_flow_file(struct list *packets, enum nx_flow_format *cur, - FILE *stream) +parse_ofp_flow_mod_file(struct list *packets, enum nx_flow_format *cur, + FILE *stream, uint16_t command) { - struct ds s = DS_EMPTY_INITIALIZER; - bool ok = false; - - while (!ds_get_line(&s, stream)) { - char *line = ds_cstr(&s); - char *comment; + struct ds s; + bool ok; - /* Delete comments. */ - comment = strchr(line, '#'); - if (comment) { - *comment = '\0'; - } - - /* Drop empty lines. */ - if (line[strspn(line, " \t\n")] == '\0') { - continue; - } - - parse_ofp_flow_mod_str(packets, cur, line, OFPFC_ADD); - ok = true; - break; + ds_init(&s); + ok = ds_get_preprocessed_line(&s, stream) == 0; + if (ok) { + parse_ofp_flow_mod_str(packets, cur, ds_cstr(&s), command); } ds_destroy(&s); @@ -909,4 +900,3 @@ parse_ofp_flow_stats_request_str(struct flow_stats_request *fsr, fsr->out_port = fm.out_port; fsr->table_id = table_id; } -