mirror of https://github.com/python/cpython
A fcntl implementation for systems (like Solaris) without flock() call.
By Sjoerd.
This commit is contained in:
parent
8c1529dc29
commit
3c0b79ca0f
|
@ -27,6 +27,8 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include "allobjects.h"
|
#include "allobjects.h"
|
||||||
#include "modsupport.h"
|
#include "modsupport.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
/* fcntl(fd, opt, [arg]) */
|
/* fcntl(fd, opt, [arg]) */
|
||||||
|
|
||||||
|
@ -144,7 +146,32 @@ fcntl_flock(self, args)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
BGN_SAVE
|
BGN_SAVE
|
||||||
|
#ifdef HAVE_FLOCK
|
||||||
ret = flock(fd, code);
|
ret = flock(fd, code);
|
||||||
|
#else
|
||||||
|
|
||||||
|
#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 {
|
||||||
|
err_setstr(ValueError, "unrecognized flock argument");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
l.l_whence = l.l_start = l.l_len = 0;
|
||||||
|
ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_FLOCK */
|
||||||
END_SAVE
|
END_SAVE
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
err_errno(IOError);
|
err_errno(IOError);
|
||||||
|
|
Loading…
Reference in New Issue