2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 #define dev_t __kernel_dev_t
42 #define ino_t __kernel_ino_t
43 #define mode_t __kernel_mode_t
44 #define nlink_t __kernel_nlink_t
45 #define uid_t __kernel_uid_t
46 #define gid_t __kernel_gid_t
47 #define off_t __kernel_off_t
48 #define loff_t __kernel_loff_t
63 #define nlink_t nlink_t
70 #define stat libc_stat
71 #define stat64 libc_stat64
75 /* These might be macros. */
80 #if defined MAJOR_IN_SYSMACROS
81 # include <sys/sysmacros.h>
82 #elif defined MAJOR_IN_MKDEV
83 # include <sys/mkdev.h>
88 #include "printstat.h"
90 /* all locally defined structures provide these fields */
91 #undef HAVE_STRUCT_STAT_ST_ATIME_NSEC
92 #define HAVE_STRUCT_STAT_ST_ATIME_NSEC 1
93 #undef HAVE_STRUCT_STAT_ST_CTIME_NSEC
94 #define HAVE_STRUCT_STAT_ST_CTIME_NSEC 1
95 #undef HAVE_STRUCT_STAT_ST_MTIME_NSEC
96 #define HAVE_STRUCT_STAT_ST_MTIME_NSEC 1
98 #undef STAT32_PERSONALITY
99 #if SUPPORTED_PERSONALITIES > 1
100 # if defined AARCH64 || defined X86_64 || defined X32
104 unsigned short st_mode;
105 unsigned short st_nlink;
106 unsigned short st_uid;
107 unsigned short st_gid;
108 unsigned int st_rdev;
109 unsigned int st_size;
110 unsigned int st_blksize;
111 unsigned int st_blocks;
112 unsigned int st_atime;
113 unsigned int st_atime_nsec;
114 unsigned int st_mtime;
115 unsigned int st_mtime_nsec;
116 unsigned int st_ctime;
117 unsigned int st_ctime_nsec;
118 unsigned int __unused4;
119 unsigned int __unused5;
121 # define STAT32_PERSONALITY 1
122 # elif defined POWERPC64
126 unsigned int st_mode;
127 unsigned short st_nlink;
130 unsigned int st_rdev;
131 unsigned int st_size;
132 unsigned int st_blksize;
133 unsigned int st_blocks;
134 unsigned int st_atime;
135 unsigned int st_atime_nsec;
136 unsigned int st_mtime;
137 unsigned int st_mtime_nsec;
138 unsigned int st_ctime;
139 unsigned int st_ctime_nsec;
140 unsigned int __unused4;
141 unsigned int __unused5;
143 # define STAT32_PERSONALITY 1
144 # elif defined SPARC64
146 unsigned short st_dev;
148 unsigned short st_mode;
149 unsigned short st_nlink;
150 unsigned short st_uid;
151 unsigned short st_gid;
152 unsigned short st_rdev;
153 unsigned int st_size;
154 unsigned int st_atime;
155 unsigned int st_atime_nsec;
156 unsigned int st_mtime;
157 unsigned int st_mtime_nsec;
158 unsigned int st_ctime;
159 unsigned int st_ctime_nsec;
160 unsigned int st_blksize;
161 unsigned int st_blocks;
162 unsigned int __unused4[2];
164 # define STAT32_PERSONALITY 0
166 # /* no 64-bit personalities */
168 # /* no 32-bit stat */
170 # warning FIXME: check whether struct stat32 definition is needed for this architecture!
171 # endif /* X86_64 || X32 || POWERPC64 */
172 #endif /* SUPPORTED_PERSONALITIES > 1 */
174 #ifdef STAT32_PERSONALITY
175 # define DO_PRINTSTAT do_printstat32
176 # define STRUCT_STAT struct stat32
177 # undef HAVE_STRUCT_STAT_ST_FLAGS
178 # undef HAVE_STRUCT_STAT_ST_FSTYPE
179 # undef HAVE_STRUCT_STAT_ST_GEN
180 # include "printstat.h"
181 #endif /* STAT32_PERSONALITY */
183 #if defined(SPARC) || defined(SPARC64)
187 unsigned int st_pad1[3]; /* network id */
194 unsigned int st_pad2[2];
195 unsigned int st_size;
196 unsigned int st_pad3; /* st_size, off_t expansion */
197 unsigned int st_atime;
198 unsigned int st_atime_nsec;
199 unsigned int st_mtime;
200 unsigned int st_mtime_nsec;
201 unsigned int st_ctime;
202 unsigned int st_ctime_nsec;
203 unsigned int st_blksize;
204 unsigned int st_blocks;
206 unsigned int st_pad4[8]; /* expansion area */
209 # define DO_PRINTSTAT do_printstat_sol
210 # define STRUCT_STAT struct solstat
211 # define STAT_MAJOR(x) (((x) >> 18) & 0x3fff)
212 # define STAT_MINOR(x) ((x) & 0x3ffff)
213 # undef HAVE_STRUCT_STAT_ST_FLAGS
214 # undef HAVE_STRUCT_STAT_ST_FSTYPE
215 # undef HAVE_STRUCT_STAT_ST_GEN
216 # include "printstat.h"
217 #endif /* SPARC || SPARC64 */
220 printstat(struct tcb *tcp, long addr)
224 #ifdef STAT32_PERSONALITY
225 if (current_personality == STAT32_PERSONALITY) {
226 struct stat32 statbuf;
228 if (!umove_or_printaddr(tcp, addr, &statbuf))
229 do_printstat32(tcp, &statbuf);
234 #if defined(SPARC) || defined(SPARC64)
235 if (current_personality == 1) {
236 struct solstat statbuf;
238 if (!umove_or_printaddr(tcp, addr, &statbuf))
239 do_printstat_sol(tcp, &statbuf);
242 #endif /* SPARC || SPARC64 */
244 if (!umove_or_printaddr(tcp, addr, &statbuf))
245 do_printstat(tcp, &statbuf);
251 printpath(tcp, tcp->u_arg[0]);
254 printstat(tcp, tcp->u_arg[1]);
262 printfd(tcp, tcp->u_arg[0]);
265 printstat(tcp, tcp->u_arg[1]);
270 #if defined STAT32_PERSONALITY && !defined HAVE_STRUCT_STAT64
271 # if defined AARCH64 || defined X86_64 || defined X32
273 * Linux x86_64 and x32 have unified `struct stat' but their i386 personality
274 * needs `struct stat64'.
275 * linux/arch/x86/include/uapi/asm/stat.h defines `struct stat64' only for i386.
277 * Similarly, aarch64 has a unified `struct stat' but its arm personality
278 * needs `struct stat64' (unlike x86, it shouldn't be packed).
281 unsigned long long st_dev;
282 unsigned char __pad0[4];
283 unsigned int __st_ino;
284 unsigned int st_mode;
285 unsigned int st_nlink;
288 unsigned long long st_rdev;
289 unsigned char __pad3[4];
291 unsigned int st_blksize;
292 unsigned long long st_blocks;
293 unsigned int st_atime;
294 unsigned int st_atime_nsec;
295 unsigned int st_mtime;
296 unsigned int st_mtime_nsec;
297 unsigned int st_ctime;
298 unsigned int st_ctime_nsec;
299 unsigned long long st_ino;
301 # if defined X86_64 || defined X32
303 # define STAT64_SIZE 96
305 # define STAT64_SIZE 104
308 # define HAVE_STRUCT_STAT64 1
309 # else /* !(AARCH64 || X86_64 || X32) */
310 # warning FIXME: check whether struct stat64 definition is needed for this architecture!
312 #endif /* STAT32_PERSONALITY && !HAVE_STRUCT_STAT64 */
314 #ifdef HAVE_STRUCT_STAT64
316 # define DO_PRINTSTAT do_printstat64
317 # define STRUCT_STAT struct stat64
318 # undef HAVE_STRUCT_STAT_ST_FLAGS
319 # undef HAVE_STRUCT_STAT_ST_FSTYPE
320 # undef HAVE_STRUCT_STAT_ST_GEN
321 # include "printstat.h"
324 printstat64(struct tcb *tcp, long addr)
326 struct stat64 statbuf;
329 (void) sizeof(char[sizeof statbuf == STAT64_SIZE ? 1 : -1]);
332 # ifdef STAT32_PERSONALITY
333 if (current_personality != STAT32_PERSONALITY) {
334 printstat(tcp, addr);
337 # endif /* STAT32_PERSONALITY */
339 if (!umove_or_printaddr(tcp, addr, &statbuf))
340 do_printstat64(tcp, &statbuf);
346 printpath(tcp, tcp->u_arg[0]);
349 printstat64(tcp, tcp->u_arg[1]);
357 printfd(tcp, tcp->u_arg[0]);
360 printstat64(tcp, tcp->u_arg[1]);
369 return sys_stat(tcp);
374 return sys_fstat(tcp);
377 #endif /* HAVE_STRUCT_STAT64 */
382 print_dirfd(tcp, tcp->u_arg[0]);
383 printpath(tcp, tcp->u_arg[1]);
386 #if defined STAT32_PERSONALITY
387 if (current_personality == STAT32_PERSONALITY)
388 printstat64(tcp, tcp->u_arg[2]);
390 printstat(tcp, tcp->u_arg[2]);
391 #elif defined HAVE_STRUCT_STAT64
392 printstat64(tcp, tcp->u_arg[2]);
394 printstat(tcp, tcp->u_arg[2]);
395 #endif /* STAT32_PERSONALITY || HAVE_STRUCT_STAT64 */
397 printflags(at_flags, tcp->u_arg[3], "AT_???");
402 #if defined(HAVE_STRUCT___OLD_KERNEL_STAT)
405 convertoldstat(const struct __old_kernel_stat *oldbuf, struct stat *newbuf)
407 memset(newbuf, 0, sizeof(*newbuf));
408 newbuf->st_dev = oldbuf->st_dev;
409 newbuf->st_ino = oldbuf->st_ino;
410 newbuf->st_mode = oldbuf->st_mode;
411 newbuf->st_nlink = oldbuf->st_nlink;
412 newbuf->st_uid = oldbuf->st_uid;
413 newbuf->st_gid = oldbuf->st_gid;
414 newbuf->st_rdev = oldbuf->st_rdev;
415 newbuf->st_size = oldbuf->st_size;
416 newbuf->st_atime = oldbuf->st_atime;
417 newbuf->st_mtime = oldbuf->st_mtime;
418 newbuf->st_ctime = oldbuf->st_ctime;
422 printoldstat(struct tcb *tcp, long addr)
424 struct __old_kernel_stat statbuf;
425 struct stat newstatbuf;
427 # if defined(SPARC) || defined(SPARC64)
428 if (current_personality == 1) {
429 struct solstat statbuf;
431 if (!umove_or_printaddr(tcp, addr, &statbuf))
432 do_printstat_sol(tcp, &statbuf);
437 if (!umove_or_printaddr(tcp, addr, &statbuf)) {
438 convertoldstat(&statbuf, &newstatbuf);
439 do_printstat(tcp, &newstatbuf);
446 printpath(tcp, tcp->u_arg[0]);
449 printoldstat(tcp, tcp->u_arg[1]);
457 printfd(tcp, tcp->u_arg[0]);
460 printoldstat(tcp, tcp->u_arg[1]);
465 #endif /* HAVE_STRUCT___OLD_KERNEL_STAT */
467 #if defined(SPARC) || defined(SPARC64)
472 tprintf("%ld, ", tcp->u_arg[0]);
473 printpath(tcp, tcp->u_arg[1]);
476 printstat(tcp, tcp->u_arg[2]);
484 tprintf("%ld, ", tcp->u_arg[0]);
485 printfd(tcp, tcp->u_arg[1]);
488 printstat(tcp, tcp->u_arg[2]);
493 #endif /* SPARC || SPARC64 */