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 + + * 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 * 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 +#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 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 : + * + * 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 #include -#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