if fix_stdout or fix_stderr:
amt = (fix_stdout and 1 or 0) + (fix_stderr and 2 or 0)
os.environ['BUP_FORCE_TTY'] = str(amt)
+ os.setsid() # make sure ctrl-c is sent just to us, not to child too
if fix_stdout or fix_stderr:
realf = fix_stderr and 2 or 1
n = subprocess.Popen([subpath('newliner')],
stdin=subprocess.PIPE, stdout=os.dup(realf),
close_fds=True, preexec_fn=force_tty)
- outf = fix_stdout and n.stdin.fileno() or 1
- errf = fix_stderr and n.stdin.fileno() or 2
+ outf = fix_stdout and n.stdin.fileno() or None
+ errf = fix_stderr and n.stdin.fileno() or None
else:
n = None
- outf = 1
- errf = 2
+ outf = None
+ errf = None
class SigException(Exception):
- pass
+ def __init__(self, signum):
+ self.signum = signum
+ Exception.__init__(self, 'signal %d received' % signum)
def handler(signum, frame):
- raise SigException('signal %d received' % signum)
+ raise SigException(signum)
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGINT, handler)
ret = 95
+p = None
+killsig = signal.SIGTERM
try:
try:
p = subprocess.Popen([subpath(subcmd)] + argv[2:],
log('%s: %s\n' % (subpath(subcmd), e))
ret = 98
except SigException, e:
+ log('\nbup: %s\n' % e)
+ killsig = e.signum
ret = 94
finally:
if p and p.poll() == None:
- os.kill(p.pid, signal.SIGTERM)
+ os.kill(p.pid, killsig)
p.wait()
if n:
n.stdin.close()