* 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.
This commit is contained in:
Corinna Vinschen 2003-11-29 23:00:51 +00:00
parent b50fe8212f
commit f3a1e23eb3
6 changed files with 137 additions and 9 deletions

View 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> 2003-11-28 Christopher Faylor <cgf@redhat.com>
* sigproc.cc (no_signals_available): Fix so that non-zero exit state is * sigproc.cc (no_signals_available): Fix so that non-zero exit state is

View 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_random.o fhandler_raw.o fhandler_registry.o fhandler_serial.o \
fhandler_socket.o fhandler_tape.o fhandler_termios.o \ fhandler_socket.o fhandler_tape.o fhandler_termios.o \
fhandler_tty.o fhandler_virtual.o fhandler_windows.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 \ fhandler_zero.o flock.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o \
ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.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 \ 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 \ 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 \ resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \

View File

@ -500,6 +500,7 @@ finitef NOSIGFE
_finitef = finitef NOSIGFE _finitef = finitef NOSIGFE
fiprintf SIGFE fiprintf SIGFE
_fiprintf = fiprintf SIGFE _fiprintf = fiprintf SIGFE
flock SIGFE
floor NOSIGFE floor NOSIGFE
_floor = floor NOSIGFE _floor = floor NOSIGFE
floorf NOSIGFE floorf NOSIGFE

89
winsup/cygwin/flock.c Normal file
View File

@ -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

View File

@ -230,12 +230,13 @@ details. */
103: Export getprogname, setprogname. 103: Export getprogname, setprogname.
104: Export msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop. 104: Export msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop.
105: Export sigwait. 105: Export sigwait.
106: Export flock.
*/ */
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0 #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 /* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible shared memory regions. It is incremented when incompatible

View File

@ -11,20 +11,44 @@
** This file is distributed WITHOUT ANY WARRANTY; without even the implied ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** 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_ #ifndef _FILE_H_
#define _FILE_H_ #define _FILE_H_
#include <sys/cdefs.h>
#include <fcntl.h> #include <fcntl.h>
#define L_SET 0 /* Whence values for lseek(); renamed by POSIX 1003.1 */
#define L_CURR 1 #define L_SET SEEK_SET
#define L_INCR 1 #define L_CURR SEEK_CUR
#define L_XTND 2 #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 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 W_OK 2 /* is it writable by caller */
#define R_OK 4 /* is it readable 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 #endif