1#!/bin/sh 2"""": # -*-python-*- 3# https://sourceware.org/bugzilla/show_bug.cgi?id=26034 4export "BUP_ARGV_0"="$0" 5arg_i=1 6for arg in "$@"; do 7 export "BUP_ARGV_${arg_i}"="$arg" 8 shift 9 arg_i=$((arg_i + 1)) 10done 11# Here to end of preamble replaced during install 12bup_python="$(dirname "$0")/../../config/bin/python" || exit $? 13exec "$bup_python" "$0" 14""" 15# end of bup preamble 16 17from __future__ import absolute_import 18import os, struct, subprocess, sys 19 20sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/..'] 21 22from bup import compat, options 23from bup.helpers import debug1, debug2, mux 24from bup.io import byte_stream 25 26# Give the subcommand exclusive access to stdin. 27orig_stdin = os.dup(0) 28devnull = os.open(os.devnull, os.O_RDONLY) 29os.dup2(devnull, 0) 30os.close(devnull) 31 32optspec = """ 33bup mux command [arguments...] 34-- 35""" 36o = options.Options(optspec) 37opt, flags, extra = o.parse(compat.argv[1:]) 38if len(extra) < 1: 39 o.fatal('command is required') 40 41subcmd = extra 42 43debug2('bup mux: starting %r\n' % (extra,)) 44 45outr, outw = os.pipe() 46errr, errw = os.pipe() 47def close_fds(): 48 os.close(outr) 49 os.close(errr) 50 51p = subprocess.Popen(subcmd, stdin=orig_stdin, stdout=outw, stderr=errw, 52 close_fds=False, preexec_fn=close_fds) 53os.close(outw) 54os.close(errw) 55sys.stdout.flush() 56out = byte_stream(sys.stdout) 57out.write(b'BUPMUX') 58out.flush() 59mux(p, out.fileno(), outr, errr) 60os.close(outr) 61os.close(errr) 62prv = p.wait() 63 64if prv: 65 debug1('%s exited with code %d\n' % (extra[0], prv)) 66 67debug1('bup mux: done\n') 68 69sys.exit(prv) 70