]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
Add set and reset options to control environment variables for scripts.
[ppp.git] / pppd / sys-linux.c
index e23315a3486a583092aa9796e3d77a4f58a881dc..b675c9765718c26ef9d547ac9d1f5f4cb9dca0ae 100644 (file)
@@ -848,6 +848,30 @@ struct speed {
 #endif
 #ifdef B921600
     { 921600, B921600 },
+#endif
+#ifdef B1000000
+    { 1000000, B1000000 },
+#endif
+#ifdef B1152000
+    { 1152000, B1152000 },
+#endif
+#ifdef B1500000
+    { 1500000, B1500000 },
+#endif
+#ifdef B2000000
+    { 2000000, B2000000 },
+#endif
+#ifdef B2500000
+    { 2500000, B2500000 },
+#endif
+#ifdef B3000000
+    { 3000000, B3000000 },
+#endif
+#ifdef B3500000
+    { 3500000, B3500000 },
+#endif
+#ifdef B4000000
+    { 4000000, B4000000 },
 #endif
     { 0, 0 }
 };
@@ -1634,6 +1658,8 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
 
+    rt.rt_dev = ifname;
+
     if (kernel_version > KVERSION(2,1,0)) {
        SET_SA_FAMILY (rt.rt_genmask, AF_INET);
        SIN_ADDR(rt.rt_genmask) = 0L;
@@ -1992,20 +2018,12 @@ ppp_registered(void)
 
 int ppp_available(void)
 {
-    int s, ok, fd;
+    int s, ok, fd, err;
     struct ifreq ifr;
     int    size;
     int    my_version, my_modification, my_patch;
     int osmaj, osmin, ospatch;
 
-    no_ppp_msg =
-       "This system lacks kernel support for PPP.  This could be because\n"
-       "the PPP kernel module could not be loaded, or because PPP was not\n"
-       "included in the kernel configuration.  If PPP was included as a\n"
-       "module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
-       "ppp.o exists in /lib/modules/`uname -r`/net.\n"
-       "See README.linux file in the ppp distribution for more details.\n";
-
     /* get the kernel version now, since we are called before sys_init */
     uname(&utsname);
     osmaj = osmin = ospatch = 0;
@@ -2013,21 +2031,6 @@ int ppp_available(void)
     kernel_version = KVERSION(osmaj, osmin, ospatch);
 
     fd = open("/dev/ppp", O_RDWR);
-#if 0
-    if (fd < 0 && errno == ENOENT) {
-       /* try making it and see if that helps. */
-       if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
-                 makedev(108, 0)) >= 0) {
-           fd = open("/dev/ppp", O_RDWR);
-           if (fd >= 0)
-               info("Created /dev/ppp device node");
-           else
-               unlink("/dev/ppp");     /* didn't work, undo the mknod */
-       } else if (errno == EEXIST) {
-           fd = open("/dev/ppp", O_RDWR);
-       }
-    }
-#endif /* 0 */
     if (fd >= 0) {
        new_style_driver = 1;
 
@@ -2038,16 +2041,30 @@ int ppp_available(void)
        close(fd);
        return 1;
     }
+    err = errno;
+
     if (kernel_version >= KVERSION(2,3,13)) {
+       error("Couldn't open the /dev/ppp device: %m");
        if (errno == ENOENT)
            no_ppp_msg =
-               "pppd is unable to open the /dev/ppp device.\n"
                "You need to create the /dev/ppp device node by\n"
                "executing the following command as root:\n"
                "       mknod /dev/ppp c 108 0\n";
+       else if (errno == ENODEV || errno == ENXIO)
+           no_ppp_msg =
+               "Please load the ppp_generic kernel module.\n";
        return 0;
     }
 
+    /* we are running on a really really old kernel */
+    no_ppp_msg =
+       "This system lacks kernel support for PPP.  This could be because\n"
+       "the PPP kernel module could not be loaded, or because PPP was not\n"
+       "included in the kernel configuration.  If PPP was included as a\n"
+       "module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
+       "ppp.o exists in /lib/modules/`uname -r`/net.\n"
+       "See README.linux file in the ppp distribution for more details.\n";
+
 /*
  * Open a socket for doing the ioctl operations.
  */
@@ -2322,11 +2339,13 @@ int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
 /*
  *  Set the gateway address
  */
-    SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
-    if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
-       if (! ok_error (errno))
-           error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__);
-       return (0);
+    if (his_adr != 0) {
+       SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
+       if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
+           if (! ok_error (errno))
+               error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__);
+           return (0);
+       }
     }
 /*
  *  Set the netmask.