summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r--accel-pptpd/ppp/ppp.c16
-rw-r--r--accel-pptpd/ppp/ppp.h2
2 files changed, 18 insertions, 0 deletions
diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c
index 95e1a869..f8faed8f 100644
--- a/accel-pptpd/ppp/ppp.c
+++ b/accel-pptpd/ppp/ppp.c
@@ -8,6 +8,7 @@
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <features.h>
+#include <signal.h>
#include "linux_ppp.h"
#include <openssl/md5.h>
@@ -30,6 +31,8 @@ __export LIST_HEAD(ppp_list);
static LIST_HEAD(layers);
int __export sock_fd;
+static int ppp_shutdown;
+
static unsigned long long seq;
#if __WORDSIZE == 32
static spinlock_t seq_lock;
@@ -226,6 +229,9 @@ static void destablish_ppp(struct ppp_t *ppp)
_free(ppp->username);
ppp->username = NULL;
}
+
+ if (ppp_shutdown && !ppp_stat.starting && !ppp_stat.active && !ppp_stat.finishing)
+ kill(getpid(), SIGTERM);
}
/*void print_buf(uint8_t *buf, int size)
@@ -592,6 +598,14 @@ struct ppp_layer_data_t *ppp_find_layer_data(struct ppp_t *ppp, struct ppp_layer
return NULL;
}
+static void ev_shutdown_soft(void)
+{
+ ppp_shutdown = 1;
+
+ if (!ppp_stat.starting && !ppp_stat.active && !ppp_stat.finishing)
+ kill(getpid(), SIGTERM);
+}
+
static void save_seq(void)
{
FILE *f;
@@ -633,6 +647,8 @@ static void __init init(void)
//log_emerg("ppp: failed to open seq-file (%s): %s\n", opt, strerror(errno));
seq = (unsigned long long)random() * (unsigned long long)random();
+ triton_event_register_handler(EV_SHUTDOWN_SOFT, (triton_event_func)ev_shutdown_soft);
+
atexit(save_seq);
}
diff --git a/accel-pptpd/ppp/ppp.h b/accel-pptpd/ppp/ppp.h
index 1a970997..814a2702 100644
--- a/accel-pptpd/ppp/ppp.h
+++ b/accel-pptpd/ppp/ppp.h
@@ -173,6 +173,8 @@ int ppp_register_layer(const char *name, struct ppp_layer_t *);
void ppp_unregister_layer(struct ppp_layer_t *);
struct ppp_layer_data_t *ppp_find_layer_data(struct ppp_t *, struct ppp_layer_t *);
+void ppp_shutdown_soft(void);
+
extern int conf_ppp_verbose;
extern pthread_rwlock_t ppp_lock;