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