summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobey Pointer <robey@lag.net>2004-12-19 19:43:27 +0000
committerRobey Pointer <robey@lag.net>2004-12-19 19:43:27 +0000
commit8d127ae8e19551b9f4d10b66430e26fbe0caeb5b (patch)
treed83289fa2b0ebe6fb97943cabf396030ee364098
parentb2eb38483ca3cc7e64342c029cf17e203e915244 (diff)
[project @ Arch-1:robey@lag.net--2003-public%secsh--dev--1.0--patch-134]
cleanup & docs in sftp add some more docs to SFTPHandle, and give a default implementation for close() that's usually right. add a flush() to the default implementation of write(). document that symlink's args in the sftp protocol are out of order (the spec is wrong).
-rw-r--r--paramiko/sftp_handle.py15
-rw-r--r--paramiko/sftp_server.py5
2 files changed, 17 insertions, 3 deletions
diff --git a/paramiko/sftp_handle.py b/paramiko/sftp_handle.py
index 5f202969..13f7b5bf 100644
--- a/paramiko/sftp_handle.py
+++ b/paramiko/sftp_handle.py
@@ -32,6 +32,9 @@ class SFTPHandle (object):
Abstract object representing a handle to an open file (or folder) on
the server. Each handle has a string representation used by the client
to refer to the underlying file.
+
+ Server implementations can (and should) subclass SFTPHandle to implement
+ features of a file handle, like L{stat} or L{chattr}.
"""
def __init__(self):
self.__name = None
@@ -44,8 +47,17 @@ class SFTPHandle (object):
When a client closes a file, this method is called on the handle.
Normally you would use this method to close the underlying OS level
file object(s).
+
+ The default implementation checks for attributes on C{self} named
+ C{readfile} and/or C{writefile}, and if either or both are present,
+ their C{close()} methods are called. This means that if you are
+ using the default implementations of L{read} and L{write}, this
+ method's default implementation should be fine also.
"""
- pass
+ if hasattr(self, 'readfile') and (self.readfile is not None):
+ self.readfile.close()
+ if hasattr(self, 'writefile') and (self.writefile is not None):
+ self.writefile.close()
def read(self, offset, length):
"""
@@ -112,6 +124,7 @@ class SFTPHandle (object):
self.writefile.seek(offset)
self.__tell = offset
self.writefile.write(data)
+ self.writefile.flush()
except IOError, e:
self.__tell = None
return SFTPServer.convert_errno(e.errno)
diff --git a/paramiko/sftp_server.py b/paramiko/sftp_server.py
index 7cf7e2bc..0b346155 100644
--- a/paramiko/sftp_server.py
+++ b/paramiko/sftp_server.py
@@ -325,9 +325,10 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
else:
self._send_status(request_number, resp)
elif t == CMD_SYMLINK:
- path = msg.get_string()
+ # the sftp 2 draft is incorrect here! path always follows target_path
target_path = msg.get_string()
- self._send_status(request_number, self.server.symlink(path, target_path))
+ path = msg.get_string()
+ self._send_status(request_number, self.server.symlink(target_path, path))
elif t == CMD_REALPATH:
path = msg.get_string()
rpath = self.server.canonicalize(path)