iptables-test: Update entries offsets properly
authorSamuel Ortiz <sameo@linux.intel.com>
Fri, 29 Oct 2010 15:28:47 +0000 (17:28 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 29 Oct 2010 22:22:21 +0000 (00:22 +0200)
This is needed to set the jump targets.

tools/iptables-test.c

index a3de513..c4d2cb0 100644 (file)
@@ -82,9 +82,7 @@ struct ipt_error_target {
 };
 
 struct connman_iptables_entry {
-       int builtin;
-       int std_target;
-       int jump_offset;
+       int offset;
 
        struct ipt_entry *entry;
 };
@@ -221,6 +219,28 @@ static GList *find_chain_tail(struct connman_iptables *table,
        return g_list_last(table->entries);
 }
 
+static void update_offsets(struct connman_iptables *table)
+{
+       GList *list, *prev;
+       struct connman_iptables_entry *entry, *prev_entry;
+
+       for (list = table->entries; list; list = list->next) {
+               entry = list->data;
+
+               if (list == table->entries) {
+                       entry->offset = 0;
+
+                       continue;
+               }
+
+               prev = list->prev;
+               prev_entry = prev->data;
+
+               entry->offset = prev_entry->offset +
+                                       prev_entry->entry->next_offset;
+       }
+}
+
 static int connman_add_entry(struct connman_iptables *table,
                                struct ipt_entry *entry, GList *before)
 {
@@ -239,6 +259,8 @@ static int connman_add_entry(struct connman_iptables *table,
        table->num_entries++;
        table->size += entry->next_offset;
 
+       update_offsets(table);
+
        return 0;
 }