[PATCH] libxtables: simple aliasing macro for exit_error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I think this is it for exit_error(). I didnt want to convert all the
calls to exit_error(), so i introduced a simple macro to point to
the xtables_globals

Next, after you look at these changes i would like to create a
xtables_merge_options and convert apps defining their own
merge_options to use it.

cheers,
jamal
commit 24a8e3b70bf70fd62da0ef493eb43fa5bb16d436
Author: Jamal Hadi Salim <hadi@xxxxxxxxxx>
Date:   Tue Feb 10 09:34:11 2009 -0500

    Rename xtables_globals exit_error cb to exit_err and introduce
    a very simple aliasing macro to point to it.
    convert iptables, ip6tables and iptables_xml to use it.
    Note iptables_xml does not have to define its own exit_error()
    since it can use the basic one provided.
    
    Signed-off-by: Jamal Hadi Salim <hadi@xxxxxxxxxx>

diff --git a/include/xtables.h.in b/include/xtables.h.in
index 3a16651..da7ee6b 100644
--- a/include/xtables.h.in
+++ b/include/xtables.h.in
@@ -189,7 +189,7 @@ struct xtables_globals
 	char *program_version;
 	char *program_name;
 	struct option *opts;
-	void (*exit_error)(enum xtables_exittype status, const char *msg, ...);
+	void (*exit_err)(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
 };
 
 extern const char *xtables_program_name;
@@ -204,7 +204,7 @@ extern void *xtables_malloc(size_t);
 
 extern int xtables_insmod(const char *, const char *, bool);
 extern int xtables_load_ko(const char *, bool);
