Roy Walker writes:
authorEric Andersen <andersen@codepoet.org>
Mon, 20 Mar 2006 17:37:00 +0000 (17:37 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 20 Mar 2006 17:37:00 +0000 (17:37 -0000)
Here is a patch against the current subversion repository, that makes
udhcpc have an adjustable timeout.  Works for both foreground and before
it drops to the background.  This brings it more in-line with ISC dhcpc.

Use like so:
udhcpc --timeout=10 ...
or
udhcpc -T 10 ...

Still shooting for 1.1.1 this month?  Would really be great if you could
get this in that release.

Please give credit to Paul Pacheco - ppacheco@gmail.com.

networking/udhcp/dhcpc.c
networking/udhcp/dhcpc.h

index 7e7f94a5ad63ec97f86b20ead30057e66374c300..0c85eca830c0e944bc2bed4ea33389bda985dbb5 100644 (file)
@@ -59,6 +59,7 @@ struct client_config_t client_config = {
        .fqdn = NULL,
        .ifindex = 0,
        .retries = 3,
+       .timeout = 3,
        .arp = "\0\0\0\0\0\0",          /* appease gcc-3.0 */
 };
 
@@ -84,6 +85,8 @@ static void ATTRIBUTE_NORETURN show_usage(void)
 "  -r, --request=IP                IP address to request (default: none)\n"
 "  -s, --script=file               Run file at dhcp events (default:\n"
 "                                  " DEFAULT_SCRIPT ")\n"
+"  -T, --timeout=seconds           Try to get the lease for the amount of\n"
+"                                  seconds (default: 3)\n"
 "  -v, --version                   Display version\n"
        );
        exit(0);
@@ -202,6 +205,7 @@ int main(int argc, char *argv[])
                {"quit",        no_argument,            0, 'q'},
                {"request",     required_argument,      0, 'r'},
                {"script",      required_argument,      0, 's'},
+               {"timeout",     required_argument,      0, 'T'},
                {"version",     no_argument,            0, 'v'},
                {"retries",     required_argument,      0, 't'},                
                {0, 0, 0, 0}
@@ -210,7 +214,7 @@ int main(int argc, char *argv[])
        /* get options */
        while (1) {
                int option_index = 0;
-               c = getopt_long(argc, argv, "c:CV:fbH:h:F:i:np:qr:s:t:v", arg_options, &option_index);
+               c = getopt_long(argc, argv, "c:CV:fbH:h:F:i:np:qr:s:T:t:v", arg_options, &option_index);
                if (c == -1) break;
 
                switch (c) {
@@ -286,6 +290,9 @@ int main(int argc, char *argv[])
                case 's':
                        client_config.script = optarg;
                        break;
+               case 'T':
+                       client_config.timeout = atoi(optarg);
+                       break;
                case 't':
                        client_config.retries = atoi(optarg);
                        break;
@@ -365,7 +372,7 @@ int main(int argc, char *argv[])
                                        /* send discover packet */
                                        send_discover(xid, requested_ip); /* broadcast */
 
-                                       timeout = now + ((packet_num == 2) ? 4 : 2);
+                                       timeout = now + client_config.timeout;
                                        packet_num++;
                                } else {
                                        run_script(NULL, "leasefail");
index 808e919244134fca652a88d993238659e3fe98a2..80c3fc2f8e71cd8e2d67df7fecd5bfff2fc1db4d 100644 (file)
@@ -30,6 +30,7 @@ struct client_config_t {
        uint8_t *fqdn;                  /* Optional fully qualified domain name to use */
        int ifindex;                    /* Index number of the interface to use */
        int retries;                    /* Max number of request packets */        
+       int timeout;                    /* Number of seconds to try to get a lease */
        uint8_t arp[6];                 /* Our arp address */
 };