]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/main.c
fix compilation problems
[ppp.git] / pppd / main.c
index 120676227df011fe0b8d4fc4ae0057eed84b7ef5..e4624209e5155ef57083639270428be0d32c96e3 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: main.c,v 1.34 1996/07/01 01:17:39 paulus Exp $";
+static char rcsid[] = "$Id: main.c,v 1.39 1996/10/08 06:43:49 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -52,6 +52,10 @@ static char rcsid[] = "$Id: main.c,v 1.34 1996/07/01 01:17:39 paulus Exp $";
 #include "pathnames.h"
 #include "patchlevel.h"
 
+#ifdef CBCP_SUPPORT
+#include "cbcp.h"
+#endif
+
 #if defined(SUNOS4)
 extern char *strerror();
 #endif
@@ -60,14 +64,6 @@ extern char *strerror();
 #include "ipxcp.h"
 #endif /* IPX_CHANGE */
 
-/*
- * If REQ_SYSOPTIONS is defined to 1, pppd will not run unless
- * /etc/ppp/options exists.
- */
-#ifndef        REQ_SYSOPTIONS
-#define REQ_SYSOPTIONS 1
-#endif
-
 /* interface vars */
 char ifname[IFNAMSIZ];         /* Interface name */
 int ifunit;                    /* Interface unit number */
@@ -78,11 +74,14 @@ static char pidfilename[MAXPATHLEN];        /* name of pid file */
 static char default_devnam[MAXPATHLEN];        /* name of default device */
 static pid_t pid;              /* Our pid */
 static uid_t uid;              /* Our real user-id */
+static int conn_running;       /* we have a [dis]connector running */
 
 int ttyfd = -1;                        /* Serial port file descriptor */
 mode_t tty_mode = -1;          /* Original access permissions to tty */
 int baud_rate;                 /* Actual bits/second for serial device */
 int hungup;                    /* terminal has been hung up */
+int privileged;                        /* we're running as real uid root */
+int need_holdoff;              /* need holdoff period before restarting */
 
 int phase;                     /* where the link is at */
 int kill_link;
@@ -125,7 +124,7 @@ extern      char    *getlogin __P((void));
 #define        O_NONBLOCK      O_NDELAY
 #endif
 
-#ifdef PRIMITIVE_SYSLOG
+#ifdef ULTRIX
 #define setlogmask(x)
 #endif
 
@@ -138,6 +137,9 @@ struct protent *protocols[] = {
     &lcp_protent,
     &pap_protent,
     &chap_protent,
+#ifdef CBCP_SUPPORT
+    &cbcp_protent,
+#endif
     &ipcp_protent,
     &ccp_protent,
 #ifdef IPX_CHANGE
@@ -168,7 +170,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);
@@ -176,12 +178,13 @@ 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;
 
     uid = getuid();
+    privileged = uid == 0;
 
     /*
      * Initialize to the standard option set, then parse, in order,
@@ -193,7 +196,7 @@ main(argc, argv)
   
     progname = *argv;
 
-    if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS, 0)
+    if (!options_from_file(_PATH_SYSOPTIONS, !privileged, 0, 1)
        || !options_from_user())
        exit(1);
     scan_args(argc-1, argv+1); /* look for tty name on command line */
@@ -202,10 +205,19 @@ main(argc, argv)
        exit(1);
 
     if (!ppp_available()) {
-       fprintf(stderr, no_ppp_msg);
+       option_error(no_ppp_msg);
        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);
+    }
+
     /*
      * Check that the options given are valid and consistent.
      */
@@ -215,8 +227,7 @@ main(argc, argv)
        if (protp->check_options != NULL)
            (*protp->check_options)();
     if (demand && connector == 0) {
-       fprintf(stderr, "%s: connect script required for demand-dialling\n",
-               progname);
+       option_error("connect script required for demand-dialling\n");
        exit(1);
     }
 
@@ -361,6 +372,8 @@ main(argc, argv)
 
     for (;;) {
 
+       need_holdoff = 1;
+
        if (demand) {
            /*
             * Don't do anything until we see some activity.
@@ -518,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.
@@ -559,7 +567,7 @@ main(argc, argv)
 
        if (demand)
            demand_discard();
-       if (holdoff > 0) {
+       if (holdoff > 0 && need_holdoff) {
            phase = PHASE_HOLDOFF;
            TIMEOUT(holdoff_end, NULL, holdoff);
            do {
@@ -863,7 +871,24 @@ timeleft(tvp)
 
     return tvp;
 }
-    
+
+
+/*
+ * kill_my_pg - send a signal to our process group, and ignore it ourselves.
+ */
+static void
+kill_my_pg(sig)
+    int sig;
+{
+    struct sigaction act, oldact;
+
+    act.sa_handler = SIG_IGN;
+    act.sa_flags = 0;
+    sigaction(sig, &act, &oldact);
+    kill(-getpgrp(), sig);
+    sigaction(sig, &oldact, NULL);
+}
+
 
 /*
  * hup - Catch SIGHUP signal.
@@ -878,6 +903,9 @@ hup(sig)
 {
     syslog(LOG_INFO, "Hangup (SIGHUP)");
     kill_link = 1;
+    if (conn_running)
+       /* Send the signal to the [dis]connector process(es) also */
+       kill_my_pg(sig);
 }
 
 
@@ -894,6 +922,9 @@ term(sig)
     syslog(LOG_INFO, "Terminating on signal %d.", sig);
     persist = 0;               /* don't try to restart */
     kill_link = 1;
+    if (conn_running)
+       /* Send the signal to the [dis]connector process(es) also */
+       kill_my_pg(sig);
 }
 
 
@@ -950,6 +981,8 @@ bad_signal(sig)
     int sig;
 {
     syslog(LOG_ERR, "Fatal signal %d", sig);
+    if (conn_running)
+       kill_my_pg(SIGTERM);
     die(1);
 }
 
@@ -967,9 +1000,11 @@ device_script(program, in, out)
     int status;
     int errfd;
 
+    conn_running = 1;
     pid = fork();
 
     if (pid < 0) {
+       conn_running = 0;
        syslog(LOG_ERR, "Failed to create child process: %m");
        die(1);
     }
@@ -1017,6 +1052,7 @@ device_script(program, in, out)
        syslog(LOG_ERR, "error waiting for (dis)connection process: %m");
        die(1);
     }
+    conn_running = 0;
 
     return (status == 0 ? 0 : -1);
 }
@@ -1292,7 +1328,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;
@@ -1300,10 +1340,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;
@@ -1392,7 +1432,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;