* 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:
parent
b50fe8212f
commit
f3a1e23eb3
|
@ -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
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue