aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/dhcpd.c')
-rw-r--r--networking/udhcp/dhcpd.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 093239536..db3ab4f00 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -915,20 +915,18 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
915 915
916 udhcp_sp_fd_set(pfds, server_socket); 916 udhcp_sp_fd_set(pfds, server_socket);
917 tv = timeout_end - monotonic_sec(); 917 tv = timeout_end - monotonic_sec();
918 retval = 0; 918 /* Block here waiting for either signal or packet */
919 if (!server_config.auto_time || tv > 0) { 919 retval = safe_poll(pfds, 2, server_config.auto_time ? tv * 1000 : -1);
920 retval = poll(pfds, 2, server_config.auto_time ? tv * 1000 : -1); 920 if (retval <= 0) {
921 } 921 if (retval == 0) {
922 if (retval == 0) { 922 write_leases();
923 write_leases(); 923 goto continue_with_autotime;
924 goto continue_with_autotime; 924 }
925 } 925 /* < 0 and not EINTR: should not happen */
926 if (retval < 0 && errno != EINTR) { 926 bb_perror_msg_and_die("poll");
927 log1("error on select");
928 continue;
929 } 927 }
930 928
931 switch (udhcp_sp_read(pfds)) { 929 if (pfds[0].revents) switch (udhcp_sp_read()) {
932 case SIGUSR1: 930 case SIGUSR1:
933 bb_error_msg("received %s", "SIGUSR1"); 931 bb_error_msg("received %s", "SIGUSR1");
934 write_leases(); 932 write_leases();
@@ -938,12 +936,16 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
938 bb_error_msg("received %s", "SIGTERM"); 936 bb_error_msg("received %s", "SIGTERM");
939 write_leases(); 937 write_leases();
940 goto ret0; 938 goto ret0;
941 case 0: /* no signal: read a packet */
942 break;
943 default: /* signal or error (probably EINTR): back to select */
944 continue;
945 } 939 }
946 940
941 /* Is it a packet? */
942 if (!pfds[1].revents)
943 continue; /* no */
944
945 /* Note: we do not block here, we block on poll() instead.
946 * Blocking here would prevent SIGTERM from working:
947 * socket read inside this call is restarted on caught signals.
948 */
947 bytes = udhcp_recv_kernel_packet(&packet, server_socket); 949 bytes = udhcp_recv_kernel_packet(&packet, server_socket);
948 if (bytes < 0) { 950 if (bytes < 0) {
949 /* bytes can also be -2 ("bad packet data") */ 951 /* bytes can also be -2 ("bad packet data") */