]>
Commit | Line | Data |
---|---|---|
e3a7ff87 | 1 | /* fxstat using old-style Unix fstat system call. |
0ecb606c JJ |
2 | Copyright (C) 1991,1995-1998,2000,2002,2003,2006 |
3 | Free Software Foundation, Inc. | |
e3a7ff87 UD |
4 | This file is part of the GNU C Library. |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
e3a7ff87 UD |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
e3a7ff87 | 15 | |
41bdb6e2 AJ |
16 | You should have received a copy of the GNU Lesser General Public |
17 | License along with the GNU C Library; if not, write to the Free | |
18 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
19 | 02111-1307 USA. */ | |
e3a7ff87 UD |
20 | |
21 | /* Ho hum, if xstat == xstat64 we must get rid of the prototype or gcc | |
22 | will complain since they don't strictly match. */ | |
23 | #define __fxstat64 __fxstat64_disable | |
24 | ||
25 | #include <errno.h> | |
26 | #include <stddef.h> | |
27 | #include <sys/stat.h> | |
28 | #include <kernel_stat.h> | |
29 | ||
30 | #include <sysdep.h> | |
31 | #include <sys/syscall.h> | |
4bbb61e4 GM |
32 | #include <bp-checks.h> |
33 | ||
0ecb606c | 34 | #include <kernel-features.h> |
e3a7ff87 | 35 | |
9c7ff11a | 36 | #include <xstatconv.h> |
e3a7ff87 | 37 | |
e3a7ff87 | 38 | #ifdef __NR_stat64 |
e3a7ff87 UD |
39 | # if __ASSUME_STAT64_SYSCALL == 0 |
40 | /* The variable is shared between all wrappers around *stat64 calls. */ | |
41 | extern int __have_no_stat64; | |
42 | # endif | |
43 | #endif | |
44 | ||
45 | /* Get information about the file FD in BUF. */ | |
46 | int | |
47 | __fxstat (int vers, int fd, struct stat *buf) | |
48 | { | |
9dbcebe8 | 49 | #if __ASSUME_STAT64_SYSCALL == 0 |
e3a7ff87 | 50 | struct kernel_stat kbuf; |
9dbcebe8 | 51 | #endif |
e3a7ff87 UD |
52 | int result; |
53 | ||
54 | if (vers == _STAT_VER_KERNEL) | |
4bbb61e4 GM |
55 | return INLINE_SYSCALL (fstat, 2, fd, CHECK_1 ((struct kernel_stat *) buf)); |
56 | ||
e3a7ff87 | 57 | #if __ASSUME_STAT64_SYSCALL > 0 |
1827fc4c UD |
58 | { |
59 | struct stat64 buf64; | |
60 | ||
4bbb61e4 | 61 | result = INLINE_SYSCALL (fstat64, 2, fd, __ptrvalue (&buf64)); |
1827fc4c | 62 | if (result == 0) |
9c7ff11a | 63 | result = __xstat32_conv (vers, &buf64, buf); |
1827fc4c UD |
64 | return result; |
65 | } | |
e3a7ff87 UD |
66 | #else |
67 | ||
68 | # if defined __NR_stat64 | |
69 | /* To support 32 bit UIDs, we have to use stat64. The normal stat call only returns | |
70 | 16 bit UIDs. */ | |
71 | if (! __have_no_stat64) | |
72 | { | |
73 | struct stat64 buf64; | |
74 | ||
4bbb61e4 | 75 | result = INLINE_SYSCALL (fstat64, 2, fd, __ptrvalue (&buf64)); |
e3a7ff87 UD |
76 | |
77 | if (result == 0) | |
9c7ff11a | 78 | result = __xstat32_conv (vers, &buf64, buf); |
4bbb61e4 | 79 | |
e3a7ff87 UD |
80 | if (result != -1 || errno != ENOSYS) |
81 | return result; | |
82 | ||
83 | __have_no_stat64 = 1; | |
84 | } | |
4bbb61e4 | 85 | # endif |
e3a7ff87 | 86 | |
4bbb61e4 | 87 | result = INLINE_SYSCALL (fstat, 2, fd, __ptrvalue (&kbuf)); |
e3a7ff87 | 88 | if (result == 0) |
9c7ff11a | 89 | result = __xstat_conv (vers, &kbuf, buf); |
e3a7ff87 UD |
90 | |
91 | return result; | |
92 | #endif /* __ASSUME_STAT64_SYSCALL */ | |
93 | } | |
94 | ||
df962917 | 95 | hidden_def (__fxstat) |
e3a7ff87 UD |
96 | weak_alias (__fxstat, _fxstat); |
97 | #ifdef XSTAT_IS_XSTAT64 | |
98 | #undef __fxstat64 | |
99 | strong_alias (__fxstat, __fxstat64); | |
df962917 | 100 | hidden_ver (__fxstat, __fxstat64) |
e3a7ff87 | 101 | #endif |