OSDN Git Service

* Makefile.in: (DLL_OFILES): Add flock.o.
authorcorinna <corinna>
Sat, 29 Nov 2003 23:00:51 +0000 (23:00 +0000)
committercorinna <corinna>
Sat, 29 Nov 2003 23:00:51 +0000 (23:00 +0000)
* 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.

winsup/cygwin/ChangeLog
winsup/cygwin/Makefile.in
winsup/cygwin/cygwin.din
winsup/cygwin/flock.c [new file with mode: 0644]
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/sys/file.h

index 100a7d2..ef86002 100644 (file)
@@ -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
index ed5247a..c445e86 100644 (file)
@@ -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 \
index 501a882..b5d7157 100644 (file)
@@ -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 (file)
index 0000000..09ea2b6
--- /dev/null
@@ -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
index 52ddb5b..7613083 100644 (file)
@@ -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
index dbf2ea8..af07df4 100644 (file)
 ** 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