X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=0bb94922e78d545545d134912412acb8ad22c49a;hb=93707a531320fbf398fdb5ffa69a86af092c798c;hp=1f6000b8b3eedb6a0c21a16ca73bb4b0f926bf2f;hpb=e8903340608548b0f92d1b0d0bf8144a43123df4;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index 1f6000b..0bb9492 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -40,7 +40,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: main.c,v 1.133 2004/02/02 03:40:12 paulus Exp $" +#define RCSID "$Id: main.c,v 1.138 2004/10/28 00:32:32 paulus Exp $" #include #include @@ -150,6 +150,7 @@ int got_sigusr2; int got_sigterm; int got_sighup; +static sigset_t signals_handled; static int waiting; static sigjmp_buf sigjmp; @@ -171,6 +172,7 @@ int ngroups; /* How many groups valid in groups */ static struct timeval start_time; /* Time when link was started. */ +static struct pppd_stats old_link_stats; struct pppd_stats link_stats; unsigned link_connect_time; int link_stats_valid; @@ -218,7 +220,7 @@ static void cleanup_db __P((void)); #endif static void handle_events __P((void)); -static void print_link_stats __P((void)); +void print_link_stats __P((void)); extern char *ttyname __P((int)); extern char *getlogin __P((void)); @@ -648,16 +650,15 @@ static void handle_events() { struct timeval timo; - sigset_t mask; kill_link = open_ccp_flag = 0; if (sigsetjmp(sigjmp, 1) == 0) { - sigprocmask(SIG_BLOCK, &mask, NULL); + sigprocmask(SIG_BLOCK, &signals_handled, NULL); if (got_sighup || got_sigterm || got_sigusr2 || got_sigchld) { - sigprocmask(SIG_UNBLOCK, &mask, NULL); + sigprocmask(SIG_UNBLOCK, &signals_handled, NULL); } else { waiting = 1; - sigprocmask(SIG_UNBLOCK, &mask, NULL); + sigprocmask(SIG_UNBLOCK, &signals_handled, NULL); wait_input(timeleft(&timo)); } } @@ -692,19 +693,18 @@ static void setup_signals() { struct sigaction sa; - sigset_t mask; /* * Compute mask of all interesting signals and install signal handlers * for each. Only one signal handler may be active at a time. Therefore, * all other signals should be masked when any handler is executing. */ - sigemptyset(&mask); - sigaddset(&mask, SIGHUP); - sigaddset(&mask, SIGINT); - sigaddset(&mask, SIGTERM); - sigaddset(&mask, SIGCHLD); - sigaddset(&mask, SIGUSR2); + sigemptyset(&signals_handled); + sigaddset(&signals_handled, SIGHUP); + sigaddset(&signals_handled, SIGINT); + sigaddset(&signals_handled, SIGTERM); + sigaddset(&signals_handled, SIGCHLD); + sigaddset(&signals_handled, SIGUSR2); #define SIGNAL(s, handler) do { \ sa.sa_handler = handler; \ @@ -712,7 +712,7 @@ setup_signals() fatal("Couldn't establish signal handler (%d): %m", s); \ } while (0) - sa.sa_mask = mask; + sa.sa_mask = signals_handled; sa.sa_flags = 0; SIGNAL(SIGHUP, hup); /* Hangup */ SIGNAL(SIGINT, term); /* Interrupt */ @@ -1127,7 +1127,7 @@ void die(status) int status; { - print_link_stats(); + print_link_stats(); cleanup(); notify(exitnotify, status); syslog(LOG_INFO, "Exit."); @@ -1177,6 +1177,18 @@ print_link_stats() } } +/* + * reset_link_stats - "reset" stats when link goes up. + */ +void +reset_link_stats(u) + int u; +{ + if (!get_ppp_stats(u, &old_link_stats)) + return; + gettimeofday(&start_time, NULL); +} + /* * update_link_stats - get stats at link termination. */ @@ -1193,6 +1205,11 @@ update_link_stats(u) link_connect_time = now.tv_sec - start_time.tv_sec; link_stats_valid = 1; + link_stats.bytes_in -= old_link_stats.bytes_in; + link_stats.bytes_out -= old_link_stats.bytes_out; + link_stats.pkts_in -= old_link_stats.pkts_in; + link_stats.pkts_out -= old_link_stats.pkts_out; + slprintf(numbuf, sizeof(numbuf), "%u", link_connect_time); script_setenv("CONNECT_TIME", numbuf, 0); slprintf(numbuf, sizeof(numbuf), "%u", link_stats.bytes_out); @@ -1338,6 +1355,7 @@ kill_my_pg(sig) { struct sigaction act, oldact; + sigemptyset(&act.sa_mask); /* unnecessary in fact */ act.sa_handler = SIG_IGN; act.sa_flags = 0; kill(0, sig); @@ -1575,6 +1593,8 @@ device_script(program, in, out, dont_wait) close(2); if (the_channel->close) (*the_channel->close)(); + else + close(devfd); /* some plugins don't have a close function */ closelog(); close(fd_devnull);