aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-07-22 20:57:28 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-07-22 20:57:28 +0000
commitf54e62a3f2a7e435605731dbb53f1bceafd31014 (patch)
tree8a53aa96203373e17ef7293ca1793536cc20e3d5
parent41660c5b2d78dbe58a6861699a348158c0aef3c3 (diff)
downloadbusybox-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
-rw-r--r--networking/inetd.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/networking/inetd.c b/networking/inetd.c
index 19434aca4..9ebec19a5 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)