udhcp: many small fixes:
* arpping(): smaller and even probably fixed
* lots of variables/params converted: ulong -> uint32_t
* uptime() nuked in favor of monotonic_sec()
* udhcp_get_packet(): only one "bad vendor", simplify
function old new delta
reservedIp 36 35 -1
udhcpc_main 2462 2460 -2
addStaticLease 64 62 -2
static.broken_vendors 16 - -16
uptime 19 - -19
udhcpd_main 1273 1238 -35
udhcp_get_packet 223 184 -39
.rodata 144162 144106 -56
arpping 690 609 -81
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 0/7 up/down: 0/-251) Total: -251 bytes
text data bss dec hex filename
734241 3028 14400 751669 b7835 busybox_old
734005 3028 14400 751433 b7749 busybox_unstripped
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 50ac31e..6909e84 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -22,8 +22,8 @@
* in the code. Manpage says that struct in_addr has a member of type long (!)
* which holds IPv4 address, and the struct is passed by value (!!)
*/
-static unsigned long timeout;
-static unsigned long requested_ip; /* = 0 */
+static unsigned timeout;
+static uint32_t requested_ip; /* = 0 */
static uint32_t server_addr;
static int packet_num; /* = 0 */
static int sockfd = -1;
@@ -84,13 +84,13 @@
/* perform a release */
static void perform_release(void)
{
- char buffer[16];
+ char buffer[sizeof("255.255.255.255")];
struct in_addr temp_addr;
/* send release packet */
if (state == BOUND || state == RENEWING || state == REBINDING) {
temp_addr.s_addr = server_addr;
- sprintf(buffer, "%s", inet_ntoa(temp_addr));
+ strcpy(buffer, inet_ntoa(temp_addr));
temp_addr.s_addr = requested_ip;
bb_info_msg("Unicasting a release of %s to %s",
inet_ntoa(temp_addr), buffer);
@@ -101,7 +101,7 @@
change_mode(LISTEN_NONE);
state = RELEASED;
- timeout = 0x7fffffff;
+ timeout = INT_MAX;
}
@@ -115,12 +115,13 @@
* will work on NOMMU too */
#else
bb_daemonize(0);
+ logmode &= ~LOGMODE_STDIO;
/* rewrite pidfile, as our pid is different now */
if (client_config.pidfile)
write_pidfile(client_config.pidfile);
- logmode &= ~LOGMODE_STDIO;
#endif
- client_config.foreground = 1; /* Do not fork again. */
+ /* Do not fork again. */
+ client_config.foreground = 1;
client_config.background_if_no_lease = 0;
}
@@ -143,9 +144,11 @@
{
uint8_t *temp, *message;
char *str_c, *str_V, *str_h, *str_F, *str_r, *str_T, *str_t;
- unsigned long t1 = 0, t2 = 0, xid = 0;
- unsigned long start = 0, lease = 0;
- long now;
+ uint32_t xid = 0;
+ uint32_t lease = 0; /* can be given as 32-bit quantity */
+ unsigned t1 = 0, t2 = 0;
+ unsigned start = 0;
+ unsigned now;
unsigned opt;
int max_fd;
int sig;
@@ -292,7 +295,7 @@
change_mode(LISTEN_RAW);
for (;;) {
- tv.tv_sec = timeout - uptime();
+ tv.tv_sec = timeout - monotonic_sec();
tv.tv_usec = 0;
if (listen_mode != LISTEN_NONE && sockfd < 0) {
@@ -308,7 +311,7 @@
retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
} else retval = 0; /* If we already timed out, fall through */
- now = uptime();
+ now = monotonic_sec();
if (retval == 0) {
/* timeout dropped to zero */
switch (state) {
@@ -398,7 +401,7 @@
break;
case RELEASED:
/* yah, I know, *you* say it would never happen */
- timeout = 0x7fffffff;
+ timeout = INT_MAX;
break;
}
} else if (retval > 0 && listen_mode != LISTEN_NONE && FD_ISSET(sockfd, &rfds)) {
@@ -415,8 +418,8 @@
if (len < 0) continue;
if (packet.xid != xid) {
- DEBUG("Ignoring XID %lx (our xid is %lx)",
- (unsigned long) packet.xid, xid);
+ DEBUG("Ignoring XID %x (our xid is %x)",
+ (unsigned)packet.xid, (unsigned)xid);
continue;
}
@@ -471,10 +474,10 @@
t1 = lease / 2;
/* little fixed point for n * .875 */
- t2 = (lease * 0x7) >> 3;
+ t2 = (lease * 7) >> 3;
temp_addr.s_addr = packet.yiaddr;
- bb_info_msg("Lease of %s obtained, lease time %ld",
- inet_ntoa(temp_addr), lease);
+ bb_info_msg("Lease of %s obtained, lease time %u",
+ inet_ntoa(temp_addr), (unsigned)lease);
start = now;
timeout = t1 + start;
requested_ip = packet.yiaddr;