From db256336b89f29cb60b18c0e551493c847ca758d Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Thu, 26 Jan 2006 01:33:26 +0000 Subject: [PATCH] Teach openpty() how to deal with pts. --- lib/libutil/pty.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/lib/libutil/pty.c b/lib/libutil/pty.c index b230edb113af..553468ccf1c4 100644 --- a/lib/libutil/pty.c +++ b/lib/libutil/pty.c @@ -53,6 +53,48 @@ static char sccsid[] = "@(#)pty.c 8.3 (Berkeley) 5/16/94"; #include #include +int __use_pts(void); + +static int +new_openpty(int *amaster, int *aslave, char *name, struct termios *termp, + struct winsize *winp) +{ + int master, slave; + + master = posix_openpt(O_RDWR); + if (master == -1) + return (-1); + + if (grantpt(master) == -1) { + close(master); + return (-1); + } + + slave = open(ptsname(master), O_RDWR); + if (slave == -1) { + close(master); + return (-1); + } + + if (unlockpt(master) == -1) { + close(master); + close(slave); + return (-1); + } + + *amaster = master; + *aslave = slave; + + if (name) + strcpy(name, ptsname(master)); + if (termp) + tcsetattr(slave, TCSAFLUSH, termp); + if (winp) + ioctl(slave, TIOCSWINSZ, (char *)winp); + + return (0); +} + int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) { @@ -61,6 +103,9 @@ openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct win int master, slave, ttygid; struct group *gr; + if (__use_pts()) + return (new_openpty(amaster, aslave, name, termp, winp)); + if ((gr = getgrnam("tty")) != NULL) ttygid = gr->gr_gid; else