X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffirewall3.git;a=blobdiff_plain;f=options.c;h=6f96681561cbeec9b782da075dab1880a8568400;hp=a2a0465d8bab1ab8e2a4eed9f6546d00182d3afc;hb=88227a80c05cc305711160ba37e6c134654672a4;hpb=1fbc7b77f4b7748b8ebfea201a3eb09153e35c23 diff --git a/options.c b/options.c index a2a0465..6f96681 100644 --- a/options.c +++ b/options.c @@ -342,12 +342,13 @@ fw3_parse_network(void *ptr, const char *val, bool is_list) list_for_each_entry(addr, addr_list, list) { addr->invert = dev.invert; + addr->resolved = true; if (!put_value(ptr, addr, sizeof(*addr), is_list)) break; } - fw3_ubus_address_free(addr_list); + fw3_free_list(addr_list); } } @@ -517,6 +518,7 @@ fw3_parse_protocol(void *ptr, const char *val, bool is_list) { struct fw3_protocol proto = { }; struct protoent *ent; + char *e; if (*val == '!') { @@ -555,9 +557,9 @@ fw3_parse_protocol(void *ptr, const char *val, bool is_list) return true; } - proto.protocol = strtoul(val, NULL, 10); + proto.protocol = strtoul(val, &e, 10); - if (errno == ERANGE || errno == EINVAL) + if ((e == val) || (*e != 0)) return false; put_value(ptr, &proto, sizeof(proto), is_list); @@ -576,20 +578,22 @@ fw3_parse_ipset_datatype(void *ptr, const char *val, bool is_list) { struct fw3_ipset_datatype type = { }; + type.dir = "src"; + if (!strncmp(val, "dest_", 5)) { val += 5; - type.dest = true; + type.dir = "dst"; } else if (!strncmp(val, "dst_", 4)) { val += 4; - type.dest = true; + type.dir = "dst"; } else if (!strncmp(val, "src_", 4)) { val += 4; - type.dest = false; + type.dir = "src"; } if (parse_enum(&type.type, val, &fw3_ipset_type_names[FW3_IPSET_TYPE_IP], @@ -808,6 +812,46 @@ fw3_parse_mark(void *ptr, const char *val, bool is_list) return true; } +bool +fw3_parse_setmatch(void *ptr, const char *val, bool is_list) +{ + struct fw3_setmatch *m = ptr; + char *p, *s; + int i; + + if (*val == '!') + { + m->invert = true; + while (isspace(*++val)); + } + + if (!(s = strdup(val))) + return false; + + if (!(p = strtok(s, " \t"))) + { + free(s); + return false; + } + + strncpy(m->name, p, sizeof(m->name)); + + for (i = 0, p = strtok(NULL, " \t,"); + i < 3 && p != NULL; + i++, p = strtok(NULL, " \t,")) + { + if (!strncmp(p, "dest", 4) || !strncmp(p, "dst", 3)) + m->dir[i] = "dst"; + else if (!strncmp(p, "src", 3)) + m->dir[i] = "src"; + } + + free(s); + + m->set = true; + return true; +} + void fw3_parse_options(void *s, const struct fw3_option *opts,