2 from __future__ import absolute_import
3 import fcntl, getopt, os, socket, subprocess, sys, select
5 from bup import options, path
6 from bup.helpers import log, debug1
10 bup daemon [options...] -- [bup-server options...]
12 l,listen ip address to listen on, defaults to *
13 p,port port to listen on, defaults to 1982
17 o = options.Options(optspec, optfunc=getopt.getopt)
18 opt, flags, extra = o.parse_bytes(argv[1:])
21 port = opt.port and int(opt.port) or 1982
24 for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
25 socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
26 af, socktype, proto, canonname, sa = res
28 s = socket.socket(af, socktype, proto)
29 except socket.error as e:
32 if af == socket.AF_INET6:
33 log("bup daemon: listening on [%s]:%s\n" % sa[:2])
35 log("bup daemon: listening on %s:%s\n" % sa[:2])
36 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
39 fcntl.fcntl(s.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
40 except socket.error as e:
46 log('bup daemon: listen socket: %s\n' % e.args[1])
51 [rl,wl,xl] = select.select(socks, [], [], 60)
55 log("Socket accepted connection from %s\n" % (src,))
56 fd1 = os.dup(s.fileno())
57 fd2 = os.dup(s.fileno())
59 sp = subprocess.Popen([path.exe(), 'mux', '--',
61 + extra, stdin=fd1, stdout=fd2)
67 l.shutdown(socket.SHUT_RDWR)
70 debug1("bup daemon: done")