zones: add interface/subnet bound LOG rules
[project/firewall3.git] / options.c
index 6d2a283..087aa63 100644 (file)
--- a/options.c
+++ b/options.c
@@ -75,6 +75,7 @@ const char *fw3_flag_names[__FW3_FLAG_MAX] = {
        "REJECT",
        "DROP",
        "NOTRACK",
+       "HELPER",
        "MARK",
        "DNAT",
        "SNAT",
@@ -640,6 +641,7 @@ fw3_parse_date(void *ptr, const char *val, bool is_list)
 {
        unsigned int year = 1970, mon = 1, day = 1, hour = 0, min = 0, sec = 0;
        struct tm tm = { 0 };
+       time_t ts;
        char *p;
 
        year = strtoul(val, &p, 10);
@@ -684,9 +686,11 @@ ret:
        tm.tm_min  = min;
        tm.tm_sec  = sec;
 
-       if (mktime(&tm) >= 0)
+       ts = mktime(&tm) - timezone;
+
+       if (ts >= 0)
        {
-               *((struct tm *)ptr) = tm;
+               gmtime_r(&ts, (struct tm *)ptr);
                return true;
        }
 
@@ -897,6 +901,39 @@ fw3_parse_direction(void *ptr, const char *val, bool is_list)
        return valid;
 }
 
+bool
+fw3_parse_cthelper(void *ptr, const char *val, bool is_list)
+{
+       struct fw3_cthelpermatch m = { };
+
+       if (*val == '!')
+       {
+               m.invert = true;
+               while (isspace(*++val));
+       }
+
+       if (*val)
+       {
+               m.set = true;
+               strncpy(m.name, val, sizeof(m.name) - 1);
+               put_value(ptr, &m, sizeof(m), is_list);
+               return true;
+       }
+
+       return false;
+}
+
+bool
+fw3_parse_setentry(void *ptr, const char *val, bool is_list)
+{
+       struct fw3_setentry e = { };
+
+       e.value = val;
+       put_value(ptr, &e, sizeof(e), is_list);
+
+       return true;
+}
+
 
 bool
 fw3_parse_options(void *s, const struct fw3_option *opts,