From: Rob Browning Date: Fri, 12 Feb 2021 20:15:11 +0000 (-0600) Subject: mux: convert to internal command X-Git-Url: https://arthur.barton.de/gitweb/?p=bup.git;a=commitdiff_plain;h=2c03d39dc7013e1b4ae7022cc7040d2cab13748e mux: convert to internal command Signed-off-by: Rob Browning --- diff --git a/lib/bup/cmd/mux.py b/lib/bup/cmd/mux.py index 3204bec..606f027 100755 --- a/lib/bup/cmd/mux.py +++ b/lib/bup/cmd/mux.py @@ -1,72 +1,55 @@ -#!/bin/sh -"""": # -*-python-*- -# https://sourceware.org/bugzilla/show_bug.cgi?id=26034 -export "BUP_ARGV_0"="$0" -arg_i=1 -for arg in "$@"; do - export "BUP_ARGV_${arg_i}"="$arg" - shift - arg_i=$((arg_i + 1)) -done -# Here to end of preamble replaced during install -bup_python="$(dirname "$0")/../../../config/bin/python" || exit $? -exec "$bup_python" "$0" -""" -# end of bup preamble from __future__ import absolute_import +import os, struct, subprocess, sys -# Intentionally replace the dirname "$0" that python prepends -import os, sys -sys.path[0] = os.path.dirname(os.path.realpath(__file__)) + '/../..' - -import struct, subprocess - -from bup import compat, options +from bup import options from bup.helpers import debug1, debug2, mux from bup.io import byte_stream -# Give the subcommand exclusive access to stdin. -orig_stdin = os.dup(0) -devnull = os.open(os.devnull, os.O_RDONLY) -os.dup2(devnull, 0) -os.close(devnull) optspec = """ bup mux command [arguments...] -- """ -o = options.Options(optspec) -opt, flags, extra = o.parse(compat.argv[1:]) -if len(extra) < 1: - o.fatal('command is required') -subcmd = extra - -debug2('bup mux: starting %r\n' % (extra,)) - -outr, outw = os.pipe() -errr, errw = os.pipe() -def close_fds(): +def main(argv): + # Give the subcommand exclusive access to stdin. + orig_stdin = os.dup(0) + devnull = os.open(os.devnull, os.O_RDONLY) + os.dup2(devnull, 0) + os.close(devnull) + + o = options.Options(optspec) + opt, flags, extra = o.parse_bytes(argv[1:]) + if len(extra) < 1: + o.fatal('command is required') + + subcmd = extra + + debug2('bup mux: starting %r\n' % (extra,)) + + outr, outw = os.pipe() + errr, errw = os.pipe() + def close_fds(): + os.close(outr) + os.close(errr) + + p = subprocess.Popen(subcmd, stdin=orig_stdin, stdout=outw, stderr=errw, + close_fds=False, preexec_fn=close_fds) + os.close(outw) + os.close(errw) + sys.stdout.flush() + out = byte_stream(sys.stdout) + out.write(b'BUPMUX') + out.flush() + mux(p, out.fileno(), outr, errr) os.close(outr) os.close(errr) + prv = p.wait() -p = subprocess.Popen(subcmd, stdin=orig_stdin, stdout=outw, stderr=errw, - close_fds=False, preexec_fn=close_fds) -os.close(outw) -os.close(errw) -sys.stdout.flush() -out = byte_stream(sys.stdout) -out.write(b'BUPMUX') -out.flush() -mux(p, out.fileno(), outr, errr) -os.close(outr) -os.close(errr) -prv = p.wait() - -if prv: - debug1('%s exited with code %d\n' % (extra[0], prv)) + if prv: + debug1('%s exited with code %d\n' % (extra[0], prv)) -debug1('bup mux: done\n') + debug1('bup mux: done\n') -sys.exit(prv) + sys.exit(prv) diff --git a/lib/cmd/bup b/lib/cmd/bup index aacb20b..7beda76 100755 --- a/lib/cmd/bup +++ b/lib/cmd/bup @@ -203,6 +203,7 @@ try: b'memtest', b'meta', b'midx', + b'mux', b'random', b'rm', b'split',