diff -ur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4.killmypg/pppd/main.c --- ppp-2.4.4.orig/pppd/main.c 2006-06-04 07:52:50 +0400 +++ ppp-2.4.4.killmypg/pppd/main.c 2007-03-18 03:37:50 +0300 @@ -234,7 +234,6 @@ static void get_input __P((void)); static void calltimeout __P((void)); static struct timeval *timeleft __P((struct timeval *)); -static void kill_my_pg __P((int)); static void hup __P((int)); static void term __P((int)); static void chld __P((int)); @@ -1375,36 +1374,6 @@ /* - * kill_my_pg - send a signal to our process group, and ignore it ourselves. - * We assume that sig is currently blocked. - */ -static void -kill_my_pg(sig) - int sig; -{ - struct sigaction act, oldact; - - sigemptyset(&act.sa_mask); /* unnecessary in fact */ - act.sa_handler = SIG_IGN; - act.sa_flags = 0; - kill(0, sig); - /* - * The kill() above made the signal pending for us, as well as - * the rest of our process group, but we don't want it delivered - * to us. It is blocked at the moment. Setting it to be ignored - * will cause the pending signal to be discarded. If we did the - * kill() after setting the signal to be ignored, it is unspecified - * (by POSIX) whether the signal is immediately discarded or left - * pending, and in fact Linux would leave it pending, and so it - * would be delivered after the current signal handler exits, - * leading to an infinite loop. - */ - sigaction(sig, &act, &oldact); - sigaction(sig, &oldact, NULL); -} - - -/* * hup - Catch SIGHUP signal. * * Indicates that the physical layer has been disconnected. @@ -1415,11 +1384,20 @@ hup(sig) int sig; { + static ignore_next = 0; + if(ignore_next) + { + ignore_next = 0; + return; + } /* can't log a message here, it can deadlock */ got_sighup = 1; if (conn_running) + { /* Send the signal to the [dis]connector process(es) also */ - kill_my_pg(sig); + ignore_next = 1; + kill(0, sig); + } notify(sigreceived, sig); if (waiting) siglongjmp(sigjmp, 1); @@ -1436,11 +1414,19 @@ term(sig) int sig; { + static ignore_next = 0; + if(ignore_next) + { + ignore_next = 0; + } /* can't log a message here, it can deadlock */ got_sigterm = sig; if (conn_running) - /* Send the signal to the [dis]connector process(es) also */ - kill_my_pg(sig); + { + /* Send the signal to the [dis]connector process(es) also */ + ignore_next = 1; + kill(0, sig); + } notify(sigreceived, sig); if (waiting) siglongjmp(sigjmp, 1); @@ -1503,14 +1489,23 @@ bad_signal(sig) int sig; { + static ignore_next = 0; static int crashed = 0; - + + if(ignore_next) + { + ignore_next = 0; + return; + } if (crashed) _exit(127); crashed = 1; error("Fatal signal %d", sig); if (conn_running) - kill_my_pg(SIGTERM); + { + ignore_next = 1; + kill(0, SIGTERM); + } notify(sigreceived, sig); die(127); }