ipt_ACCOUNT, iptables: (tomj) fix delete handling (#1379)
[ipt_ACCOUNT] / iptables / extensions / libipt_ACCOUNT.c
index 084c31f..aa619b3 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <syslog.h>
 #include <getopt.h>
+#include <stddef.h>
 #include <iptables.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_ACCOUNT.h>
@@ -30,14 +31,11 @@ IPTABLES_VERSION, opts[0].name, opts[1].name);
 
 /* Initialize the target. */
 static void
-init(struct ipt_entry_target *t, unsigned int *nfcache)
+init(struct xt_entry_target *t)
 {
     struct ipt_acc_info *accountinfo = (struct ipt_acc_info *)t->data;
 
     accountinfo->table_nr = -1;
-
-    /* Can't cache this */
-    *nfcache |= NFC_UNKNOWN;
 }
 
 #define IPT_ACCOUNT_OPT_ADDR 0x01
@@ -45,10 +43,9 @@ init(struct ipt_entry_target *t, unsigned int *nfcache)
 
 /* Function which parses command options; returns true if it
    ate an option */
-static int
-parse(int c, char **argv, int invert, unsigned int *flags,
-      const struct ipt_entry *entry,
-      struct ipt_entry_target **target)
+
+static int parse(int c, char **argv, int invert, unsigned int *flags,
+                     const void *entry, struct xt_entry_target **target)
 {
     struct ipt_acc_info *accountinfo = (struct ipt_acc_info *)(*target)->data;
     struct in_addr *addrs = NULL, mask;
@@ -66,13 +63,13 @@ parse(int c, char **argv, int invert, unsigned int *flags,
 
         //loginfo->level = parse_level(optarg);
         parse_hostnetworkmask(optarg, &addrs, &mask, &naddrs);
-        
+
         if (naddrs > 1)
                 exit_error(PARAMETER_PROBLEM, "multiple IP addresses not allowed");
-        
+
         accountinfo->net_ip = addrs[0].s_addr;
         accountinfo->net_mask = mask.s_addr;
-                
+
         *flags |= IPT_ACCOUNT_OPT_ADDR;
         break;
 
@@ -93,7 +90,7 @@ parse(int c, char **argv, int invert, unsigned int *flags,
             strcpy(accountinfo->table_name, optarg);
             *flags |= IPT_ACCOUNT_OPT_TABLE;
             break;
-    
+
     default:
             return 0;
     }
@@ -108,8 +105,8 @@ static void final_check(unsigned int flags)
                     opts[0].name, opts[1].name);
 }
 
-static void print_it(const struct ipt_ip *ip,
-                     const struct ipt_entry_target *target, char do_prefix)
+static void print_it(const void *ip,
+                     const struct xt_entry_target *target, char do_prefix)
 {
     const struct ipt_acc_info *accountinfo
         = (const struct ipt_acc_info *)target->data;
@@ -117,12 +114,12 @@ static void print_it(const struct ipt_ip *ip,
 
     if (!do_prefix)
         printf("ACCOUNT ");
-    
+
     // Network information
     if (do_prefix)
-       printf("--");
+        printf("--");
     printf("%s ", opts[0].name);
-    
+
     a.s_addr = accountinfo->net_ip;    
     printf("%s", addr_to_dotted(&a));
     a.s_addr = accountinfo->net_mask;
@@ -130,15 +127,15 @@ static void print_it(const struct ipt_ip *ip,
 
     printf(" ");
     if (do_prefix)
-       printf("--");
+        printf("--");
 
     printf("%s %s", opts[1].name, accountinfo->table_name);
 }
 
-/* Prints out the targinfo. */
+
 static void
-print(const struct ipt_ip *ip,
-      const struct ipt_entry_target *target,
+print(const void *ip,
+      const struct xt_entry_target *target,
       int numeric)
 {
     print_it (ip, target, 0);
@@ -146,7 +143,7 @@ print(const struct ipt_ip *ip,
 
 /* Saves the union ipt_targinfo in parsable form to stdout. */
 static void
-save(const struct ipt_ip *ip, const struct ipt_entry_target *target)
+save(const void *ip, const struct xt_entry_target *target)
 {
     print_it(ip, target, 1);
 }
@@ -158,7 +155,7 @@ struct iptables_target account
     .name          = "ACCOUNT",
     .version       = IPTABLES_VERSION,
     .size          = IPT_ALIGN(sizeof(struct ipt_acc_info)),
-    .userspacesize = IPT_ALIGN(sizeof(struct ipt_acc_info)),
+    .userspacesize = offsetof(struct ipt_acc_info, table_nr),
     .help          = &help,
     .init          = &init,
     .parse         = &parse,