udhcp: MAC_BCAST_ADDR and blank_chaddr are in fact constant, move to rodata.
a few global variables reduced to smallints
function old new delta
add_lease 75 227 +152
static.blank_chaddr - 16 +16
MAC_BCAST_ADDR - 6 +6
sockfd 4 8 +4
udhcp_run_script 1153 1155 +2
state 8 5 -3
listen_mode 4 1 -3
perform_release 152 148 -4
fd 8 4 -4
blank_chaddr 16 - -16
udhcpc_main 2518 2497 -21
.rodata 131864 131832 -32
oldest_expired_lease 61 - -61
clear_lease 127 - -127
------------------------------------------------------------------------------
(add/remove: 2/3 grow/shrink: 3/6 up/down: 180/-271) Total: -91 bytes
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index e8cdd79..362e701 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -17,22 +17,23 @@
#include "options.h"
-static int state;
/* Something is definitely wrong here. IPv4 addresses
* in variables of type long?? BTW, we use inet_ntoa()
* 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 uint32_t server_addr;
-static unsigned long timeout;
static int packet_num; /* = 0 */
-static int fd = -1;
+static int sockfd = -1;
#define LISTEN_NONE 0
#define LISTEN_KERNEL 1
#define LISTEN_RAW 2
-static int listen_mode;
+static smallint listen_mode;
+
+static smallint state;
struct client_config_t client_config;
@@ -42,8 +43,10 @@
{
DEBUG("entering %s listen mode",
new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
- if (fd >= 0) close(fd);
- fd = -1;
+ if (sockfd >= 0) {
+ close(sockfd);
+ sockfd = -1;
+ }
listen_mode = new_mode;
}
@@ -111,6 +114,7 @@
* If that will be properly disabled for NOMMU, client_background()
* will work on NOMMU too */
#else
+// chdir(/) is problematic. Imagine that e.g. pidfile name is RELATIVE! what will unlink do then, eh?
bb_daemonize(DAEMON_CHDIR_ROOT);
logmode &= ~LOGMODE_STDIO;
#endif
@@ -289,13 +293,13 @@
tv.tv_sec = timeout - uptime();
tv.tv_usec = 0;
- if (listen_mode != LISTEN_NONE && fd < 0) {
+ if (listen_mode != LISTEN_NONE && sockfd < 0) {
if (listen_mode == LISTEN_KERNEL)
- fd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface);
+ sockfd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface);
else
- fd = raw_socket(client_config.ifindex);
+ sockfd = raw_socket(client_config.ifindex);
}
- max_fd = udhcp_sp_fd_set(&rfds, fd);
+ max_fd = udhcp_sp_fd_set(&rfds, sockfd);
if (tv.tv_sec > 0) {
DEBUG("Waiting on select...");
@@ -342,7 +346,8 @@
packet_num++;
} else {
/* timed out, go back to init state */
- if (state == RENEW_REQUESTED) udhcp_run_script(NULL, "deconfig");
+ if (state == RENEW_REQUESTED)
+ udhcp_run_script(NULL, "deconfig");
state = INIT_SELECTING;
timeout = now;
packet_num = 0;
@@ -393,12 +398,12 @@
timeout = 0x7fffffff;
break;
}
- } else if (retval > 0 && listen_mode != LISTEN_NONE && FD_ISSET(fd, &rfds)) {
+ } else if (retval > 0 && listen_mode != LISTEN_NONE && FD_ISSET(sockfd, &rfds)) {
/* a packet is ready, read it */
if (listen_mode == LISTEN_KERNEL)
- len = udhcp_get_packet(&packet, fd);
- else len = get_raw_packet(&packet, fd);
+ len = udhcp_get_packet(&packet, sockfd);
+ else len = get_raw_packet(&packet, sockfd);
if (len == -1 && errno != EINTR) {
DEBUG("error on read, %s, reopening socket", strerror(errno));
@@ -418,7 +423,8 @@
continue;
}
- if ((message = get_option(&packet, DHCP_MESSAGE_TYPE)) == NULL) {
+ message = get_option(&packet, DHCP_MESSAGE_TYPE);
+ if (message == NULL) {
bb_error_msg("cannot get option from packet - ignoring");
continue;
}