changeset 1582:491ccb10ff72 draft

Fix -r, --request address option
author Roy Marples <roy@marples.name>
date Thu, 23 Dec 2010 22:18:56 +0000
parents f625328e6859
children 6ba877c9df39
files dhcp.c dhcpcd.c if-options.c
diffstat 3 files changed, 13 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/dhcp.c	Mon Dec 06 15:01:56 2010 +0000
+++ b/dhcp.c	Thu Dec 23 22:18:56 2010 +0000
@@ -892,7 +892,6 @@
 
 	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 @@
 		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)
--- a/dhcpcd.c	Mon Dec 06 15:01:56 2010 +0000
+++ b/dhcpcd.c	Thu Dec 23 22:18:56 2010 +0000
@@ -1107,9 +1107,6 @@
 		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 @@
 		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 @@
 	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)) {
--- a/if-options.c	Mon Dec 06 15:01:56 2010 +0000
+++ b/if-options.c	Thu Dec 23 22:18:56 2010 +0000
@@ -420,14 +420,12 @@
 		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 @@
 			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);