1 /* $NetBSD: flock.c,v 1.1.1.1 2011/04/13 18:15:41 elric Exp $ */
4 * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the Institute nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 #include <krb5/roken.h>
42 #define OP_MASK (LOCK_SH | LOCK_EX | LOCK_UN)
45 ROKEN_LIB_FUNCTION
int ROKEN_LIB_CALL
46 rk_flock(int fd
, int operation
)
48 #if defined(HAVE_FCNTL) && defined(F_SETLK)
52 arg
.l_whence
= SEEK_SET
;
54 arg
.l_len
= 0; /* means to EOF */
56 if (operation
& LOCK_NB
)
59 cmd
= F_SETLKW
; /* Blocking */
61 switch (operation
& OP_MASK
) {
64 code
= fcntl(fd
, F_SETLK
, &arg
);
68 code
= fcntl(fd
, cmd
, &arg
);
72 code
= fcntl(fd
, cmd
, &arg
);
84 #define FLOCK_OFFSET_LOW 0
85 #define FLOCK_OFFSET_HIGH 0
86 #define FLOCK_LENGTH_LOW 0x00000000
87 #define FLOCK_LENGTH_HIGH 0x80000000
94 hFile
= (HANDLE
) _get_osfhandle(fd
);
95 if (hFile
== NULL
|| hFile
== INVALID_HANDLE_VALUE
) {
100 ZeroMemory(&ov
, sizeof(ov
));
102 ov
.Offset
= FLOCK_OFFSET_LOW
;
103 ov
.OffsetHigh
= FLOCK_OFFSET_HIGH
;
105 if (operation
& LOCK_NB
)
106 f
= LOCKFILE_FAIL_IMMEDIATELY
;
108 switch (operation
& OP_MASK
) {
109 case LOCK_UN
: /* Unlock */
110 rv
= UnlockFileEx(hFile
, 0,
111 FLOCK_LENGTH_LOW
, FLOCK_LENGTH_HIGH
, &ov
);
114 case LOCK_SH
: /* Shared lock */
115 rv
= LockFileEx(hFile
, f
, 0,
116 FLOCK_LENGTH_LOW
, FLOCK_LENGTH_HIGH
, &ov
);
119 case LOCK_EX
: /* Exclusive lock */
120 rv
= LockFileEx(hFile
, f
|LOCKFILE_EXCLUSIVE_LOCK
, 0,
121 FLOCK_LENGTH_LOW
, FLOCK_LENGTH_HIGH
,
131 switch (GetLastError()) {
132 case ERROR_SHARING_VIOLATION
:
133 case ERROR_LOCK_VIOLATION
:
134 case ERROR_IO_PENDING
:
135 _set_errno(EWOULDBLOCK
);
138 case ERROR_ACCESS_DENIED
: