diff options
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r-- | accel-pptpd/ppp/ppp.c | 16 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.h | 2 |
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; |