From: David Carlier Date: Mon, 15 Jun 2020 08:53:30 +0000 (+0100) Subject: Implements an openpty wrapper for solaris based systems X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15b2cc7c289af9aed896a85b775372d1633fe54b;p=php Implements an openpty wrapper for solaris based systems This is only used by proc_open pty support, and as such declared directly there. --- diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index ba9fbbaa41..092c506dcf 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -56,6 +56,63 @@ extern int openpty(int *, int *, char *, struct termios *, struct winsize *); /* Mac OS X (and some BSDs) define `openpty` in */ # include # endif +#elif defined(__sun) +# include +# include +# include +# define HAVE_OPENPTY 1 + +/* Solaris/Illumos does not have any openpty implementation */ +int openpty(int *master, int *slave, char *name, struct termios *termp, struct winsize *winp) +{ + int fd, sd; + const char *slaveid; + + assert(master); + assert(slave); + + sd = *master = *slave = -1; + fd = open("/dev/ptmx", O_NOCTTY|O_RDWR); + if (fd == -1) { + return -1; + } + /* Checking if we can have to the pseudo terminal */ + if (grantpt(fd) != 0 || unlockpt(fd) != 0) { + goto fail; + } + slaveid = ptsname(fd); + if (!slaveid) { + goto fail; + } + + /* Getting the slave path and pushing pseudo terminal */ + sd = open(slaveid, O_NOCTTY|O_RDONLY); + if (sd == -1 || ioctl(sd, I_PUSH, "ptem") == -1) { + goto fail; + } + if (termp) { + if (tcgetattr(sd, termp) < 0) { + goto fail; + } + } + if (winp) { + if (ioctl(sd, TIOCSWINSZ, winp) == -1) { + goto fail; + } + } + + *slave = sd; + *master = fd; + return 0; +fail: + if (sd != -1) { + close(sd); + } + if (fd != -1) { + close(fd); + } + return -1; +} #endif #include "proc_open.h"