fixing a lot of bugs / cleaning up
- no more dependency problems with user-defined chains
- cleanup of the old strtok problem ( no more goto)
diff --git a/iptables-restore.c b/iptables-restore.c
index b4a8135..936c666 100644
--- a/iptables-restore.c
+++ b/iptables-restore.c
@@ -4,7 +4,7 @@
  *
  * This coude is distributed under the terms of GNU GPL
  *
- * $Id: iptables-restore.c,v 1.8 2001/01/23 22:54:34 laforge Exp $
+ * $Id: iptables-restore.c,v 1.9 2001/02/26 17:31:20 laforge Exp $
  */
 
 #include <getopt.h>
@@ -65,6 +65,21 @@
 	return (sscanf(string, "[%llu:%llu]", &ctr->pcnt, &ctr->bcnt) == 2);
 }
 
+/* global new argv and argc */
+static char* newargv[1024];
+static int newargc;
+
+/* function adding one argument to newargv, updating newargc 
+ * returns true if argument added, false otherwise */
+static int add_argv(char *what) {
+	if (what && ((newargc + 1) < sizeof(newargv)/sizeof(char *))) {
+		newargv[newargc] = what;
+		newargc++;
+		return 1;
+	} else 
+		return 0;
+}
+
 int main(int argc, char *argv[])
 {
 	iptc_handle_t handle;
@@ -72,7 +87,6 @@
 	unsigned int line = 0;
 	int c;
 	char curtable[IPT_TABLE_MAXNAMELEN + 1];
-	char curchain[IPT_FUNCTION_MAXNAMELEN + 1];
 	FILE *in;
 
 	program_name = "iptables-restore";
@@ -109,17 +123,7 @@
 		exit(1);
 	}
 	else in = stdin;
-/*
-	handle = iptc_init("filter");
-	if (!handle)
-		exit_error(VERSION_PROBLEM,
-			   "can't initialize iptables-restore: %s",
-			   iptc_strerror(errno));
-
-	if (!clean_slate(&handle))
-		exit_error(OTHER_PROBLEM, "Deleting old chains: %s",
-			   iptc_strerror(errno));
-*/
+	
 	/* Grab standard input. */
 	while (fgets(buffer, sizeof(buffer), in)) {
 		int ret;
@@ -173,16 +177,14 @@
 					   program_name, line);
 				exit(1);
 			}
-			strncpy(curchain, chain, IPT_FUNCTION_MAXNAMELEN);
 
-			/* why the f... does iptc_builtin not work here ? */
 			/* FIXME: abort if chain creation fails --RR */
-//			if (!iptc_builtin(curchain, &handle)) {
-				DEBUGP("Creating new chain '%s'\n", curchain);
-				if (!iptc_create_chain(curchain, &handle))
-				DEBUGP("unable to create chain '%s':%s\n", curchain,
+			if (!iptc_builtin(chain, handle)) {
+				DEBUGP("Creating new chain '%s'\n", chain);
+				if (!iptc_create_chain(chain, &handle))
+				DEBUGP("unable to create chain '%s':%s\n", chain,
 					strerror(errno));
-//			}
+			}
 
 			policy = strtok(NULL, " \t\n");
 			DEBUGP("line %u, policy '%s'\n", line, policy);
@@ -222,66 +224,64 @@
 			ret = 1;
 
 		} else {
-			char *newargv[1024];
-			int i,a, argvsize;
+			int a;
 			char *ptr = buffer;
 			char *pcnt = NULL;
 			char *bcnt = NULL;
+			char *parsestart;
+
+			/* reset the newargv */
+			newargc = 0;
 
 			if (buffer[0] == '[') {
+				/* we have counters in our input */
 				ptr = strchr(buffer, ']');
 				if (!ptr)
 					exit_error(PARAMETER_PROBLEM,
 						   "Bad line %u: need ]\n",
 						   line);
+
 				pcnt = strtok(buffer+1, ":");
+				if (!pcnt)
+					exit_error(PARAMETER_PROBLEM,
+						   "Bad line %u: need :\n",
+						   line);
+
 				bcnt = strtok(NULL, "]");
+				if (!bcnt)
+					exit_error(PARAMETER_PROBLEM,
+						   "Bad line %u: need ]\n",
+						   line);
+
+				/* start command parsing after counter */
+				parsestart = ptr + 1;
+			} else {
+				/* start command parsing at start of line */
+				parsestart = buffer;
 			}
 
-			newargv[0] = argv[0];
-			newargv[1] = "-t";
-			newargv[2] = (char *) &curtable;
-			newargv[3] = "-A";
-			newargv[4] = (char *) &curchain;
-			argvsize = 5;
-
+			add_argv(argv[0]);
+			add_argv("-t");
+			add_argv((char *) &curtable);
+			
 			if (counters && pcnt && bcnt) {
-				newargv[5] = "--set-counters";
-				newargv[6] = (char *) pcnt;
-				newargv[7] = (char *) bcnt;
-				argvsize = 8;
+				add_argv("--set-counters");
+				add_argv((char *) pcnt);
+				add_argv((char *) bcnt);
 			}
 
-			// strtok initcialize!
-			if ( buffer[0]!='[' )
-			{
-				if (!(newargv[argvsize] = strtok(buffer, " \t\n")))
-					goto ImLaMeR;
-					//break;
-				argvsize++;
-			}
-
-			/* strtok: a function only a coder could love */
-			for (i = argvsize; i < sizeof(newargv)/sizeof(char *); 
-					i++) {
-				if (!(newargv[i] = strtok(NULL, " \t\n")))
-					break;
-				ptr = NULL;
-			}
-ImLaMeR:		if (i == sizeof(newargv)/sizeof(char *)) {
-				fprintf(stderr,
-					"%s: line %u too many arguments\n",
-					program_name, line);
-				exit(1);
+			/* parse till end of line */
+			if (add_argv(strtok(parsestart, " \t\n"))) {
+				while (add_argv(strtok(NULL, " \t\n")));
 			}
 
 			DEBUGP("===>calling do_command(%u, argv, &%s, handle):\n",
-					i, curtable);
+					newargc, curtable);
 
-			for (a = 0; a <= i; a++)
+			for (a = 0; a <= newargc; a++)
 				DEBUGP("argv[%u]: %s\n", a, newargv[a]);
 
-			ret = do_command(i, newargv, &newargv[2], &handle);
+			ret = do_command(newargc, newargv, &newargv[2], &handle);
 		}
 		if (!ret) {
 			fprintf(stderr, "%s: line %u failed\n",