pptp: kill the call manager process on shutdown
SVN-Revision: 31606
This commit is contained in:
		
							
								
								
									
										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); | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau