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