pptp: kill the call manager process on shutdown
[openwrt/svn-archive/archive.git] / package / pptp / patches / 100-signal_cleanup.patch
1 --- a/pptp.c
2 +++ b/pptp.c
3 @@ -60,6 +60,7 @@
4 int syncppp = 0;
5 int log_level = 1;
6 int disable_buffer = 0;
7 +pid_t callmgr_pid = 0;
8
9 struct in_addr get_ip_address(char *name);
10 int open_callmgr(struct in_addr inetaddr, char *phonenr, int argc,char **argv,char **envp, int pty_fd, int gre_fd);
11 @@ -115,6 +116,8 @@ sigjmp_buf env;
12 /*** signal handler ***********************************************************/
13 void sighandler(int sig)
14 {
15 + fprintf(stderr, "Got signal, pid=%d\n", callmgr_pid);
16 + fflush(stderr);
17 siglongjmp(env, 1);
18 }
19
20 @@ -330,6 +333,14 @@ int main(int argc, char **argv, char **e
21 parent_pid = 0; /* don't kill pppd */
22 }
23
24 + if (sigsetjmp(env, 1)!= 0) goto shutdown;
25 +
26 + signal(SIGINT, sighandler);
27 + signal(SIGTERM, sighandler);
28 + signal(SIGKILL, sighandler);
29 + signal(SIGCHLD, sighandler);
30 + signal(SIGUSR1, sigstats);
31 +
32 do {
33 /*
34 * Open connection to call manager (Launch call manager if necessary.)
35 @@ -360,13 +371,6 @@ int main(int argc, char **argv, char **e
36 if (rc != 0) perror("prctl");
37 #endif
38 inststr(argc, argv, envp, buf);
39 - if (sigsetjmp(env, 1)!= 0) goto shutdown;
40 -
41 - signal(SIGINT, sighandler);
42 - signal(SIGTERM, sighandler);
43 - signal(SIGKILL, sighandler);
44 - signal(SIGCHLD, sighandler);
45 - signal(SIGUSR1, sigstats);
46
47 /* Do GRE copy until close. */
48 pptp_gre_copy(call_id, peer_call_id, pty_fd, gre_fd);
49 @@ -375,6 +379,8 @@ shutdown:
50 /* on close, kill all. */
51 if(launchpppd)
52 kill(parent_pid, SIGTERM);
53 + if (callmgr_pid)
54 + kill(callmgr_pid, SIGTERM);
55 close(pty_fd);
56 close(callmgr_sock);
57 exit(0);
58 @@ -407,7 +413,7 @@ int open_callmgr(struct in_addr inetaddr
59 struct sockaddr_un where;
60 const int NUM_TRIES = 3;
61 int i, fd;
62 - pid_t pid;
63 + pid_t pid = 0;
64 int status;
65 /* Open socket */
66 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
67 @@ -434,6 +440,7 @@ int open_callmgr(struct in_addr inetaddr
68 launch_callmgr(inetaddr, phonenr, argc, argv, envp);
69 }
70 default: /* parent */
71 + callmgr_pid = pid;
72 waitpid(pid, &status, 0);
73 if (status!= 0)
74 fatal("Call manager exited with error %d", status);