]> granicus.if.org Git - php/commitdiff
Implements an openpty wrapper for solaris based systems
authorDavid Carlier <devnexen@gmail.com>
Mon, 15 Jun 2020 08:53:30 +0000 (09:53 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 16 Jun 2020 09:19:00 +0000 (11:19 +0200)
This is only used by proc_open pty support, and as such declared
directly there.

ext/standard/proc_open.c

index ba9fbbaa41476900e4fac2380de4d0536dcbd746..092c506dcfcc1c1e7c6ef2fac8ef70517e859376 100644 (file)
@@ -56,6 +56,63 @@ extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
 /* Mac OS X (and some BSDs) define `openpty` in <util.h> */
 #  include <util.h>
 # endif
+#elif defined(__sun)
+# include <fcntl.h>
+# include <stropts.h>
+# include <termios.h>
+# 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"