[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).
This commit is contained in:
parent
b2eb38483c
commit
8d127ae8e1
|
@ -32,6 +32,9 @@ class SFTPHandle (object):
|
||||||
Abstract object representing a handle to an open file (or folder) on
|
Abstract object representing a handle to an open file (or folder) on
|
||||||
the server. Each handle has a string representation used by the client
|
the server. Each handle has a string representation used by the client
|
||||||
to refer to the underlying file.
|
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):
|
def __init__(self):
|
||||||
self.__name = None
|
self.__name = None
|
||||||
|
@ -44,8 +47,17 @@ class SFTPHandle (object):
|
||||||
When a client closes a file, this method is called on the handle.
|
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
|
Normally you would use this method to close the underlying OS level
|
||||||
file object(s).
|
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):
|
def read(self, offset, length):
|
||||||
"""
|
"""
|
||||||
|
@ -112,6 +124,7 @@ class SFTPHandle (object):
|
||||||
self.writefile.seek(offset)
|
self.writefile.seek(offset)
|
||||||
self.__tell = offset
|
self.__tell = offset
|
||||||
self.writefile.write(data)
|
self.writefile.write(data)
|
||||||
|
self.writefile.flush()
|
||||||
except IOError, e:
|
except IOError, e:
|
||||||
self.__tell = None
|
self.__tell = None
|
||||||
return SFTPServer.convert_errno(e.errno)
|
return SFTPServer.convert_errno(e.errno)
|
||||||
|
|
|
@ -325,9 +325,10 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
|
||||||
else:
|
else:
|
||||||
self._send_status(request_number, resp)
|
self._send_status(request_number, resp)
|
||||||
elif t == CMD_SYMLINK:
|
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()
|
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:
|
elif t == CMD_REALPATH:
|
||||||
path = msg.get_string()
|
path = msg.get_string()
|
||||||
rpath = self.server.canonicalize(path)
|
rpath = self.server.canonicalize(path)
|
||||||
|
|
Loading…
Reference in New Issue