add 'flags' param to SFTPHandle and make the default impl avoid calling tell() when in append mode; add proper append-mode support to stub_sftp
This commit is contained in:
Robey Pointer 2006-08-21 19:56:01 -07:00
parent 49418d1145
commit cc3e383baf
2 changed files with 28 additions and 10 deletions

View File

@ -35,7 +35,16 @@ class SFTPHandle (object):
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, flags=0):
"""
Create a new file handle representing a local file being served over
SFTP. If C{flags} is passed in, it's used to determine if the file
is open in append mode.
@param flags: optional flags as passed to L{SFTPServerInterface.open}
@type flags: int
"""
self.__flags = flags
self.__name = None
# only for handles to folders:
self.__files = { }
@ -121,17 +130,20 @@ class SFTPHandle (object):
if writefile is None:
return SFTP_OP_UNSUPPORTED
try:
if self.__tell is None:
self.__tell = writefile.tell()
if offset != self.__tell:
writefile.seek(offset)
self.__tell = offset
# in append mode, don't care about seeking
if (self.__flags & os.O_APPEND) == 0:
if self.__tell is None:
self.__tell = writefile.tell()
if offset != self.__tell:
writefile.seek(offset)
self.__tell = offset
writefile.write(data)
writefile.flush()
except IOError, e:
self.__tell = None
return SFTPServer.convert_errno(e.errno)
self.__tell += len(data)
if self.__tell is not None:
self.__tell += len(data)
return SFTP_OK
def stat(self):

View File

@ -104,9 +104,15 @@ class StubSFTPServer (SFTPServerInterface):
attr._flags &= ~attr.FLAG_PERMISSIONS
SFTPServer.set_file_attr(path, attr)
if flags & os.O_WRONLY:
fstr = 'wb'
if flags & os.O_APPEND:
fstr = 'ab'
else:
fstr = 'wb'
elif flags & os.O_RDWR:
fstr = 'r+b'
if flags & os.O_APPEND:
fstr = 'a+b'
else:
fstr = 'r+b'
else:
# O_RDONLY (== 0)
fstr = 'rb'
@ -114,7 +120,7 @@ class StubSFTPServer (SFTPServerInterface):
f = os.fdopen(fd, fstr)
except OSError, e:
return SFTPServer.convert_errno(e.errno)
fobj = StubSFTPHandle()
fobj = StubSFTPHandle(flags)
fobj.filename = path
fobj.readfile = f
fobj.writefile = f