Use libiptc to clear current ruleset
[project/firewall3.git] / options.c
index f261e70..3d30c57 100644 (file)
--- a/options.c
+++ b/options.c
@@ -91,13 +91,15 @@ static const char *limit_units[] = {
        "day",
 };
 
-static const char *ipset_methods[] = {
+const char *fw3_ipset_method_names[__FW3_IPSET_METHOD_MAX] = {
+       "(bug)",
        "bitmap",
        "hash",
        "list",
 };
 
-static const char *ipset_types[] = {
+const char *fw3_ipset_type_names[__FW3_IPSET_TYPE_MAX] = {
+       "(bug)",
        "ip",
        "port",
        "mac",
@@ -140,7 +142,7 @@ fw3_parse_bool(void *ptr, const char *val, bool is_list)
 bool
 fw3_parse_int(void *ptr, const char *val, bool is_list)
 {
-       int n = strtol(val, NULL, 10);
+       int n = strtol(val, NULL, 0);
 
        if (errno == ERANGE || errno == EINVAL)
                return false;
@@ -201,6 +203,7 @@ fw3_parse_limit(void *ptr, const char *val, bool is_list)
 bool
 fw3_parse_device(void *ptr, const char *val, bool is_list)
 {
+       char *p;
        struct fw3_device dev = { };
 
        if (*val == '*')
@@ -217,6 +220,12 @@ fw3_parse_device(void *ptr, const char *val, bool is_list)
                while (isspace(*++val));
        }
 
+       if ((p = strchr(val, '@')) != NULL)
+       {
+               *p++ = 0;
+               snprintf(dev.network, sizeof(dev.network), "%s", p);
+       }
+
        if (*val)
                snprintf(dev.name, sizeof(dev.name), "%s", val);
        else
@@ -558,33 +567,39 @@ fw3_parse_protocol(void *ptr, const char *val, bool is_list)
 bool
 fw3_parse_ipset_method(void *ptr, const char *val, bool is_list)
 {
-       return parse_enum(ptr, val, ipset_methods,
+       return parse_enum(ptr, val, &fw3_ipset_method_names[FW3_IPSET_METHOD_BITMAP],
                          FW3_IPSET_METHOD_BITMAP, FW3_IPSET_METHOD_LIST);
 }
 
 bool
 fw3_parse_ipset_datatype(void *ptr, const char *val, bool is_list)
 {
-       struct fw3_ipset_datatype *type = ptr;
+       struct fw3_ipset_datatype type = { };
 
        if (!strncmp(val, "dest_", 5))
        {
                val += 5;
-               type->dest = true;
+               type.dest = true;
        }
        else if (!strncmp(val, "dst_", 4))
        {
                val += 4;
-               type->dest = true;
+               type.dest = true;
        }
        else if (!strncmp(val, "src_", 4))
        {
                val += 4;
-               type->dest = false;
+               type.dest = false;
        }
 
-       return parse_enum(&type->type, val, ipset_types,
-                         FW3_IPSET_TYPE_IP, FW3_IPSET_TYPE_SET);
+       if (parse_enum(&type.type, val, &fw3_ipset_type_names[FW3_IPSET_TYPE_IP],
+                      FW3_IPSET_TYPE_IP, FW3_IPSET_TYPE_SET))
+       {
+               put_value(ptr, &type, sizeof(type), is_list);
+               return true;
+       }
+
+       return false;
 }
 
 bool
@@ -1042,10 +1057,7 @@ fw3_format_ipset(struct fw3_ipset *ipset, bool invert)
        if (!ipset)
                return;
 
-       if (ipset->external && *ipset->external)
-               name = ipset->external;
-       else
-               name = ipset->name;
+       name = ipset->external ? ipset->external : ipset->name;
 
        fw3_pr(" -m set %s--match-set %s", invert ? "! " : "", name);