diff options
author | Denis Vlasenko | 2008-07-22 20:57:28 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-07-22 20:57:28 +0000 |
commit | f54e62a3f2a7e435605731dbb53f1bceafd31014 (patch) | |
tree | 8a53aa96203373e17ef7293ca1793536cc20e3d5 /networking | |
parent | 41660c5b2d78dbe58a6861699a348158c0aef3c3 (diff) | |
download | busybox-f54e62a3f2a7e435605731dbb53f1bceafd31014.zip busybox-f54e62a3f2a7e435605731dbb53f1bceafd31014.tar.gz |
inetd: do not trash errno in signal handlers;
in CHLD handler, stop looping through services when pid is found
function old new delta
reread_config_file 1072 1092 +20
retry_network_setup 55 69 +14
reap_child 132 130 -2
Diffstat (limited to 'networking')
-rw-r--r-- | networking/inetd.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/networking/inetd.c b/networking/inetd.c index 19434ac..9ebec19 100644 --- a/networking/inetd.c +++ b/networking/inetd.c @@ -894,9 +894,10 @@ static void reread_config_file(int sig UNUSED_PARAM) sigset_t omask; unsigned n; uint16_t port; + int save_errno = errno; if (!reopen_config_file()) - return; + goto ret; for (sep = serv_list; sep; sep = sep->se_next) sep->se_checked = 0; @@ -1055,6 +1056,8 @@ static void reread_config_file(int sig UNUSED_PARAM) free(sep); } restore_sigmask(&omask); + ret: + errno = save_errno; } static void reap_child(int sig UNUSED_PARAM) @@ -1068,24 +1071,27 @@ static void reap_child(int sig UNUSED_PARAM) pid = wait_any_nohang(&status); if (pid <= 0) break; - for (sep = serv_list; sep; sep = sep->se_next) - if (sep->se_wait == pid) { - /* One of our "wait" services */ - if (WIFEXITED(status) && WEXITSTATUS(status)) - bb_error_msg("%s: exit status 0x%x", - sep->se_program, WEXITSTATUS(status)); - else if (WIFSIGNALED(status)) - bb_error_msg("%s: exit signal 0x%x", - sep->se_program, WTERMSIG(status)); - sep->se_wait = 1; - add_fd_to_set(sep->se_fd); - } + for (sep = serv_list; sep; sep = sep->se_next) { + if (sep->se_wait != pid) + continue; + /* One of our "wait" services */ + if (WIFEXITED(status) && WEXITSTATUS(status)) + bb_error_msg("%s: exit status 0x%x", + sep->se_program, WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + bb_error_msg("%s: exit signal 0x%x", + sep->se_program, WTERMSIG(status)); + sep->se_wait = 1; + add_fd_to_set(sep->se_fd); + break; + } } errno = save_errno; } static void retry_network_setup(int sig UNUSED_PARAM) { + int save_errno = errno; servtab_t *sep; alarm_armed = 0; @@ -1098,6 +1104,7 @@ static void retry_network_setup(int sig UNUSED_PARAM) #endif } } + errno = save_errno; } static void clean_up_and_exit(int sig UNUSED_PARAM) |