[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)