]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/main.c
mods from Steve Perkins
[ppp.git] / pppd / main.c
index 170db95cfb4c610c109fa27da268fe63fdeca564..022551164450d0fa730b437917b30202c49812b4 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.35 1996/08/28 06:41:16 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.40 1997/03/04 03:41:17 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -52,6 +52,10 @@ static char rcsid[] = "$Id: main.c,v 1.35 1996/08/28 06:41:16 paulus Exp $";
 #include "pathnames.h"
 #include "patchlevel.h"
 
+#ifdef CBCP_SUPPORT
+#include "cbcp.h"
+#endif
+
 #if defined(SUNOS4)
 extern char *strerror();
 #endif
@@ -59,6 +63,9 @@ extern char *strerror();
 #ifdef IPX_CHANGE
 #include "ipxcp.h"
 #endif /* IPX_CHANGE */
+#ifdef AT_CHANGE
+#include "atcp.h"
+#endif
 
 /* interface vars */
 char ifname[IFNAMSIZ];         /* Interface name */
@@ -98,7 +105,6 @@ char *no_ppp_msg = "Sorry - this system lacks PPP kernel support\n";
 static void cleanup __P((void));
 static void close_tty __P((void));
 static void get_input __P((void));
-static void connect_time_expired __P((caddr_t));
 static void calltimeout __P((void));
 static struct timeval *timeleft __P((struct timeval *));
 static void hup __P((int));
@@ -120,7 +126,7 @@ extern      char    *getlogin __P((void));
 #define        O_NONBLOCK      O_NDELAY
 #endif
 
-#ifdef PRIMITIVE_SYSLOG
+#ifdef ULTRIX
 #define setlogmask(x)
 #endif
 
@@ -133,10 +139,16 @@ struct protent *protocols[] = {
     &lcp_protent,
     &pap_protent,
     &chap_protent,
+#ifdef CBCP_SUPPORT
+    &cbcp_protent,
+#endif
     &ipcp_protent,
     &ccp_protent,
 #ifdef IPX_CHANGE
     &ipxcp_protent,
+#endif
+#ifdef AT_CHANGE
+    &atcp_protent,
 #endif
     NULL
 };
@@ -163,7 +175,7 @@ main(argc, argv)
     strcpy(default_devnam, devnam);
 
     /* Initialize syslog facilities */
-#ifdef PRIMITIVE_SYSLOG
+#ifdef ULTRIX
     openlog("pppd", LOG_PID);
 #else
     openlog("pppd", LOG_PID | LOG_NDELAY, LOG_PPP);
@@ -171,7 +183,7 @@ main(argc, argv)
 #endif
 
     if (gethostname(hostname, MAXNAMELEN) < 0 ) {
-       syslog(LOG_ERR, "couldn't get hostname: %m");
+       option_error("Couldn't get hostname: %m");
        die(1);
     }
     hostname[MAXNAMELEN-1] = 0;
@@ -197,6 +209,15 @@ main(argc, argv)
        || !parse_args(argc-1, argv+1))
        exit(1);
 
