diff options
Diffstat (limited to 'networking/udhcp/dhcpd.c')
-rw-r--r-- | networking/udhcp/dhcpd.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index 7b4596895..d0a1eba81 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c | |||
@@ -26,8 +26,7 @@ int udhcpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
26 | int udhcpd_main(int argc UNUSED_PARAM, char **argv) | 26 | int udhcpd_main(int argc UNUSED_PARAM, char **argv) |
27 | { | 27 | { |
28 | fd_set rfds; | 28 | fd_set rfds; |
29 | struct timeval tv; | 29 | int server_socket = -1, retval, max_sock; |
30 | int server_socket = -1, bytes, retval, max_sock; | ||
31 | struct dhcpMessage packet; | 30 | struct dhcpMessage packet; |
32 | uint8_t *state, *server_id, *requested; | 31 | uint8_t *state, *server_id, *requested; |
33 | uint32_t server_id_aligned = server_id_aligned; /* for compiler */ | 32 | uint32_t server_id_aligned = server_id_aligned; /* for compiler */ |
@@ -107,6 +106,8 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
107 | 106 | ||
108 | timeout_end = monotonic_sec() + server_config.auto_time; | 107 | timeout_end = monotonic_sec() + server_config.auto_time; |
109 | while (1) { /* loop until universe collapses */ | 108 | while (1) { /* loop until universe collapses */ |
109 | int bytes; | ||
110 | struct timeval tv; | ||
110 | 111 | ||
111 | if (server_socket < 0) { | 112 | if (server_socket < 0) { |
112 | server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT, | 113 | server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT, |
@@ -143,12 +144,15 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
143 | case SIGTERM: | 144 | case SIGTERM: |
144 | bb_info_msg("Received a SIGTERM"); | 145 | bb_info_msg("Received a SIGTERM"); |
145 | goto ret0; | 146 | goto ret0; |
146 | case 0: break; /* no signal */ | 147 | case 0: /* no signal: read a packet */ |
147 | default: continue; /* signal or error (probably EINTR) */ | 148 | break; |
149 | default: /* signal or error (probably EINTR): back to select */ | ||
150 | continue; | ||
148 | } | 151 | } |
149 | 152 | ||
150 | bytes = udhcp_recv_kernel_packet(&packet, server_socket); /* this waits for a packet - idle */ | 153 | bytes = udhcp_recv_kernel_packet(&packet, server_socket); |
151 | if (bytes < 0) { | 154 | if (bytes < 0) { |
155 | /* bytes can also be -2 ("bad packet data") */ | ||
152 | if (bytes == -1 && errno != EINTR) { | 156 | if (bytes == -1 && errno != EINTR) { |
153 | DEBUG("error on read, %s, reopening socket", strerror(errno)); | 157 | DEBUG("error on read, %s, reopening socket", strerror(errno)); |
154 | close(server_socket); | 158 | close(server_socket); |
@@ -165,7 +169,6 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
165 | 169 | ||
166 | /* Look for a static lease */ | 170 | /* Look for a static lease */ |
167 | static_lease_ip = getIpByMac(server_config.static_leases, &packet.chaddr); | 171 | static_lease_ip = getIpByMac(server_config.static_leases, &packet.chaddr); |
168 | |||
169 | if (static_lease_ip) { | 172 | if (static_lease_ip) { |
170 | bb_info_msg("Found static lease: %x", static_lease_ip); | 173 | bb_info_msg("Found static lease: %x", static_lease_ip); |
171 | 174 | ||