]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
mods to get it to compile better on linux
[ppp.git] / pppd / sys-linux.c
index c86d668d8ddda4a6e07e1909019b0cdd806771ca..e92f6845a825b75d6fe043ef8ee52715677bab25 100644 (file)
@@ -86,6 +86,7 @@ static int has_proxy_arp       = 0;
 static int driver_version      = 0;
 static int driver_modification = 0;
 static int driver_patch        = 0;
+static int driver_is_old       = 0;
 static int restore_term        = 0;    /* 1 => we've munged the terminal */
 static struct termios inittermios;     /* Initial TTY termios */
 
@@ -754,7 +755,7 @@ void output (int unit, unsigned char *p, int len)
   {
     if (debug)
       {
-        log_packet(p, len, "sent ");
+        log_packet(p, len, "sent ", LOG_DEBUG);
       }
     
     if (write(ppp_fd, p, len) < 0)
@@ -1258,13 +1259,13 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
 
     if (defaultroute_exists(&rt))
       {
-       u_int32_t old_gateway = ((struct sockaddr_in *) (&rt.rt_gateway))->
-                               sin_addr.s_addr;
+       struct in_addr old_gateway =
+         ((struct sockaddr_in *) (&rt.rt_gateway))-> sin_addr;
 
-       if (old_gateway != gateway)
+       if (old_gateway.s_addr != gateway)
          {
            syslog (LOG_ERR,
-                   "ppp not replacing existing default route to %s[%s]",
+                   "not replacing existing default route to %s [%s]",
                    rt.rt_dev,
                    inet_ntoa (old_gateway));
          }
@@ -1749,9 +1750,10 @@ int ppp_available(void)
     if (!ok)
       {
        no_ppp_msg = 
-         "This system lacks kernel support for PPP. To include PPP support\n"
-         "in the kernel, please follow the steps detailed in the "
-         "README.linux\nfile in the ppp-2.3 distribution.\n";
+         "This system lacks kernel support for PPP.  This could be because\n"
+         "the PPP kernel module is not loaded, or because the kernel is\n"
+         "not configured for PPP.  See the README.linux file in the\n"
+         "ppp-2.3.1 distribution.\n";
       }
 /*
  *  This is the PPP device. Validate the version of the driver at this
@@ -1796,7 +1798,12 @@ int ppp_available(void)
        /* The modification levels must be legal */
        if (driver_modification < my_modification)
          {
-           ok = 0;
+           if (driver_modification >= 2) {
+             /* we can cope with 2.2.0 and above */
+             driver_is_old = 1;
+           } else {
+             ok = 0;
+           }
          }
 
        close (s);
@@ -2292,15 +2299,27 @@ int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
 void
 open_ppp_loopback(void)
   {
-    int            flags;
+    int flags, i;
     struct termios tios;
 
-    if (openpty (&master_fd, &slave_fd, loop_name, NULL, NULL) < 0)
-      {
-       syslog(LOG_ERR, "No free pty for loopback");
-       die(1);
-      }
+    master_fd = -1;
+    for (i = 0; i < 64; ++i) {
+      sprintf(loop_name, "/dev/pty%c%x", 'p' + i / 16, i % 16);
+      master_fd = open(loop_name, O_RDWR, 0);
+      if (master_fd >= 0)
+       break;
+    }
+    if (master_fd < 0) {
+      syslog(LOG_ERR, "No free pty for loopback");
+      die(1);
+    }
     SYSDEBUG((LOG_DEBUG, "using %s for loopback", loop_name));
+    loop_name[5] = 't';
+    slave_fd = open(loop_name, O_RDWR, 0);
+    if (slave_fd < 0) {
+      syslog(LOG_ERR, "Couldn't open %s for loopback: %m", loop_name);
+      die(1);
+    }
 
     set_ppp_fd(slave_fd);
 
@@ -2517,6 +2536,30 @@ int cipxfaddr (int unit)
     return result;
   }
 
+/*
+ * daemon - Detach us from controlling terminal session.
+ */
+int
+daemon(nochdir, noclose)
+    int nochdir, noclose;
+{
+    int pid;
+
+    if ((pid = fork()) < 0)
+       return -1;
+    if (pid != 0)
+       exit(0);                /* parent dies */
+    setsid();
+    if (!nochdir)
+       chdir("/");
+    if (!noclose) {
+       fclose(stdin);          /* don't need stdin, stdout, stderr */
+       fclose(stdout);
+       fclose(stderr);
+    }
+    return 0;
+}
+
 /********************************************************************
  *
  * sys_check_options - check the options that the user specified
@@ -2547,4 +2590,10 @@ sys_check_options(void)
        break;
       }
 #endif
+    if (demand && driver_is_old) {
+      option_error("demand dialling is not supported by kernel driver version "
+                  "%d.%d.%d", driver_version, driver_modification,
+                  driver_patch);
+      demand = 0;
+    }
   }