]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/client.py
If you specified the port number on the command line, convert it to an int.
[bup.git] / lib / bup / client.py
index 0bb5219c4f9bc6952a0031cefb5da69cfdae3aec..f06d54965979d0c92ca36044af24a5c62c9668e3 100644 (file)
@@ -65,6 +65,7 @@ class Client:
         if is_reverse:
             self.pout = os.fdopen(3, 'rb')
             self.pin = os.fdopen(4, 'wb')
+            self.conn = Conn(self.pout, self.pin)
         else:
             if self.protocol in ('ssh', 'file'):
                 try:
@@ -72,14 +73,14 @@ class Client:
                     self.p = ssh.connect(self.host, self.port, 'server')
                     self.pout = self.p.stdout
                     self.pin = self.p.stdin
+                    self.conn = Conn(self.pout, self.pin)
                 except OSError, e:
                     raise ClientError, 'connect: %s' % e, sys.exc_info()[2]
             elif self.protocol == 'bup':
                 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-                self.sock.connect((self.host, self.port or 1982))
-                self.pout = self.sock.makefile('rb')
-                self.pin = self.sock.makefile('wb')
-        self.conn = Conn(self.pout, self.pin)
+                self.sock.connect((self.host, atoi(self.port) or 1982))
+                self.sockw = self.sock.makefile('wb')
+                self.conn = DemuxConn(self.sock.fileno(), self.sockw)
         if self.dir:
             self.dir = re.sub(r'[\r\n]', ' ', self.dir)
             if create:
@@ -101,10 +102,14 @@ class Client:
     def close(self):
         if self.conn and not self._busy:
             self.conn.write('quit\n')
-        if self.pin and self.pout:
+        if self.pin:
             self.pin.close()
-            while self.pout.read(65536):
-                pass
+        if self.sock and self.sockw:
+            self.sockw.close()
+            self.sock.shutdown(socket.SHUT_WR)
+        if self.conn:
+            self.conn.close()
+        if self.pout:
             self.pout.close()
         if self.sock:
             self.sock.close()
@@ -318,9 +323,12 @@ class PackWriter_Remote(git.PackWriter):
                           sha,
                           struct.pack('!I', crc),
                           data))
-        (self._bwcount, self._bwtime) = \
-            _raw_write_bwlimit(self.file, outbuf, self._bwcount, self._bwtime)
-        self.outbytes += len(data) - 20 - 4 # Don't count sha1+crc
+        try:
+            (self._bwcount, self._bwtime) = _raw_write_bwlimit(
+                    self.file, outbuf, self._bwcount, self._bwtime)
+        except IOError, e:
+            raise ClientError, e, sys.exc_info()[2]
+        self.outbytes += len(data)
         self.count += 1
 
         if self.file.has_input():