From 3a77c7ab16d737a19cfb3fae4bd0f92517abe149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20D=C3=B6rwald?= Date: Wed, 6 Jun 2007 16:31:14 +0000 Subject: If append mode is specified seek to the end of the file. Add a test to test_fileio.py for this. --- Lib/test/test_fileio.py | 18 ++++++++++++++++++ Modules/_fileio.c | 12 ++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 064ec0c..8cf79df 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -205,6 +205,24 @@ class OtherFileTests(unittest.TestCase): finally: os.unlink(TESTFN) + def testAppend(self): + try: + f = open(TESTFN, 'wb') + f.write(b'spam') + f.close() + f = open(TESTFN, 'ab') + f.write(b'eggs') + f.close() + f = open(TESTFN, 'rb') + d = f.read() + f.close() + self.assertEqual(d, b'spameggs') + finally: + try: + os.unlink(TESTFN) + except: + pass + def test_main(): # Historically, these tests have been sloppy about removing TESTFN. # So get rid of it no matter what. diff --git a/Modules/_fileio.c b/Modules/_fileio.c index c46f17e..364748a 100644 --- a/Modules/_fileio.c +++ b/Modules/_fileio.c @@ -242,6 +242,18 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) PyErr_SetFromErrnoWithFilename(PyExc_IOError, name); goto error; } + if (append) { + int result; + Py_BEGIN_ALLOW_THREADS + errno = 0; + result = lseek(self->fd, 0, SEEK_END); + Py_END_ALLOW_THREADS + if (result < 0) { + close(self->fd); + PyErr_SetFromErrnoWithFilename(PyExc_IOError, name); + goto error; + } + } } goto done; -- cgit v0.12