From: Walter Dörwald Date: Wed, 6 Jun 2007 16:31:14 +0000 (+0000) Subject: If append mode is specified seek to the end of the file. X-Git-Tag: v3.0a1~825 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a77c7ab16d737a19cfb3fae4bd0f92517abe149;p=python If append mode is specified seek to the end of the file. Add a test to test_fileio.py for this. --- diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 064ec0caad..8cf79df370 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 c46f17e2b0..364748adee 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;