X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=contrib%2Fpython_1.5.2-fcntl_lockf.diff;fp=contrib%2Fpython_1.5.2-fcntl_lockf.diff;h=d8d062382b8783d9e23e8605dbe8c1b64e2f8024;hb=33f3f15fd6dfa7d131f22c737c7b1ed3159d73c8;hp=0000000000000000000000000000000000000000;hpb=b5ee62da9921f9e14343e880c156ab1bf9896190;p=dak.git diff --git a/contrib/python_1.5.2-fcntl_lockf.diff b/contrib/python_1.5.2-fcntl_lockf.diff new file mode 100644 index 00000000..d8d06238 --- /dev/null +++ b/contrib/python_1.5.2-fcntl_lockf.diff @@ -0,0 +1,82 @@ +--- python-1.5.2/Modules/fcntlmodule.c.orig Wed Jan 6 13:44:23 1999 ++++ python-1.5.2/Modules/fcntlmodule.c Sun Apr 1 07:42:54 2001 +@@ -233,30 +233,12 @@ + { + int fd, code, ret, whence = 0; + PyObject *lenobj = NULL, *startobj = NULL; ++ struct flock l; + + if (!PyArg_ParseTuple(args, "ii|OOi", &fd, &code, + &lenobj, &startobj, &whence)) + return NULL; + +-#ifndef LOCK_SH +-#define LOCK_SH 1 /* shared lock */ +-#define LOCK_EX 2 /* exclusive lock */ +-#define LOCK_NB 4 /* don't block when locking */ +-#define LOCK_UN 8 /* unlock */ +-#endif +- { +- struct flock l; +- if (code == LOCK_UN) +- l.l_type = F_UNLCK; +- else if (code & LOCK_SH) +- l.l_type = F_RDLCK; +- else if (code & LOCK_EX) +- l.l_type = F_WRLCK; +- else { +- PyErr_SetString(PyExc_ValueError, +- "unrecognized flock argument"); +- return NULL; +- } + l.l_start = l.l_len = 0; + if (startobj != NULL) { + #if !defined(HAVE_LARGEFILE_SUPPORT) +@@ -281,10 +263,45 @@ + return NULL; + } + l.l_whence = whence; ++ switch (code) ++ { ++ case F_TEST: ++ /* Test the lock: return 0 if FD is unlocked or locked by this process; ++ return -1, set errno to EACCES, if another process holds the lock. */ ++ if (fcntl (fd, F_GETLK, &l) < 0) { ++ PyErr_SetFromErrno(PyExc_IOError); ++ return NULL; ++ } ++ if (l.l_type == F_UNLCK || l.l_pid == getpid ()) { ++ Py_INCREF(Py_None); ++ return Py_None; ++ } ++ errno = EACCES; ++ PyErr_SetFromErrno(PyExc_IOError); ++ return NULL; ++ ++ case F_ULOCK: ++ l.l_type = F_UNLCK; ++ code = F_SETLK; ++ break; ++ case F_LOCK: ++ l.l_type = F_WRLCK; ++ code = F_SETLKW; ++ break; ++ case F_TLOCK: ++ l.l_type = F_WRLCK; ++ code = F_SETLK; ++ break; ++ ++ default: ++ PyErr_SetString(PyExc_ValueError, ++ "unrecognized flock argument"); ++ return NULL; ++ } + Py_BEGIN_ALLOW_THREADS +- ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); ++ ret = fcntl(fd, code, &l); + Py_END_ALLOW_THREADS +- } ++ + if (ret < 0) { + PyErr_SetFromErrno(PyExc_IOError); + return NULL;