summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_fileio.py18
-rw-r--r--Modules/_fileio.c12
2 files changed, 30 insertions, 0 deletions
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;