aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/flock.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-11-30 10:43:04 +0000
committerCorinna Vinschen <corinna@vinschen.de>2003-11-30 10:43:04 +0000
commitb406ed7b51a9faa7bf3efaaefab51ecb67d7068b (patch)
treea15e8131d7d097680dbb150622c7aa74c241c322 /winsup/cygwin/flock.cc
parentfcac3491660e47bc402f4c7d556e8fead97628ca (diff)
downloadnewlib-b406ed7b51a9faa7bf3efaaefab51ecb67d7068b.zip
newlib-b406ed7b51a9faa7bf3efaaefab51ecb67d7068b.tar.gz
newlib-b406ed7b51a9faa7bf3efaaefab51ecb67d7068b.tar.bz2
* flock.cc: Renamed from flock.c.
Diffstat (limited to 'winsup/cygwin/flock.cc')
-rw-r--r--winsup/cygwin/flock.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
new file mode 100644
index 0000000..09ea2b6
--- /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 <sys/file.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+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