diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-11-30 10:43:04 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-11-30 10:43:04 +0000 |
commit | b406ed7b51a9faa7bf3efaaefab51ecb67d7068b (patch) | |
tree | a15e8131d7d097680dbb150622c7aa74c241c322 /winsup/cygwin/flock.cc | |
parent | fcac3491660e47bc402f4c7d556e8fead97628ca (diff) | |
download | newlib-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.cc | 89 |
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 |