pptp: kill the call manager process on shutdown
authorFelix Fietkau <nbd@openwrt.org>
Sat, 5 May 2012 16:56:42 +0000 (16:56 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 5 May 2012 16:56:42 +0000 (16:56 +0000)
SVN-Revision: 31606

package/pptp/patches/100-signal_cleanup.patch [new file with mode: 0644]

diff --git a/package/pptp/patches/100-signal_cleanup.patch b/package/pptp/patches/100-signal_cleanup.patch
new file mode 100644 (file)
index 0000000..cb3a94f
--- /dev/null
@@ -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);