path: root/iptables/xshared.h
diff options
authorPhil Sutter <>2019-10-17 23:36:47 +0200
committerPhil Sutter <>2019-10-24 16:22:52 +0200
commit9376c42a59929031610ea70d2fc6347fbfa46e67 (patch)
tree026389796b060b491903131ee8102d035c98dbfd /iptables/xshared.h
parentf8ec1b7a296e6f461278937213a1477e4d29b1f3 (diff)
xshared: Introduce struct argv_store
The use of global variables in code around add_argv() is error-prone and hard to follow. Replace them by a struct which functions will modify instead of causing side-effects. Given the lack of static variables, this effectively makes argv construction code reentrant. Signed-off-by: Phil Sutter <> Acked-by: Florian Westphal <>
Diffstat (limited to 'iptables/xshared.h')
1 files changed, 15 insertions, 11 deletions
diff --git a/iptables/xshared.h b/iptables/xshared.h
index 21f4e8fd..64b7e8fc 100644
--- a/iptables/xshared.h
+++ b/iptables/xshared.h
@@ -156,18 +156,22 @@ bool xs_has_arg(int argc, char *argv[]);
extern const struct xtables_afinfo *afinfo;
-extern char *newargv[];
-extern int newargc;
-extern char *oldargv[];
-extern int oldargc;
-extern int newargvattr[];
+#define MAX_ARGC 255
+struct argv_store {
+ int argc;
+ char *argv[MAX_ARGC];
+ int argvattr[MAX_ARGC];
-int add_argv(const char *what, int quoted);
-void free_argv(void);
-void save_argv(void);
-void add_param_to_argv(char *parsestart, int line);
+void add_argv(struct argv_store *store, const char *what, int quoted);
+void free_argv(struct argv_store *store);
+void save_argv(struct argv_store *dst, struct argv_store *src);
+void add_param_to_argv(struct argv_store *store, char *parsestart, int line);
+#ifdef DEBUG
+void debug_print_argv(struct argv_store *store);
+# define debug_print_argv(...) /* nothing */
void print_ipv4_addresses(const struct ipt_entry *fw, unsigned int format);
void print_ipv6_addresses(const struct ip6t_entry *fw6, unsigned int format);