From b406ed7b51a9faa7bf3efaaefab51ecb67d7068b Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sun, 30 Nov 2003 10:43:04 +0000 Subject: * flock.cc: Renamed from flock.c. --- winsup/cygwin/flock.cc | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 winsup/cygwin/flock.cc (limited to 'winsup/cygwin/flock.cc') diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc new file mode 100644 index 000000000..09ea2b6db --- /dev/null +++ b/winsup/cygwin/flock.cc @@ -0,0 +1,89 @@ +/* One of many ways to emulate flock() on top of real (good) POSIX locks. + * + * This flock() emulation is based upon source taken from the Red Hat + * implementation used in their imap-2002d SRPM. + * + * $RH: flock.c,v 1.2 2000/08/23 17:07:00 nalin Exp $ + */ +/* flock.c + + Copyright 2003 Red Hat, Inc. + + This file is part of Cygwin. + + This software is a copyrighted work licensed under the terms of the + Cygwin license. Please consult the file "CYGWIN_LICENSE" for + details. */ + +#include +#include +#include +#include +#include + +int +flock (int fd, int operation) +{ + int i, cmd; + struct flock l = { 0, 0, 0, 0, 0 }; + if (operation & LOCK_NB) + { + cmd = F_SETLK; + } + else + { + cmd = F_SETLKW; + } + l.l_whence = SEEK_SET; + switch (operation & (~LOCK_NB)) + { + case LOCK_EX: + l.l_type = F_WRLCK; + i = fcntl (fd, cmd, &l); + if (i == -1) + { + if ((errno == EAGAIN) || (errno == EACCES)) + { + errno = EWOULDBLOCK; + } + } + break; + case LOCK_SH: + l.l_type = F_RDLCK; + i = fcntl (fd, cmd, &l); + if (i == -1) + { + if ((errno == EAGAIN) || (errno == EACCES)) + { + errno = EWOULDBLOCK; + } + } + break; + case LOCK_UN: + l.l_type = F_UNLCK; + i = fcntl (fd, cmd, &l); + if (i == -1) + { + if ((errno == EAGAIN) || (errno == EACCES)) + { + errno = EWOULDBLOCK; + } + } + break; + default: + i = -1; + errno = EINVAL; + break; + } + return i; +} + +#ifdef FLOCK_EMULATE_IS_MAIN +int +main (int argc, char **argv) +{ + int fd = open (argv[1], O_WRONLY); + flock (fd, LOCK_EX); + return 0; +} +#endif -- cgit v1.2.3