blob: d2867c616b73a370dc0c8937f5445b131e951025 [file] [log] [blame]
Guido van Rossum9a22de11995-01-12 12:29:47 +00001import os
2import sys
3import string
4
5MAXFD = 100 # Max number of file descriptors (os.getdtablesize()???)
6
Guido van Rossumcaa9f231997-04-21 14:15:55 +00007def _popen2(cmd, capturestderr=0):
Guido van Rossum971ee131995-08-07 20:17:23 +00008 cmd = ['/bin/sh', '-c', cmd]
Guido van Rossum9a22de11995-01-12 12:29:47 +00009 p2cread, p2cwrite = os.pipe()
10 c2pread, c2pwrite = os.pipe()
Guido van Rossumcaa9f231997-04-21 14:15:55 +000011 if capturestderr:
12 errout, errin = os.pipe()
Guido van Rossum9a22de11995-01-12 12:29:47 +000013 pid = os.fork()
14 if pid == 0:
15 # Child
16 os.close(0)
17 os.close(1)
18 if os.dup(p2cread) <> 0:
19 sys.stderr.write('popen2: bad read dup\n')
20 if os.dup(c2pwrite) <> 1:
21 sys.stderr.write('popen2: bad write dup\n')
Guido van Rossumcaa9f231997-04-21 14:15:55 +000022 if capturestderr:
23 os.close(2)
24 if os.dup(errin) <> 2: pass
Guido van Rossum9a22de11995-01-12 12:29:47 +000025 for i in range(3, MAXFD):
26 try:
27 os.close(i)
Guido van Rossumcaa9f231997-04-21 14:15:55 +000028 except: pass
Guido van Rossum9a22de11995-01-12 12:29:47 +000029 try:
30 os.execv(cmd[0], cmd)
31 finally:
32 os._exit(1)
33 # Shouldn't come here, I guess
34 os._exit(1)
35 os.close(p2cread)
36 tochild = os.fdopen(p2cwrite, 'w')
37 os.close(c2pwrite)
38 fromchild = os.fdopen(c2pread, 'r')
Guido van Rossumcaa9f231997-04-21 14:15:55 +000039 if capturestderr:
40 os.close(errin)
41 childerr = os.fdopen(errout, 'r')
42 return fromchild, tochild, childerr
43 else:
44 return fromchild, tochild, None
45
46def popen2(cmd):
47 return _popen2(cmd, 0)[:2]
48
49def popen3(cmd):
50 return _popen2(cmd, 1)