]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix -r, --request address option
authorRoy Marples <roy@marples.name>
Thu, 23 Dec 2010 22:18:56 +0000 (22:18 +0000)
committerRoy Marples <roy@marples.name>
Thu, 23 Dec 2010 22:18:56 +0000 (22:18 +0000)
dhcp.c
dhcpcd.c
if-options.c

diff --git a/dhcp.c b/dhcp.c
index 8a61a0f857ac715455cd2984f3c31d2f52dab759..d0a9e129911657c991f5c31ed59f19e311fcf519 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
@@ -892,7 +892,6 @@ make_message(struct dhcp_message **message,
 
        if (lease->addr.s_addr && lease->cookie == htonl(MAGIC_COOKIE)) {
                if (type == DHCP_DECLINE ||
-                   type == DHCP_DISCOVER ||
                    (type == DHCP_REQUEST &&
                        lease->addr.s_addr != iface->addr.s_addr))
                {
@@ -915,6 +914,9 @@ make_message(struct dhcp_message **message,
                p += len;
        }
 
+       if (type == DHCP_DISCOVER && ifo->options & DHCPCD_REQUEST)
+               PUTADDR(DHO_IPADDRESS, ifo->req_addr);
+
        if (type == DHCP_DISCOVER ||
            type == DHCP_INFORM ||
            type == DHCP_REQUEST)
index 80bdd942d4f4c18b7b1c9e800396204d674185ab..704cbb5e52afbb8e24107f5de57293c011ad0ac3 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -1107,9 +1107,6 @@ start_interface(void *arg)
                return;
        }
 
-       /* We don't want to read the old lease if we NAK an old test */
-       nolease = iface->state->offer && options & DHCPCD_TEST;
-
        iface->start_uptime = uptime();
        free(iface->state->offer);
        iface->state->offer = NULL;
@@ -1134,21 +1131,9 @@ start_interface(void *arg)
                delete_timeout(NULL, iface);
                return;
        }
-       if (ifo->req_addr.s_addr) {
-               iface->state->offer =
-                   dhcp_message_new(&ifo->req_addr, &ifo->req_mask);
-               if (ifo->options & DHCPCD_REQUEST)
-                       ifo->req_addr.s_addr = 0;
-               else {
-                       iface->state->reason = "STATIC";
-                       iface->state->new = iface->state->offer;
-                       iface->state->offer = NULL;
-                       get_lease(&iface->state->lease, iface->state->new);
-                       configure(iface);
-                       start_inform(iface);
-                       return;
-               }
-       } else if (!nolease)
+       /* We don't want to read the old lease if we NAK an old test */
+       nolease = iface->state->offer && options & DHCPCD_TEST;
+       if (!nolease)
                iface->state->offer = read_lease(iface);
        if (iface->state->offer) {
                get_lease(&iface->state->lease, iface->state->offer);
@@ -1207,6 +1192,10 @@ init_state(struct interface *iface, int argc, char **argv)
        configure_interface(iface, argc, argv);
        if (!(options & DHCPCD_TEST))
                run_script(iface);
+       /* We need to drop the leasefile so that start_interface
+        * doesn't load it. */  
+       if (ifs->options->options & DHCPCD_REQUEST)
+               unlink(iface->leasefile);
 
        if (ifs->options->options & DHCPCD_LINK) {
                switch (carrier_status(iface)) {
index 3367b4154343ab4924bd60aced11c470dc61701f..88b43d7b5085756ad19bc0865ea641610aecce81 100644 (file)
@@ -420,14 +420,12 @@ parse_option(struct if_options *ifo, int opt, const char *arg)
                ifo->options |= DHCPCD_QUIET;
                break;
        case 'r':
-               ifo->options |= DHCPCD_REQUEST;
                if (parse_addr(&ifo->req_addr, NULL, arg) != 0)
                        return -1;
+               ifo->options |= DHCPCD_REQUEST;
                ifo->req_mask.s_addr = 0;
                break;
        case 's':
-               ifo->options |= DHCPCD_INFORM | DHCPCD_PERSISTENT;
-               ifo->options &= ~(DHCPCD_ARP | DHCPCD_STATIC);
                if (arg && *arg != '\0') {
                        if (parse_addr(&ifo->req_addr, &ifo->req_mask,
                                arg) != 0)
@@ -436,6 +434,8 @@ parse_option(struct if_options *ifo, int opt, const char *arg)
                        ifo->req_addr.s_addr = 0;
                        ifo->req_mask.s_addr = 0;
                }
+               ifo->options |= DHCPCD_INFORM | DHCPCD_PERSISTENT;
+               ifo->options &= ~(DHCPCD_ARP | DHCPCD_STATIC);
                break;
        case 't':
                ifo->timeout = atoint(arg);