[Python-checkins] CVS: python/dist/src/Lib pty.py,1.3,1.4
Fred L. Drake
python-dev@python.org
Wed, 28 Jun 2000 09:40:40 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory slayer.i.sourceforge.net:/tmp/cvs-serv20497/Lib
Modified Files:
pty.py
Log Message:
Thomas Wouters <thomas@xs4all.net>:
This patch adds the openpty() and forkpty() library calls to posixmodule.c,
when they are available on the target
system. (glibc-2.1-based Linux systems, FreeBSD and BSDI at least, probably
the other BSD-based systems as well.)
Lib/pty.py is also rewritten to use openpty when available, but falls
back to the old SGI method or the "manual" BSD open-a-pty
code. Openpty() is necessary to use the Unix98 ptys under Linux 2.2,
or when using non-standard tty names under (at least) BSDI, which is
why I needed it, myself ;-) forkpty() is included for symmetry.
Index: pty.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pty.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** pty.py 2000/02/04 15:10:34 1.3
--- pty.py 2000/06/28 16:40:38 1.4
***************
*** 17,23 ****
CHILD = 0
def master_open():
"""Open pty master and return (master_fd, tty_name).
! SGI and Linux/BSD version."""
try:
import sgi
--- 17,51 ----
CHILD = 0
+ def openpty():
+ """openpty() -> (master_fd, slave_fd)
+ Open a pty master/slave pair, using os.openpty() if possible."""
+
+ try:
+ return os.openpty()
+ except (AttributeError, OSError):
+ pass
+ master_fd, slave_name = _open_terminal()
+ slave_fd = _slave_open(slave_name)
+ return master_fd, slave_fd
+
def master_open():
+ """master_open() -> (master_fd, slave_name)
+ Open a pty master and return the fd, and the filename of the slave end.
+ Deprecated, use openpty() instead."""
+
+ try:
+ master_fd, slave_fd = os.openpty()
+ except (AttributeError, OSError):
+ pass
+ else:
+ slave_name = os.ttyname(slave_fd)
+ os.close(slave_fd)
+ return master_fd, slave_name
+
+ return _open_terminal()
+
+ def _open_terminal():
"""Open pty master and return (master_fd, tty_name).
! SGI and generic BSD version, for when openpty() fails."""
try:
import sgi
***************
*** 41,60 ****
def slave_open(tty_name):
! """Open the pty slave and acquire the controlling terminal.
! Return the file descriptor. Linux version."""
! # (Should be universal? --Guido)
return os.open(tty_name, FCNTL.O_RDWR)
def fork():
! """Fork and make the child a session leader with a controlling terminal.
! Return (pid, master_fd)."""
! master_fd, tty_name = master_open()
pid = os.fork()
if pid == CHILD:
# Establish a new session.
os.setsid()
-
- # Acquire controlling terminal.
- slave_fd = slave_open(tty_name)
os.close(master_fd)
--- 69,101 ----
def slave_open(tty_name):
! """slave_open(tty_name) -> slave_fd
! Open the pty slave and acquire the controlling terminal, returning
! opened filedescriptor.
! Deprecated, use openpty() instead."""
!
return os.open(tty_name, FCNTL.O_RDWR)
def fork():
! """fork() -> (pid, master_fd)
! Fork and make the child a session leader with a controlling terminal."""
!
! try:
! pid, fd = os.forkpty()
! except (AttributeError, OSError):
! pass
! else:
! if pid == CHILD:
! try:
! os.setsid()
! except OSError:
! # os.forkpty() already set us session leader
! pass
! return pid, fd
!
! master_fd, slave_fd = openpty()
pid = os.fork()
if pid == CHILD:
# Establish a new session.
os.setsid()
os.close(master_fd)
***************
*** 69,73 ****
return pid, master_fd
! def writen(fd, data):
"""Write all the data to a descriptor."""
while data != '':
--- 110,114 ----
return pid, master_fd
! def _writen(fd, data):
"""Write all the data to a descriptor."""
while data != '':
***************
*** 75,83 ****
data = data[n:]
! def read(fd):
"""Default read function."""
return os.read(fd, 1024)
! def copy(master_fd, master_read=read, stdin_read=read):
"""Parent copy loop.
Copies
--- 116,124 ----
data = data[n:]
! def _read(fd):
"""Default read function."""
return os.read(fd, 1024)
! def _copy(master_fd, master_read=_read, stdin_read=_read):
"""Parent copy loop.
Copies
***************
*** 92,98 ****
if STDIN_FILENO in rfds:
data = stdin_read(STDIN_FILENO)
! writen(master_fd, data)
! def spawn(argv, master_read=read, stdin_read=read):
"""Create a spawned process."""
if type(argv) == type(''):
--- 133,139 ----
if STDIN_FILENO in rfds:
data = stdin_read(STDIN_FILENO)
! _writen(master_fd, data)
! def spawn(argv, master_read=_read, stdin_read=_read):
"""Create a spawned process."""
if type(argv) == type(''):
***************
*** 104,108 ****
tty.setraw(STDIN_FILENO)
try:
! copy(master_fd, master_read, stdin_read)
except:
tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
--- 145,149 ----
tty.setraw(STDIN_FILENO)
try:
! _copy(master_fd, master_read, stdin_read)
except:
tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)