diff options
author | Guido van Rossum <guido@python.org> | 1999-01-06 18:44:23 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1999-01-06 18:44:23 (GMT) |
commit | 056bad993c835a59c0fad07b2e569dd17ea03544 (patch) | |
tree | d9387f9b17f7022a6ae219aa6c0babae9ad75f06 | |
parent | 94f6f72c057e4467ced293eebf7c479afa8ab2d3 (diff) | |
download | cpython-056bad993c835a59c0fad07b2e569dd17ea03544.zip cpython-056bad993c835a59c0fad07b2e569dd17ea03544.tar.gz cpython-056bad993c835a59c0fad07b2e569dd17ea03544.tar.bz2 |
Changes for long file support by Steve Clift.
He also fixes thread-related evil that caused core dumps.
-rw-r--r-- | Modules/fcntlmodule.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 59a4d4a..1764bca 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -178,9 +178,10 @@ fcntl_flock(self, args) if (!PyArg_Parse(args, "(ii)", &fd, &code)) return NULL; - Py_BEGIN_ALLOW_THREADS #ifdef HAVE_FLOCK + Py_BEGIN_ALLOW_THREADS ret = flock(fd, code); + Py_END_ALLOW_THREADS #else #ifndef LOCK_SH @@ -203,10 +204,11 @@ fcntl_flock(self, args) return NULL; } l.l_whence = l.l_start = l.l_len = 0; + Py_BEGIN_ALLOW_THREADS ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS } #endif /* HAVE_FLOCK */ - Py_END_ALLOW_THREADS if (ret < 0) { PyErr_SetFromErrno(PyExc_IOError); return NULL; @@ -229,13 +231,13 @@ fcntl_lockf(self, args) PyObject *self; /* Not used */ PyObject *args; { - int fd, code, len = 0, start = 0, whence = 0, ret; + int fd, code, ret, whence = 0; + PyObject *lenobj = NULL, *startobj = NULL; - if (!PyArg_ParseTuple(args, "ii|iii", &fd, &code, &len, - &start, &whence)) + if (!PyArg_ParseTuple(args, "ii|OOi", &fd, &code, + &lenobj, &startobj, &whence)) return NULL; - Py_BEGIN_ALLOW_THREADS #ifndef LOCK_SH #define LOCK_SH 1 /* shared lock */ #define LOCK_EX 2 /* exclusive lock */ @@ -255,12 +257,34 @@ fcntl_lockf(self, args) "unrecognized flock argument"); return NULL; } - l.l_len = len; - l.l_start = start; + l.l_start = l.l_len = 0; + if (startobj != NULL) { +#if !defined(HAVE_LARGEFILE_SUPPORT) + l.l_start = PyInt_AsLong(startobj); +#else + l.l_start = PyLong_Check(startobj) ? + PyLong_AsLongLong(startobj) : + PyInt_AsLong(startobj); +#endif + if (PyErr_Occurred()) + return NULL; + } + if (lenobj != NULL) { +#if !defined(HAVE_LARGEFILE_SUPPORT) + l.l_len = PyInt_AsLong(lenobj); +#else + l.l_len = PyLong_Check(lenobj) ? + PyLong_AsLongLong(lenobj) : + PyInt_AsLong(lenobj); +#endif + if (PyErr_Occurred()) + return NULL; + } l.l_whence = whence; + Py_BEGIN_ALLOW_THREADS ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS } - Py_END_ALLOW_THREADS if (ret < 0) { PyErr_SetFromErrno(PyExc_IOError); return NULL; |