[klibc] [PATCH] Add configurable timeout to ipconfig

Bryan O'Sullivan bos at serpentine.com
Tue Apr 29 14:05:54 PDT 2003


Knocking a small item off Russell's feature list.  This applies on top
of my earlier bugfix+options patch.

README |   15 ++++-----------
main.c |   28 +++++++++++++++++++++++-----
2 files changed, 27 insertions(+), 16 deletions(-)


diff -Nru a/ipconfig/README b/ipconfig/README
--- a/ipconfig/README	Tue Apr 29 13:03:14 2003
+++ b/ipconfig/README	Tue Apr 29 13:03:14 2003
@@ -10,22 +10,15 @@
    It will wait for all listed interfaces to complete bootp/dhcp
    configuration.
 
-2. We should have a timeout parameter:
-
-	ipconfig -t 30
-
-   so we can optionally bound the time we allow for the configuration
-   to complete.
-
-3. We should let the user specify the configuration protocol
+2. We should let the user specify the configuration protocol
    (maybe per-interface?)  The code internally supports per-interface.
 
-4. Static IP configuration.
+3. Static IP configuration.
 
-5. Command line arguments.  Maybe we should accept an ip= string on the
+4. Command line arguments.  Maybe we should accept an ip= string on the
    command line to remain compatible with the kernel?
 
-6. The code in main.c is yucky imho.  Needs cleaning.
+5. The code in main.c is yucky imho.  Needs cleaning.
 
 --
 Russell King (22/10/2002)
diff -Nru a/ipconfig/main.c b/ipconfig/main.c
--- a/ipconfig/main.c	Tue Apr 29 13:03:14 2003
+++ b/ipconfig/main.c	Tue Apr 29 13:03:14 2003
@@ -18,6 +18,7 @@
 
 static const char *progname;
 static char do_not_config;
+static int loop_timeout = -1;
 
 struct state {
 	int		state;
@@ -270,6 +271,7 @@
 	int pkt_fd;
 	int nr = 0;
 	struct timeval now, prev;
+	time_t start;
 
 	pkt_fd = packet_open();
 	if (pkt_fd == -1) {
@@ -281,6 +283,7 @@
 	fds[0].events = POLLRDNORM;
 
 	gettimeofday(&now, NULL);
+	start = now.tv_sec;
 	while (1) {
 		int timeout = 60;
 		int pending = 0;
@@ -308,8 +311,8 @@
 		for (x = 0; x < 2; x++) {
 			int delta_ms;
 			
-			if (timeout_ms <= 0)
-				timeout_ms = 1;
+			if (timeout_ms <= 0 || loop_timeout == 0)
+				timeout_ms = 100;
 
 			nr = poll(fds, NR_FDS, timeout_ms);
 			prev = now;
@@ -319,6 +322,14 @@
 			    do_pkt_recv(pkt_fd, now.tv_sec) == 1) {
 				break;
 			}
+
+			if (loop_timeout >= 0 &&
+			    now.tv_sec - start >= loop_timeout) {
+				printf("IP-Config: no response after %d "
+				       "secs - giving up\n", loop_timeout);
+				goto bail;
+			}
+			
 			packet_discard();
 
 			delta_ms = (now.tv_sec - prev.tv_sec) * 1000;
@@ -329,7 +340,7 @@
 			timeout_ms -= delta_ms;
 		}
 	}
-
+ bail:
 	packet_close();
 
 	return 0;
@@ -404,7 +415,7 @@
 	progname = argv[0];
 	
 	do {
-		c = getopt(argc, argv, "d:np:t");
+		c = getopt(argc, argv, "d:np:t:");
 		if (c == EOF)
 			break;
 
@@ -413,7 +424,7 @@
 			port = atoi(optarg);
 			if (port <= 0 || port > USHRT_MAX) {
 				fprintf(stderr,
-					"%s: port number %d out of range\n",
+					"%s: invalid port number %d\n",
 					progname, port);
 				exit(1);
 			}
@@ -423,6 +434,13 @@
 			       "dest to %d\n", local_port, remote_port);
 			break;
 		case 't':
+			loop_timeout = atoi(optarg);
+			if (loop_timeout < 0) {
+				fprintf(stderr,
+					"%s: invalid timeout %d\n",
+					progname, loop_timeout);
+				exit(1);
+			}
 			break;
 		case 'n':
 			do_not_config = 1;





More information about the klibc mailing list