]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/main.c
get files from ../include/linux if not here
[ppp.git] / pppd / main.c
index c69d6c245ed578a848f5c30f96aa66ce6b6dbea6..0fbef8681e5bd1ec6d95b15b737289c24727598d 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.65 1999/03/23 01:23:46 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.69 1999/03/30 06:01:24 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -110,6 +110,7 @@ u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */
 u_char inpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for incoming packet */
 
 static int n_children;         /* # child processes still running */
+static int got_sigchld;                /* set if we have received a SIGCHLD */
 
 static int locked;             /* lock() has succeeded */
 
@@ -246,7 +247,25 @@ main(argc, argv)
     if (!options_from_file(_PATH_SYSOPTIONS, !privileged, 0, 1)
        || !options_from_user())
        exit(1);
+    using_pty = notty || ptycommand != NULL;
     scan_args(argc-1, argv+1); /* look for tty name on command line */
+
+    /*
+     * Work out the device name, if it hasn't already been specified.
+     */
+    if (!using_pty) {
+       p = isatty(0)? ttyname(0): NULL;
+       if (p != NULL) {
+           if (default_device)
+               strlcpy(devnam, p, sizeof(devnam));
+           else if (strcmp(devnam, p) == 0)
+               default_device = 1;
+       }
+    }
+
+    /*
+     * Parse the tty options file and the command line.
+     */
     if (!options_for_tty()
        || !parse_args(argc-1, argv+1))
        exit(1);
@@ -279,7 +298,7 @@ main(argc, argv)
        exit(1);
     }
 
-    if (ptycommand != NULL || notty) {
+    if (using_pty) {
        if (!default_device) {
            option_error("%s option precludes specifying device name",
                         notty? "notty": "pty");
@@ -293,21 +312,9 @@ main(argc, argv)
        lockflag = 0;
        modem = 0;
     } else {
-       /*
-        * If the user has specified the default device name explicitly,
-        * pretend they hadn't.
-        */
-       p = isatty(0)? ttyname(0): NULL;
-       if (p == NULL) {
-           if (default_device) {
-               option_error("no device specified and stdin is not a tty");
-               exit(1);
-           }
-       } else {
-           if (default_device)
-               strlcpy(devnam, p, sizeof(devnam));
-           else if (strcmp(devnam, p) == 0)
-               default_device = 1;
+       if (devnam[0] == 0) {
+           option_error("no device specified and stdin is not a tty");
+           exit(1);
        }
     }
     if (default_device)
@@ -316,8 +323,6 @@ main(argc, argv)
        log_to_fd = 1;          /* default to stdout */
 
     script_setenv("DEVICE", devnam);
-    slprintf(numbuf, sizeof(numbuf), "%d", baud_rate);
-    script_setenv("SPEED", numbuf);
 
     /*
      * Initialize system-dependent stuff and magic number package.
@@ -476,7 +481,8 @@ main(argc, argv)
                }
                if (get_loop_output())
                    break;
-               reap_kids(0);
+               if (got_sigchld)
+                   reap_kids(0);
            }
            remove_fd(fd_loop);
            if (kill_link && !persist)
@@ -526,10 +532,10 @@ main(argc, argv)
            for (;;) {
                /* If the user specified the device name, become the
                   user before opening it. */
-               if (!devnam_info.priv)
+               if (!devnam_info.priv && !default_device)
                    seteuid(uid);
                ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0);
-               if (!devnam_info.priv)
+               if (!devnam_info.priv && !default_device)
                    seteuid(0);
                if (ttyfd >= 0)
                    break;
@@ -636,6 +642,9 @@ main(argc, argv)
            close(i);
        }
 
+       slprintf(numbuf, sizeof(numbuf), "%d", baud_rate);
+       script_setenv("SPEED", numbuf);
+
        /* run welcome script, if any */
        if (welcomer && welcomer[0]) {
            if (device_script(welcomer, ttyfd, ttyfd, 0) < 0)
@@ -704,7 +713,8 @@ main(argc, argv)
                }
                open_ccp_flag = 0;
            }
-           reap_kids(0);       /* Don't leave dead kids lying around */
+           if (got_sigchld)
+               reap_kids(0);   /* Don't leave dead kids lying around */
        }
 
        /*
@@ -793,7 +803,8 @@ main(argc, argv)
                    kill_link = 0;
                    phase = PHASE_DORMANT; /* allow signal to end holdoff */
                }
-               reap_kids(0);
+               if (got_sigchld)
+                   reap_kids(0);
            } while (phase == PHASE_HOLDOFF);
            if (!persist)
                break;
@@ -1191,12 +1202,13 @@ term(sig)
 
 /*
  * chld - Catch SIGCHLD signal.
- * Calls reap_kids to get status for any dead kids.
+ * Sets a flag so we will call reap_kids in the mainline.
  */
 static void
 chld(sig)
     int sig;
 {
+    got_sigchld = 1;
     if (waiting)
        siglongjmp(sigjmp, 1);
 }
@@ -1308,12 +1320,13 @@ device_script(program, in, out, dont_wait)
            if (out == 0)
                out = dup(out);
            dup2(in, 0);
-           if (in != out)
+           if (in > 2)
                close(in);
        }
        if (out != 1) {
            dup2(out, 1);
-           close(out);
+           if (out > 2)
+               close(out);
        }
        if (real_ttyfd > 2)
            close(real_ttyfd);
@@ -1506,6 +1519,7 @@ reap_kids(waitfor)
     int pid, status;
     struct subprocess *chp, **prevp;
 
+    got_sigchld = 0;
     if (n_children == 0)
        return;
     while ((pid = waitpid(-1, &status, (waitfor? 0: WNOHANG))) != -1
@@ -2373,8 +2387,16 @@ charshunt(ifd, ofd, record_file)
     nibuf = nobuf = 0;
     ibufp = obufp = NULL;
     pty_readable = stdin_readable = 1;
-    gettimeofday(&lasttime, NULL);
     nfds = (ofd > pty_master? ofd: pty_master) + 1;
+    if (recordf != NULL) {
+       gettimeofday(&lasttime, NULL);
+       putc(7, recordf);       /* put start marker */
+       putc(lasttime.tv_sec >> 24, recordf);
+       putc(lasttime.tv_sec >> 16, recordf);
+       putc(lasttime.tv_sec >> 8, recordf);
+       putc(lasttime.tv_sec, recordf);
+       lasttime.tv_usec = 0;
+    }
 
     while (nibuf != 0 || nobuf != 0 || pty_readable || stdin_readable) {
        FD_ZERO(&ready);
@@ -2490,8 +2512,8 @@ record_write(f, code, buf, nb, tp)
     int diff;
 
     gettimeofday(&now, NULL);
-    diff = (now.tv_sec - tp->tv_sec) * 10
-       + (now.tv_usec - tp->tv_usec) / 100000;
+    now.tv_usec /= 100000;     /* actually 1/10 s, not usec now */
+    diff = (now.tv_sec - tp->tv_sec) * 10 + (now.tv_usec - tp->tv_usec);
     if (diff > 0) {
        if (diff > 255) {
            putc(5, f);