summaryrefslogtreecommitdiff
path: root/accel-pppd/session.c
diff options
context:
space:
mode:
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)