1 import sys, os, pwd, subprocess, errno, socket, select, mmap
12 if e.errno == errno.EEXIST:
19 p = subprocess.Popen(argv, stdout=subprocess.PIPE)
31 _username = pwd.getpwuid(uid)[0]
33 _username = 'user%d' % uid
43 _userfullname = pwd.getpwuid(uid)[4].split(',')[0]
45 _userfullname = 'user%d' % uid
53 _hostname = socket.getfqdn()
58 def __init__(self, inp, outp):
64 return self.inp.read(size)
68 return self.inp.readline()
70 def write(self, data):
71 #log('%d writing: %d bytes\n' % (os.getpid(), len(data)))
75 [rl, wl, xl] = select.select([self.inp.fileno()], [], [], 0)
77 assert(rl[0] == self.inp.fileno())
85 def drain_and_check_ok(self):
88 for rl in linereader(self.inp):
89 #log('%d got line: %r\n' % (os.getpid(), rl))
90 if not rl: # empty line
101 for rl in linereader(self.inp):
102 #log('%d got line: %r\n' % (os.getpid(), rl))
103 if not rl: # empty line
108 raise Exception('expected "ok", got %r' % rl)
109 raise Exception('server exited unexpectedly; see errors above')
120 def chunkyreader(f, count = None):
123 b = f.read(min(count, 65536))
125 raise IOError('EOF with %d bytes remaining' % count)
136 if s and not s.endswith('/'):
142 def _mmap_do(f, len, flags, prot):
144 st = os.fstat(f.fileno())
146 map = mmap.mmap(f.fileno(), len, flags, prot)
147 f.close() # map will persist beyond file close
151 def mmap_read(f, len = 0):
152 return _mmap_do(f, len, mmap.MAP_PRIVATE, mmap.PROT_READ)
155 def mmap_readwrite(f, len = 0):
156 return _mmap_do(f, len, mmap.MAP_SHARED, mmap.PROT_READ|mmap.PROT_WRITE)