diff options
-rwxr-xr-x | examples/var_service/dhcpd_if/run | 4 | ||||
-rw-r--r-- | examples/var_service/dhcpd_if/udhcpd.conf (renamed from examples/var_service/dhcpd_if/udhcpc.conf) | 0 | ||||
-rw-r--r-- | networking/udhcp/common.h | 2 | ||||
-rw-r--r-- | networking/udhcp/d6_dhcpc.c | 9 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 9 | ||||
-rw-r--r-- | networking/udhcp/dhcpd.c | 34 | ||||
-rw-r--r-- | networking/udhcp/signalpipe.c | 11 |
7 files changed, 35 insertions, 34 deletions
diff --git a/examples/var_service/dhcpd_if/run b/examples/var_service/dhcpd_if/run index de85dece0..a603bdc71 100755 --- a/examples/var_service/dhcpd_if/run +++ b/examples/var_service/dhcpd_if/run | |||
@@ -11,13 +11,13 @@ echo "* Upping iface $if" | |||
11 | ip link set dev $if up | 11 | ip link set dev $if up |
12 | 12 | ||
13 | >>udhcpd.leases | 13 | >>udhcpd.leases |
14 | sed 's/^interface.*$/interface '"$if/" -i udhcpc.conf | 14 | sed 's/^interface.*$/interface '"$if/" -i udhcpd.conf |
15 | 15 | ||
16 | echo "* Starting udhcpd" | 16 | echo "* Starting udhcpd" |
17 | exec \ | 17 | exec \ |
18 | env - PATH="$PATH" \ | 18 | env - PATH="$PATH" \ |
19 | softlimit \ | 19 | softlimit \ |
20 | setuidgid root \ | 20 | setuidgid root \ |
21 | udhcpd -f -vv udhcpc.conf | 21 | udhcpd -f -vv udhcpd.conf |
22 | 22 | ||
23 | exit $? | 23 | exit $? |
diff --git a/examples/var_service/dhcpd_if/udhcpc.conf b/examples/var_service/dhcpd_if/udhcpd.conf index a81925970..a81925970 100644 --- a/examples/var_service/dhcpd_if/udhcpc.conf +++ b/examples/var_service/dhcpd_if/udhcpd.conf | |||
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index 04939e707..13059f106 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h | |||
@@ -314,7 +314,7 @@ int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, | |||
314 | 314 | ||
315 | void udhcp_sp_setup(void) FAST_FUNC; | 315 | void udhcp_sp_setup(void) FAST_FUNC; |
316 | void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC; | 316 | void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC; |
317 | int udhcp_sp_read(struct pollfd *pfds) FAST_FUNC; | 317 | int udhcp_sp_read(void) FAST_FUNC; |
318 | 318 | ||
319 | int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC; | 319 | int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC; |
320 | 320 | ||
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index 35c99e89c..289df66ee 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c | |||
@@ -1375,13 +1375,12 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
1375 | /* yah, I know, *you* say it would never happen */ | 1375 | /* yah, I know, *you* say it would never happen */ |
1376 | timeout = INT_MAX; | 1376 | timeout = INT_MAX; |
1377 | continue; /* back to main loop */ | 1377 | continue; /* back to main loop */ |
1378 | } /* if select timed out */ | 1378 | } /* if poll timed out */ |
1379 | 1379 | ||
1380 | /* select() didn't timeout, something happened */ | 1380 | /* poll() didn't timeout, something happened */ |
1381 | 1381 | ||
1382 | /* Is it a signal? */ | 1382 | /* Is it a signal? */ |
1383 | /* note: udhcp_sp_read checks poll result before reading */ | 1383 | switch (udhcp_sp_read()) { |
1384 | switch (udhcp_sp_read(pfds)) { | ||
1385 | case SIGUSR1: | 1384 | case SIGUSR1: |
1386 | client_config.first_secs = 0; /* make secs field count from 0 */ | 1385 | client_config.first_secs = 0; /* make secs field count from 0 */ |
1387 | already_waited_sec = 0; | 1386 | already_waited_sec = 0; |
@@ -1416,7 +1415,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
1416 | } | 1415 | } |
1417 | 1416 | ||
1418 | /* Is it a packet? */ | 1417 | /* Is it a packet? */ |
1419 | if (listen_mode == LISTEN_NONE || !pfds[1].revents) | 1418 | if (!pfds[1].revents) |
1420 | continue; /* no */ | 1419 | continue; /* no */ |
1421 | 1420 | ||
1422 | { | 1421 | { |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 35694fbe3..90b07bf4b 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -1574,13 +1574,12 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
1574 | /* yah, I know, *you* say it would never happen */ | 1574 | /* yah, I know, *you* say it would never happen */ |
1575 | timeout = INT_MAX; | 1575 | timeout = INT_MAX; |
1576 | continue; /* back to main loop */ | 1576 | continue; /* back to main loop */ |
1577 | } /* if select timed out */ | 1577 | } /* if poll timed out */ |
1578 | 1578 | ||
1579 | /* select() didn't timeout, something happened */ | 1579 | /* poll() didn't timeout, something happened */ |
1580 | 1580 | ||
1581 | /* Is it a signal? */ | 1581 | /* Is it a signal? */ |
1582 | /* note: udhcp_sp_read checks poll result before reading */ | 1582 | switch (udhcp_sp_read()) { |
1583 | switch (udhcp_sp_read(pfds)) { | ||
1584 | case SIGUSR1: | 1583 | case SIGUSR1: |
1585 | client_config.first_secs = 0; /* make secs field count from 0 */ | 1584 | client_config.first_secs = 0; /* make secs field count from 0 */ |
1586 | already_waited_sec = 0; | 1585 | already_waited_sec = 0; |
@@ -1615,7 +1614,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv) | |||
1615 | } | 1614 | } |
1616 | 1615 | ||
1617 | /* Is it a packet? */ | 1616 | /* Is it a packet? */ |
1618 | if (listen_mode == LISTEN_NONE || !pfds[1].revents) | 1617 | if (!pfds[1].revents) |
1619 | continue; /* no */ | 1618 | continue; /* no */ |
1620 | 1619 | ||
1621 | { | 1620 | { |
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") */ |
diff --git a/networking/udhcp/signalpipe.c b/networking/udhcp/signalpipe.c index b101b4ce4..2ff78f0f2 100644 --- a/networking/udhcp/signalpipe.c +++ b/networking/udhcp/signalpipe.c | |||
@@ -40,6 +40,7 @@ void FAST_FUNC udhcp_sp_setup(void) | |||
40 | xpiped_pair(signal_pipe); | 40 | xpiped_pair(signal_pipe); |
41 | close_on_exec_on(signal_pipe.rd); | 41 | close_on_exec_on(signal_pipe.rd); |
42 | close_on_exec_on(signal_pipe.wr); | 42 | close_on_exec_on(signal_pipe.wr); |
43 | ndelay_on(signal_pipe.rd); | ||
43 | ndelay_on(signal_pipe.wr); | 44 | ndelay_on(signal_pipe.wr); |
44 | bb_signals(0 | 45 | bb_signals(0 |
45 | + (1 << SIGUSR1) | 46 | + (1 << SIGUSR1) |
@@ -61,20 +62,20 @@ void FAST_FUNC udhcp_sp_fd_set(struct pollfd pfds[2], int extra_fd) | |||
61 | pfds[1].fd = extra_fd; | 62 | pfds[1].fd = extra_fd; |
62 | pfds[1].events = POLLIN; | 63 | pfds[1].events = POLLIN; |
63 | } | 64 | } |
65 | /* this simplifies "is extra_fd ready?" tests elsewhere: */ | ||
66 | pfds[1].revents = 0; | ||
64 | } | 67 | } |
65 | 68 | ||
66 | /* Read a signal from the signal pipe. Returns 0 if there is | 69 | /* Read a signal from the signal pipe. Returns 0 if there is |
67 | * no signal, -1 on error (and sets errno appropriately), and | 70 | * no signal, -1 on error (and sets errno appropriately), and |
68 | * your signal on success */ | 71 | * your signal on success */ |
69 | int FAST_FUNC udhcp_sp_read(struct pollfd pfds[2]) | 72 | int FAST_FUNC udhcp_sp_read(void) |
70 | { | 73 | { |
71 | unsigned char sig; | 74 | unsigned char sig; |
72 | 75 | ||
73 | if (!pfds[0].revents) | 76 | /* Can't block here, fd is in nonblocking mode */ |
74 | return 0; | ||
75 | |||
76 | if (safe_read(signal_pipe.rd, &sig, 1) != 1) | 77 | if (safe_read(signal_pipe.rd, &sig, 1) != 1) |
77 | return -1; | 78 | return 0; |
78 | 79 | ||
79 | return sig; | 80 | return sig; |
80 | } | 81 | } |