]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/sys-linux.c
couple more get_pty's
[ppp.git] / pppd / sys-linux.c
index 718a678bfbc4a4abf3af87d0547636b0a3b8a5a8..43855a932afaff000fc419412e873aca7ce17612 100644 (file)
@@ -1571,47 +1571,39 @@ ppp_registered(void)
 {
     int local_fd;
     int init_disc = -1;
-    int initfdflags;
+    int mfd = -1;
+    int ret = 0;
 
-    local_fd = open(devnam, O_NONBLOCK | O_RDWR, 0);
-    if (local_fd < 0) {
-       error("Failed to open %s: %m(%d)", devnam, errno);
-       return 0;
-    }
-
-    initfdflags = fcntl(local_fd, F_GETFL);
-    if (initfdflags == -1) {
-       error("Couldn't get device fd flags: %m(%d)", errno);
-       close (local_fd);
-       return 0;
+    if (devnam[0] == 0) {
+       /* running with notty or pty option */
+       char slave[16];
+       if (!get_pty(&mfd, &local_fd, slave, 0))
+           return 0;
+    } else {
+       local_fd = open(devnam, O_NONBLOCK | O_RDWR, 0);
+       if (local_fd < 0) {
+           error("Failed to open %s: %m(%d)", devnam, errno);
+           return 0;
+       }
     }
 
-    initfdflags &= ~O_NONBLOCK;
-    fcntl(local_fd, F_SETFL, initfdflags);
 /*
- * Read the initial line dicipline and try to put the device into the
+ * Read the initial line discipline and try to put the device into the
  * PPP dicipline.
  */
     if (ioctl(local_fd, TIOCGETD, &init_disc) < 0) {
        error("ioctl(TIOCGETD): %m(%d)", errno);
-       close (local_fd);
-       return 0;
-    }
-    
-    if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
-       error("ioctl(TIOCSETD): %m(%d)", errno);
-       close (local_fd);
-       return 0;
-    }
-    
-    if (ioctl(local_fd, TIOCSETD, &init_disc) < 0) {
-       error("ioctl(TIOCSETD): %m(%d)", errno);
-       close (local_fd);
-       return 0;
-    }
+    } else if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
+       error("ioctl(TIOCSETD(PPP)): %m(%d)", errno);
+    } else if (ioctl(local_fd, TIOCSETD, &init_disc) < 0) {
+       error("ioctl(TIOCSETD(%d)): %m(%d)", init_disc, errno);
+    } else
+       ret = 1;
     
     close (local_fd);
-    return 1;
+    if (mfd >= 0)
+       close(mfd);
+    return ret;
 }
 
 /********************************************************************
@@ -1661,7 +1653,7 @@ int ppp_available(void)
          "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.6 distribution.\n";
+         "ppp-2.3.7 distribution.\n";
 
 /*
  *  This is the PPP device. Validate the version of the driver at this