]>
Commit | Line | Data |
---|---|---|
d4697bc9 | 1 | /* Copyright (C) 2000-2014 Free Software Foundation, Inc. |
f2481c31 UD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Lesser General Public | |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Lesser General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 PE |
15 | License along with the GNU C Library; if not, see |
16 | <http://www.gnu.org/licenses/>. */ | |
f2481c31 UD |
17 | |
18 | #include <assert.h> | |
19 | #include <errno.h> | |
d199bfb2 | 20 | #include <sysdep-cancel.h> /* Must come before <fcntl.h>. */ |
f2481c31 UD |
21 | #include <fcntl.h> |
22 | #include <stdarg.h> | |
23 | ||
f2481c31 UD |
24 | #include <sys/syscall.h> |
25 | ||
26 | ||
06eee9f5 | 27 | #ifndef NO_CANCELLATION |
d199bfb2 | 28 | int |
f2481c31 UD |
29 | __fcntl_nocancel (int fd, int cmd, ...) |
30 | { | |
31 | va_list ap; | |
32 | void *arg; | |
33 | ||
34 | va_start (ap, cmd); | |
35 | arg = va_arg (ap, void *); | |
36 | va_end (ap); | |
37 | ||
38 | return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); | |
39 | } | |
06eee9f5 | 40 | #endif |
f2481c31 UD |
41 | |
42 | ||
43 | int | |
44 | __libc_fcntl (int fd, int cmd, ...) | |
45 | { | |
46 | va_list ap; | |
47 | void *arg; | |
48 | ||
49 | va_start (ap, cmd); | |
50 | arg = va_arg (ap, void *); | |
51 | va_end (ap); | |
52 | ||
53 | if (cmd >= F_GETLK64 && cmd <= F_SETLKW64) | |
54 | cmd -= F_GETLK64 - F_GETLK; | |
55 | ||
56 | if (SINGLE_THREAD_P || cmd != F_SETLKW) | |
06eee9f5 | 57 | return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); |
f2481c31 UD |
58 | |
59 | int oldtype = LIBC_CANCEL_ASYNC (); | |
60 | ||
06eee9f5 | 61 | int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg); |
f2481c31 UD |
62 | |
63 | LIBC_CANCEL_RESET (oldtype); | |
64 | ||
65 | return result; | |
66 | } | |
67 | libc_hidden_def (__libc_fcntl) | |
68 | ||
69 | weak_alias (__libc_fcntl, __fcntl) | |
70 | libc_hidden_weak (__fcntl) | |
71 | weak_alias (__libc_fcntl, fcntl) |