Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-11-30 02:00:51 +0300
committerCorinna Vinschen <corinna@vinschen.de>2003-11-30 02:00:51 +0300
commitf3a1e23eb385bdf9dd71676aebb9b64cf617ec7a (patch)
tree5c5eee4aef88035c6196b87533c3bad8c580e7ae /winsup/cygwin
parentb50fe8212fd825120f5c2bbf3d4f3afb684d27ad (diff)
* Makefile.in: (DLL_OFILES): Add flock.o.
* cygwin.din: Export flock. * flock.c: New file. * include/sys/file.h: Include sys/cdefs.h. Add function prototype for flock(). Add some comments from BSD's header for further clarity. (L_SET, L_CURR, L_INCR, L_XTND): Redefine as the macros SEEK_SET, SEEK_CUR, SEEK_CUR, & SEEK_END respectively. (LOCK_SH,LOCK_EX,LOCK_NB,LOCK_UN): New macros for flock(). * include/cygwin/version.h: Bump API minor number.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog13
-rw-r--r--winsup/cygwin/Makefile.in4
-rw-r--r--winsup/cygwin/cygwin.din1
-rw-r--r--winsup/cygwin/flock.c89
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/include/sys/file.h36
6 files changed, 137 insertions, 9 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 100a7d23c..ef86002a0 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,16 @@
+2003-11-29 Nicholas Wourms <nwourms@netscape.net>
+
+ * Makefile.in: (DLL_OFILES): Add flock.o.
+ * cygwin.din: Export flock.
+ * flock.c: New file.
+ * include/sys/file.h: Include sys/cdefs.h.
+ Add function prototype for flock().
+ Add some comments from BSD's header for further clarity.
+ (L_SET, L_CURR, L_INCR, L_XTND): Redefine as the macros
+ SEEK_SET, SEEK_CUR, SEEK_CUR, & SEEK_END respectively.
+ (LOCK_SH,LOCK_EX,LOCK_NB,LOCK_UN): New macros for flock().
+ * include/cygwin/version.h: Bump API minor number.
+
2003-11-28 Christopher Faylor <cgf@redhat.com>
* sigproc.cc (no_signals_available): Fix so that non-zero exit state is
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
index ed5247ab1..c445e8667 100644
--- a/winsup/cygwin/Makefile.in
+++ b/winsup/cygwin/Makefile.in
@@ -127,8 +127,8 @@ DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o dcrt0.o \
fhandler_random.o fhandler_raw.o fhandler_registry.o fhandler_serial.o \
fhandler_socket.o fhandler_tape.o fhandler_termios.o \
fhandler_tty.o fhandler_virtual.o fhandler_windows.o \
- fhandler_zero.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o init.o \
- ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.o \
+ fhandler_zero.o flock.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o \
+ init.o ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.o \
mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o \
poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o registry.o \
resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
index 501a88249..b5d71578a 100644
--- a/winsup/cygwin/cygwin.din
+++ b/winsup/cygwin/cygwin.din
@@ -500,6 +500,7 @@ finitef NOSIGFE
_finitef = finitef NOSIGFE
fiprintf SIGFE
_fiprintf = fiprintf SIGFE
+flock SIGFE
floor NOSIGFE
_floor = floor NOSIGFE
floorf NOSIGFE
diff --git a/winsup/cygwin/flock.c b/winsup/cygwin/flock.c
new file mode 100644
index 000000000..09ea2b6db
--- /dev/null
+++ b/winsup/cygwin/flock.c
@@ -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
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
index 52ddb5be8..76130833b 100644
--- a/winsup/cygwin/include/cygwin/version.h
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -230,12 +230,13 @@ details. */
103: Export getprogname, setprogname.
104: Export msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop.
105: Export sigwait.
+ 106: Export flock.
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 105
+#define CYGWIN_VERSION_API_MINOR 106
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible
diff --git a/winsup/cygwin/include/sys/file.h b/winsup/cygwin/include/sys/file.h
index dbf2ea88a..af07df4cf 100644
--- a/winsup/cygwin/include/sys/file.h
+++ b/winsup/cygwin/include/sys/file.h
@@ -11,20 +11,44 @@
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
-
+/*
+ * 2003-11-27 Nicholas Wourms <nwourms@netscape.net>:
+ *
+ * Include sys/cdefs.h. Add function prototype for flock().
+ * Add some comments from BSD's header for further clarity.
+ * (L_SET, L_CURR, L_INCR, L_XTND): Redefine as the macros
+ * SEEK_SET, SEEK_CUR, SEEK_CUR, & SEEK_END respectively.
+ * (LOCK_SH,LOCK_EX,LOCK_NB,LOCK_UN): New macros for flock().
+*/
#ifndef _FILE_H_
#define _FILE_H_
+#include <sys/cdefs.h>
#include <fcntl.h>
-#define L_SET 0
-#define L_CURR 1
-#define L_INCR 1
-#define L_XTND 2
+/* Whence values for lseek(); renamed by POSIX 1003.1 */
+#define L_SET SEEK_SET
+#define L_CURR SEEK_CUR
+#define L_INCR SEEK_CUR
+#define L_XTND SEEK_END
+
+/* Operations for flock() function */
+#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. */
+/* Operations for access function */
#define F_OK 0 /* does file exist */
-#define X_OK 1 /* is it executable by caller */
+#define X_OK 1 /* is it executable or searchable by caller */
#define W_OK 2 /* is it writable by caller */
#define R_OK 4 /* is it readable by caller */
+/* Apply or remove an advisory lock on the file fd refers to. */
+__BEGIN_DECLS
+
+int _EXFUN(flock, (int, int));
+
+__END_DECLS
+
#endif