]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/main.c
Add --prefix and --sysconfdir options to configure, and put
[ppp.git] / pppd / main.c
index 1f6000b8b3eedb6a0c21a16ca73bb4b0f926bf2f..0bb94922e78d545545d134912412acb8ad22c49a 100644 (file)
@@ -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 <stdio.h>
 #include <ctype.h>
@@ -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);