mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 08:21:14 +00:00
pptp: kill the call manager process on shutdown
SVN-Revision: 31606
This commit is contained in:
parent
3225530e1e
commit
73383c252e
74
package/pptp/patches/100-signal_cleanup.patch
Normal file
74
package/pptp/patches/100-signal_cleanup.patch
Normal file
@ -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);
|
Loading…
Reference in New Issue
Block a user