libxtables: prefix/order - program_name

Split XTABLES_VERSION into xtables and iptables, and encode the
xtables soversion into the extensions instead. This makes it possible
to upgrade iptables without having to recompile 3rd-party extensions
(if the libxtables version matches, of course).

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
diff --git a/xtables.c b/xtables.c
index 9e57679..642c04b 100644
--- a/xtables.c
+++ b/xtables.c
@@ -44,6 +44,11 @@
 #define PROC_SYS_MODPROBE "/proc/sys/kernel/modprobe"
 #endif
 
+/**
+ * Program will set this to its own name.
+ */
+const char *xtables_program_name;
+
 /* Search path for Xtables .so files */
 static const char *xtables_libdir;
 
@@ -529,23 +534,25 @@
 {
 	struct xtables_match **i, *old;
 
-	if (strcmp(me->version, program_version) != 0) {
-		fprintf(stderr, "%s: match `%s' v%s (I'm v%s).\n",
-			program_name, me->name, me->version, program_version);
+	if (strcmp(me->version, XTABLES_VERSION) != 0) {
+		fprintf(stderr, "%s: match \"%s\" has version \"%s\", "
+		        "but \"%s\" is required.\n",
+			xtables_program_name, me->name,
+			me->version, XTABLES_VERSION);
 		exit(1);
 	}
 
 	/* Revision field stole a char from name. */
 	if (strlen(me->name) >= XT_FUNCTION_MAXNAMELEN-1) {
 		fprintf(stderr, "%s: target `%s' has invalid name\n",
-			program_name, me->name);
+			xtables_program_name, me->name);
 		exit(1);
 	}
 
 	if (me->family >= NPROTO) {
 		fprintf(stderr,
 			"%s: BUG: match %s has invalid protocol family\n",
-			program_name, me->name);
+			xtables_program_name, me->name);
 		exit(1);
 	}
 
@@ -559,7 +566,7 @@
 		    old->family == me->family) {
 			fprintf(stderr,
 				"%s: match `%s' already registered.\n",
-				program_name, me->name);
+				xtables_program_name, me->name);
 			exit(1);
 		}
 
@@ -583,7 +590,7 @@
 
 	if (me->size != XT_ALIGN(me->size)) {
 		fprintf(stderr, "%s: match `%s' has invalid size %u.\n",
-			program_name, me->name, (unsigned int)me->size);
+			xtables_program_name, me->name, (unsigned int)me->size);
 		exit(1);
 	}
 
@@ -600,23 +607,25 @@
 {
 	struct xtables_target *old;
 
-	if (strcmp(me->version, program_version) != 0) {
-		fprintf(stderr, "%s: target `%s' v%s (I'm v%s).\n",
-			program_name, me->name, me->version, program_version);
+	if (strcmp(me->version, XTABLES_VERSION) != 0) {
+		fprintf(stderr, "%s: target \"%s\" has version \"%s\", "
+		        "but \"%s\" is required.\n",
+			xtables_program_name, me->name,
+			me->version, XTABLES_VERSION);
 		exit(1);
 	}
 
 	/* Revision field stole a char from name. */
 	if (strlen(me->name) >= XT_FUNCTION_MAXNAMELEN-1) {
 		fprintf(stderr, "%s: target `%s' has invalid name\n",
-			program_name, me->name);
+			xtables_program_name, me->name);
 		exit(1);
 	}
 
 	if (me->family >= NPROTO) {
 		fprintf(stderr,
 			"%s: BUG: target %s has invalid protocol family\n",
-			program_name, me->name);
+			xtables_program_name, me->name);
 		exit(1);
 	}
 
@@ -632,7 +641,7 @@
 		    old->family == me->family) {
 			fprintf(stderr,
 				"%s: target `%s' already registered.\n",
-				program_name, me->name);
+				xtables_program_name, me->name);
 			exit(1);
 		}
 
@@ -656,7 +665,7 @@
 
 	if (me->size != XT_ALIGN(me->size)) {
 		fprintf(stderr, "%s: target `%s' has invalid size %u.\n",
-			program_name, me->name, (unsigned int)me->size);
+			xtables_program_name, me->name, (unsigned int)me->size);
 		exit(1);
 	}