提交 b997d19f 编写于 作者: D Dmitry Kozlov

pppd_compat: unblock signals before executing scripts (fixes scripts hangs)

上级 a7eaf069
...@@ -159,6 +159,10 @@ static void ev_ppp_pre_up(struct ppp_t *ppp) ...@@ -159,6 +159,10 @@ static void ev_ppp_pre_up(struct ppp_t *ppp)
return; return;
} }
} else if (pid == 0) { } else if (pid == 0) {
sigset_t set;
sigfillset(&set);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
execve(conf_ip_pre_up, argv, env); execve(conf_ip_pre_up, argv, env);
log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_pre_up, strerror(errno)); log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_pre_up, strerror(errno));
_exit(EXIT_FAILURE); _exit(EXIT_FAILURE);
...@@ -198,6 +202,10 @@ static void ev_ppp_started(struct ppp_t *ppp) ...@@ -198,6 +202,10 @@ static void ev_ppp_started(struct ppp_t *ppp)
log_ppp_info2("pppd_compat: ip-up started (pid %i)\n", pid); log_ppp_info2("pppd_compat: ip-up started (pid %i)\n", pid);
sigchld_unlock(); sigchld_unlock();
} else if (pid == 0) { } else if (pid == 0) {
sigset_t set;
sigfillset(&set);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
execve(conf_ip_up, argv, env); execve(conf_ip_up, argv, env);
log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_up, strerror(errno)); log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_up, strerror(errno));
_exit(EXIT_FAILURE); _exit(EXIT_FAILURE);
...@@ -266,23 +274,29 @@ static void ev_ppp_finished(struct ppp_t *ppp) ...@@ -266,23 +274,29 @@ static void ev_ppp_finished(struct ppp_t *ppp)
env[4] = NULL; env[4] = NULL;
fill_env(env, pd); fill_env(env, pd);
sigchld_lock(); if (conf_ip_down) {
pid = fork(); sigchld_lock();
if (pid > 0) { pid = fork();
pd->ip_down_hnd.pid = pid; if (pid > 0) {
sigchld_register_handler(&pd->ip_down_hnd); pd->ip_down_hnd.pid = pid;
if (conf_verbose) sigchld_register_handler(&pd->ip_down_hnd);
log_ppp_info2("pppd_compat: ip-down started (pid %i)\n", pid); if (conf_verbose)
sigchld_unlock(); log_ppp_info2("pppd_compat: ip-down started (pid %i)\n", pid);
triton_context_schedule(); sigchld_unlock();
pthread_mutex_lock(&pd->ip_down_hnd.lock); triton_context_schedule();
pthread_mutex_unlock(&pd->ip_down_hnd.lock); pthread_mutex_lock(&pd->ip_down_hnd.lock);
} else if (pid == 0) { pthread_mutex_unlock(&pd->ip_down_hnd.lock);
execve(conf_ip_down, argv, env); } else if (pid == 0) {
log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_down, strerror(errno)); sigset_t set;
_exit(EXIT_FAILURE); sigfillset(&set);
} else pthread_sigmask(SIG_UNBLOCK, &set, NULL);
log_error("pppd_compat: fork: %s\n", strerror(errno));
execve(conf_ip_down, argv, env);
log_emerg("pppd_compat: exec '%s': %s\n", conf_ip_down, strerror(errno));
_exit(EXIT_FAILURE);
} else
log_error("pppd_compat: fork: %s\n", strerror(errno));
}
pthread_mutex_lock(&pd->ip_up_hnd.lock); pthread_mutex_lock(&pd->ip_up_hnd.lock);
if (pd->ip_up_hnd.pid) { if (pd->ip_up_hnd.pid) {
......
...@@ -35,7 +35,7 @@ static void* sigchld_thread(void *arg) ...@@ -35,7 +35,7 @@ static void* sigchld_thread(void *arg)
sigaddset(&set, SIGQUIT); sigaddset(&set, SIGQUIT);
while (1) { while (1) {
pid = waitpid(0, &status, 0); pid = waitpid(-1, &status, 0);
if (pid < 0) { if (pid < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册