-int xtables_set_params(struct xtables_globals *xtp);
+extern int xtables_set_params(struct xtables_globals *xtp);
 void xtables_free_opts(int reset_offset, struct option *original_opts);
 
 extern struct xtables_match *xtables_find_match(const char *name,
@@ -230,8 +230,8 @@ xtables_parse_interface(const char *arg, char *vianame, unsigned char *mask);
 
 int xtables_check_inverse(const char option[], int *invert,
 	int *my_optind, int argc);
-void exit_error(enum xtables_exittype, const char *, ...)
-	__attribute__((noreturn, format(printf,2,3)));
+extern struct xtables_globals *xt_params;
+#define exit_error xt_params->exit_err
 extern void xtables_param_act(unsigned int, const char *, ...);
 
 extern const char *xtables_ipaddr_to_numeric(const struct in_addr *);
diff --git a/ip6tables.c b/ip6tables.c
index 7561353..9262b14 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -145,12 +145,13 @@ int line = -1;
 
 static struct option *opts = original_opts;
 static unsigned int global_option_offset = 0;
+void ip6tables_exit_error(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
 struct xtables_globals ip6tables_globals = {
 	.option_offset = 0,
 	.program_version = IPTABLES_VERSION,
 	.program_name = "ip6tables",
 	.opts = original_opts,
-	.exit_error = exit_error,
+	.exit_err = ip6tables_exit_error,
 };
 
 /* Table of legal combinations of commands and options.  If any of the
@@ -336,7 +337,7 @@ exit_printhelp(struct ip6tables_rule_match *matches)
 }
 
 void
-exit_error(enum xtables_exittype status, const char *msg, ...)
+ip6tables_exit_error(enum xtables_exittype status, const char *msg, ...)
 {
 	va_list args;
 
diff --git a/iptables-xml.c b/iptables-xml.c
index 329c598..4bb0557 100644
--- a/iptables-xml.c
+++ b/iptables-xml.c
@@ -31,18 +31,6 @@ const char *program_version;
 
 #ifndef IPTABLES_MULTI
 int line = 0;
-void exit_error(enum xtables_exittype status, const char *msg, ...)
-{
-	va_list args;
-
-	va_start(args, msg);
-	fprintf(stderr, "%s v%s: ", program_name, program_version);
-	vfprintf(stderr, msg, args);
-	va_end(args);
-	fprintf(stderr, "\n");
-	/* On error paths, make sure that we don't leak memory */
-	exit(status);
-}
 #endif
 
 static void print_usage(const char *name, const char *version)
@@ -634,7 +622,6 @@ struct xtables_globals iptables_xml_globals = {
 	.option_offset = 0,
 	.program_version = IPTABLES_VERSION,
 	.program_name = "iptables-xml",
-	.exit_error = exit_error,
 };
 
 #ifdef IPTABLES_MULTI
diff --git a/iptables.c b/iptables.c
index e8bed87..fe28e50 100644
--- a/iptables.c
+++ b/iptables.c
@@ -145,12 +145,14 @@ int line = -1;
 static struct option *opts = original_opts;
 static unsigned int global_option_offset = 0;
 
+void iptables_exit_error(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
+
 struct xtables_globals iptables_globals = {
 	.option_offset = 0,
 	.program_version = IPTABLES_VERSION,
 	.program_name = "iptables",
 	.opts = original_opts,
-	.exit_error = exit_error,
+	.exit_err = iptables_exit_error,
 };
 
 /* Table of legal combinations of commands and options.  If any of the
@@ -348,7 +350,7 @@ exit_printhelp(struct iptables_rule_match *matches)
 }
 
 void
-exit_error(enum xtables_exittype status, const char *msg, ...)
+iptables_exit_error(enum xtables_exittype status, const char *msg, ...)
 {
 	va_list args;
 
diff --git a/xtables.c b/xtables.c
index a7425ec..8e28d5e 100644
--- a/xtables.c
+++ b/xtables.c
@@ -46,9 +46,11 @@
 #define PROC_SYS_MODPROBE "/proc/sys/kernel/modprobe"
 #endif
 
+void basic_exit_err(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
+
 struct xtables_globals *xt_params = NULL;
 
-void basic_exit_error(enum xtables_exittype status, const char *msg, ...)
+void basic_exit_err(enum xtables_exittype status, const char *msg, ...)
 {
 	va_list args;
 
@@ -60,6 +62,7 @@ void basic_exit_error(enum xtables_exittype status, const char *msg, ...)
 	exit(status);
 }
 
+
 /**
  * xtables_set_params - set the global parameters used by xtables
  * @xtp:	input xtables_globals structure
@@ -79,8 +82,8 @@ int xtables_set_params(struct xtables_globals *xtp)
 
 	xt_params = xtp;
 
-	if (!xt_params->exit_error)
-		xt_params->exit_error = basic_exit_error;
+	if (!xt_params->exit_err)
+		xt_params->exit_err = basic_exit_err;
 
 	return 0;
 }
@@ -359,7 +362,7 @@ u_int16_t xtables_parse_port(const char *port, const char *proto)
 	    (portnum = xtables_service_to_port(port, proto)) != (unsigned)-1)
 		return portnum;
 
-	xt_params->exit_error(PARAMETER_PROBLEM,
+	xt_params->exit_err(PARAMETER_PROBLEM,
 		   "invalid port/service `%s' specified", port);
 }
 
@@ -373,7 +376,7 @@ void xtables_parse_interface(const char *arg, char *vianame,
 	memset(vianame, 0, IFNAMSIZ);
 
 	if (vialen + 1 > IFNAMSIZ)
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 			   "interface name `%s' must be shorter than IFNAMSIZ"
 			   " (%i)", arg, IFNAMSIZ-1);
 
@@ -495,7 +498,7 @@ xtables_find_match(const char *name, enum xtables_tryload tryload,
 		      name, false);
 
 		if (ptr == NULL && tryload == XTF_LOAD_MUST_SUCCEED)
-			xt_params->exit_error(PARAMETER_PROBLEM,
+			xt_params->exit_err(PARAMETER_PROBLEM,
 				   "Couldn't load match `%s':%s\n",
 				   name, dlerror());
 	}
@@ -507,7 +510,7 @@ xtables_find_match(const char *name, enum xtables_tryload tryload,
 			ptr = NULL;
 	}
 	if(!ptr && (tryload == XTF_LOAD_MUST_SUCCEED)) {
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 			   "Couldn't find match `%s'\n", name);
 	}
 #endif
@@ -555,7 +558,7 @@ xtables_find_target(const char *name, enum xtables_tryload tryload)
 		      name, true);
 
 		if (ptr == NULL && tryload == XTF_LOAD_MUST_SUCCEED)
-			xt_params->exit_error(PARAMETER_PROBLEM,
+			xt_params->exit_err(PARAMETER_PROBLEM,
 				   "Couldn't load target `%s':%s\n",
 				   name, dlerror());
 	}
@@ -567,7 +570,7 @@ xtables_find_target(const char *name, enum xtables_tryload tryload)
 			ptr = NULL;
 	}
 	if(!ptr && (tryload == LOAD_MUST_SUCCEED)) {
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 			   "Couldn't find target `%s'\n", name);
 	}
 #endif
@@ -820,7 +823,7 @@ void xtables_param_act(unsigned int status, const char *p1, ...)
 		b  = va_arg(args, unsigned int);
 		if (!b)
 			return;
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 		           "%s: \"%s\" option may only be specified once",
 		           p1, p2);
 		break;
@@ -829,13 +832,13 @@ void xtables_param_act(unsigned int status, const char *p1, ...)
 		b  = va_arg(args, unsigned int);
 		if (!b)
 			return;
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 		           "%s: \"%s\" option cannot be inverted", p1, p2);
 		break;
 	case XTF_BAD_VALUE:
 		p2 = va_arg(args, const char *);
 		p3 = va_arg(args, const char *);
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 		           "%s: Bad value for \"%s\" option: \"%s\"",
 		           p1, p2, p3);
 		break;
@@ -843,11 +846,11 @@ void xtables_param_act(unsigned int status, const char *p1, ...)
 		b = va_arg(args, unsigned int);
 		if (!b)
 			return;
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 		           "%s: At most one action is possible", p1);
 		break;
 	default:
-		xt_params->exit_error(status, p1, args);
+		xt_params->exit_err(status, p1, args);
 		break;
 	}
 
@@ -1030,7 +1033,7 @@ ipparse_hostnetwork(const char *name, unsigned int *naddrs)
 	if ((addrptmp = host_to_ipaddr(name, naddrs)) != NULL)
 		return addrptmp;
 
-	xt_params->exit_error(PARAMETER_PROBLEM, "host/network `%s' not found", name);
+	xt_params->exit_err(PARAMETER_PROBLEM, "host/network `%s' not found", name);
 }
 
 static struct in_addr *parse_ipmask(const char *mask)
@@ -1048,7 +1051,7 @@ static struct in_addr *parse_ipmask(const char *mask)
 		/* dotted_to_addr already returns a network byte order addr */
 		return addrp;
 	if (!xtables_strtoui(mask, NULL, &bits, 0, 32))
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 			   "invalid mask `%s' specified", mask);
 	if (bits != 0) {
 		maskaddr.s_addr = htonl(0xFFFFFFFF << (32 - bits));
@@ -1259,7 +1262,7 @@ ip6parse_hostnetwork(const char *name, unsigned int *naddrs)
 	if ((addrp = host_to_ip6addr(name, naddrs)) != NULL)
 		return addrp;
 
-	xt_params->exit_error(PARAMETER_PROBLEM, "host/network `%s' not found", name);
+	xt_params->exit_err(PARAMETER_PROBLEM, "host/network `%s' not found", name);
 }
 
 static struct in6_addr *parse_ip6mask(char *mask)
@@ -1276,7 +1279,7 @@ static struct in6_addr *parse_ip6mask(char *mask)
 	if ((addrp = xtables_numeric_to_ip6addr(mask)) != NULL)
 		return addrp;
 	if (!xtables_strtoui(mask, NULL, &bits, 0, 128))
-		xt_params->exit_error(PARAMETER_PROBLEM,
+		xt_params->exit_err(PARAMETER_PROBLEM,
 			   "invalid mask `%s' specified", mask);
 	if (bits != 0) {
 		char *p = (void *)&maskaddr;
@@ -1376,13 +1379,13 @@ int xtables_check_inverse(const char option[], int *invert,
 		        "extrapositioned (`! --option this`).\n");
 
 		if (*invert)
-			xt_params->exit_error(PARAMETER_PROBLEM,
+			xt_params->exit_err(PARAMETER_PROBLEM,
 				   "Multiple `!' flags not allowed");
 		*invert = true;
 		if (my_optind != NULL) {
 			++*my_optind;
 			if (argc && *my_optind > argc)
-				xt_params->exit_error(PARAMETER_PROBLEM,
+				xt_params->exit_err(PARAMETER_PROBLEM,
 					   "no argument following `!'");
 		}
 
@@ -1433,7 +1436,7 @@ xtables_parse_protocol(const char *s)
 				}
 			}
 			if (i == ARRAY_SIZE(xtables_chain_protos))
-				xt_params->exit_error(PARAMETER_PROBLEM,
+				xt_params->exit_err(PARAMETER_PROBLEM,
 					   "unknown protocol `%s' specified",
 					   s);
 		}

[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux