netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* iptables: mainloop cleanup, symbol vis+versioning
@ 2011-02-04 13:08 Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 1/8] iptables: reduce indentation of parse loop (1/3) Jan Engelhardt
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel


The following changes since commit 9ee2a9fe2f74b616da34878104bd1ff406534ad1:

  extensions: add extension for devgroup match (2011-02-03 06:10:41 +0100)

are available in the git repository at:
  git://dev.medozas.de/iptables master

Jan Engelhardt (8):
      iptables: reduce indentation of parse loop (1/3)
      iptables: reduce indentation of parse loop (2/3)
      iptables: use variable as shortcut in parse loop
      iptables: reduce indentation of parse loop (3/3)
      iptables: fix error message for unknown options
      build: directly use config.h in internal.h
      libxtables: symbol visibility
      libxtables: symbol versioning

 .gitignore                     |    1 -
 Makefile.am                    |    9 +-
 configure.ac                   |    6 +-
 extensions/GNUmakefile.in      |    2 +-
 include/iptables/internal.h    |   21 +++++
 include/iptables/internal.h.in |   13 ---
 ip6tables.c                    |  187 ++++++++++++++++++---------------------
 iptables.c                     |  194 ++++++++++++++++++----------------------
 libxtables.map                 |   55 +++++++++++
 m4/gcc4_visibility.m4          |   21 +++++
 xtables.c                      |  109 +++++++++++++----------
 11 files changed, 340 insertions(+), 278 deletions(-)
 create mode 100644 include/iptables/internal.h
 delete mode 100644 include/iptables/internal.h.in
 create mode 100644 libxtables.map
 create mode 100644 m4/gcc4_visibility.m4

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/8] iptables: reduce indentation of parse loop (1/3)
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 2/8] iptables: reduce indentation of parse loop (2/3) Jan Engelhardt
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

Trying to make this code suck less by using early
exclusion/break/return.

References: http://iq0.com/notes/deep.nesting.html
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 ip6tables.c |  184 ++++++++++++++++++++++++++++----------------------------
 iptables.c  |  196 +++++++++++++++++++++++++++++-----------------------------
 2 files changed, 190 insertions(+), 190 deletions(-)

diff --git a/ip6tables.c b/ip6tables.c
index 8c1b504..d453868 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -1703,104 +1703,104 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 			exit_tryhelp(2);
 
 		default:
-			if (target == NULL || target->parse == NULL ||
-			    c < target->option_offset ||
-			    c >= target->option_offset + XT_OPTION_OFFSET_SCALE ||
-			    !target->parse(c - target->option_offset,
+			if (target != NULL && target->parse != NULL &&
+			    c >= target->option_offset &&
+			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
+			    target->parse(c - target->option_offset,
 					       argv, invert,
 					       &target->tflags,
-					       &fw, &target->t)) {
-				for (matchp = matches; matchp; matchp = matchp->next) {
-					if (matchp->completed ||
-					    matchp->match->parse == NULL)
-						continue;
-					if (c < matchp->match->option_offset ||
-					    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
-						continue;
-					if (matchp->match->parse(c - matchp->match->option_offset,
-						     argv, invert,
-						     &matchp->match->mflags,
-						     &fw,
-						     &matchp->match->m))
-						break;
-				}
-				m = matchp ? matchp->match : NULL;
-
-				/* If you listen carefully, you can
-				   actually hear this code suck. */
-
-				/* some explanations (after four different bugs
-				 * in 3 different releases): If we encounter a
-				 * parameter, that has not been parsed yet,
-				 * it's not an option of an explicitly loaded
-				 * match or a target.  However, we support
-				 * implicit loading of the protocol match
-				 * extension.  '-p tcp' means 'l4 proto 6' and
-				 * at the same time 'load tcp protocol match on
-				 * demand if we specify --dport'.
-				 *
-				 * To make this work, we need to make sure:
-				 * - the parameter has not been parsed by
-				 *   a match (m above)
-				 * - a protocol has been specified
-				 * - the protocol extension has not been
-				 *   loaded yet, or is loaded and unused
-				 *   [think of ip6tables-restore!]
-				 * - the protocol extension can be successively
-				 *   loaded
-				 */
-				if (m == NULL
-				    && protocol
-				    && (!find_proto(protocol, XTF_DONT_LOAD,
-						   options&OPT_NUMERIC, NULL)
-					|| (find_proto(protocol, XTF_DONT_LOAD,
-							options&OPT_NUMERIC, NULL)
-					    && (proto_used == 0))
-				       )
-				    && (m = find_proto(protocol, XTF_TRY_LOAD,
-						       options&OPT_NUMERIC, &matches))) {
-					/* Try loading protocol */
-					size_t size;
-
-					proto_used = 1;
-
-					size = IP6T_ALIGN(sizeof(struct ip6t_entry_match))
-							 + m->size;
-
-					m->m = xtables_calloc(1, size);
-					m->m->u.match_size = size;
-					strcpy(m->m->u.user.name, m->name);
-					m->m->u.user.revision = m->revision;
-					if (m->init != NULL)
-						m->init(m->m);
-
-					opts = xtables_merge_options(ip6tables_globals.orig_opts, opts,
-					    m->extra_opts, &m->option_offset);
-
-					optind--;
+					       &fw, &target->t))
+				break;
+			for (matchp = matches; matchp; matchp = matchp->next) {
+				if (matchp->completed ||
+				    matchp->match->parse == NULL)
 					continue;
-				}
+				if (c < matchp->match->option_offset ||
+				    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
+					continue;
+				if (matchp->match->parse(c - matchp->match->option_offset,
+					     argv, invert,
+					     &matchp->match->mflags,
+					     &fw,
+					     &matchp->match->m))
+					break;
+			}
+			m = matchp ? matchp->match : NULL;
+
+			/* If you listen carefully, you can
+			   actually hear this code suck. */
+
+			/* some explanations (after four different bugs
+			 * in 3 different releases): If we encounter a
+			 * parameter, that has not been parsed yet,
+			 * it's not an option of an explicitly loaded
+			 * match or a target.  However, we support
+			 * implicit loading of the protocol match
+			 * extension.  '-p tcp' means 'l4 proto 6' and
+			 * at the same time 'load tcp protocol match on
+			 * demand if we specify --dport'.
+			 *
+			 * To make this work, we need to make sure:
+			 * - the parameter has not been parsed by
+			 *   a match (m above)
+			 * - a protocol has been specified
+			 * - the protocol extension has not been
+			 *   loaded yet, or is loaded and unused
+			 *   [think of ip6tables-restore!]
+			 * - the protocol extension can be successively
+			 *   loaded
+			 */
+			if (m == NULL
+			    && protocol
+			    && (!find_proto(protocol, XTF_DONT_LOAD,
+					   options&OPT_NUMERIC, NULL)
+				|| (find_proto(protocol, XTF_DONT_LOAD,
+						options&OPT_NUMERIC, NULL)
+				    && (proto_used == 0))
+			       )
+			    && (m = find_proto(protocol, XTF_TRY_LOAD,
+					       options&OPT_NUMERIC, &matches))) {
+				/* Try loading protocol */
+				size_t size;
+
+				proto_used = 1;
+
+				size = IP6T_ALIGN(sizeof(struct ip6t_entry_match))
+						 + m->size;
 
-				if (!m) {
-					if (c == '?') {
-						if (optopt) {
-							xtables_error(
-							   PARAMETER_PROBLEM,
-							   "option `%s' "
-							   "requires an "
-							   "argument",
-							   argv[optind-1]);
-						} else {
-							xtables_error(
-							   PARAMETER_PROBLEM,
-							   "unknown option "
-							   "`%s'",
-							   argv[optind-1]);
-						}
+				m->m = xtables_calloc(1, size);
+				m->m->u.match_size = size;
+				strcpy(m->m->u.user.name, m->name);
+				m->m->u.user.revision = m->revision;
+				if (m->init != NULL)
+					m->init(m->m);
+
+				opts = xtables_merge_options(ip6tables_globals.orig_opts, opts,
+				    m->extra_opts, &m->option_offset);
+
+				optind--;
+				continue;
+			}
+
+			if (!m) {
+				if (c == '?') {
+					if (optopt) {
+						xtables_error(
+						   PARAMETER_PROBLEM,
+						   "option `%s' "
+						   "requires an "
+						   "argument",
+						   argv[optind-1]);
+					} else {
+						xtables_error(
+						   PARAMETER_PROBLEM,
+						   "unknown option "
+						   "`%s'",
+						   argv[optind-1]);
 					}
-					xtables_error(PARAMETER_PROBLEM,
-						   "Unknown arg `%s'", optarg);
 				}
+				xtables_error(PARAMETER_PROBLEM,
+					   "Unknown arg `%s'", optarg);
 			}
 		}
 		invert = FALSE;
diff --git a/iptables.c b/iptables.c
index 2459b64..eb7ac8e 100644
--- a/iptables.c
+++ b/iptables.c
@@ -1735,109 +1735,109 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 			exit_tryhelp(2);
 
 		default:
-			if (target == NULL || target->parse == NULL ||
-			    c < target->option_offset ||
-			    c >= target->option_offset + XT_OPTION_OFFSET_SCALE ||
-			    !target->parse(c - target->option_offset,
+			if (target != NULL && target->parse != NULL &&
+			    c >= target->option_offset &&
+			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
+			    target->parse(c - target->option_offset,
 					       argv, invert,
 					       &target->tflags,
-					       &fw, &target->t)) {
-				for (matchp = matches; matchp; matchp = matchp->next) {
-					if (matchp->completed ||
-					    matchp->match->parse == NULL)
-						continue;
-					if (c < matchp->match->option_offset ||
-					    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
-						continue;
-					if (matchp->match->parse(c - matchp->match->option_offset,
-						     argv, invert,
-						     &matchp->match->mflags,
-						     &fw,
-						     &matchp->match->m))
-						break;
-				}
-				m = matchp ? matchp->match : NULL;
-
-				/* If you listen carefully, you can
-				   actually hear this code suck. */
-
-				/* some explanations (after four different bugs
-				 * in 3 different releases): If we encounter a
-				 * parameter, that has not been parsed yet,
-				 * it's not an option of an explicitly loaded
-				 * match or a target.  However, we support
-				 * implicit loading of the protocol match
-				 * extension.  '-p tcp' means 'l4 proto 6' and
-				 * at the same time 'load tcp protocol match on
-				 * demand if we specify --dport'.
-				 *
-				 * To make this work, we need to make sure:
-				 * - the parameter has not been parsed by
-				 *   a match (m above)
-				 * - a protocol has been specified
-				 * - the protocol extension has not been
-				 *   loaded yet, or is loaded and unused
-				 *   [think of iptables-restore!]
-				 * - the protocol extension can be successively
-				 *   loaded
-				 */
-				if (m == NULL
-				    && protocol
-				    && (!find_proto(protocol, XTF_DONT_LOAD,
-						   options&OPT_NUMERIC, NULL)
-					|| (find_proto(protocol, XTF_DONT_LOAD,
-							options&OPT_NUMERIC, NULL)
-					    && (proto_used == 0))
-				       )
-				    && (m = find_proto(protocol, XTF_TRY_LOAD,
-						       options&OPT_NUMERIC, &matches))) {
-					/* Try loading protocol */
-					size_t size;
-
-					proto_used = 1;
-
-					size = IPT_ALIGN(sizeof(struct ipt_entry_match))
-							 + m->size;
-
-					m->m = xtables_calloc(1, size);
-					m->m->u.match_size = size;
-					strcpy(m->m->u.user.name, m->name);
-					m->m->u.user.revision = m->revision;
-					if (m->init != NULL)
-						m->init(m->m);
-
-					opts = xtables_merge_options(
-							     iptables_globals.orig_opts,
-							     opts,
-							     m->extra_opts,
-							     &m->option_offset);
-					if (opts == NULL)
-						xtables_error(OTHER_PROBLEM,
-							"can't alloc memory!");
-
-					optind--;
+					       &fw, &target->t))
+				break;
+			for (matchp = matches; matchp; matchp = matchp->next) {
+				if (matchp->completed ||
+				    matchp->match->parse == NULL)
 					continue;
-				}
-				if (!m) {
-					if (c == '?') {
-						if (optopt) {
-							xtables_error(
-							   PARAMETER_PROBLEM,
-							   "option `%s' "
-							   "requires an "
-							   "argument",
-							   argv[optind-1]);
-						} else {
-							xtables_error(
-							   PARAMETER_PROBLEM,
-							   "unknown option "
-							   "`%s'",
-							   argv[optind-1]);
-						}
+				if (c < matchp->match->option_offset ||
+				    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
+					continue;
+				if (matchp->match->parse(c - matchp->match->option_offset,
+					     argv, invert,
+					     &matchp->match->mflags,
+					     &fw,
+					     &matchp->match->m))
+					break;
+			}
+			m = matchp ? matchp->match : NULL;
+
+			/* If you listen carefully, you can
+			   actually hear this code suck. */
+
+			/* some explanations (after four different bugs
+			 * in 3 different releases): If we encounter a
+			 * parameter, that has not been parsed yet,
+			 * it's not an option of an explicitly loaded
+			 * match or a target.  However, we support
+			 * implicit loading of the protocol match
+			 * extension.  '-p tcp' means 'l4 proto 6' and
+			 * at the same time 'load tcp protocol match on
+			 * demand if we specify --dport'.
+			 *
+			 * To make this work, we need to make sure:
+			 * - the parameter has not been parsed by
+			 *   a match (m above)
+			 * - a protocol has been specified
+			 * - the protocol extension has not been
+			 *   loaded yet, or is loaded and unused
+			 *   [think of iptables-restore!]
+			 * - the protocol extension can be successively
+			 *   loaded
+			 */
+			if (m == NULL
+			    && protocol
+			    && (!find_proto(protocol, XTF_DONT_LOAD,
+					   options&OPT_NUMERIC, NULL)
+				|| (find_proto(protocol, XTF_DONT_LOAD,
+						options&OPT_NUMERIC, NULL)
+				    && (proto_used == 0))
+			       )
+			    && (m = find_proto(protocol, XTF_TRY_LOAD,
+					       options&OPT_NUMERIC, &matches))) {
+				/* Try loading protocol */
+				size_t size;
+
+				proto_used = 1;
+
+				size = IPT_ALIGN(sizeof(struct ipt_entry_match))
+						 + m->size;
+
+				m->m = xtables_calloc(1, size);
+				m->m->u.match_size = size;
+				strcpy(m->m->u.user.name, m->name);
+				m->m->u.user.revision = m->revision;
+				if (m->init != NULL)
+					m->init(m->m);
+
+				opts = xtables_merge_options(
+						     iptables_globals.orig_opts,
+						     opts,
+						     m->extra_opts,
+						     &m->option_offset);
+				if (opts == NULL)
+					xtables_error(OTHER_PROBLEM,
+						"can't alloc memory!");
+
+				optind--;
+				continue;
+			}
+			if (!m) {
+				if (c == '?') {
+					if (optopt) {
+						xtables_error(
+						   PARAMETER_PROBLEM,
+						   "option `%s' "
+						   "requires an "
+						   "argument",
+						   argv[optind-1]);
+					} else {
+						xtables_error(
+						   PARAMETER_PROBLEM,
+						   "unknown option "
+						   "`%s'",
+						   argv[optind-1]);
 					}
-					xtables_error(PARAMETER_PROBLEM,
-						   "Unknown arg `%s'", optarg);
 				}
+				xtables_error(PARAMETER_PROBLEM,
+					   "Unknown arg `%s'", optarg);
 			}
 		}
 		invert = FALSE;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/8] iptables: reduce indentation of parse loop (2/3)
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 1/8] iptables: reduce indentation of parse loop (1/3) Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 3/8] iptables: use variable as shortcut in parse loop Jan Engelhardt
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

The stop flag is temporary (see next patch). By using such early
break, less clauses can be removed.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 ip6tables.c |   50 ++++++++++++++++++++++++++------------------------
 iptables.c  |   49 ++++++++++++++++++++++++++-----------------------
 2 files changed, 52 insertions(+), 47 deletions(-)

diff --git a/ip6tables.c b/ip6tables.c
index d453868..f581509 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -1702,7 +1702,9 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 			fprintf(stderr, "Bad argument `%s'\n", optarg);
 			exit_tryhelp(2);
 
-		default:
+		default: {
+			bool stop = false;
+
 			if (target != NULL && target->parse != NULL &&
 			    c >= target->option_offset &&
 			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
@@ -1722,10 +1724,13 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 					     argv, invert,
 					     &matchp->match->mflags,
 					     &fw,
-					     &matchp->match->m))
+					     &matchp->match->m)) {
+					stop = true;
 					break;
+				}
 			}
-			m = matchp ? matchp->match : NULL;
+			if (stop)
+				break;
 
 			/* If you listen carefully, you can
 			   actually hear this code suck. */
@@ -1750,8 +1755,7 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 			 * - the protocol extension can be successively
 			 *   loaded
 			 */
-			if (m == NULL
-			    && protocol
+			if (protocol != NULL
 			    && (!find_proto(protocol, XTF_DONT_LOAD,
 					   options&OPT_NUMERIC, NULL)
 				|| (find_proto(protocol, XTF_DONT_LOAD,
@@ -1781,27 +1785,25 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 				optind--;
 				continue;
 			}
-
-			if (!m) {
-				if (c == '?') {
-					if (optopt) {
-						xtables_error(
-						   PARAMETER_PROBLEM,
-						   "option `%s' "
-						   "requires an "
-						   "argument",
-						   argv[optind-1]);
-					} else {
-						xtables_error(
-						   PARAMETER_PROBLEM,
-						   "unknown option "
-						   "`%s'",
-						   argv[optind-1]);
-					}
+			if (c == '?') {
+				if (optopt) {
+					xtables_error(
+					   PARAMETER_PROBLEM,
+					   "option `%s' "
+					   "requires an "
+					   "argument",
+					   argv[optind-1]);
+				} else {
+					xtables_error(
+					   PARAMETER_PROBLEM,
+					   "unknown option "
+					   "`%s'",
+					   argv[optind-1]);
 				}
-				xtables_error(PARAMETER_PROBLEM,
-					   "Unknown arg `%s'", optarg);
 			}
+			xtables_error(PARAMETER_PROBLEM,
+				   "Unknown arg `%s'", optarg);
+		} /* default */
 		}
 		invert = FALSE;
 	}
diff --git a/iptables.c b/iptables.c
index eb7ac8e..b957e66 100644
--- a/iptables.c
+++ b/iptables.c
@@ -1734,7 +1734,9 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 			fprintf(stderr, "Bad argument `%s'\n", optarg);
 			exit_tryhelp(2);
 
-		default:
+		default: {
+			bool stop = false;
+
 			if (target != NULL && target->parse != NULL &&
 			    c >= target->option_offset &&
 			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
@@ -1754,10 +1756,13 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 					     argv, invert,
 					     &matchp->match->mflags,
 					     &fw,
-					     &matchp->match->m))
+					     &matchp->match->m)) {
+					stop = true;
 					break;
+				}
 			}
-			m = matchp ? matchp->match : NULL;
+			if (stop)
+				break;
 
 			/* If you listen carefully, you can
 			   actually hear this code suck. */
@@ -1782,8 +1787,7 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 			 * - the protocol extension can be successively
 			 *   loaded
 			 */
-			if (m == NULL
-			    && protocol
+			if (protocol != NULL
 			    && (!find_proto(protocol, XTF_DONT_LOAD,
 					   options&OPT_NUMERIC, NULL)
 				|| (find_proto(protocol, XTF_DONT_LOAD,
@@ -1819,26 +1823,25 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 				optind--;
 				continue;
 			}
-			if (!m) {
-				if (c == '?') {
-					if (optopt) {
-						xtables_error(
-						   PARAMETER_PROBLEM,
-						   "option `%s' "
-						   "requires an "
-						   "argument",
-						   argv[optind-1]);
-					} else {
-						xtables_error(
-						   PARAMETER_PROBLEM,
-						   "unknown option "
-						   "`%s'",
-						   argv[optind-1]);
-					}
+			if (c == '?') {
+				if (optopt) {
+					xtables_error(
+					   PARAMETER_PROBLEM,
+					   "option `%s' "
+					   "requires an "
+					   "argument",
+					   argv[optind-1]);
+				} else {
+					xtables_error(
+					   PARAMETER_PROBLEM,
+					   "unknown option "
+					   "`%s'",
+					   argv[optind-1]);
 				}
-				xtables_error(PARAMETER_PROBLEM,
-					   "Unknown arg `%s'", optarg);
 			}
+			xtables_error(PARAMETER_PROBLEM,
+				   "Unknown arg `%s'", optarg);
+		} /* default */
 		}
 		invert = FALSE;
 	}
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/8] iptables: use variable as shortcut in parse loop
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 1/8] iptables: reduce indentation of parse loop (1/3) Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 2/8] iptables: reduce indentation of parse loop (2/3) Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 4/8] iptables: reduce indentation of parse loop (3/3) Jan Engelhardt
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

"m" is around, so use it, cut the code.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 ip6tables.c |   17 ++++++++---------
 iptables.c  |   17 ++++++++---------
 2 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/ip6tables.c b/ip6tables.c
index f581509..caee730 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -1714,17 +1714,16 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 					       &fw, &target->t))
 				break;
 			for (matchp = matches; matchp; matchp = matchp->next) {
-				if (matchp->completed ||
-				    matchp->match->parse == NULL)
+				m = matchp->match;
+
+				if (matchp->completed || m->parse == NULL)
 					continue;
-				if (c < matchp->match->option_offset ||
-				    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
+				if (c < m->option_offset ||
+				    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
 					continue;
-				if (matchp->match->parse(c - matchp->match->option_offset,
-					     argv, invert,
-					     &matchp->match->mflags,
-					     &fw,
-					     &matchp->match->m)) {
+				if (m->parse(c - matchp->match->option_offset,
+					     argv, invert, &m->mflags, &fw,
+					     &m->m)) {
 					stop = true;
 					break;
 				}
diff --git a/iptables.c b/iptables.c
index b957e66..db8e136 100644
--- a/iptables.c
+++ b/iptables.c
@@ -1746,17 +1746,16 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 					       &fw, &target->t))
 				break;
 			for (matchp = matches; matchp; matchp = matchp->next) {
-				if (matchp->completed ||
-				    matchp->match->parse == NULL)
+				m = matchp->match;
+
+				if (matchp->completed || m->parse == NULL)
 					continue;
-				if (c < matchp->match->option_offset ||
-				    c >= matchp->match->option_offset + XT_OPTION_OFFSET_SCALE)
+				if (c < m->option_offset ||
+				    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
 					continue;
-				if (matchp->match->parse(c - matchp->match->option_offset,
-					     argv, invert,
-					     &matchp->match->mflags,
-					     &fw,
-					     &matchp->match->m)) {
+				if (m->parse(c - matchp->match->option_offset,
+					     argv, invert, &m->mflags, &fw,
+					     &m->m)) {
 					stop = true;
 					break;
 				}
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/8] iptables: reduce indentation of parse loop (3/3)
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
                   ` (2 preceding siblings ...)
  2011-02-04 13:08 ` [PATCH 3/8] iptables: use variable as shortcut in parse loop Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 5/8] iptables: fix error message for unknown options Jan Engelhardt
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

Put the default case into its own function. Essentially, 5 levels of
indentation have been stripped, and this is surely a result that looks
a lot better than it did before.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 ip6tables.c |  190 ++++++++++++++++++++++++++-------------------------------
 iptables.c  |  196 ++++++++++++++++++++++++++--------------------------------
 2 files changed, 176 insertions(+), 210 deletions(-)

diff --git a/ip6tables.c b/ip6tables.c
index caee730..fb3b320 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -1288,6 +1288,88 @@ static void clear_rule_matches(struct xtables_rule_match **matches)
 	*matches = NULL;
 }
 
+static void
+command_default(int c, char **argv, bool invert, struct ip6t_entry *fw,
+		const char *protocol, bool *proto_used, unsigned int options,
+		struct xtables_target *target,
+		struct xtables_rule_match **matches)
+{
+	struct xtables_rule_match *matchp;
+	struct xtables_match *m;
+
+	if (target != NULL && target->parse != NULL &&
+	    c >= target->option_offset &&
+	    c < target->option_offset + XT_OPTION_OFFSET_SCALE)
+		if (target->parse(c - target->option_offset, argv, invert,
+		    &target->tflags, fw, &target->t))
+			return;
+
+	for (matchp = *matches; matchp != NULL; matchp = matchp->next) {
+		m = matchp->match;
+
+		if (matchp->completed || m->parse == NULL)
+			continue;
+		if (c < m->option_offset ||
+		    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
+			continue;
+		if (m->parse(c - matchp->match->option_offset,
+		    argv, invert, &matchp->match->mflags, fw,
+		    &matchp->match->m))
+			return;
+	}
+
+	/*
+	 * If you listen carefully, you can actually hear this code suck.
+	 *
+	 * Some explanations (after four different bugs in 3 different
+	 * releases): If we encounter a parameter, that has not been parsed
+	 * yet, it's not an option of an explicitly loaded match or a target.
+	 * However, we support implicit loading of the protocol match
+	 * extension. '-p tcp' means 'l4 proto 6' and at the same time 'load
+	 * tcp protocol match on demand if we specify --dport'.
+	 *
+	 * To make this work, we need to make sure:
+	 * - the parameter has not been parsed by a match (m above)
+	 * - a protocol has been specified
+	 * - the protocol extension has not been loaded yet, or is loaded and
+	 *   unused [think of iptables-restore!]
+	 * - the protocol extension can be successively loaded
+	 */
+	if (m == NULL && protocol != NULL &&
+	    (!find_proto(protocol, XTF_DONT_LOAD, options & OPT_NUMERIC, NULL) ||
+	     (find_proto(protocol, XTF_DONT_LOAD, options & OPT_NUMERIC, NULL) && !*proto_used)) &&
+	    (m = find_proto(protocol, XTF_TRY_LOAD, options & OPT_NUMERIC, matches))) {
+		/* Try loading protocol */
+		size_t size;
+
+		*proto_used = true;
+		size = IP6T_ALIGN(sizeof(struct ip6t_entry_match)) + m->size;
+
+		m->m = xtables_calloc(1, size);
+		m->m->u.match_size = size;
+		strcpy(m->m->u.user.name, m->name);
+		m->m->u.user.revision = m->revision;
+		if (m->init != NULL)
+			m->init(m->m);
+
+		opts = xtables_merge_options(ip6tables_globals.orig_opts, opts,
+					     m->extra_opts, &m->option_offset);
+		if (opts == NULL)
+			xtables_error(OTHER_PROBLEM, "can't alloc memory!");
+		optind--;
+		return;
+	}
+	if (c == '?') {
+		if (optopt)
+			xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
+			              "requires an argument", argv[optind-1]);
+		else
+			xtables_error(PARAMETER_PROBLEM, "unknown option "
+				      "\"%s\"", optarg);
+	}
+	xtables_error(PARAMETER_PROBLEM, "Unknown arg \"%s\"", argv[optind-1]);
+}
+
 int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **handle)
 {
 	struct ip6t_entry fw, *e = NULL;
@@ -1310,7 +1392,7 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 	struct xtables_target *t;
 	const char *jumpto = "";
 	char *protocol = NULL;
-	int proto_used = 0;
+	bool proto_used = false;
 	unsigned long long cnt;
 
 	memset(&fw, 0, sizeof(fw));
@@ -1702,107 +1784,11 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 			fprintf(stderr, "Bad argument `%s'\n", optarg);
 			exit_tryhelp(2);
 
-		default: {
-			bool stop = false;
-
-			if (target != NULL && target->parse != NULL &&
-			    c >= target->option_offset &&
-			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
-			    target->parse(c - target->option_offset,
-					       argv, invert,
-					       &target->tflags,
-					       &fw, &target->t))
-				break;
-			for (matchp = matches; matchp; matchp = matchp->next) {
-				m = matchp->match;
-
-				if (matchp->completed || m->parse == NULL)
-					continue;
-				if (c < m->option_offset ||
-				    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
-					continue;
-				if (m->parse(c - matchp->match->option_offset,
-					     argv, invert, &m->mflags, &fw,
-					     &m->m)) {
-					stop = true;
-					break;
-				}
-			}
-			if (stop)
-				break;
-
-			/* If you listen carefully, you can
-			   actually hear this code suck. */
-
-			/* some explanations (after four different bugs
-			 * in 3 different releases): If we encounter a
-			 * parameter, that has not been parsed yet,
-			 * it's not an option of an explicitly loaded
-			 * match or a target.  However, we support
-			 * implicit loading of the protocol match
-			 * extension.  '-p tcp' means 'l4 proto 6' and
-			 * at the same time 'load tcp protocol match on
-			 * demand if we specify --dport'.
-			 *
-			 * To make this work, we need to make sure:
-			 * - the parameter has not been parsed by
-			 *   a match (m above)
-			 * - a protocol has been specified
-			 * - the protocol extension has not been
-			 *   loaded yet, or is loaded and unused
-			 *   [think of ip6tables-restore!]
-			 * - the protocol extension can be successively
-			 *   loaded
-			 */
-			if (protocol != NULL
-			    && (!find_proto(protocol, XTF_DONT_LOAD,
-					   options&OPT_NUMERIC, NULL)
-				|| (find_proto(protocol, XTF_DONT_LOAD,
-						options&OPT_NUMERIC, NULL)
-				    && (proto_used == 0))
-			       )
-			    && (m = find_proto(protocol, XTF_TRY_LOAD,
-					       options&OPT_NUMERIC, &matches))) {
-				/* Try loading protocol */
-				size_t size;
-
-				proto_used = 1;
-
-				size = IP6T_ALIGN(sizeof(struct ip6t_entry_match))
-						 + m->size;
-
-				m->m = xtables_calloc(1, size);
-				m->m->u.match_size = size;
-				strcpy(m->m->u.user.name, m->name);
-				m->m->u.user.revision = m->revision;
-				if (m->init != NULL)
-					m->init(m->m);
-
-				opts = xtables_merge_options(ip6tables_globals.orig_opts, opts,
-				    m->extra_opts, &m->option_offset);
-
-				optind--;
-				continue;
-			}
-			if (c == '?') {
-				if (optopt) {
-					xtables_error(
-					   PARAMETER_PROBLEM,
-					   "option `%s' "
-					   "requires an "
-					   "argument",
-					   argv[optind-1]);
-				} else {
-					xtables_error(
-					   PARAMETER_PROBLEM,
-					   "unknown option "
-					   "`%s'",
-					   argv[optind-1]);
-				}
-			}
-			xtables_error(PARAMETER_PROBLEM,
-				   "Unknown arg `%s'", optarg);
-		} /* default */
+		default:
+			command_default(c, argv, invert, &fw, protocol,
+					&proto_used, options,
+					target, &matches);
+			break;
 		}
 		invert = FALSE;
 	}
diff --git a/iptables.c b/iptables.c
index db8e136..9977634 100644
--- a/iptables.c
+++ b/iptables.c
@@ -1311,6 +1311,88 @@ get_kernel_version(void) {
 	kernel_version = LINUX_VERSION(x, y, z);
 }
 
+static void
+command_default(int c, char **argv, bool invert, struct ipt_entry *fw,
+		const char *protocol, bool *proto_used, unsigned int options,
+		struct xtables_target *target,
+		struct xtables_rule_match **matches)
+{
+	struct xtables_rule_match *matchp;
+	struct xtables_match *m;
+
+	if (target != NULL && target->parse != NULL &&
+	    c >= target->option_offset &&
+	    c < target->option_offset + XT_OPTION_OFFSET_SCALE)
+		if (target->parse(c - target->option_offset, argv, invert,
+		    &target->tflags, fw, &target->t))
+			return;
+
+	for (matchp = *matches; matchp != NULL; matchp = matchp->next) {
+		m = matchp->match;
+
+		if (matchp->completed || m->parse == NULL)
+			continue;
+		if (c < m->option_offset ||
+		    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
+			continue;
+		if (m->parse(c - matchp->match->option_offset,
+		    argv, invert, &matchp->match->mflags, fw,
+		    &matchp->match->m))
+			return;
+	}
+
+	/*
+	 * If you listen carefully, you can actually hear this code suck.
+	 *
+	 * Some explanations (after four different bugs in 3 different
+	 * releases): If we encounter a parameter, that has not been parsed
+	 * yet, it's not an option of an explicitly loaded match or a target.
+	 * However, we support implicit loading of the protocol match
+	 * extension. '-p tcp' means 'l4 proto 6' and at the same time 'load
+	 * tcp protocol match on demand if we specify --dport'.
+	 *
+	 * To make this work, we need to make sure:
+	 * - the parameter has not been parsed by a match (m above)
+	 * - a protocol has been specified
+	 * - the protocol extension has not been loaded yet, or is loaded and
+	 *   unused [think of iptables-restore!]
+	 * - the protocol extension can be successively loaded
+	 */
+	if (m == NULL && protocol != NULL &&
+	    (!find_proto(protocol, XTF_DONT_LOAD, options & OPT_NUMERIC, NULL) ||
+	     (find_proto(protocol, XTF_DONT_LOAD, options & OPT_NUMERIC, NULL) && !*proto_used)) &&
+	    (m = find_proto(protocol, XTF_TRY_LOAD, options & OPT_NUMERIC, matches))) {
+		/* Try loading protocol */
+		size_t size;
+
+		*proto_used = true;
+		size = IPT_ALIGN(sizeof(struct ipt_entry_match)) + m->size;
+
+		m->m = xtables_calloc(1, size);
+		m->m->u.match_size = size;
+		strcpy(m->m->u.user.name, m->name);
+		m->m->u.user.revision = m->revision;
+		if (m->init != NULL)
+			m->init(m->m);
+
+		opts = xtables_merge_options(iptables_globals.orig_opts, opts,
+					     m->extra_opts, &m->option_offset);
+		if (opts == NULL)
+			xtables_error(OTHER_PROBLEM, "can't alloc memory!");
+		optind--;
+		return;
+	}
+	if (c == '?') {
+		if (optopt)
+			xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
+			              "requires an argument", argv[optind-1]);
+		else
+			xtables_error(PARAMETER_PROBLEM, "unknown option "
+				      "\"%s\"", argv[optind-1]);
+	}
+	xtables_error(PARAMETER_PROBLEM, "Unknown arg \"%s\"", optarg);
+}
+
 int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle)
 {
 	struct ipt_entry fw, *e = NULL;
@@ -1333,7 +1415,7 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 	struct xtables_target *t;
 	const char *jumpto = "";
 	char *protocol = NULL;
-	int proto_used = 0;
+	bool proto_used = false;
 	unsigned long long cnt;
 
 	memset(&fw, 0, sizeof(fw));
@@ -1734,113 +1816,11 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 			fprintf(stderr, "Bad argument `%s'\n", optarg);
 			exit_tryhelp(2);
 
-		default: {
-			bool stop = false;
-
-			if (target != NULL && target->parse != NULL &&
-			    c >= target->option_offset &&
-			    c < target->option_offset + XT_OPTION_OFFSET_SCALE &&
-			    target->parse(c - target->option_offset,
-					       argv, invert,
-					       &target->tflags,
-					       &fw, &target->t))
-				break;
-			for (matchp = matches; matchp; matchp = matchp->next) {
-				m = matchp->match;
-
-				if (matchp->completed || m->parse == NULL)
-					continue;
-				if (c < m->option_offset ||
-				    c >= m->option_offset + XT_OPTION_OFFSET_SCALE)
-					continue;
-				if (m->parse(c - matchp->match->option_offset,
-					     argv, invert, &m->mflags, &fw,
-					     &m->m)) {
-					stop = true;
-					break;
-				}
-			}
-			if (stop)
-				break;
-
-			/* If you listen carefully, you can
-			   actually hear this code suck. */
-
-			/* some explanations (after four different bugs
-			 * in 3 different releases): If we encounter a
-			 * parameter, that has not been parsed yet,
-			 * it's not an option of an explicitly loaded
-			 * match or a target.  However, we support
-			 * implicit loading of the protocol match
-			 * extension.  '-p tcp' means 'l4 proto 6' and
-			 * at the same time 'load tcp protocol match on
-			 * demand if we specify --dport'.
-			 *
-			 * To make this work, we need to make sure:
-			 * - the parameter has not been parsed by
-			 *   a match (m above)
-			 * - a protocol has been specified
-			 * - the protocol extension has not been
-			 *   loaded yet, or is loaded and unused
-			 *   [think of iptables-restore!]
-			 * - the protocol extension can be successively
-			 *   loaded
-			 */
-			if (protocol != NULL
-			    && (!find_proto(protocol, XTF_DONT_LOAD,
-					   options&OPT_NUMERIC, NULL)
-				|| (find_proto(protocol, XTF_DONT_LOAD,
-						options&OPT_NUMERIC, NULL)
-				    && (proto_used == 0))
-			       )
-			    && (m = find_proto(protocol, XTF_TRY_LOAD,
-					       options&OPT_NUMERIC, &matches))) {
-				/* Try loading protocol */
-				size_t size;
-
-				proto_used = 1;
-
-				size = IPT_ALIGN(sizeof(struct ipt_entry_match))
-						 + m->size;
-
-				m->m = xtables_calloc(1, size);
-				m->m->u.match_size = size;
-				strcpy(m->m->u.user.name, m->name);
-				m->m->u.user.revision = m->revision;
-				if (m->init != NULL)
-					m->init(m->m);
-
-				opts = xtables_merge_options(
-						     iptables_globals.orig_opts,
-						     opts,
-						     m->extra_opts,
-						     &m->option_offset);
-				if (opts == NULL)
-					xtables_error(OTHER_PROBLEM,
-						"can't alloc memory!");
-
-				optind--;
-				continue;
-			}
-			if (c == '?') {
-				if (optopt) {
-					xtables_error(
-					   PARAMETER_PROBLEM,
-					   "option `%s' "
-					   "requires an "
-					   "argument",
-					   argv[optind-1]);
-				} else {
-					xtables_error(
-					   PARAMETER_PROBLEM,
-					   "unknown option "
-					   "`%s'",
-					   argv[optind-1]);
-				}
-			}
-			xtables_error(PARAMETER_PROBLEM,
-				   "Unknown arg `%s'", optarg);
-		} /* default */
+		default:
+			command_default(c, argv, invert, &fw, protocol,
+					&proto_used, options,
+					target, &matches);
+			break;
 		}
 		invert = FALSE;
 	}
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/8] iptables: fix error message for unknown options
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
                   ` (3 preceding siblings ...)
  2011-02-04 13:08 ` [PATCH 4/8] iptables: reduce indentation of parse loop (3/3) Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 6/8] build: directly use config.h in internal.h Jan Engelhardt
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

-From: iptables v1.4.10: option "-q" requires an argument
+To:   iptables v1.4.10: unknown option "-q"

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 ip6tables.c |   16 +++++++---------
 iptables.c  |   16 +++++++---------
 2 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/ip6tables.c b/ip6tables.c
index fb3b320..8cacf61 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -1359,14 +1359,12 @@ command_default(int c, char **argv, bool invert, struct ip6t_entry *fw,
 		optind--;
 		return;
 	}
-	if (c == '?') {
-		if (optopt)
-			xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
-			              "requires an argument", argv[optind-1]);
-		else
-			xtables_error(PARAMETER_PROBLEM, "unknown option "
-				      "\"%s\"", optarg);
-	}
+	if (c == ':')
+		xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
+		              "requires an argument", argv[optind-1]);
+	if (c == '?')
+		xtables_error(PARAMETER_PROBLEM, "unknown option "
+			      "\"%s\"", argv[optind-1]);
 	xtables_error(PARAMETER_PROBLEM, "Unknown arg \"%s\"", argv[optind-1]);
 }
 
@@ -1417,7 +1415,7 @@ int do_command6(int argc, char *argv[], char **table, struct ip6tc_handle **hand
 
 	opts = xt_params->orig_opts;
 	while ((c = getopt_long(argc, argv,
-	   "-A:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:bvnt:m:xc:g:",
+	   "-:A:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:bvnt:m:xc:g:",
 					   opts, NULL)) != -1) {
 		switch (c) {
 			/*
diff --git a/iptables.c b/iptables.c
index 9977634..504bcd8 100644
--- a/iptables.c
+++ b/iptables.c
@@ -1382,14 +1382,12 @@ command_default(int c, char **argv, bool invert, struct ipt_entry *fw,
 		optind--;
 		return;
 	}
-	if (c == '?') {
-		if (optopt)
-			xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
-			              "requires an argument", argv[optind-1]);
-		else
-			xtables_error(PARAMETER_PROBLEM, "unknown option "
-				      "\"%s\"", argv[optind-1]);
-	}
+	if (c == ':')
+		xtables_error(PARAMETER_PROBLEM, "option \"%s\" "
+		              "requires an argument", argv[optind-1]);
+	if (c == '?')
+		xtables_error(PARAMETER_PROBLEM, "unknown option "
+			      "\"%s\"", argv[optind-1]);
 	xtables_error(PARAMETER_PROBLEM, "Unknown arg \"%s\"", optarg);
 }
 
@@ -1440,7 +1438,7 @@ int do_command(int argc, char *argv[], char **table, struct iptc_handle **handle
 
 	opts = xt_params->orig_opts;
 	while ((c = getopt_long(argc, argv,
-	   "-A:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:fbvnt:m:xc:g:",
+	   "-:A:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:fbvnt:m:xc:g:",
 					   opts, NULL)) != -1) {
 		switch (c) {
 			/*
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/8] build: directly use config.h in internal.h
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
                   ` (4 preceding siblings ...)
  2011-02-04 13:08 ` [PATCH 5/8] iptables: fix error message for unknown options Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 7/8] libxtables: symbol visibility Jan Engelhardt
  2011-02-04 13:08 ` [PATCH 8/8] libxtables: symbol versioning Jan Engelhardt
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

This avoids the extra indirection via the .h.in file.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 .gitignore                     |    1 -
 Makefile.am                    |    3 +--
 configure.ac                   |    2 +-
 include/iptables/internal.h    |   15 +++++++++++++++
 include/iptables/internal.h.in |   13 -------------
 5 files changed, 17 insertions(+), 17 deletions(-)
 create mode 100644 include/iptables/internal.h
 delete mode 100644 include/iptables/internal.h.in

diff --git a/.gitignore b/.gitignore
index e5d3099..7d0df25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,7 +18,6 @@ Makefile.in
 /extensions/targets?.man
 
 /include/xtables.h
-/include/iptables/internal.h
 
 /aclocal.m4
 /autom4te*.cache
diff --git a/Makefile.am b/Makefile.am
index 7f0eb2f..cfccbf2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -89,8 +89,7 @@ tarball:
 	tar -C /tmp -cjf ${PACKAGE_TARNAME}-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ${PACKAGE_TARNAME}-${PACKAGE_VERSION}/;
 	rm -Rf /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION};
 
-config.status: extensions/GNUmakefile.in \
-	include/xtables.h.in include/iptables/internal.h.in
+config.status: extensions/GNUmakefile.in include/xtables.h.in
 
 # Using if..fi avoids an ugly "error (ignored)" message :)
 install-exec-hook:
diff --git a/configure.ac b/configure.ac
index eb447e0..94d5ab2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -111,5 +111,5 @@ AC_SUBST([libxtables_vmajor])
 
 AC_CONFIG_FILES([Makefile extensions/GNUmakefile include/Makefile
 	libipq/Makefile utils/Makefile
-	include/xtables.h include/iptables/internal.h libiptc.pc xtables.pc])
+	include/xtables.h libiptc.pc xtables.pc])
 AC_OUTPUT
diff --git a/include/iptables/internal.h b/include/iptables/internal.h
new file mode 100644
index 0000000..531fe4f
--- /dev/null
+++ b/include/iptables/internal.h
@@ -0,0 +1,15 @@
+#ifndef IPTABLES_INTERNAL_H
+#define IPTABLES_INTERNAL_H 1
+
+#include "config.h"
+
+#define IPTABLES_VERSION PACKAGE_VERSION
+
+/**
+ * Program's own name and version.
+ */
+extern const char *program_name, *program_version;
+
+extern int line;
+
+#endif /* IPTABLES_INTERNAL_H */
diff --git a/include/iptables/internal.h.in b/include/iptables/internal.h.in
deleted file mode 100644
index 8568e58..0000000
--- a/include/iptables/internal.h.in
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef IPTABLES_INTERNAL_H
-#define IPTABLES_INTERNAL_H 1
-
-#define IPTABLES_VERSION "@PACKAGE_VERSION@"
-
-/**
- * Program's own name and version.
- */
-extern const char *program_name, *program_version;
-
-extern int line;
-
-#endif /* IPTABLES_INTERNAL_H */
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/8] libxtables: symbol visibility
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
                   ` (5 preceding siblings ...)
  2011-02-04 13:08 ` [PATCH 6/8] build: directly use config.h in internal.h Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  2011-02-04 13:13   ` Patrick McHardy
  2011-02-04 13:08 ` [PATCH 8/8] libxtables: symbol versioning Jan Engelhardt
  7 siblings, 1 reply; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 Makefile.am                 |    4 +-
 configure.ac                |    2 +
 extensions/GNUmakefile.in   |    2 +-
 include/iptables/internal.h |    6 ++
 iptables.c                  |    2 +-
 m4/gcc4_visibility.m4       |   21 ++++++++
 xtables.c                   |  109 ++++++++++++++++++++++++-------------------
 7 files changed, 94 insertions(+), 52 deletions(-)
 create mode 100644 m4/gcc4_visibility.m4

diff --git a/Makefile.am b/Makefile.am
index cfccbf2..a560113 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -29,11 +29,11 @@ libiptc_libip6tc_la_LDFLAGS = -version-info 0:0:0 ${libiptc_LDFLAGS2}
 lib_LTLIBRARIES      += libxtables.la
 libxtables_la_SOURCES = xtables.c
 libxtables_la_LDFLAGS = -version-info ${libxtables_vcurrent}:0:${libxtables_vage}
+libxtables_la_CFLAGS  = ${AM_CFLAGS} ${GCC_FVISIBILITY_HIDDEN}
 if ENABLE_SHARED
-libxtables_la_CFLAGS  = ${AM_CFLAGS}
 libxtables_la_LIBADD  = -ldl
 else
-libxtables_la_CFLAGS  = ${AM_CFLAGS} -DNO_SHARED_LIBS=1
+libxtables_la_CFLAGS += -DNO_SHARED_LIBS=1
 libxtables_la_LIBADD  =
 endif
 
diff --git a/configure.ac b/configure.ac
index 94d5ab2..cba1dc5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,6 +14,8 @@ AM_PROG_CC_C_O
 AC_DISABLE_STATIC
 AM_PROG_LIBTOOL
 
+CHECK_GCC_FVISIBILITY
+
 AC_ARG_WITH([kernel],
 	AS_HELP_STRING([--with-kernel=PATH],
 	[Path to kernel source/build directory]),
diff --git a/extensions/GNUmakefile.in b/extensions/GNUmakefile.in
index 74a058c..899a52d 100644
--- a/extensions/GNUmakefile.in
+++ b/extensions/GNUmakefile.in
@@ -18,7 +18,7 @@ LDFLAGS        := @LDFLAGS@
 regular_CFLAGS := @regular_CFLAGS@
 kinclude_CFLAGS := @kinclude_CFLAGS@
 
-AM_CFLAGS      := ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include ${kinclude_CFLAGS}
+AM_CFLAGS      := ${regular_CFLAGS} -I${top_builddir}/include -I${top_srcdir}/include ${kinclude_CFLAGS} -I${top_builddir}
 AM_DEPFLAGS     = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
 
 ifeq (${V},)
diff --git a/include/iptables/internal.h b/include/iptables/internal.h
index 531fe4f..89d11cb 100644
--- a/include/iptables/internal.h
+++ b/include/iptables/internal.h
@@ -3,6 +3,12 @@
 
 #include "config.h"
 
+#ifdef HAVE_VISIBILITY_HIDDEN
+#	define EXPORT_SYMBOL __attribute__((visibility("default")))
+#else
+#	define EXPORT_SYMBOL
+#endif
+
 #define IPTABLES_VERSION PACKAGE_VERSION
 
 /**
diff --git a/iptables.c b/iptables.c
index 504bcd8..1bc9d84 100644
--- a/iptables.c
+++ b/iptables.c
@@ -200,7 +200,7 @@ static const int inverse_for_options[NUMBER_OF_OPT] =
 #define prog_name iptables_globals.program_name
 #define prog_vers iptables_globals.program_version
 
-int kernel_version;
+EXPORT_SYMBOL int kernel_version;
 
 /* Primitive headers... */
 /* defined in netinet/in.h */
diff --git a/m4/gcc4_visibility.m4 b/m4/gcc4_visibility.m4
new file mode 100644
index 0000000..84959f3
--- /dev/null
+++ b/m4/gcc4_visibility.m4
@@ -0,0 +1,21 @@
+
+# GCC 4.x -fvisibility=hidden
+
+AC_DEFUN([CHECK_GCC_FVISIBILITY], [
+	AC_LANG_PUSH([C])
+	saved_CFLAGS="$CFLAGS"
+	CFLAGS="$saved_CFLAGS -fvisibility=hidden"
+	AC_CACHE_CHECK([whether compiler accepts -fvisibility=hidden],
+	  [ac_cv_fvisibility_hidden], AC_COMPILE_IFELSE(
+		AC_LANG_PROGRAM([], []),
+		[ac_cv_fvisibility_hidden=yes],
+		[ac_cv_fvisibility_hidden=no]
+	))
+	if test "$ac_cv_fvisibility_hidden" = "yes"; then
+		AC_DEFINE([HAVE_VISIBILITY_HIDDEN], [1],
+		  [True if compiler supports -fvisibility=hidden])
+		AC_SUBST([GCC_FVISIBILITY_HIDDEN], [-fvisibility=hidden])
+	fi
+	CFLAGS="$saved_CFLAGS"
+	AC_LANG_POP([C])
+])
diff --git a/xtables.c b/xtables.c
index fc59f75..4425f38 100644
--- a/xtables.c
+++ b/xtables.c
@@ -50,6 +50,7 @@
 #endif
 #include <getopt.h>
 #include "xshared.h"
+#include "iptables/internal.h"
 
 #define NPROTO	255
 
@@ -59,7 +60,7 @@
 
 void basic_exit_err(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
 
-struct xtables_globals *xt_params = NULL;
+EXPORT_SYMBOL struct xtables_globals *xt_params;
 
 void basic_exit_err(enum xtables_exittype status, const char *msg, ...)
 {
@@ -73,7 +74,7 @@ void basic_exit_err(enum xtables_exittype status, const char *msg, ...)
 	exit(status);
 }
 
-void xtables_free_opts(int unused)
+EXPORT_SYMBOL void xtables_free_opts(int unused)
 {
 	if (xt_params->opts != xt_params->orig_opts) {
 		free(xt_params->opts);
@@ -81,10 +82,10 @@ void xtables_free_opts(int unused)
 	}
 }
 
-struct option *xtables_merge_options(struct option *orig_opts,
-				     struct option *oldopts,
-				     const struct option *newopts,
-				     unsigned int *option_offset)
+EXPORT_SYMBOL struct option *
+xtables_merge_options(struct option *orig_opts, struct option *oldopts,
+		      const struct option *newopts,
+		      unsigned int *option_offset)
 {
 	unsigned int num_oold = 0, num_old = 0, num_new = 0, i;
 	struct option *merge, *mp;
@@ -172,11 +173,11 @@ static const struct xtables_afinfo *afinfo;
 static const char *xtables_libdir;
 
 /* the path to command to load kernel module */
-const char *xtables_modprobe_program;
+EXPORT_SYMBOL const char *xtables_modprobe_program;
 
 /* Keeping track of external matches and targets: linked lists.  */
-struct xtables_match *xtables_matches;
-struct xtables_target *xtables_targets;
+EXPORT_SYMBOL struct xtables_match *xtables_matches;
+EXPORT_SYMBOL struct xtables_target *xtables_targets;
 
 void xtables_init(void)
 {
@@ -230,7 +231,7 @@ void xtables_set_nfproto(uint8_t nfproto)
  *
  * Returns -1 on failure to set and 0 on success
  */
-int xtables_set_params(struct xtables_globals *xtp)
+EXPORT_SYMBOL int xtables_set_params(struct xtables_globals *xtp)
 {
 	if (!xtp) {
 		fprintf(stderr, "%s: Illegal global params\n",__func__);
@@ -245,7 +246,8 @@ int xtables_set_params(struct xtables_globals *xtp)
 	return 0;
 }
 
-int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto)
+EXPORT_SYMBOL int
+xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto)
 {
 	xtables_init();
 	xtables_set_nfproto(nfproto);
@@ -255,7 +257,7 @@ int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto)
 /**
  * xtables_*alloc - wrappers that exit on failure
  */
-void *xtables_calloc(size_t count, size_t size)
+EXPORT_SYMBOL void *xtables_calloc(size_t count, size_t size)
 {
 	void *p;
 
@@ -267,7 +269,7 @@ void *xtables_calloc(size_t count, size_t size)
 	return p;
 }
 
-void *xtables_malloc(size_t size)
+EXPORT_SYMBOL void *xtables_malloc(size_t size)
 {
 	void *p;
 
@@ -367,7 +369,7 @@ int xtables_insmod(const char *modname, const char *modprobe, bool quiet)
 	return -1;
 }
 
-int xtables_load_ko(const char *modprobe, bool quiet)
+EXPORT_SYMBOL int xtables_load_ko(const char *modprobe, bool quiet)
 {
 	static bool loaded = false;
 	static int ret = -1;
@@ -421,8 +423,9 @@ bool xtables_strtoul(const char *s, char **end, unsigned long *value,
 	return false;
 }
 
-bool xtables_strtoui(const char *s, char **end, unsigned int *value,
-                     unsigned int min, unsigned int max)
+EXPORT_SYMBOL bool
+xtables_strtoui(const char *s, char **end, unsigned int *value,
+		unsigned int min, unsigned int max)
 {
 	unsigned long v;
 	bool ret;
@@ -433,7 +436,7 @@ bool xtables_strtoui(const char *s, char **end, unsigned int *value,
 	return ret;
 }
 
-int xtables_service_to_port(const char *name, const char *proto)
+EXPORT_SYMBOL int xtables_service_to_port(const char *name, const char *proto)
 {
 	struct servent *service;
 
@@ -443,7 +446,7 @@ int xtables_service_to_port(const char *name, const char *proto)
 	return -1;
 }
 
-uint16_t xtables_parse_port(const char *port, const char *proto)
+EXPORT_SYMBOL uint16_t xtables_parse_port(const char *port, const char *proto)
 {
 	unsigned int portnum;
 
@@ -455,8 +458,8 @@ uint16_t xtables_parse_port(const char *port, const char *proto)
 		   "invalid port/service `%s' specified", port);
 }
 
-void xtables_parse_interface(const char *arg, char *vianame,
-			     unsigned char *mask)
+EXPORT_SYMBOL void
+xtables_parse_interface(const char *arg, char *vianame, unsigned char *mask)
 {
 	unsigned int vialen = strlen(arg);
 	unsigned int i;
@@ -547,7 +550,7 @@ static void *load_extension(const char *search_path, const char *af_prefix,
 }
 #endif
 
-struct xtables_match *
+EXPORT_SYMBOL struct xtables_match *
 xtables_find_match(const char *name, enum xtables_tryload tryload,
 		   struct xtables_rule_match **matches)
 {
@@ -628,7 +631,7 @@ xtables_find_match(const char *name, enum xtables_tryload tryload,
 	return ptr;
 }
 
-struct xtables_target *
+EXPORT_SYMBOL struct xtables_target *
 xtables_find_target(const char *name, enum xtables_tryload tryload)
 {
 	struct xtables_target *ptr;
@@ -744,7 +747,7 @@ static void xtables_check_options(const char *name, const struct option *opt)
 		}
 }
 
-void xtables_register_match(struct xtables_match *me)
+EXPORT_SYMBOL void xtables_register_match(struct xtables_match *me)
 {
 	struct xtables_match **i, *old;
 
@@ -825,14 +828,15 @@ void xtables_register_match(struct xtables_match *me)
 	me->mflags = 0;
 }
 
-void xtables_register_matches(struct xtables_match *match, unsigned int n)
+EXPORT_SYMBOL void
+xtables_register_matches(struct xtables_match *match, unsigned int n)
 {
 	do {
 		xtables_register_match(&match[--n]);
 	} while (n > 0);
 }
 
-void xtables_register_target(struct xtables_target *me)
+EXPORT_SYMBOL void xtables_register_target(struct xtables_target *me)
 {
 	struct xtables_target *old;
 
@@ -913,7 +917,8 @@ void xtables_register_target(struct xtables_target *me)
 	me->tflags = 0;
 }
 
-void xtables_register_targets(struct xtables_target *target, unsigned int n)
+EXPORT_SYMBOL void
+xtables_register_targets(struct xtables_target *target, unsigned int n)
 {
 	do {
 		xtables_register_target(&target[--n]);
@@ -944,7 +949,7 @@ void xtables_register_targets(struct xtables_target *target, unsigned int n)
  *
  * Displays an error message and exits the program.
  */
-void xtables_param_act(unsigned int status, const char *p1, ...)
+EXPORT_SYMBOL void xtables_param_act(unsigned int status, const char *p1, ...)
 {
 	const char *p2, *p3;
 	va_list args;
@@ -992,7 +997,8 @@ void xtables_param_act(unsigned int status, const char *p1, ...)
 	va_end(args);
 }
 
-const char *xtables_ipaddr_to_numeric(const struct in_addr *addrp)
+EXPORT_SYMBOL const char *
+xtables_ipaddr_to_numeric(const struct in_addr *addrp)
 {
 	static char buf[20];
 	const unsigned char *bytep = (const void *)&addrp->s_addr;
@@ -1022,7 +1028,7 @@ static const char *ipaddr_to_network(const struct in_addr *addr)
 	return NULL;
 }
 
-const char *xtables_ipaddr_to_anyname(const struct in_addr *addr)
+EXPORT_SYMBOL const char *xtables_ipaddr_to_anyname(const struct in_addr *addr)
 {
 	const char *name;
 
@@ -1033,7 +1039,7 @@ const char *xtables_ipaddr_to_anyname(const struct in_addr *addr)
 	return xtables_ipaddr_to_numeric(addr);
 }
 
-const char *xtables_ipmask_to_numeric(const struct in_addr *mask)
+EXPORT_SYMBOL const char *xtables_ipmask_to_numeric(const struct in_addr *mask)
 {
 	static char buf[20];
 	uint32_t maskaddr, bits;
@@ -1104,12 +1110,12 @@ static struct in_addr *__numeric_to_ipaddr(const char *dotted, bool is_mask)
 	return &addr;
 }
 
-struct in_addr *xtables_numeric_to_ipaddr(const char *dotted)
+EXPORT_SYMBOL struct in_addr *xtables_numeric_to_ipaddr(const char *dotted)
 {
 	return __numeric_to_ipaddr(dotted, false);
 }
 
-struct in_addr *xtables_numeric_to_ipmask(const char *dotted)
+EXPORT_SYMBOL struct in_addr *xtables_numeric_to_ipmask(const char *dotted)
 {
 	return __numeric_to_ipaddr(dotted, true);
 }
@@ -1197,8 +1203,9 @@ static struct in_addr *parse_ipmask(const char *mask)
 	return &maskaddr;
 }
 
-void xtables_ipparse_multiple(const char *name, struct in_addr **addrpp,
-                              struct in_addr **maskpp, unsigned int *naddrs)
+EXPORT_SYMBOL void
+xtables_ipparse_multiple(const char *name, struct in_addr **addrpp,
+			 struct in_addr **maskpp, unsigned int *naddrs)
 {
 	struct in_addr *addrp;
 	char buf[256], *p;
@@ -1284,8 +1291,9 @@ void xtables_ipparse_multiple(const char *name, struct in_addr **addrpp,
  * 	m{^($hostname|$networkname|$ipaddr)(/$mask)?}
  * "1.2.3.4/5", "1.2.3.4", "hostname", "networkname"
  */
-void xtables_ipparse_any(const char *name, struct in_addr **addrpp,
-                         struct in_addr *maskp, unsigned int *naddrs)
+EXPORT_SYMBOL void
+xtables_ipparse_any(const char *name, struct in_addr **addrpp,
+		    struct in_addr *maskp, unsigned int *naddrs)
 {
 	unsigned int i, j, k, n;
 	struct in_addr *addrp;
@@ -1318,7 +1326,8 @@ void xtables_ipparse_any(const char *name, struct in_addr **addrpp,
 	}
 }
 
-const char *xtables_ip6addr_to_numeric(const struct in6_addr *addrp)
+EXPORT_SYMBOL const char *
+xtables_ip6addr_to_numeric(const struct in6_addr *addrp)
 {
 	/* 0000:0000:0000:0000:0000:000.000.000.000
 	 * 0000:0000:0000:0000:0000:0000:0000:0000 */
@@ -1351,7 +1360,8 @@ static const char *ip6addr_to_host(const struct in6_addr *addr)
 	return hostname;
 }
 
-const char *xtables_ip6addr_to_anyname(const struct in6_addr *addr)
+EXPORT_SYMBOL const char *
+xtables_ip6addr_to_anyname(const struct in6_addr *addr)
 {
 	const char *name;
 
@@ -1385,7 +1395,8 @@ static int ip6addr_prefix_length(const struct in6_addr *k)
 	return bits;
 }
 
-const char *xtables_ip6mask_to_numeric(const struct in6_addr *addrp)
+EXPORT_SYMBOL const char *
+xtables_ip6mask_to_numeric(const struct in6_addr *addrp)
 {
 	static char buf[50+2];
 	int l = ip6addr_prefix_length(addrp);
@@ -1399,7 +1410,7 @@ const char *xtables_ip6mask_to_numeric(const struct in6_addr *addrp)
 	return buf;
 }
 
-struct in6_addr *xtables_numeric_to_ip6addr(const char *num)
+EXPORT_SYMBOL struct in6_addr *xtables_numeric_to_ip6addr(const char *num)
 {
 	static struct in6_addr ap;
 	int err;
@@ -1508,7 +1519,7 @@ static struct in6_addr *parse_ip6mask(char *mask)
 	return &maskaddr;
 }
 
-void
+EXPORT_SYMBOL void
 xtables_ip6parse_multiple(const char *name, struct in6_addr **addrpp,
 		      struct in6_addr **maskpp, unsigned int *naddrs)
 {
@@ -1592,8 +1603,9 @@ xtables_ip6parse_multiple(const char *name, struct in6_addr **addrpp,
 			(*addrpp+i)->s6_addr32[j] &= (*maskpp+i)->s6_addr32[j];
 }
 
-void xtables_ip6parse_any(const char *name, struct in6_addr **addrpp,
-                          struct in6_addr *maskp, unsigned int *naddrs)
+EXPORT_SYMBOL void
+xtables_ip6parse_any(const char *name, struct in6_addr **addrpp,
+		     struct in6_addr *maskp, unsigned int *naddrs)
 {
 	static const struct in6_addr zero_addr;
 	struct in6_addr *addrp;
@@ -1629,7 +1641,7 @@ void xtables_ip6parse_any(const char *name, struct in6_addr **addrpp,
 	}
 }
 
-void xtables_save_string(const char *value)
+EXPORT_SYMBOL void xtables_save_string(const char *value)
 {
 	static const char no_quote_chars[] = "_-0123456789"
 		"abcdefghijklmnopqrstuvwxyz"
@@ -1670,8 +1682,9 @@ void xtables_save_string(const char *value)
  * Check for option-intrapositional negation.
  * Do not use in new code.
  */
-int xtables_check_inverse(const char option[], int *invert,
-			  int *my_optind, int argc, char **argv)
+EXPORT_SYMBOL int
+xtables_check_inverse(const char *option, int *invert, int *my_optind,
+		      int argc, char **argv)
 {
 	if (option == NULL || strcmp(option, "!") != 0)
 		return false;
@@ -1695,7 +1708,7 @@ int xtables_check_inverse(const char option[], int *invert,
 	return true;
 }
 
-const struct xtables_pprot xtables_chain_protos[] = {
+EXPORT_SYMBOL const struct xtables_pprot xtables_chain_protos[] = {
 	{"tcp",       IPPROTO_TCP},
 	{"sctp",      IPPROTO_SCTP},
 	{"udp",       IPPROTO_UDP},
@@ -1711,7 +1724,7 @@ const struct xtables_pprot xtables_chain_protos[] = {
 	{NULL},
 };
 
-uint16_t
+EXPORT_SYMBOL uint16_t
 xtables_parse_protocol(const char *s)
 {
 	unsigned int proto;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 8/8] libxtables: symbol versioning
  2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
                   ` (6 preceding siblings ...)
  2011-02-04 13:08 ` [PATCH 7/8] libxtables: symbol visibility Jan Engelhardt
@ 2011-02-04 13:08 ` Jan Engelhardt
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:08 UTC (permalink / raw)
  To: kaber; +Cc: netfilter-devel

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
---
 Makefile.am    |    2 +-
 configure.ac   |    2 +-
 libxtables.map |   55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 57 insertions(+), 2 deletions(-)
 create mode 100644 libxtables.map

diff --git a/Makefile.am b/Makefile.am
index a560113..4406435 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,7 +28,7 @@ libiptc_libip6tc_la_LDFLAGS = -version-info 0:0:0 ${libiptc_LDFLAGS2}
 
 lib_LTLIBRARIES      += libxtables.la
 libxtables_la_SOURCES = xtables.c
-libxtables_la_LDFLAGS = -version-info ${libxtables_vcurrent}:0:${libxtables_vage}
+libxtables_la_LDFLAGS = -version-info ${libxtables_vcurrent}:0:${libxtables_vage} -Wl,--version-script=${srcdir}/libxtables.map
 libxtables_la_CFLAGS  = ${AM_CFLAGS} ${GCC_FVISIBILITY_HIDDEN}
 if ENABLE_SHARED
 libxtables_la_LIBADD  = -ldl
diff --git a/configure.ac b/configure.ac
index cba1dc5..ec44c3a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 AC_INIT([iptables], [1.4.10])
 
 # See libtool.info "Libtool's versioning system"
-libxtables_vcurrent=5
+libxtables_vcurrent=6
 libxtables_vage=0
 
 AC_CONFIG_HEADERS([config.h])
diff --git a/libxtables.map b/libxtables.map
new file mode 100644
index 0000000..54fd64c
--- /dev/null
+++ b/libxtables.map
@@ -0,0 +1,55 @@
+XTABLES_1.4.2 {
+global:
+	xtables_matches;
+	xtables_targets;
+	xtables_register_match;
+	xtables_register_target;
+local:
+	*;
+};
+
+XTABLES_1.4.3 {
+	xt_params;
+	xtables_free_opts;
+	xtables_modprobe_program;
+	xtables_set_params;
+	xtables_init_all;
+	xtables_calloc;
+	xtables_malloc;
+	xtables_load_ko;
+	xtables_strtoui;
+	xtables_service_to_port;
+	xtables_parse_port;
+	xtables_parse_interface;
+	xtables_find_match;
+	xtables_find_target;
+	xtables_param_act;
+	xtables_ipaddr_to_numeric;
+	xtables_ipaddr_to_anyname;
+	xtables_ipmask_to_numeric;
+	xtables_numeric_to_ipaddr;
+	xtables_numeric_to_ipmask;
+	xtables_ipparse_any;
+	xtables_ip6addr_to_numeric;
+	xtables_ip6addr_to_anyname;
+	xtables_ip6mask_to_numeric;
+	xtables_numeric_to_ip6addr;
+	xtables_ip6parse_any;
+	xtables_save_string;
+	xtables_check_inverse;
+	xtables_chain_protos;
+	xtables_parse_protocol;
+} XTABLES_1.4.2;
+
+XTABLES_1.4.5 {
+global:
+	xtables_register_matches;
+	xtables_register_targets;
+	xtables_ipparse_multiple;
+	xtables_ip6parse_multiple;
+} XTABLES_1.4.3;
+
+XTABLES_1.4.11 {
+global:
+	xtables_merge_options;
+} XTABLES_1.4.5;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 7/8] libxtables: symbol visibility
  2011-02-04 13:08 ` [PATCH 7/8] libxtables: symbol visibility Jan Engelhardt
@ 2011-02-04 13:13   ` Patrick McHardy
  2011-02-04 13:22     ` Jan Engelhardt
  0 siblings, 1 reply; 12+ messages in thread
From: Patrick McHardy @ 2011-02-04 13:13 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On 04.02.2011 14:08, Jan Engelhardt wrote:
> -void xtables_free_opts(int unused)
> +EXPORT_SYMBOL void xtables_free_opts(int unused)

This is pretty ugly in my opinion. Please do something like this:

#define EXPORT_SYMBOL(x)        typeof(x) (x)
__attribute__((visibility("default")))

so you can use EXPORT_SYMBOL as in the kernel.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 7/8] libxtables: symbol visibility
  2011-02-04 13:13   ` Patrick McHardy
@ 2011-02-04 13:22     ` Jan Engelhardt
  2011-02-04 13:30       ` Patrick McHardy
  0 siblings, 1 reply; 12+ messages in thread
From: Jan Engelhardt @ 2011-02-04 13:22 UTC (permalink / raw)
  To: Patrick McHardy; +Cc: netfilter-devel

On Friday 2011-02-04 14:13, Patrick McHardy wrote:

>On 04.02.2011 14:08, Jan Engelhardt wrote:
>> -void xtables_free_opts(int unused)
>> +EXPORT_SYMBOL void xtables_free_opts(int unused)
>
>This is pretty ugly in my opinion. Please do something like this:
>
>#define EXPORT_SYMBOL(x)        typeof(x) (x)
>__attribute__((visibility("default")))
>
>so you can use EXPORT_SYMBOL as in the kernel.

But that is redundancy nonplusultra. The reason why EXPORT_SYMBOL is a 
separate statement is because it is much more than just a function 
attribute inside the kernel.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 7/8] libxtables: symbol visibility
  2011-02-04 13:22     ` Jan Engelhardt
@ 2011-02-04 13:30       ` Patrick McHardy
  0 siblings, 0 replies; 12+ messages in thread
From: Patrick McHardy @ 2011-02-04 13:30 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On 04.02.2011 14:22, Jan Engelhardt wrote:
> On Friday 2011-02-04 14:13, Patrick McHardy wrote:
> 
>> On 04.02.2011 14:08, Jan Engelhardt wrote:
>>> -void xtables_free_opts(int unused)
>>> +EXPORT_SYMBOL void xtables_free_opts(int unused)
>>
>> This is pretty ugly in my opinion. Please do something like this:
>>
>> #define EXPORT_SYMBOL(x)        typeof(x) (x)
>> __attribute__((visibility("default")))
>>
>> so you can use EXPORT_SYMBOL as in the kernel.
> 
> But that is redundancy nonplusultra.

Who cares? Its a lot nicer to look at and people are used to using
it this way. In fact Pablo just changed libmnl to the same style.

> The reason why EXPORT_SYMBOL is a 
> separate statement is because it is much more than just a function 
> attribute inside the kernel.

That might be one reason.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2011-02-04 13:30 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-04 13:08 iptables: mainloop cleanup, symbol vis+versioning Jan Engelhardt
2011-02-04 13:08 ` [PATCH 1/8] iptables: reduce indentation of parse loop (1/3) Jan Engelhardt
2011-02-04 13:08 ` [PATCH 2/8] iptables: reduce indentation of parse loop (2/3) Jan Engelhardt
2011-02-04 13:08 ` [PATCH 3/8] iptables: use variable as shortcut in parse loop Jan Engelhardt
2011-02-04 13:08 ` [PATCH 4/8] iptables: reduce indentation of parse loop (3/3) Jan Engelhardt
2011-02-04 13:08 ` [PATCH 5/8] iptables: fix error message for unknown options Jan Engelhardt
2011-02-04 13:08 ` [PATCH 6/8] build: directly use config.h in internal.h Jan Engelhardt
2011-02-04 13:08 ` [PATCH 7/8] libxtables: symbol visibility Jan Engelhardt
2011-02-04 13:13   ` Patrick McHardy
2011-02-04 13:22     ` Jan Engelhardt
2011-02-04 13:30       ` Patrick McHardy
2011-02-04 13:08 ` [PATCH 8/8] libxtables: symbol versioning Jan Engelhardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).