summaryrefslogtreecommitdiff
path: root/accel-pppd/session.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2016-03-18 13:40:07 +0300
committerDmitry Kozlov <xeb@mail.ru>2016-03-18 13:40:07 +0300
commitecee62f204a93c7f512dce46657fbd101d155d78 (patch)
treed2fbe940bd94e7a93310651dceaf7c27e4866b75 /accel-pppd/session.c
parent862f1cbfe781098be2263443fc108a46f521a163 (diff)
downloadaccel-ppp-ecee62f204a93c7f512dce46657fbd101d155d78.tar.gz
accel-ppp-ecee62f204a93c7f512dce46657fbd101d155d78.zip
make termination caused by SIGTERM soft
Diffstat (limited to 'accel-pppd/session.c')
-rw-r--r--accel-pppd/session.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/accel-pppd/session.c b/accel-pppd/session.c
index 1ed1023..1fbac10 100644
--- a/accel-pppd/session.c
+++ b/accel-pppd/session.c
@@ -292,17 +292,35 @@ void __export ap_session_terminate(struct ap_session *ses, int cause, int hard)
}
}
-void ap_shutdown_soft(void (*cb)(void))
+static void __terminate_soft_reboot(struct ap_session *ses)
{
+ ap_session_terminate(ses, TERM_NAS_REBOOT, 0);
+}
+
+int ap_shutdown_soft(void (*cb)(void), int term)
+{
+ struct ap_session *ses;
+
ap_shutdown = 1;
shutdown_cb = cb;
+ pthread_rwlock_rdlock(&ses_lock);
+
if (!ap_session_stat.starting && !ap_session_stat.active && !ap_session_stat.finishing) {
+ pthread_rwlock_unlock(&ses_lock);
if (shutdown_cb)
shutdown_cb();
else
kill(getpid(), SIGTERM);
+ return 1;
+ } else if (term) {
+ list_for_each_entry(ses, &ses_list, entry)
+ triton_context_call(ses->ctrl->ctx, (triton_event_func)__terminate_soft_reboot, ses);
}
+
+ pthread_rwlock_unlock(&ses_lock);
+
+ return 0;
}
static void generate_sessionid(struct ap_session *ses)