From: Felix Fietkau Date: Sat, 5 May 2012 16:56:42 +0000 (+0000) Subject: pptp: kill the call manager process on shutdown X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;hb=b5e5f65c1ea63835107277f94fdfa9ad9d2fcbd8 pptp: kill the call manager process on shutdown SVN-Revision: 31606 --- diff --git a/package/pptp/patches/100-signal_cleanup.patch b/package/pptp/patches/100-signal_cleanup.patch new file mode 100644 index 0000000000..cb3a94f2ad --- /dev/null +++ b/package/pptp/patches/100-signal_cleanup.patch @@ -0,0 +1,74 @@ +--- a/pptp.c ++++ b/pptp.c +@@ -60,6 +60,7 @@ + int syncppp = 0; + int log_level = 1; + int disable_buffer = 0; ++pid_t callmgr_pid = 0; + + struct in_addr get_ip_address(char *name); + int open_callmgr(struct in_addr inetaddr, char *phonenr, int argc,char **argv,char **envp, int pty_fd, int gre_fd); +@@ -115,6 +116,8 @@ sigjmp_buf env; + /*** signal handler ***********************************************************/ + void sighandler(int sig) + { ++ fprintf(stderr, "Got signal, pid=%d\n", callmgr_pid); ++ fflush(stderr); + siglongjmp(env, 1); + } + +@@ -330,6 +333,14 @@ int main(int argc, char **argv, char **e + parent_pid = 0; /* don't kill pppd */ + } + ++ if (sigsetjmp(env, 1)!= 0) goto shutdown; ++ ++ signal(SIGINT, sighandler); ++ signal(SIGTERM, sighandler); ++ signal(SIGKILL, sighandler); ++ signal(SIGCHLD, sighandler); ++ signal(SIGUSR1, sigstats); ++ + do { + /* + * Open connection to call manager (Launch call manager if necessary.) +@@ -360,13 +371,6 @@ int main(int argc, char **argv, char **e + if (rc != 0) perror("prctl"); + #endif + inststr(argc, argv, envp, buf); +- if (sigsetjmp(env, 1)!= 0) goto shutdown; +- +- signal(SIGINT, sighandler); +- signal(SIGTERM, sighandler); +- signal(SIGKILL, sighandler); +- signal(SIGCHLD, sighandler); +- signal(SIGUSR1, sigstats); + + /* Do GRE copy until close. */ + pptp_gre_copy(call_id, peer_call_id, pty_fd, gre_fd); +@@ -375,6 +379,8 @@ shutdown: + /* on close, kill all. */ + if(launchpppd) + kill(parent_pid, SIGTERM); ++ if (callmgr_pid) ++ kill(callmgr_pid, SIGTERM); + close(pty_fd); + close(callmgr_sock); + exit(0); +@@ -407,7 +413,7 @@ int open_callmgr(struct in_addr inetaddr + struct sockaddr_un where; + const int NUM_TRIES = 3; + int i, fd; +- pid_t pid; ++ pid_t pid = 0; + int status; + /* Open socket */ + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { +@@ -434,6 +440,7 @@ int open_callmgr(struct in_addr inetaddr + launch_callmgr(inetaddr, phonenr, argc, argv, envp); + } + default: /* parent */ ++ callmgr_pid = pid; + waitpid(pid, &status, 0); + if (status!= 0) + fatal("Call manager exited with error %d", status);