diff options
author | Jesus Cea <jcea@jcea.es> | 2012-04-26 14:39:35 (GMT) |
---|---|---|
committer | Jesus Cea <jcea@jcea.es> | 2012-04-26 14:39:35 (GMT) |
commit | 2b47f0a23ffcb0cd86dc9eacf379fbd329b895c7 (patch) | |
tree | e7a04c686ef2b72e9d4495b88e8f87c58cfd5e11 /Modules | |
parent | 790a9b4c193a9f3323138a8c1c1d074a6b6289f0 (diff) | |
download | cpython-2b47f0a23ffcb0cd86dc9eacf379fbd329b895c7.zip cpython-2b47f0a23ffcb0cd86dc9eacf379fbd329b895c7.tar.gz cpython-2b47f0a23ffcb0cd86dc9eacf379fbd329b895c7.tar.bz2 |
Close #10142: Support for SEEK_HOLE/SEEK_DATA
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_io/bufferedio.c | 21 | ||||
-rw-r--r-- | Modules/posixmodule.c | 7 |
2 files changed, 25 insertions, 3 deletions
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 8a9ae47..dc723b1 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1157,9 +1157,20 @@ buffered_seek(buffered *self, PyObject *args) if (!PyArg_ParseTuple(args, "O|i:seek", &targetobj, &whence)) { return NULL; } - if (whence < 0 || whence > 2) { + + /* Do some error checking instead of trusting OS 'seek()' + ** error detection, just in case. + */ + if ((whence < 0 || whence >2) +#ifdef SEEK_HOLE + && (whence != SEEK_HOLE) +#endif +#ifdef SEEK_DATA + && (whence != SEEK_DATA) +#endif + ) { PyErr_Format(PyExc_ValueError, - "whence must be between 0 and 2, not %d", whence); + "whence value %d unsupported", whence); return NULL; } @@ -1172,7 +1183,11 @@ buffered_seek(buffered *self, PyObject *args) if (target == -1 && PyErr_Occurred()) return NULL; - if (whence != 2 && self->readable) { + /* SEEK_SET and SEEK_CUR are special because we could seek inside the + buffer. Other whence values must be managed without this optimization. + Some Operating Systems can provide additional values, like + SEEK_HOLE/SEEK_DATA. */ + if (((whence == 0) || (whence == 1)) && self->readable) { Py_off_t current, avail; /* Check if seeking leaves us inside the current buffer, so as to return quickly if possible. Also, we needn't take the diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 92a6277..8254f81 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -11227,6 +11227,13 @@ all_ins(PyObject *d) #endif +#ifdef SEEK_HOLE + if (ins(d, "SEEK_HOLE", (long)SEEK_HOLE)) return -1; +#endif +#ifdef SEEK_DATA + if (ins(d, "SEEK_DATA", (long)SEEK_DATA)) return -1; +#endif + /* MS Windows */ #ifdef O_NOINHERIT /* Don't inherit in child processes. */ |