home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / pty.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  3.6 KB  |  174 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. from select import select
  5. import os
  6. import tty
  7. __all__ = [
  8.     'openpty',
  9.     'fork',
  10.     'spawn']
  11. STDIN_FILENO = 0
  12. STDOUT_FILENO = 1
  13. STDERR_FILENO = 2
  14. CHILD = 0
  15.  
  16. def openpty():
  17.     
  18.     try:
  19.         return os.openpty()
  20.     except (AttributeError, OSError):
  21.         pass
  22.  
  23.     (master_fd, slave_name) = _open_terminal()
  24.     slave_fd = slave_open(slave_name)
  25.     return (master_fd, slave_fd)
  26.  
  27.  
  28. def master_open():
  29.     
  30.     try:
  31.         (master_fd, slave_fd) = os.openpty()
  32.     except (AttributeError, OSError):
  33.         pass
  34.  
  35.     slave_name = os.ttyname(slave_fd)
  36.     os.close(slave_fd)
  37.     return (master_fd, slave_name)
  38.     return _open_terminal()
  39.  
  40.  
  41. def _open_terminal():
  42.     
  43.     try:
  44.         import sgi
  45.     except ImportError:
  46.         pass
  47.  
  48.     
  49.     try:
  50.         (tty_name, master_fd) = sgi._getpty(os.O_RDWR, 438, 0)
  51.     except IOError:
  52.         msg = None
  53.         raise os.error, msg
  54.  
  55.     return (master_fd, tty_name)
  56.     for x in 'pqrstuvwxyzPQRST':
  57.         for y in '0123456789abcdef':
  58.             pty_name = '/dev/pty' + x + y
  59.             
  60.             try:
  61.                 fd = os.open(pty_name, os.O_RDWR)
  62.             except os.error:
  63.                 continue
  64.  
  65.             return (fd, '/dev/tty' + x + y)
  66.         
  67.     
  68.     raise os.error, 'out of pty devices'
  69.  
  70.  
  71. def slave_open(tty_name):
  72.     result = os.open(tty_name, os.O_RDWR)
  73.     
  74.     try:
  75.         ioctl = ioctl
  76.         I_PUSH = I_PUSH
  77.         import fcntl
  78.     except ImportError:
  79.         return result
  80.  
  81.     
  82.     try:
  83.         ioctl(result, I_PUSH, 'ptem')
  84.         ioctl(result, I_PUSH, 'ldterm')
  85.     except IOError:
  86.         pass
  87.  
  88.     return result
  89.  
  90.  
  91. def fork():
  92.     
  93.     try:
  94.         (pid, fd) = os.forkpty()
  95.     except (AttributeError, OSError):
  96.         pass
  97.  
  98.     if pid == CHILD:
  99.         
  100.         try:
  101.             os.setsid()
  102.         except OSError:
  103.             pass
  104.         
  105.  
  106.     return (pid, fd)
  107.     (master_fd, slave_fd) = openpty()
  108.     pid = os.fork()
  109.     if pid == CHILD:
  110.         os.setsid()
  111.         os.close(master_fd)
  112.         os.dup2(slave_fd, STDIN_FILENO)
  113.         os.dup2(slave_fd, STDOUT_FILENO)
  114.         os.dup2(slave_fd, STDERR_FILENO)
  115.         if slave_fd > STDERR_FILENO:
  116.             os.close(slave_fd)
  117.         tmp_fd = os.open(os.ttyname(STDOUT_FILENO), os.O_RDWR)
  118.         os.close(tmp_fd)
  119.     else:
  120.         os.close(slave_fd)
  121.     return (pid, master_fd)
  122.  
  123.  
  124. def _writen(fd, data):
  125.     while data != '':
  126.         n = os.write(fd, data)
  127.         data = data[n:]
  128.  
  129.  
  130. def _read(fd):
  131.     return os.read(fd, 1024)
  132.  
  133.  
  134. def _copy(master_fd, master_read = _read, stdin_read = _read):
  135.     while None:
  136.         (rfds, wfds, xfds) = select([
  137.             master_fd,
  138.             STDIN_FILENO], [], [])
  139.         if master_fd in rfds:
  140.             data = master_read(master_fd)
  141.             os.write(STDOUT_FILENO, data)
  142.         if STDIN_FILENO in rfds:
  143.             data = stdin_read(STDIN_FILENO)
  144.             _writen(master_fd, data)
  145.             continue
  146.             continue
  147.             return None
  148.  
  149.  
  150. def spawn(argv, master_read = _read, stdin_read = _read):
  151.     if type(argv) == type(''):
  152.         argv = (argv,)
  153.     (pid, master_fd) = fork()
  154.     if pid == CHILD:
  155.         os.execlp(argv[0], *argv)
  156.     
  157.     try:
  158.         mode = tty.tcgetattr(STDIN_FILENO)
  159.         tty.setraw(STDIN_FILENO)
  160.         restore = 1
  161.     except tty.error:
  162.         restore = 0
  163.  
  164.     
  165.     try:
  166.         _copy(master_fd, master_read, stdin_read)
  167.     except (IOError, OSError):
  168.         if restore:
  169.             tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
  170.         
  171.  
  172.     os.close(master_fd)
  173.  
  174.