Support for /dev/ptm was added over 8 years ago.  I think we can
safely rely on it being available by now.

ok?


Index: pty.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/lib/libutil/pty.c,v
retrieving revision 1.15
diff -u -p -r1.15 pty.c
--- pty.c       30 Mar 2006 20:44:19 -0000      1.15
+++ pty.c       26 Apr 2012 05:31:04 -0000
@@ -44,34 +44,23 @@
 
 #include "util.h"
 
-#define TTY_LETTERS "pqrstuvwxyzPQRST"
-#define TTY_SUFFIX 
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-
 int
 openpty(int *amaster, int *aslave, char *name, struct termios *termp,
     struct winsize *winp)
 {
-       char line[] = "/dev/ptyXX";
-       const char *cp1, *cp2;
        int master, slave, fd;
        struct ptmget ptm;
-       struct group *gr;
-       gid_t ttygid;
 
        /*
-        * Try to use /dev/ptm and the PTMGET ioctl to get a properly set up
-        * and owned pty/tty pair. If this fails, (because we might not have
-        * the ptm device, etc.) fall back to using the traditional method
-        * of walking through the pty entries in /dev for the moment, until
-        * there is less chance of people being seriously boned by running
-        * kernels without /dev/ptm in them.
+        * Use /dev/ptm and the PTMGET ioctl to get a properly set up and
+        * owned pty/tty pair.
         */
        fd = open(PATH_PTMDEV, O_RDWR, 0);
        if (fd == -1)
-               goto walkit;
+               return (-1);
        if ((ioctl(fd, PTMGET, &ptm) == -1)) {
                close(fd);
-               goto walkit;
+               return (-1);
        }
        close(fd);
        master = ptm.cfd;
@@ -89,49 +78,6 @@ openpty(int *amaster, int *aslave, char 
        if (winp)
                (void) ioctl(slave, TIOCSWINSZ, winp);
        return (0);
- walkit:
-       if ((gr = getgrnam("tty")) != NULL)
-               ttygid = gr->gr_gid;
-       else
-               ttygid = (gid_t)-1;
-
-       for (cp1 = TTY_LETTERS; *cp1; cp1++) {
-               line[8] = *cp1;
-               for (cp2 = TTY_SUFFIX; *cp2; cp2++) {
-                       line[9] = *cp2;
-                       line[5] = 'p';
-                       if ((master = open(line, O_RDWR, 0)) == -1) {
-                               if (errno == ENOENT)
-                                       return (-1);    /* out of ptys */
-                       } else {
-                               line[5] = 't';
-                               (void) chown(line, getuid(), ttygid);
-                               (void) chmod(line, S_IRUSR|S_IWUSR|S_IWGRP);
-                               (void) revoke(line);
-                               if ((slave = open(line, O_RDWR, 0)) != -1) {
-                                       *amaster = master;
-                                       *aslave = slave;
-                                       if (name) {
-                                               /*
-                                                * Manual page says "at least
-                                                * 16 characters".
-                                                */
-                                               strlcpy(name, line, 16);
-                                       }
-                                       if (termp)
-                                               (void) tcsetattr(slave,
-                                                   TCSAFLUSH, termp);
-                                       if (winp)
-                                               (void) ioctl(slave, TIOCSWINSZ,
-                                                   winp);
-                                       return (0);
-                               }
-                               (void) close(master);
-                       }
-               }
-       }
-       errno = ENOENT; /* out of ptys */
-       return (-1);
 }
 
 pid_t

Reply via email to