]> arthur.barton.de Git - bup.git/blobdiff - cmd/daemon-cmd.py
Get SC_ARG_MAX from os.sysconf(), not C
[bup.git] / cmd / daemon-cmd.py
index 0b274f71e4a75cae9f2ecdd23da2e935ceea979e..c90e3e4bb3b9224c3be2039a7760340e28c1c9e8 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-import sys, getopt, socket, subprocess
+import sys, getopt, socket, subprocess, fcntl
 from bup import options, path
 from bup.helpers import *
 
@@ -32,8 +32,10 @@ for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
             log("bup daemon: listening on [%s]:%s\n" % sa[:2])
         else:
             log("bup daemon: listening on %s:%s\n" % sa[:2])
+        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         s.bind(sa)
         s.listen(1)
+        fcntl.fcntl(s.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
     except socket.error, e:
         s.close()
         continue
@@ -48,10 +50,17 @@ try:
         [rl,wl,xl] = select.select(socks, [], [], 60)
         for l in rl:
             s, src = l.accept()
-            log("Socket accepted connection from %s\n" % (src,))
-            sp = subprocess.Popen([path.exe(), 'mux', '--', 'server'] + extra,
-                                  stdin=os.dup(s.fileno()), stdout=os.dup(s.fileno()))
-            s.close()
+            try:
+                log("Socket accepted connection from %s\n" % (src,))
+                fd1 = os.dup(s.fileno())
+                fd2 = os.dup(s.fileno())
+                s.close()
+                sp = subprocess.Popen([path.exe(), 'mux', '--',
+                                       path.exe(), 'server']
+                                      + extra, stdin=fd1, stdout=fd2)
+            finally:
+                os.close(fd1)
+                os.close(fd2)
 finally:
     for l in socks:
         l.shutdown(socket.SHUT_RDWR)