*** Python-2.2.1.orig/Modules/posixmodule.c Tue Mar 12 16:38:31 2002 --- Python-2.2.1/Modules/posixmodule.c Tue May 21 01:16:29 2002 *************** *** 1904,1910 **** } #endif ! #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) #ifdef HAVE_PTY_H #include #else --- 1904,1913 ---- } #endif ! #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(sun) ! #ifdef sun ! #include ! #endif #ifdef HAVE_PTY_H #include #else *************** *** 1914,1920 **** #endif /* HAVE_PTY_H */ #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ ! #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) static char posix_openpty__doc__[] = "openpty() -> (master_fd, slave_fd)\n\ Open a pseudo-terminal, returning open fd's for both master and slave end.\n"; --- 1917,1923 ---- #endif /* HAVE_PTY_H */ #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ ! #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(sun) static char posix_openpty__doc__[] = "openpty() -> (master_fd, slave_fd)\n\ Open a pseudo-terminal, returning open fd's for both master and slave end.\n"; *************** *** 1925,1932 **** int master_fd, slave_fd; #ifndef HAVE_OPENPTY char * slave_name; #endif ! if (!PyArg_ParseTuple(args, ":openpty")) return NULL; --- 1928,1941 ---- int master_fd, slave_fd; #ifndef HAVE_OPENPTY char * slave_name; + #ifdef sun + void *sig_saved; #endif ! #endif ! #if !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY) && defined(sun) ! extern char *ptsname(); ! #endif ! if (!PyArg_ParseTuple(args, ":openpty")) return NULL; *************** *** 1933,1939 **** #ifdef HAVE_OPENPTY if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0) return posix_error(); ! #else slave_name = _getpty(&master_fd, O_RDWR, 0666, 0); if (slave_name == NULL) return posix_error(); --- 1942,1948 ---- #ifdef HAVE_OPENPTY if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0) return posix_error(); ! #elif HAVE__GETPTY slave_name = _getpty(&master_fd, O_RDWR, 0666, 0); if (slave_name == NULL) return posix_error(); *************** *** 1941,1946 **** --- 1950,1966 ---- slave_fd = open(slave_name, O_RDWR); if (slave_fd < 0) return posix_error(); + #else + master_fd = open("/dev/ptmx", O_RDWR|O_NOCTTY); /* open master */ + sig_saved = signal(SIGCHLD, SIG_DFL); + grantpt(master_fd); /* change permission of slave */ + unlockpt(master_fd); /* unlock slave */ + signal(SIGCHLD,sig_saved); + slave_name = ptsname(master_fd); /* get name of slave */ + slave_fd = open(slave_name, O_RDWR); /* open slave */ + ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */ + ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm*/ + ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat*/ #endif /* HAVE_OPENPTY */ return Py_BuildValue("(ii)", master_fd, slave_fd); *************** *** 1948,1954 **** } #endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) */ ! #ifdef HAVE_FORKPTY static char posix_forkpty__doc__[] = "forkpty() -> (pid, master_fd)\n\ Fork a new process with a new pseudo-terminal as controlling tty.\n\n\ --- 1968,1974 ---- } #endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) */ ! #if defined(HAVE_FORKPTY) || defined(sun) static char posix_forkpty__doc__[] = "forkpty() -> (pid, master_fd)\n\ Fork a new process with a new pseudo-terminal as controlling tty.\n\n\ *************** *** 1959,1968 **** --- 1979,2067 ---- posix_forkpty(PyObject *self, PyObject *args) { int master_fd, pid; + #if defined(sun) + int slave; + char * slave_name; + void *sig_saved; + int fd; + #endif if (!PyArg_ParseTuple(args, ":forkpty")) return NULL; + #if defined(sun) + master_fd = open("/dev/ptmx", O_RDWR|O_NOCTTY); /* open master */ + sig_saved = signal(SIGCHLD, SIG_DFL); + grantpt(master_fd); /* change permission of slave */ + unlockpt(master_fd); /* unlock slave */ + signal(SIGCHLD,sig_saved); + slave_name = ptsname(master_fd); /* get name of slave */ + slave = open(slave_name, O_RDWR); /* open slave */ + ioctl(slave, I_PUSH, "ptem"); /* push ptem */ + ioctl(slave, I_PUSH, "ldterm"); /* push ldterm*/ + ioctl(slave, I_PUSH, "ttcompat"); /* push ttcompat*/ + if (master_fd < 0 || slave < 0) + { + return posix_error(); + } + switch (pid = fork()) { + case -1: + return posix_error(); + case 0: + /* First disconnect from the old controlling tty. */ + #ifdef TIOCNOTTY + fd = open("/dev/tty", O_RDWR | O_NOCTTY); + if (fd >= 0) { + (void) ioctl(fd, TIOCNOTTY, NULL); + close(fd); + } + #endif /* TIOCNOTTY */ + if (setsid() < 0) + return posix_error(); + + /* + * Verify that we are successfully disconnected from the controlling + * tty. + */ + fd = open("/dev/tty", O_RDWR | O_NOCTTY); + if (fd >= 0) { + return posix_error(); + close(fd); + } + /* Make it our controlling tty. */ + #ifdef TIOCSCTTY + if (ioctl(slave, TIOCSCTTY, NULL) < 0) + return posix_error(); + #endif /* TIOCSCTTY */ + fd = open(slave_name, O_RDWR); + if (fd < 0) { + return posix_error(); + } else { + close(fd); + } + /* Verify that we now have a controlling tty. */ + fd = open("/dev/tty", O_WRONLY); + if (fd < 0) + return posix_error(); + else { + close(fd); + } + (void) close(master_fd); + (void) dup2(slave, 0); + (void) dup2(slave, 1); + (void) dup2(slave, 2); + if (slave > 2) + (void) close(slave); + pid = 0; + break; + defautlt: + /* + * parent + */ + (void) close(slave); + } + #else pid = forkpty(&master_fd, NULL, NULL, NULL); + #endif if (pid == -1) return posix_error(); if (pid == 0) *************** *** 5607,5616 **** #ifdef HAVE_FORK {"fork", posix_fork, METH_VARARGS, posix_fork__doc__}, #endif /* HAVE_FORK */ ! #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) {"openpty", posix_openpty, METH_VARARGS, posix_openpty__doc__}, #endif /* HAVE_OPENPTY || HAVE__GETPTY */ ! #ifdef HAVE_FORKPTY {"forkpty", posix_forkpty, METH_VARARGS, posix_forkpty__doc__}, #endif /* HAVE_FORKPTY */ #ifdef HAVE_GETEGID --- 5706,5715 ---- #ifdef HAVE_FORK {"fork", posix_fork, METH_VARARGS, posix_fork__doc__}, #endif /* HAVE_FORK */ ! #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(sun) {"openpty", posix_openpty, METH_VARARGS, posix_openpty__doc__}, #endif /* HAVE_OPENPTY || HAVE__GETPTY */ ! #if defined(HAVE_FORKPTY) || defined(sun) {"forkpty", posix_forkpty, METH_VARARGS, posix_forkpty__doc__}, #endif /* HAVE_FORKPTY */ #ifdef HAVE_GETEGID