=== modified file 'bzrlib/transport/sftp.py'
--- bzrlib/transport/sftp.py 2007-10-24 18:19:51 +0000
+++ bzrlib/transport/sftp.py 2008-04-10 09:16:39 +0000
@@ -1019,10 +1019,12 @@
def close(self):
pass
- server = paramiko.SFTPServer(FakeChannel(), 'sftp', StubServer(self), StubSFTPServer,
- root=self._root, home=self._server_homedir)
+ server = paramiko.SFTPServer(
+ FakeChannel(), 'sftp', StubServer(self), StubSFTPServer,
+ root=self._root, home=self._server_homedir)
try:
- server.start_subsystem('sftp', None, sock)
+ server.start_subsystem(
+ 'sftp', None, ssh.SocketAsChannelAdapter(sock))
except socket.error, e:
if (len(e.args) > 0) and (e.args[0] == errno.EPIPE):
# it's okay for the client to disconnect abruptly
=== modified file 'bzrlib/transport/ssh.py'
--- bzrlib/transport/ssh.py 2008-02-08 18:36:35 +0000
+++ bzrlib/transport/ssh.py 2008-04-10 09:16:39 +0000
@@ -172,19 +172,34 @@
signal.signal(signal.SIGINT, signal.SIG_IGN)
-class LoopbackSFTP(object):
+class SocketAsChannelAdapter(object):
"""Simple wrapper for a socket that pretends to be a paramiko Channel."""
def __init__(self, sock):
self.__socket = sock
+ def get_name(self):
+ return "bzr SocketAsChannelAdapter"
+
def send(self, data):
return self.__socket.send(data)
def recv(self, n):
- return self.__socket.recv(n)
+ try:
+ return self.__socket.recv(n)
+ except socket.error, e:
+ if e.args[0] in (errno.EPIPE, errno.ECONNRESET, errno.ECONNABORTED,
+ errno.EBADF):
+ # Connection has closed. Paramiko expects an empty string in
+ # this case, not an exception.
+ return ''
+ raise
def recv_ready(self):
+ # TODO: jam 20051215 this function is necessary to support the
+ # pipelined() function. In reality, it probably should use
+ # poll() or select() to actually return if there is data
+ # available, otherwise we probably don't get any benefit
return True
def close(self):
@@ -237,7 +252,7 @@
sock.connect((host, port))
except socket.error, e:
self._raise_connection_error(host, port=port, orig_error=e)
- return SFTPClient(LoopbackSFTP(sock))
+ return SFTPClient(SocketAsChannelAdapter(sock))
register_ssh_vendor('loopback', LoopbackVendor())
@@ -347,7 +362,7 @@
argv = self._get_vendor_specific_argv(username, host, port,
subsystem='sftp')
sock = self._connect(argv)
- return SFTPClient(sock)
+ return SFTPClient(SocketAsChannelAdapter(sock))
except _sftp_connection_errors, e:
self._raise_connection_error(host, port=port, orig_error=e)
except (OSError, IOError), e:
@@ -601,13 +616,6 @@
def send(self, data):
return os.write(self.proc.stdin.fileno(), data)
- def recv_ready(self):
- # TODO: jam 20051215 this function is necessary to support the
- # pipelined() function. In reality, it probably should use
- # poll() or select() to actually return if there is data
- # available, otherwise we probably don't get any benefit
- return True
-
def recv(self, count):
return os.read(self.proc.stdout.fileno(), count)