3 # https://sourceware.org/bugzilla/show_bug.cgi?id=26034
4 export "BUP_ARGV_0"="$0"
7 export "BUP_ARGV_${arg_i}"="$arg"
11 # Here to end of preamble replaced during install
12 bup_python="$(dirname "$0")/../../config/bin/python" || exit $?
13 exec "$bup_python" "$0"
17 from __future__ import absolute_import
19 # Intentionally replace the dirname "$0" that python prepends
21 sys.path[0] = os.path.dirname(os.path.realpath(__file__)) + '/..'
23 import getopt, socket, subprocess, fcntl
25 from bup import compat, options, path
26 from bup.helpers import *
29 bup daemon [options...] -- [bup-server options...]
31 l,listen ip address to listen on, defaults to *
32 p,port port to listen on, defaults to 1982
34 o = options.Options(optspec, optfunc=getopt.getopt)
35 opt, flags, extra = o.parse(compat.argv[1:])
38 port = opt.port and int(opt.port) or 1982
45 for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
46 socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
47 af, socktype, proto, canonname, sa = res
49 s = socket.socket(af, socktype, proto)
50 except socket.error as e:
53 if af == socket.AF_INET6:
54 log("bup daemon: listening on [%s]:%s\n" % sa[:2])
56 log("bup daemon: listening on %s:%s\n" % sa[:2])
57 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
60 fcntl.fcntl(s.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
61 except socket.error as e:
67 log('bup daemon: listen socket: %s\n' % e.args[1])
72 [rl,wl,xl] = select.select(socks, [], [], 60)
76 log("Socket accepted connection from %s\n" % (src,))
77 fd1 = os.dup(s.fileno())
78 fd2 = os.dup(s.fileno())
80 sp = subprocess.Popen([path.exe(), 'mux', '--',
82 + extra, stdin=fd1, stdout=fd2)
88 l.shutdown(socket.SHUT_RDWR)
91 debug1("bup daemon: done")