+    /*
+     * Check that we are running as root.
+     */
+    if (geteuid() != 0) {
+       option_error("must be root to run %s, since it is not setuid-root",
+                    argv[0]);
+       die(1);
+    }
+
     if (!ppp_available()) {
        option_error(no_ppp_msg);
        exit(1);
@@ -401,9 +422,11 @@ main(argc, argv)
         * the non-blocking I/O bit.
         */
        nonblock = (connector || !modem)? O_NONBLOCK: 0;
-       if ((ttyfd = open(devnam, nonblock | O_RDWR, 0)) < 0) {
-           syslog(LOG_ERR, "Failed to open %s: %m", devnam);
-           goto fail;
+       while ((ttyfd = open(devnam, nonblock | O_RDWR, 0)) < 0) {
+           if (errno != EINTR)
+               syslog(LOG_ERR, "Failed to open %s: %m", devnam);
+           if (!persist || errno != EINTR)
+               goto fail;
        }
        if (nonblock) {
            if ((fdflags = fcntl(ttyfd, F_GETFL)) == -1
@@ -477,13 +500,6 @@ main(argc, argv)
            }
        }
 
-       /*
-        * Set a timeout to close the connection once the maximum
-        * connect time has expired.
-        */
-       if (maxconnect > 0)
-           TIMEOUT(connect_time_expired, 0, maxconnect);
-
        /*
         * Start opening the connection and wait for
         * incoming events (reply, timeout, etc.).
@@ -515,14 +531,9 @@ main(argc, argv)
         * real serial device back to its normal mode of operation.
         */
        clean_check();
-#ifdef _linux_
-       disestablish_ppp(ttyfd);
-#endif
        if (demand)
            restore_loop();
-#ifndef _linux_
        disestablish_ppp(ttyfd);
-#endif
 
        /*
         * Run disconnector script, if requested.
@@ -538,7 +549,8 @@ main(argc, argv)
        }
 
     fail:
-       close_tty();
+       if (ttyfd >= 0)
+           close_tty();
        if (locked) {
            unlock();
            locked = 0;
@@ -628,7 +640,19 @@ get_input()
      */
     if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) {
        MAINDEBUG((LOG_INFO,
-                  "io(): Received non-LCP packet when LCP not open."));
+                  "get_input: Received non-LCP packet when LCP not open."));
+       return;
+    }
+
+    /*
+     * Until we get past the authentication phase, toss all packets
+     * except LCP, LQR and authentication packets.
+     */
+    if (phase <= PHASE_AUTHENTICATE
+       && !(protocol == PPP_LCP || protocol == PPP_LQR
+            || protocol == PPP_PAP || protocol == PPP_CHAP)) {
+       MAINDEBUG((LOG_INFO, "get_input: discarding proto 0x%x in phase %d",
+                  protocol, phase));
        return;
     }
 
@@ -674,17 +698,6 @@ die(status)
     exit(status);
 }
 
-/*
- * connect_time_expired - log a message and close the connection.
- */
-static void
-connect_time_expired(arg)
-    caddr_t arg;
-{
-    syslog(LOG_INFO, "Connect time expired");
-    lcp_close(0, "Connect time expired");      /* Close connection */
-}
-
 /*
  * cleanup - restore anything which needs to be restored before we exit
  */
@@ -873,8 +886,8 @@ kill_my_pg(sig)
 
     act.sa_handler = SIG_IGN;
     act.sa_flags = 0;
+    kill(0, sig);
     sigaction(sig, &act, &oldact);
-    kill(-getpgrp(), sig);
     sigaction(sig, &oldact, NULL);
 }
 
@@ -1317,7 +1330,11 @@ fmtmsg __V((char *buf, int buflen, char *fmt, ...))
 #define OUTCHAR(c)     (buflen > 0? (--buflen, *buf++ = (c)): 0)
 
 int
-vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
+vfmtmsg(buf, buflen, fmt, args)
+    char *buf;
+    int buflen;
+    char *fmt;
+    va_list args;
 {
     int c, i, n;
     int width, prec, fillch;
@@ -1325,10 +1342,10 @@ vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
     unsigned long val;
     char *str, *f, *buf0;
     unsigned char *p;
-    va_list a;
+    void *a;
     char num[32];
     time_t t;
-    static char hexchars[16] = "0123456789abcdef";
+    static char hexchars[] = "0123456789abcdef";
 
     buf0 = buf;
     --buflen;
@@ -1417,7 +1434,11 @@ vfmtmsg(char *buf, int buflen, char *fmt, va_list args)
            break;
        case 'r':
            f = va_arg(args, char *);
-           a = va_arg(args, va_list);
+           /*
+            * XXX We assume a va_list is either a pointer or an array, so
+            * what gets passed for a va_list is like a void * in some sense.
+            */
+           a = va_arg(args, void *);
            n = vfmtmsg(buf, buflen + 1, f, a);
            buf += n;
            buflen -= n;