$OpenBSD: patch-pty_c,v 1.1 2003/09/26 23:50:55 brad Exp $ --- pty.c.orig 2003-09-08 10:26:18.000000000 -0400 +++ pty.c 2003-09-13 04:18:35.000000000 -0400 @@ -29,6 +29,23 @@ #include "config.h" #include "screen.h" +#if HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if SYSNDIR +# include +# endif +# if SYSDIR +# include +# endif +# if NDIR +# include +# endif +#endif + #ifndef sun # include #endif @@ -337,25 +354,25 @@ int OpenPTY(ttyn) char **ttyn; { - register char *p, *q, *l, *d; - register int f; + DIR *devdir; + struct dirent *candidate; + int f; - debug("OpenPTY: Using BSD style ptys.\n"); - strcpy(PtyName, PtyProto); - strcpy(TtyName, TtyProto); - for (p = PtyName; *p != 'X'; p++) - ; - for (q = TtyName; *q != 'X'; q++) - ; - for (l = PTYRANGE0; (*p = *l) != '\0'; l++) + debug("OpenPTY: Using BSD style ptys, dynamic range.\n"); + + devdir = opendir("/dev"); + if (!devdir) + return -1; + while (candidate = readdir(devdir)) { - for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++) + if (NAMLEN(candidate) == 5 && strncmp(candidate->d_name, "pty", 3) == 0) { + sprintf(PtyName, "/dev/%s", candidate->d_name); debug1("OpenPTY tries '%s'\n", PtyName); if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) continue; - q[0] = *l; - q[1] = *d; + strcpy(TtyName, PtyName); + TtyName[5] = 't'; if (eff_uid && access(TtyName, R_OK | W_OK)) { close(f); @@ -378,9 +395,11 @@ char **ttyn; #endif initmaster(f); *ttyn = TtyName; + closedir(devdir); return f; } } + closedir(devdir); return -1; } #endif