udhcpc: code shrink

function                                             old     new   delta
udhcpc_main                                         2646    2649      +3
udhcp_run_script                                     816     802     -14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index ea798a3..f202ecf 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -499,9 +499,6 @@
 	char **envp, **curr;
 	char *argv[3];
 
-	if (client_config.script == NULL)
-		return;
-
 	envp = fill_envp(packet);
 
 	/* call script */
@@ -1009,7 +1006,7 @@
 	}
 }
 
-static void perform_release(uint32_t requested_ip, uint32_t server_addr)
+static void perform_release(uint32_t server_addr, uint32_t requested_ip)
 {
 	char buffer[sizeof("255.255.255.255")];
 	struct in_addr temp_addr;
@@ -1154,15 +1151,12 @@
 	uint32_t server_addr = server_addr; /* for compiler */
 	uint32_t requested_ip = 0;
 	uint32_t xid = 0;
-	uint32_t lease_seconds = 0; /* can be given as 32-bit quantity */
 	int packet_num;
 	int timeout; /* must be signed */
 	unsigned already_waited_sec;
 	unsigned opt;
 	int max_fd;
 	int retval;
-	struct timeval tv;
-	struct dhcp_packet packet;
 	fd_set rfds;
 
 	/* Default options */
@@ -1302,6 +1296,8 @@
 	 * "continue" statements in code below jump to the top of the loop.
 	 */
 	for (;;) {
+		struct timeval tv;
+		struct dhcp_packet packet;
 		/* silence "uninitialized!" warning */
 		unsigned timestamp_before_wait = timestamp_before_wait;
 
@@ -1349,7 +1345,7 @@
 					NULL,
 					client_config.client_mac)
 			) {
-				return 1; /* iface is gone? */
+				goto ret0; /* iface is gone? */
 			}
 			if (clientid_mac_ptr)
 				memcpy(clientid_mac_ptr, client_config.client_mac, 6);
@@ -1486,13 +1482,11 @@
 			timeout = 0;
 			continue;
 		case SIGUSR2:
-			perform_release(requested_ip, server_addr);
+			perform_release(server_addr, requested_ip);
 			timeout = INT_MAX;
 			continue;
 		case SIGTERM:
 			bb_info_msg("Received SIGTERM");
-			if (opt & OPT_R) /* release on quit */
-				perform_release(requested_ip, server_addr);
 			goto ret0;
 		}
 
@@ -1589,6 +1583,9 @@
 		case RENEW_REQUESTED:
 		case REBINDING:
 			if (*message == DHCPACK) {
+				uint32_t lease_seconds;
+				struct in_addr temp_addr;
+
 				temp = udhcp_get_option(&packet, DHCP_LEASE_TIME);
 				if (!temp) {
 					bb_error_msg("no lease time with ACK, using 1 hour lease");
@@ -1597,9 +1594,11 @@
 					/* it IS unaligned sometimes, don't "optimize" */
 					move_from_unaligned32(lease_seconds, temp);
 					lease_seconds = ntohl(lease_seconds);
-					lease_seconds &= 0x0fffffff; /* paranoia: must not be prone to overflows */
-					if (lease_seconds < 10) /* and not too small */
-						lease_seconds = 10;
+					/* paranoia: must not be too small and not prone to overflows */
+					if (lease_seconds < 0x10)
+						lease_seconds = 0x10;
+					if (lease_seconds >= 0x10000000)
+						lease_seconds = 0x0fffffff;
 				}
 #if ENABLE_FEATURE_UDHCPC_ARPING
 				if (opt & OPT_a) {
@@ -1637,20 +1636,15 @@
 #endif
 				/* enter bound state */
 				timeout = lease_seconds / 2;
-				{
-					struct in_addr temp_addr;
-					temp_addr.s_addr = packet.yiaddr;
-					bb_info_msg("Lease of %s obtained, lease time %u",
-						inet_ntoa(temp_addr), (unsigned)lease_seconds);
-				}
+			        temp_addr.s_addr = packet.yiaddr;
+				bb_info_msg("Lease of %s obtained, lease time %u",
+					inet_ntoa(temp_addr), (unsigned)lease_seconds);
 				requested_ip = packet.yiaddr;
 				udhcp_run_script(&packet, state == REQUESTING ? "bound" : "renew");
 
 				state = BOUND;
 				change_listen_mode(LISTEN_NONE);
 				if (opt & OPT_q) { /* quit after lease */
-					if (opt & OPT_R) /* release on quit */
-						perform_release(requested_ip, server_addr);
 					goto ret0;
 				}
 				/* future renew failures should not exit (JM) */
@@ -1688,6 +1682,8 @@
 	} /* for (;;) - main loop ends */
 
  ret0:
+	if (opt & OPT_R) /* release on quit */
+		perform_release(server_addr, requested_ip);
 	retval = 0;
  ret:
 	/*if (client_config.pidfile) - remove_pidfile has its own check */