diff options
Diffstat (limited to 'networking/udhcp/dhcpd.c')
-rw-r--r-- | networking/udhcp/dhcpd.c | 34 |
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") */ |