blob: db6b60aeb9c05aa539b0715290e7c360172915a0 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
Michal Ludvig53b320f2002-09-23 13:30:09 +00002#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
4 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
5 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00006 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00007 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 * $Id$
32 */
33
34#include "defs.h"
35
36#include <dirent.h>
Michal Ludvig53b320f2002-09-23 13:30:09 +000037#ifdef LINUX
Wichert Akkerman9524bb91999-05-25 23:11:18 +000038#define dirent kernel_dirent
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +000039#define dirent64 kernel_dirent64
Wichert Akkerman9524bb91999-05-25 23:11:18 +000040#include <linux/types.h>
41#include <linux/dirent.h>
42#undef dirent
Michal Ludvig10a88d02002-10-07 14:31:00 +000043#undef dirent64
Wichert Akkerman9524bb91999-05-25 23:11:18 +000044#else
45#define kernel_dirent dirent
46#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000047
Michal Ludvig53b320f2002-09-23 13:30:09 +000048#ifdef LINUX
Wichert Akkermandacfb6e1999-06-03 14:21:07 +000049# ifdef LINUXSPARC
50struct stat {
51 unsigned short st_dev;
52 unsigned int st_ino;
53 unsigned short st_mode;
54 short st_nlink;
55 unsigned short st_uid;
56 unsigned short st_gid;
57 unsigned short st_rdev;
58 unsigned int st_size;
59 int st_atime;
60 unsigned int __unused1;
61 int st_mtime;
62 unsigned int __unused2;
63 int st_ctime;
64 unsigned int __unused3;
65 int st_blksize;
66 int st_blocks;
67 unsigned int __unused4[2];
68};
Roland McGrath6d1a65c2004-07-12 07:44:08 +000069#if defined(SPARC64)
70struct stat_sparc64 {
71 unsigned int st_dev;
72 unsigned long st_ino;
73 unsigned int st_mode;
74 unsigned int st_nlink;
75 unsigned int st_uid;
76 unsigned int st_gid;
77 unsigned int st_rdev;
78 long st_size;
79 long st_atime;
80 long st_mtime;
81 long st_ctime;
82 long st_blksize;
83 long st_blocks;
84 unsigned long __unused4[2];
85};
86#endif /* SPARC64 */
Wichert Akkermandacfb6e1999-06-03 14:21:07 +000087# define stat kernel_stat
88# include <asm/stat.h>
89# undef stat
90# else
Wichert Akkerman5b4d1281999-07-09 00:32:54 +000091# undef dev_t
92# undef ino_t
93# undef mode_t
94# undef nlink_t
95# undef uid_t
96# undef gid_t
97# undef off_t
98# undef loff_t
99
Wichert Akkermana6013701999-07-08 14:00:58 +0000100# define dev_t __kernel_dev_t
101# define ino_t __kernel_ino_t
102# define mode_t __kernel_mode_t
103# define nlink_t __kernel_nlink_t
104# define uid_t __kernel_uid_t
105# define gid_t __kernel_gid_t
106# define off_t __kernel_off_t
107# define loff_t __kernel_loff_t
108
Wichert Akkermandacfb6e1999-06-03 14:21:07 +0000109# include <asm/stat.h>
Wichert Akkermana6013701999-07-08 14:00:58 +0000110
111# undef dev_t
112# undef ino_t
113# undef mode_t
114# undef nlink_t
115# undef uid_t
116# undef gid_t
117# undef off_t
118# undef loff_t
Wichert Akkerman5b4d1281999-07-09 00:32:54 +0000119
120# define dev_t dev_t
121# define ino_t ino_t
122# define mode_t mode_t
123# define nlink_t nlink_t
124# define uid_t uid_t
125# define gid_t gid_t
126# define off_t off_t
127# define loff_t loff_t
Wichert Akkermandacfb6e1999-06-03 14:21:07 +0000128# endif
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000129# ifdef HPPA /* asm-parisc/stat.h defines stat64 */
130# undef stat64
131# endif
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000132# define stat libc_stat
Ulrich Drepper0fa01d71999-12-24 07:18:28 +0000133# define stat64 libc_stat64
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000134# include <sys/stat.h>
135# undef stat
Ulrich Drepper0fa01d71999-12-24 07:18:28 +0000136# undef stat64
Roland McGrathca16a402003-01-09 06:53:22 +0000137 /* These might be macros. */
138# undef st_atime
139# undef st_mtime
140# undef st_ctime
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000141# ifdef HPPA
142# define stat64 hpux_stat64
143# endif
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000144#else
145# include <sys/stat.h>
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000146#endif
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000147
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000148#include <fcntl.h>
149
150#ifdef SVR4
151# include <sys/cred.h>
152#endif /* SVR4 */
153
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000154#ifdef HAVE_SYS_VFS_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000155#include <sys/vfs.h>
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000156#endif
157
Roland McGrath186c5ac2002-12-15 23:58:23 +0000158#ifdef HAVE_LINUX_XATTR_H
159#include <linux/xattr.h>
160#elif defined linux
161#define XATTR_CREATE 1
162#define XATTR_REPLACE 2
163#endif
164
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000165#ifdef FREEBSD
166#include <sys/param.h>
167#include <sys/mount.h>
168#include <sys/stat.h>
John Hughes70623be2001-03-08 13:59:00 +0000169#endif
170
171#if HAVE_LONG_LONG_OFF_T
172/*
173 * Ugly hacks for systems that have typedef long long off_t
174 */
John Hughesb8c9f772001-03-07 16:53:07 +0000175
176#define stat64 stat
177#define HAVE_STAT64 1 /* Ugly hack */
John Hughes70623be2001-03-08 13:59:00 +0000178
179#define sys_stat64 sys_stat
180#define sys_fstat64 sys_fstat
181#define sys_lstat64 sys_lstat
182#define sys_lseek64 sys_lseek
183#define sys_truncate64 sys_truncate
184#define sys_ftruncate64 sys_ftruncate
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000185#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000186
187#ifdef MAJOR_IN_SYSMACROS
188#include <sys/sysmacros.h>
189#endif
190
191#ifdef MAJOR_IN_MKDEV
192#include <sys/mkdev.h>
193#endif
194
195#ifdef HAVE_SYS_ASYNCH_H
196#include <sys/asynch.h>
197#endif
198
199#ifdef SUNOS4
200#include <ustat.h>
201#endif
202
203/*
204 * This is a really dirty trick but it should always work. Traditional
205 * Unix says r/w/rw are 0/1/2, so we make them true flags 1/2/3 by
206 * adding 1. Just remember to add 1 to any arg decoded with openmodes.
207 */
Roland McGrathd9f816f2004-09-04 03:39:20 +0000208const struct xlat openmodes[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000209 { O_RDWR+1, "O_RDWR" },
210 { O_RDONLY+1, "O_RDONLY" },
211 { O_WRONLY+1, "O_WRONLY" },
212 { O_NONBLOCK, "O_NONBLOCK" },
213 { O_APPEND, "O_APPEND" },
214 { O_CREAT, "O_CREAT" },
215 { O_TRUNC, "O_TRUNC" },
216 { O_EXCL, "O_EXCL" },
217 { O_NOCTTY, "O_NOCTTY" },
218#ifdef O_SYNC
219 { O_SYNC, "O_SYNC" },
220#endif
221#ifdef O_ASYNC
222 { O_ASYNC, "O_ASYNC" },
223#endif
224#ifdef O_DSYNC
225 { O_DSYNC, "O_DSYNC" },
226#endif
227#ifdef O_RSYNC
228 { O_RSYNC, "O_RSYNC" },
229#endif
230#ifdef O_NDELAY
231 { O_NDELAY, "O_NDELAY" },
232#endif
233#ifdef O_PRIV
234 { O_PRIV, "O_PRIV" },
235#endif
236#ifdef O_DIRECT
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000237 { O_DIRECT, "O_DIRECT" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000238#endif
239#ifdef O_LARGEFILE
Roland McGrathfee836e2005-02-02 22:11:32 +0000240# if O_LARGEFILE == 0 /* biarch platforms in 64-bit mode */
241# undef O_LARGEFILE
242# ifdef SPARC64
243# define O_LARGEFILE 0x40000
244# elif defined X86_64 || defined S390X
245# define O_LARGEFILE 0100000
246# endif
247# endif
Roland McGrath663a8a02005-02-04 09:49:56 +0000248# ifdef O_LARGEFILE
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000249 { O_LARGEFILE, "O_LARGEFILE" },
Roland McGrath663a8a02005-02-04 09:49:56 +0000250# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000251#endif
252#ifdef O_DIRECTORY
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000253 { O_DIRECTORY, "O_DIRECTORY" },
254#endif
255#ifdef O_NOFOLLOW
256 { O_NOFOLLOW, "O_NOFOLLOW" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000257#endif
Roland McGrath1025c3e2005-05-09 07:40:35 +0000258#ifdef O_NOATIME
259 { O_NOATIME, "O_NOATIME" },
260#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000261
262#ifdef FNDELAY
263 { FNDELAY, "FNDELAY" },
264#endif
265#ifdef FAPPEND
266 { FAPPEND, "FAPPEND" },
267#endif
268#ifdef FMARK
269 { FMARK, "FMARK" },
270#endif
271#ifdef FDEFER
272 { FDEFER, "FDEFER" },
273#endif
274#ifdef FASYNC
275 { FASYNC, "FASYNC" },
276#endif
277#ifdef FSHLOCK
278 { FSHLOCK, "FSHLOCK" },
279#endif
280#ifdef FEXLOCK
281 { FEXLOCK, "FEXLOCK" },
282#endif
283#ifdef FCREAT
284 { FCREAT, "FCREAT" },
285#endif
286#ifdef FTRUNC
287 { FTRUNC, "FTRUNC" },
288#endif
289#ifdef FEXCL
290 { FEXCL, "FEXCL" },
291#endif
292#ifdef FNBIO
293 { FNBIO, "FNBIO" },
294#endif
295#ifdef FSYNC
296 { FSYNC, "FSYNC" },
297#endif
298#ifdef FNOCTTY
299 { FNOCTTY, "FNOCTTY" },
Roland McGrath186c5ac2002-12-15 23:58:23 +0000300#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000301#ifdef O_SHLOCK
302 { O_SHLOCK, "O_SHLOCK" },
303#endif
304#ifdef O_EXLOCK
305 { O_EXLOCK, "O_EXLOCK" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000306#endif
307 { 0, NULL },
308};
309
310int
311sys_open(tcp)
312struct tcb *tcp;
313{
314 if (entering(tcp)) {
315 printpath(tcp, tcp->u_arg[0]);
316 tprintf(", ");
317 /* flags */
Roland McGrathb2dee132005-06-01 19:02:36 +0000318 printflags(openmodes, tcp->u_arg[1] + 1, "O_???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000319 if (tcp->u_arg[1] & O_CREAT) {
320 /* mode */
321 tprintf(", %#lo", tcp->u_arg[2]);
322 }
323 }
324 return 0;
325}
326
327#ifdef LINUXSPARC
Roland McGrathd9f816f2004-09-04 03:39:20 +0000328const struct xlat openmodessol[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000329 { 0, "O_RDWR" },
330 { 1, "O_RDONLY" },
331 { 2, "O_WRONLY" },
332 { 0x80, "O_NONBLOCK" },
333 { 8, "O_APPEND" },
334 { 0x100, "O_CREAT" },
335 { 0x200, "O_TRUNC" },
336 { 0x400, "O_EXCL" },
337 { 0x800, "O_NOCTTY" },
338 { 0x10, "O_SYNC" },
339 { 0x40, "O_DSYNC" },
340 { 0x8000, "O_RSYNC" },
341 { 4, "O_NDELAY" },
342 { 0x1000, "O_PRIV" },
343 { 0, NULL },
344};
345
346int
347solaris_open(tcp)
348struct tcb *tcp;
349{
350 if (entering(tcp)) {
351 printpath(tcp, tcp->u_arg[0]);
352 tprintf(", ");
353 /* flags */
Roland McGrathb2dee132005-06-01 19:02:36 +0000354 printflags(openmodessol, tcp->u_arg[1] + 1, "O_???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000355 if (tcp->u_arg[1] & 0x100) {
356 /* mode */
357 tprintf(", %#lo", tcp->u_arg[2]);
358 }
359 }
360 return 0;
361}
362
363#endif
364
365int
366sys_creat(tcp)
367struct tcb *tcp;
368{
369 if (entering(tcp)) {
370 printpath(tcp, tcp->u_arg[0]);
371 tprintf(", %#lo", tcp->u_arg[1]);
372 }
373 return 0;
374}
375
Roland McGrathd9f816f2004-09-04 03:39:20 +0000376static const struct xlat access_flags[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000377 { F_OK, "F_OK", },
378 { R_OK, "R_OK" },
379 { W_OK, "W_OK" },
380 { X_OK, "X_OK" },
381#ifdef EFF_ONLY_OK
382 { EFF_ONLY_OK, "EFF_ONLY_OK" },
383#endif
384#ifdef EX_OK
385 { EX_OK, "EX_OK" },
386#endif
387 { 0, NULL },
388};
389
390int
391sys_access(tcp)
392struct tcb *tcp;
393{
394 if (entering(tcp)) {
395 printpath(tcp, tcp->u_arg[0]);
396 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +0000397 printflags(access_flags, tcp->u_arg[1], "?_OK");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000398 }
399 return 0;
400}
401
402int
403sys_umask(tcp)
404struct tcb *tcp;
405{
406 if (entering(tcp)) {
407 tprintf("%#lo", tcp->u_arg[0]);
408 }
409 return RVAL_OCTAL;
410}
411
Roland McGrathd9f816f2004-09-04 03:39:20 +0000412static const struct xlat whence[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000413 { SEEK_SET, "SEEK_SET" },
414 { SEEK_CUR, "SEEK_CUR" },
415 { SEEK_END, "SEEK_END" },
416 { 0, NULL },
417};
418
John Hughes70623be2001-03-08 13:59:00 +0000419#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000420int
421sys_lseek(tcp)
422struct tcb *tcp;
423{
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000424 off_t offset;
425 int _whence;
426
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000427 if (entering(tcp)) {
428 tprintf("%ld, ", tcp->u_arg[0]);
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000429 offset = tcp->u_arg[1];
430 _whence = tcp->u_arg[2];
431 if (_whence == SEEK_SET)
432 tprintf("%lu, ", offset);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000433 else
Roland McGrath186c5ac2002-12-15 23:58:23 +0000434 tprintf("%ld, ", offset);
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000435 printxval(whence, _whence, "SEEK_???");
Roland McGrath186c5ac2002-12-15 23:58:23 +0000436 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000437 return RVAL_UDECIMAL;
438}
John Hughes5a826b82001-03-07 13:21:24 +0000439#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000440
Michal Ludvig53b320f2002-09-23 13:30:09 +0000441#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000442int
443sys_llseek (tcp)
444struct tcb *tcp;
445{
446 if (entering(tcp)) {
Roland McGrath8c304bc2004-10-19 22:59:55 +0000447 /*
448 * This one call takes explicitly two 32-bit arguments hi, lo,
449 * rather than one 64-bit argument for which LONG_LONG works
450 * appropriate for the native byte order.
451 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000452 if (tcp->u_arg[4] == SEEK_SET)
453 tprintf("%ld, %llu, ", tcp->u_arg[0],
Roland McGrath8c304bc2004-10-19 22:59:55 +0000454 (((long long int) tcp->u_arg[1]) << 32
455 | (unsigned long long) (unsigned) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000456 else
457 tprintf("%ld, %lld, ", tcp->u_arg[0],
Roland McGrath8c304bc2004-10-19 22:59:55 +0000458 (((long long int) tcp->u_arg[1]) << 32
459 | (unsigned long long) (unsigned) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000460 }
461 else {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000462 long long int off;
463 if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000464 tprintf("%#lx, ", tcp->u_arg[3]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000465 else
466 tprintf("[%llu], ", off);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000467 printxval(whence, tcp->u_arg[4], "SEEK_???");
468 }
469 return 0;
470}
Roland McGrath186c5ac2002-12-15 23:58:23 +0000471
472int
473sys_readahead (tcp)
474struct tcb *tcp;
475{
476 if (entering(tcp)) {
477 tprintf("%ld, %lld, %ld", tcp->u_arg[0],
478# if defined IA64 || defined X86_64 || defined ALPHA
479 (long long int) tcp->u_arg[1], tcp->u_arg[2]
480# else
Roland McGrath2fe2a3e2004-10-07 19:09:16 +0000481 LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]), tcp->u_arg[3]
Roland McGrath186c5ac2002-12-15 23:58:23 +0000482# endif
483 );
484 }
485 return 0;
486}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000487#endif
488
John Hughes70623be2001-03-08 13:59:00 +0000489#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
John Hughesbdf48f52001-03-06 15:08:09 +0000490int
491sys_lseek64 (tcp)
492struct tcb *tcp;
493{
494 if (entering(tcp)) {
John Hughes5a826b82001-03-07 13:21:24 +0000495 long long offset;
496 ALIGN64 (tcp, 1); /* FreeBSD aligns off_t args */
John Hughes0c79e012001-03-08 14:40:06 +0000497 offset = LONG_LONG(tcp->u_arg [1], tcp->u_arg[2]);
John Hughesbdf48f52001-03-06 15:08:09 +0000498 if (tcp->u_arg[3] == SEEK_SET)
499 tprintf("%ld, %llu, ", tcp->u_arg[0], offset);
500 else
501 tprintf("%ld, %lld, ", tcp->u_arg[0], offset);
502 printxval(whence, tcp->u_arg[3], "SEEK_???");
503 }
504 return RVAL_LUDECIMAL;
505}
506#endif
507
John Hughes70623be2001-03-08 13:59:00 +0000508#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000509int
510sys_truncate(tcp)
511struct tcb *tcp;
512{
513 if (entering(tcp)) {
514 printpath(tcp, tcp->u_arg[0]);
515 tprintf(", %lu", tcp->u_arg[1]);
516 }
517 return 0;
518}
John Hughes5a826b82001-03-07 13:21:24 +0000519#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000520
John Hughes70623be2001-03-08 13:59:00 +0000521#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
John Hughes96f51472001-03-06 16:50:41 +0000522int
523sys_truncate64(tcp)
524struct tcb *tcp;
525{
526 if (entering(tcp)) {
John Hughes5a826b82001-03-07 13:21:24 +0000527 ALIGN64 (tcp, 1);
John Hughes96f51472001-03-06 16:50:41 +0000528 printpath(tcp, tcp->u_arg[0]);
John Hughes0c79e012001-03-08 14:40:06 +0000529 tprintf(", %llu", LONG_LONG(tcp->u_arg[1],tcp->u_arg[2]));
John Hughes96f51472001-03-06 16:50:41 +0000530 }
531 return 0;
532}
533#endif
534
John Hughes70623be2001-03-08 13:59:00 +0000535#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000536int
537sys_ftruncate(tcp)
538struct tcb *tcp;
539{
540 if (entering(tcp)) {
541 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
542 }
543 return 0;
544}
John Hughes5a826b82001-03-07 13:21:24 +0000545#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000546
John Hughes70623be2001-03-08 13:59:00 +0000547#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
John Hughes96f51472001-03-06 16:50:41 +0000548int
549sys_ftruncate64(tcp)
550struct tcb *tcp;
551{
552 if (entering(tcp)) {
John Hughes5a826b82001-03-07 13:21:24 +0000553 ALIGN64 (tcp, 1);
John Hughes96f51472001-03-06 16:50:41 +0000554 tprintf("%ld, %llu", tcp->u_arg[0],
John Hughes0c79e012001-03-08 14:40:06 +0000555 LONG_LONG(tcp->u_arg[1] ,tcp->u_arg[2]));
John Hughes96f51472001-03-06 16:50:41 +0000556 }
557 return 0;
558}
559#endif
560
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000561/* several stats */
562
Roland McGrathd9f816f2004-09-04 03:39:20 +0000563static const struct xlat modetypes[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000564 { S_IFREG, "S_IFREG" },
565 { S_IFSOCK, "S_IFSOCK" },
566 { S_IFIFO, "S_IFIFO" },
567 { S_IFLNK, "S_IFLNK" },
568 { S_IFDIR, "S_IFDIR" },
569 { S_IFBLK, "S_IFBLK" },
570 { S_IFCHR, "S_IFCHR" },
571 { 0, NULL },
572};
573
Roland McGrathf9c49b22004-10-06 22:11:54 +0000574static const char *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000575sprintmode(mode)
576int mode;
577{
578 static char buf[64];
Roland McGrathf9c49b22004-10-06 22:11:54 +0000579 const char *s;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000580
581 if ((mode & S_IFMT) == 0)
582 s = "";
583 else if ((s = xlookup(modetypes, mode & S_IFMT)) == NULL) {
584 sprintf(buf, "%#o", mode);
585 return buf;
586 }
587 sprintf(buf, "%s%s%s%s", s,
588 (mode & S_ISUID) ? "|S_ISUID" : "",
589 (mode & S_ISGID) ? "|S_ISGID" : "",
590 (mode & S_ISVTX) ? "|S_ISVTX" : "");
591 mode &= ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX);
592 if (mode)
593 sprintf(buf + strlen(buf), "|%#o", mode);
594 s = (*buf == '|') ? buf + 1 : buf;
595 return *s ? s : "0";
596}
597
598static char *
599sprinttime(t)
600time_t t;
601{
602 struct tm *tmp;
603 static char buf[32];
604
605 if (t == 0) {
606 sprintf(buf, "0");
607 return buf;
608 }
609 tmp = localtime(&t);
610 sprintf(buf, "%02d/%02d/%02d-%02d:%02d:%02d",
Wichert Akkerman3ed6dc22000-01-11 14:41:09 +0000611 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000612 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
613 return buf;
614}
615
616#ifdef LINUXSPARC
617typedef struct {
618 int tv_sec;
619 int tv_nsec;
620} timestruct_t;
621
622struct solstat {
623 unsigned st_dev;
624 int st_pad1[3]; /* network id */
625 unsigned st_ino;
626 unsigned st_mode;
627 unsigned st_nlink;
628 unsigned st_uid;
629 unsigned st_gid;
630 unsigned st_rdev;
631 int st_pad2[2];
632 int st_size;
633 int st_pad3; /* st_size, off_t expansion */
634 timestruct_t st_atime;
635 timestruct_t st_mtime;
636 timestruct_t st_ctime;
637 int st_blksize;
638 int st_blocks;
639 char st_fstype[16];
640 int st_pad4[8]; /* expansion area */
641};
642
643static void
644printstatsol(tcp, addr)
645struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000646long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000647{
648 struct solstat statbuf;
649
650 if (!addr) {
651 tprintf("NULL");
652 return;
653 }
654 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000655 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000656 return;
657 }
658 if (umove(tcp, addr, &statbuf) < 0) {
659 tprintf("{...}");
660 return;
661 }
662 if (!abbrev(tcp)) {
663 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
664 (unsigned long) ((statbuf.st_dev >> 18) & 0x3fff),
665 (unsigned long) (statbuf.st_dev & 0x3ffff),
666 (unsigned long) statbuf.st_ino,
667 sprintmode(statbuf.st_mode));
668 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
669 (unsigned long) statbuf.st_nlink,
670 (unsigned long) statbuf.st_uid,
671 (unsigned long) statbuf.st_gid);
672 tprintf("st_blksize=%lu, ", (unsigned long) statbuf.st_blksize);
673 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
674 }
675 else
676 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
677 switch (statbuf.st_mode & S_IFMT) {
678 case S_IFCHR: case S_IFBLK:
679 tprintf("st_rdev=makedev(%lu, %lu), ",
680 (unsigned long) ((statbuf.st_rdev >> 18) & 0x3fff),
681 (unsigned long) (statbuf.st_rdev & 0x3ffff));
682 break;
683 default:
684 tprintf("st_size=%u, ", statbuf.st_size);
685 break;
686 }
687 if (!abbrev(tcp)) {
688 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
689 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
690 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
691 }
692 else
693 tprintf("...}");
694}
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000695
696#if defined (SPARC64)
697static void
698printstat_sparc64(tcp, addr)
699struct tcb *tcp;
700long addr;
701{
702 struct stat_sparc64 statbuf;
703
704 if (!addr) {
705 tprintf("NULL");
706 return;
707 }
708 if (syserror(tcp) || !verbose(tcp)) {
709 tprintf("%#lx", addr);
710 return;
711 }
712 if (umove(tcp, addr, &statbuf) < 0) {
713 tprintf("{...}");
714 return;
715 }
716
717 if (!abbrev(tcp)) {
718 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
719 (unsigned long) major(statbuf.st_dev),
720 (unsigned long) minor(statbuf.st_dev),
721 (unsigned long) statbuf.st_ino,
722 sprintmode(statbuf.st_mode));
723 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
724 (unsigned long) statbuf.st_nlink,
725 (unsigned long) statbuf.st_uid,
726 (unsigned long) statbuf.st_gid);
727 tprintf("st_blksize=%lu, ",
728 (unsigned long) statbuf.st_blksize);
729 tprintf("st_blocks=%lu, ",
730 (unsigned long) statbuf.st_blocks);
731 }
732 else
733 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
734 switch (statbuf.st_mode & S_IFMT) {
735 case S_IFCHR: case S_IFBLK:
736 tprintf("st_rdev=makedev(%lu, %lu), ",
737 (unsigned long) major(statbuf.st_rdev),
738 (unsigned long) minor(statbuf.st_rdev));
739 break;
740 default:
741 tprintf("st_size=%lu, ", statbuf.st_size);
742 break;
743 }
744 if (!abbrev(tcp)) {
745 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
746 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
747 tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime));
748 tprintf("}");
749 }
750 else
751 tprintf("...}");
752}
753#endif /* SPARC64 */
Wichert Akkermanb859bea1999-04-18 22:50:50 +0000754#endif /* LINUXSPARC */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000755
Roland McGrathd9f816f2004-09-04 03:39:20 +0000756const struct xlat fileflags[] = {
John Hughesc0fc3fd2001-03-08 16:10:40 +0000757#ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000758 { UF_NODUMP, "UF_NODUMP" },
759 { UF_IMMUTABLE, "UF_IMMUTABLE" },
760 { UF_APPEND, "UF_APPEND" },
761 { UF_OPAQUE, "UF_OPAQUE" },
762 { UF_NOUNLINK, "UF_NOUNLINK" },
763 { SF_ARCHIVED, "SF_ARCHIVED" },
764 { SF_IMMUTABLE, "SF_IMMUTABLE" },
765 { SF_APPEND, "SF_APPEND" },
766 { SF_NOUNLINK, "SF_NOUNLINK" },
John Hughesc0fc3fd2001-03-08 16:10:40 +0000767#elif UNIXWARE >= 2
768#ifdef _S_ISMLD
769 { _S_ISMLD, "_S_ISMLD" },
770#endif
771#ifdef _S_ISMOUNTED
772 { _S_ISMOUNTED, "_S_ISMOUNTED" },
773#endif
774#endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000775 { 0, NULL },
776};
777
John Hughesc0fc3fd2001-03-08 16:10:40 +0000778#ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000779int
780sys_chflags(tcp)
781struct tcb *tcp;
782{
783 if (entering(tcp)) {
784 printpath(tcp, tcp->u_arg[0]);
785 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +0000786 printflags(fileflags, tcp->u_arg[1], "UF_???");
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000787 }
788 return 0;
789}
790
791int
792sys_fchflags(tcp)
793struct tcb *tcp;
794{
795 if (entering(tcp)) {
796 tprintf("%ld, ", tcp->u_arg[0]);
Roland McGrathb2dee132005-06-01 19:02:36 +0000797 printflags(fileflags, tcp->u_arg[1], "UF_???");
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000798 }
799 return 0;
800}
801#endif
802
John Hughes70623be2001-03-08 13:59:00 +0000803#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000804static void
805realprintstat(tcp, statbuf)
806struct tcb *tcp;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000807struct stat *statbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000808{
809 if (!abbrev(tcp)) {
810 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
811 (unsigned long) major(statbuf->st_dev),
812 (unsigned long) minor(statbuf->st_dev),
813 (unsigned long) statbuf->st_ino,
814 sprintmode(statbuf->st_mode));
815 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
816 (unsigned long) statbuf->st_nlink,
817 (unsigned long) statbuf->st_uid,
818 (unsigned long) statbuf->st_gid);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000819#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000820 tprintf("st_blksize=%lu, ", (unsigned long) statbuf->st_blksize);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000821#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
822#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000823 tprintf("st_blocks=%lu, ", (unsigned long) statbuf->st_blocks);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000824#endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000825 }
826 else
827 tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode));
828 switch (statbuf->st_mode & S_IFMT) {
829 case S_IFCHR: case S_IFBLK:
Roland McGrath6d2b3492002-12-30 00:51:30 +0000830#ifdef HAVE_STRUCT_STAT_ST_RDEV
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000831 tprintf("st_rdev=makedev(%lu, %lu), ",
832 (unsigned long) major(statbuf->st_rdev),
833 (unsigned long) minor(statbuf->st_rdev));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000834#else /* !HAVE_STRUCT_STAT_ST_RDEV */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000835 tprintf("st_size=makedev(%lu, %lu), ",
836 (unsigned long) major(statbuf->st_size),
837 (unsigned long) minor(statbuf->st_size));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000838#endif /* !HAVE_STRUCT_STAT_ST_RDEV */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000839 break;
840 default:
841 tprintf("st_size=%lu, ", statbuf->st_size);
842 break;
843 }
844 if (!abbrev(tcp)) {
845 tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
846 tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
John Hughesc0fc3fd2001-03-08 16:10:40 +0000847 tprintf("st_ctime=%s", sprinttime(statbuf->st_ctime));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000848#if HAVE_STRUCT_STAT_ST_FLAGS
John Hughesc0fc3fd2001-03-08 16:10:40 +0000849 tprintf(", st_flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000850 printflags(fileflags, statbuf->st_flags, "UF_???");
John Hughesc0fc3fd2001-03-08 16:10:40 +0000851#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000852#if HAVE_STRUCT_STAT_ST_ACLCNT
John Hughesc0fc3fd2001-03-08 16:10:40 +0000853 tprintf(", st_aclcnt=%d", statbuf->st_aclcnt);
854#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000855#if HAVE_STRUCT_STAT_ST_LEVEL
John Hughesc0fc3fd2001-03-08 16:10:40 +0000856 tprintf(", st_level=%ld", statbuf->st_level);
857#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000858#if HAVE_STRUCT_STAT_ST_FSTYPE
John Hughesc0fc3fd2001-03-08 16:10:40 +0000859 tprintf(", st_fstype=%.*s",
860 (int) sizeof statbuf->st_fstype, statbuf->st_fstype);
861#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000862#if HAVE_STRUCT_STAT_ST_GEN
John Hughesc0fc3fd2001-03-08 16:10:40 +0000863 tprintf(", st_gen=%u", statbuf->st_gen);
864#endif
865 tprintf("}");
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000866 }
867 else
868 tprintf("...}");
869}
870
Nate Sammons771a6ff1999-04-05 22:39:31 +0000871
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000872static void
873printstat(tcp, addr)
874struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000875long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000876{
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000877 struct stat statbuf;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000878
879#ifdef LINUXSPARC
880 if (current_personality == 1) {
881 printstatsol(tcp, addr);
882 return;
883 }
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000884#ifdef SPARC64
885 else if (current_personality == 2) {
886 printstat_sparc64(tcp, addr);
887 return;
888 }
889#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000890#endif /* LINUXSPARC */
891
892 if (!addr) {
893 tprintf("NULL");
894 return;
895 }
896 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000897 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000898 return;
899 }
900 if (umove(tcp, addr, &statbuf) < 0) {
901 tprintf("{...}");
902 return;
903 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000904
905 realprintstat(tcp, &statbuf);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000906}
John Hughes70623be2001-03-08 13:59:00 +0000907#endif /* !HAVE_LONG_LONG_OFF_T */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000908
Wichert Akkermanc7926982000-04-10 22:22:31 +0000909#ifdef HAVE_STAT64
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000910static void
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000911printstat64(tcp, addr)
912struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000913long addr;
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000914{
915 struct stat64 statbuf;
916
917#ifdef LINUXSPARC
918 if (current_personality == 1) {
919 printstatsol(tcp, addr);
920 return;
921 }
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000922#ifdef SPARC64
923 else if (current_personality == 2) {
924 printstat_sparc64(tcp, addr);
925 return;
926 }
927#endif
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000928#endif /* LINUXSPARC */
929
930 if (!addr) {
931 tprintf("NULL");
932 return;
933 }
934 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000935 tprintf("%#lx", addr);
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000936 return;
937 }
938 if (umove(tcp, addr, &statbuf) < 0) {
939 tprintf("{...}");
940 return;
941 }
942
943 if (!abbrev(tcp)) {
Wichert Akkermand077c452000-08-10 18:16:15 +0000944#ifdef HAVE_LONG_LONG
945 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%llu, st_mode=%s, ",
946#else
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000947 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
Wichert Akkermand077c452000-08-10 18:16:15 +0000948#endif
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000949 (unsigned long) major(statbuf.st_dev),
950 (unsigned long) minor(statbuf.st_dev),
Wichert Akkermand077c452000-08-10 18:16:15 +0000951#ifdef HAVE_LONG_LONG
952 (unsigned long long) statbuf.st_ino,
953#else
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000954 (unsigned long) statbuf.st_ino,
Wichert Akkermand077c452000-08-10 18:16:15 +0000955#endif
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000956 sprintmode(statbuf.st_mode));
957 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
958 (unsigned long) statbuf.st_nlink,
959 (unsigned long) statbuf.st_uid,
960 (unsigned long) statbuf.st_gid);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000961#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000962 tprintf("st_blksize=%lu, ",
963 (unsigned long) statbuf.st_blksize);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000964#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
965#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000966 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
Roland McGrath6d2b3492002-12-30 00:51:30 +0000967#endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000968 }
969 else
970 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
971 switch (statbuf.st_mode & S_IFMT) {
972 case S_IFCHR: case S_IFBLK:
Roland McGrath6d2b3492002-12-30 00:51:30 +0000973#ifdef HAVE_STRUCT_STAT_ST_RDEV
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000974 tprintf("st_rdev=makedev(%lu, %lu), ",
975 (unsigned long) major(statbuf.st_rdev),
976 (unsigned long) minor(statbuf.st_rdev));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000977#else /* !HAVE_STRUCT_STAT_ST_RDEV */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000978 tprintf("st_size=makedev(%lu, %lu), ",
979 (unsigned long) major(statbuf.st_size),
980 (unsigned long) minor(statbuf.st_size));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000981#endif /* !HAVE_STRUCT_STAT_ST_RDEV */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000982 break;
983 default:
984 tprintf("st_size=%llu, ", statbuf.st_size);
985 break;
986 }
987 if (!abbrev(tcp)) {
988 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
989 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
John Hughesc0fc3fd2001-03-08 16:10:40 +0000990 tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime));
Roland McGrath6d2b3492002-12-30 00:51:30 +0000991#if HAVE_STRUCT_STAT_ST_FLAGS
John Hughesc0fc3fd2001-03-08 16:10:40 +0000992 tprintf(", st_flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000993 printflags(fileflags, statbuf.st_flags, "UF_???");
John Hughesc0fc3fd2001-03-08 16:10:40 +0000994#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000995#if HAVE_STRUCT_STAT_ST_ACLCNT
John Hughesc0fc3fd2001-03-08 16:10:40 +0000996 tprintf(", st_aclcnt=%d", statbuf.st_aclcnt);
997#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +0000998#if HAVE_STRUCT_STAT_ST_LEVEL
John Hughesc0fc3fd2001-03-08 16:10:40 +0000999 tprintf(", st_level=%ld", statbuf.st_level);
1000#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +00001001#if HAVE_STRUCT_STAT_ST_FSTYPE
John Hughesc0fc3fd2001-03-08 16:10:40 +00001002 tprintf(", st_fstype=%.*s",
1003 (int) sizeof statbuf.st_fstype, statbuf.st_fstype);
1004#endif
Roland McGrath6d2b3492002-12-30 00:51:30 +00001005#if HAVE_STRUCT_STAT_ST_GEN
John Hughesc0fc3fd2001-03-08 16:10:40 +00001006 tprintf(", st_gen=%u", statbuf.st_gen);
1007#endif
1008 tprintf("}");
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001009 }
1010 else
1011 tprintf("...}");
1012}
Wichert Akkermanc7926982000-04-10 22:22:31 +00001013#endif /* HAVE_STAT64 */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001014
Roland McGrath79db8af2003-06-27 21:20:09 +00001015#if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001016static void
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001017convertoldstat(oldbuf, newbuf)
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +00001018const struct __old_kernel_stat *oldbuf;
1019struct stat *newbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001020{
1021 newbuf->st_dev=oldbuf->st_dev;
1022 newbuf->st_ino=oldbuf->st_ino;
1023 newbuf->st_mode=oldbuf->st_mode;
1024 newbuf->st_nlink=oldbuf->st_nlink;
1025 newbuf->st_uid=oldbuf->st_uid;
1026 newbuf->st_gid=oldbuf->st_gid;
1027 newbuf->st_rdev=oldbuf->st_rdev;
1028 newbuf->st_size=oldbuf->st_size;
1029 newbuf->st_atime=oldbuf->st_atime;
1030 newbuf->st_mtime=oldbuf->st_mtime;
1031 newbuf->st_ctime=oldbuf->st_ctime;
1032 newbuf->st_blksize=0; /* not supported in old_stat */
1033 newbuf->st_blocks=0; /* not supported in old_stat */
1034}
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001035
1036
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001037static void
1038printoldstat(tcp, addr)
1039struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00001040long addr;
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001041{
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +00001042 struct __old_kernel_stat statbuf;
1043 struct stat newstatbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001044
1045#ifdef LINUXSPARC
1046 if (current_personality == 1) {
1047 printstatsol(tcp, addr);
1048 return;
1049 }
1050#endif /* LINUXSPARC */
1051
1052 if (!addr) {
1053 tprintf("NULL");
1054 return;
1055 }
1056 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00001057 tprintf("%#lx", addr);
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001058 return;
1059 }
1060 if (umove(tcp, addr, &statbuf) < 0) {
1061 tprintf("{...}");
1062 return;
1063 }
1064
1065 convertoldstat(&statbuf, &newstatbuf);
1066 realprintstat(tcp, &newstatbuf);
1067}
Michal Ludvig10a88d02002-10-07 14:31:00 +00001068#endif /* LINUX && !IA64 && !HPPA && !X86_64 && !S390 && !S390X */
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001069
John Hughes70623be2001-03-08 13:59:00 +00001070#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001071int
1072sys_stat(tcp)
1073struct tcb *tcp;
1074{
1075 if (entering(tcp)) {
1076 printpath(tcp, tcp->u_arg[0]);
1077 tprintf(", ");
1078 } else {
1079 printstat(tcp, tcp->u_arg[1]);
1080 }
1081 return 0;
1082}
John Hughesb8c9f772001-03-07 16:53:07 +00001083#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001084
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001085int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001086sys_stat64(tcp)
1087struct tcb *tcp;
1088{
1089#ifdef HAVE_STAT64
1090 if (entering(tcp)) {
1091 printpath(tcp, tcp->u_arg[0]);
1092 tprintf(", ");
1093 } else {
1094 printstat64(tcp, tcp->u_arg[1]);
1095 }
1096 return 0;
1097#else
1098 return printargs(tcp);
1099#endif
1100}
1101
Roland McGrath79db8af2003-06-27 21:20:09 +00001102#if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001103int
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001104sys_oldstat(tcp)
1105struct tcb *tcp;
1106{
1107 if (entering(tcp)) {
1108 printpath(tcp, tcp->u_arg[0]);
1109 tprintf(", ");
1110 } else {
1111 printoldstat(tcp, tcp->u_arg[1]);
1112 }
1113 return 0;
1114}
Roland McGrath79db8af2003-06-27 21:20:09 +00001115#endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001116
John Hughes70623be2001-03-08 13:59:00 +00001117#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001118int
1119sys_fstat(tcp)
1120struct tcb *tcp;
1121{
1122 if (entering(tcp))
1123 tprintf("%ld, ", tcp->u_arg[0]);
1124 else {
1125 printstat(tcp, tcp->u_arg[1]);
1126 }
1127 return 0;
1128}
John Hughesb8c9f772001-03-07 16:53:07 +00001129#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001130
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001131int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001132sys_fstat64(tcp)
1133struct tcb *tcp;
1134{
1135#ifdef HAVE_STAT64
1136 if (entering(tcp))
1137 tprintf("%ld, ", tcp->u_arg[0]);
1138 else {
1139 printstat64(tcp, tcp->u_arg[1]);
1140 }
1141 return 0;
1142#else
1143 return printargs(tcp);
1144#endif
1145}
1146
Roland McGrath79db8af2003-06-27 21:20:09 +00001147#if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001148int
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001149sys_oldfstat(tcp)
1150struct tcb *tcp;
1151{
1152 if (entering(tcp))
1153 tprintf("%ld, ", tcp->u_arg[0]);
1154 else {
1155 printoldstat(tcp, tcp->u_arg[1]);
1156 }
1157 return 0;
1158}
Roland McGrath79db8af2003-06-27 21:20:09 +00001159#endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001160
John Hughes70623be2001-03-08 13:59:00 +00001161#ifndef HAVE_LONG_LONG_OFF_T
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001162int
1163sys_lstat(tcp)
1164struct tcb *tcp;
1165{
1166 if (entering(tcp)) {
1167 printpath(tcp, tcp->u_arg[0]);
1168 tprintf(", ");
1169 } else {
1170 printstat(tcp, tcp->u_arg[1]);
1171 }
1172 return 0;
1173}
John Hughesb8c9f772001-03-07 16:53:07 +00001174#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001175
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001176int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001177sys_lstat64(tcp)
1178struct tcb *tcp;
1179{
1180#ifdef HAVE_STAT64
1181 if (entering(tcp)) {
1182 printpath(tcp, tcp->u_arg[0]);
1183 tprintf(", ");
1184 } else {
1185 printstat64(tcp, tcp->u_arg[1]);
1186 }
1187 return 0;
1188#else
1189 return printargs(tcp);
1190#endif
1191}
1192
Roland McGrath79db8af2003-06-27 21:20:09 +00001193#if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +00001194int
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001195sys_oldlstat(tcp)
1196struct tcb *tcp;
1197{
1198 if (entering(tcp)) {
1199 printpath(tcp, tcp->u_arg[0]);
1200 tprintf(", ");
1201 } else {
1202 printoldstat(tcp, tcp->u_arg[1]);
1203 }
1204 return 0;
1205}
Roland McGrath79db8af2003-06-27 21:20:09 +00001206#endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001207
1208
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001209#if defined(SVR4) || defined(LINUXSPARC)
1210
1211int
1212sys_xstat(tcp)
1213struct tcb *tcp;
1214{
1215 if (entering(tcp)) {
1216 tprintf("%ld, ", tcp->u_arg[0]);
1217 printpath(tcp, tcp->u_arg[1]);
1218 tprintf(", ");
1219 } else {
John Hughes8fe2c982001-03-06 09:45:18 +00001220#ifdef _STAT64_VER
1221 if (tcp->u_arg[0] == _STAT64_VER)
1222 printstat64 (tcp, tcp->u_arg[2]);
1223 else
1224#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001225 printstat(tcp, tcp->u_arg[2]);
1226 }
1227 return 0;
1228}
1229
1230int
1231sys_fxstat(tcp)
1232struct tcb *tcp;
1233{
1234 if (entering(tcp))
1235 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]);
1236 else {
John Hughes8fe2c982001-03-06 09:45:18 +00001237#ifdef _STAT64_VER
1238 if (tcp->u_arg[0] == _STAT64_VER)
1239 printstat64 (tcp, tcp->u_arg[2]);
1240 else
1241#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001242 printstat(tcp, tcp->u_arg[2]);
1243 }
1244 return 0;
1245}
1246
1247int
1248sys_lxstat(tcp)
1249struct tcb *tcp;
1250{
1251 if (entering(tcp)) {
1252 tprintf("%ld, ", tcp->u_arg[0]);
1253 printpath(tcp, tcp->u_arg[1]);
1254 tprintf(", ");
1255 } else {
John Hughes8fe2c982001-03-06 09:45:18 +00001256#ifdef _STAT64_VER
1257 if (tcp->u_arg[0] == _STAT64_VER)
1258 printstat64 (tcp, tcp->u_arg[2]);
1259 else
1260#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001261 printstat(tcp, tcp->u_arg[2]);
1262 }
1263 return 0;
1264}
1265
1266int
1267sys_xmknod(tcp)
1268struct tcb *tcp;
1269{
1270 int mode = tcp->u_arg[2];
1271
1272 if (entering(tcp)) {
1273 tprintf("%ld, ", tcp->u_arg[0]);
1274 printpath(tcp, tcp->u_arg[1]);
1275 tprintf(", %s", sprintmode(mode));
1276 switch (mode & S_IFMT) {
1277 case S_IFCHR: case S_IFBLK:
1278#ifdef LINUXSPARC
1279 tprintf(", makedev(%lu, %lu)",
1280 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
1281 (unsigned long) (tcp->u_arg[3] & 0x3ffff));
Roland McGrath186c5ac2002-12-15 23:58:23 +00001282#else
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001283 tprintf(", makedev(%lu, %lu)",
1284 (unsigned long) major(tcp->u_arg[3]),
1285 (unsigned long) minor(tcp->u_arg[3]));
Roland McGrath186c5ac2002-12-15 23:58:23 +00001286#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001287 break;
1288 default:
1289 break;
1290 }
1291 }
1292 return 0;
1293}
1294
Wichert Akkerman8829a551999-06-11 13:18:40 +00001295#ifdef HAVE_SYS_ACL_H
1296
1297#include <sys/acl.h>
1298
Roland McGrathd9f816f2004-09-04 03:39:20 +00001299const struct xlat aclcmds[] = {
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001300#ifdef SETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +00001301 { SETACL, "SETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001302#endif
1303#ifdef GETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +00001304 { GETACL, "GETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001305#endif
1306#ifdef GETACLCNT
Wichert Akkerman8829a551999-06-11 13:18:40 +00001307 { GETACLCNT, "GETACLCNT" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001308#endif
1309#ifdef ACL_GET
1310 { ACL_GET, "ACL_GET" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001311#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001312#ifdef ACL_SET
1313 { ACL_SET, "ACL_SET" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001314#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001315#ifdef ACL_CNT
1316 { ACL_CNT, "ACL_CNT" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001317#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +00001318 { 0, NULL },
1319};
1320
1321int
1322sys_acl(tcp)
1323struct tcb *tcp;
1324{
1325 if (entering(tcp)) {
1326 printpath(tcp, tcp->u_arg[0]);
1327 tprintf(", ");
1328 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
1329 tprintf(", %ld", tcp->u_arg[2]);
1330 /*
1331 * FIXME - dump out the list of aclent_t's pointed to
1332 * by "tcp->u_arg[3]" if it's not NULL.
1333 */
1334 if (tcp->u_arg[3])
1335 tprintf(", %#lx", tcp->u_arg[3]);
1336 else
1337 tprintf(", NULL");
1338 }
1339 return 0;
1340}
1341
1342
1343int
1344sys_facl(tcp)
1345struct tcb *tcp;
1346{
1347 if (entering(tcp)) {
1348 tprintf("%ld, ", tcp->u_arg[0]);
1349 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
1350 tprintf(", %ld", tcp->u_arg[2]);
1351 /*
1352 * FIXME - dump out the list of aclent_t's pointed to
1353 * by "tcp->u_arg[3]" if it's not NULL.
1354 */
1355 if (tcp->u_arg[3])
1356 tprintf(", %#lx", tcp->u_arg[3]);
1357 else
1358 tprintf(", NULL");
1359 }
1360 return 0;
1361}
1362
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001363
Roland McGrathd9f816f2004-09-04 03:39:20 +00001364const struct xlat aclipc[] = {
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001365#ifdef IPC_SHM
1366 { IPC_SHM, "IPC_SHM" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001367#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001368#ifdef IPC_SEM
1369 { IPC_SEM, "IPC_SEM" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001370#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001371#ifdef IPC_MSG
1372 { IPC_MSG, "IPC_MSG" },
Roland McGrath186c5ac2002-12-15 23:58:23 +00001373#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001374 { 0, NULL },
1375};
1376
1377
1378int
1379sys_aclipc(tcp)
1380struct tcb *tcp;
1381{
1382 if (entering(tcp)) {
1383 printxval(aclipc, tcp->u_arg[0], "???IPC???");
1384 tprintf(", %#lx, ", tcp->u_arg[1]);
1385 printxval(aclcmds, tcp->u_arg[2], "???ACL???");
1386 tprintf(", %ld", tcp->u_arg[3]);
1387 /*
1388 * FIXME - dump out the list of aclent_t's pointed to
1389 * by "tcp->u_arg[4]" if it's not NULL.
1390 */
1391 if (tcp->u_arg[4])
1392 tprintf(", %#lx", tcp->u_arg[4]);
1393 else
1394 tprintf(", NULL");
1395 }
1396 return 0;
1397}
1398
1399
1400
Wichert Akkerman8829a551999-06-11 13:18:40 +00001401#endif /* HAVE_SYS_ACL_H */
1402
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001403#endif /* SVR4 || LINUXSPARC */
1404
Michal Ludvig53b320f2002-09-23 13:30:09 +00001405#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001406
Roland McGrathd9f816f2004-09-04 03:39:20 +00001407static const struct xlat fsmagic[] = {
Wichert Akkerman43a74822000-06-27 17:33:32 +00001408 { 0x73757245, "CODA_SUPER_MAGIC" },
1409 { 0x012ff7b7, "COH_SUPER_MAGIC" },
1410 { 0x1373, "DEVFS_SUPER_MAGIC" },
1411 { 0x1cd1, "DEVPTS_SUPER_MAGIC" },
1412 { 0x414A53, "EFS_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001413 { 0xef51, "EXT2_OLD_SUPER_MAGIC" },
1414 { 0xef53, "EXT2_SUPER_MAGIC" },
1415 { 0x137d, "EXT_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001416 { 0xf995e849, "HPFS_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001417 { 0x9660, "ISOFS_SUPER_MAGIC" },
1418 { 0x137f, "MINIX_SUPER_MAGIC" },
1419 { 0x138f, "MINIX_SUPER_MAGIC2" },
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001420 { 0x2468, "MINIX2_SUPER_MAGIC" },
1421 { 0x2478, "MINIX2_SUPER_MAGIC2" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001422 { 0x4d44, "MSDOS_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001423 { 0x564c, "NCP_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001424 { 0x6969, "NFS_SUPER_MAGIC" },
1425 { 0x9fa0, "PROC_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001426 { 0x002f, "QNX4_SUPER_MAGIC" },
1427 { 0x52654973, "REISERFS_SUPER_MAGIC" },
1428 { 0x02011994, "SHMFS_SUPER_MAGIC" },
1429 { 0x517b, "SMB_SUPER_MAGIC" },
1430 { 0x012ff7b6, "SYSV2_SUPER_MAGIC" },
1431 { 0x012ff7b5, "SYSV4_SUPER_MAGIC" },
1432 { 0x00011954, "UFS_MAGIC" },
1433 { 0x54190100, "UFS_CIGAM" },
1434 { 0x012ff7b4, "XENIX_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001435 { 0x012fd16d, "XIAFS_SUPER_MAGIC" },
Roland McGrathc767ad82004-01-13 10:13:45 +00001436 { 0x62656572, "SYSFS_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001437 { 0, NULL },
1438};
1439
Michal Ludvig53b320f2002-09-23 13:30:09 +00001440#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001441
1442#ifndef SVR4
1443
Roland McGrathf9c49b22004-10-06 22:11:54 +00001444static const char *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001445sprintfstype(magic)
1446int magic;
1447{
1448 static char buf[32];
Michal Ludvig53b320f2002-09-23 13:30:09 +00001449#ifdef LINUX
Roland McGrathf9c49b22004-10-06 22:11:54 +00001450 const char *s;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001451
1452 s = xlookup(fsmagic, magic);
1453 if (s) {
1454 sprintf(buf, "\"%s\"", s);
1455 return buf;
1456 }
Michal Ludvig53b320f2002-09-23 13:30:09 +00001457#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001458 sprintf(buf, "%#x", magic);
1459 return buf;
1460}
1461
1462static void
1463printstatfs(tcp, addr)
1464struct tcb *tcp;
1465long addr;
1466{
1467 struct statfs statbuf;
1468
1469 if (syserror(tcp) || !verbose(tcp)) {
1470 tprintf("%#lx", addr);
1471 return;
1472 }
1473 if (umove(tcp, addr, &statbuf) < 0) {
1474 tprintf("{...}");
1475 return;
1476 }
1477#ifdef ALPHA
1478
1479 tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ",
1480 sprintfstype(statbuf.f_type),
1481 statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree);
Roland McGrathab147c52003-07-17 09:03:02 +00001482 tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_fsid={%d, %d}, f_namelen=%u",
1483 statbuf.f_bavail,statbuf.f_files, statbuf.f_ffree,
1484 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1],
1485 statbuf.f_namelen);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001486#else /* !ALPHA */
1487 tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ",
1488 sprintfstype(statbuf.f_type),
Nate Sammons5c74d201999-04-06 01:37:51 +00001489 (unsigned long)statbuf.f_bsize,
1490 (unsigned long)statbuf.f_blocks,
1491 (unsigned long)statbuf.f_bfree);
Roland McGrathab147c52003-07-17 09:03:02 +00001492 tprintf("f_bavail=%lu, f_files=%lu, f_ffree=%lu, f_fsid={%d, %d}",
1493 (unsigned long)statbuf.f_bavail,
Nate Sammons5c74d201999-04-06 01:37:51 +00001494 (unsigned long)statbuf.f_files,
Roland McGrathab147c52003-07-17 09:03:02 +00001495 (unsigned long)statbuf.f_ffree,
1496 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]);
Michal Ludvig53b320f2002-09-23 13:30:09 +00001497#ifdef LINUX
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001498 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
Michal Ludvig53b320f2002-09-23 13:30:09 +00001499#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001500#endif /* !ALPHA */
Roland McGrathab147c52003-07-17 09:03:02 +00001501#ifdef _STATFS_F_FRSIZE
1502 tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize);
1503#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001504 tprintf("}");
1505}
1506
1507int
1508sys_statfs(tcp)
1509struct tcb *tcp;
1510{
1511 if (entering(tcp)) {
1512 printpath(tcp, tcp->u_arg[0]);
1513 tprintf(", ");
1514 } else {
1515 printstatfs(tcp, tcp->u_arg[1]);
1516 }
1517 return 0;
1518}
1519
1520int
1521sys_fstatfs(tcp)
1522struct tcb *tcp;
1523{
1524 if (entering(tcp)) {
1525 tprintf("%lu, ", tcp->u_arg[0]);
1526 } else {
1527 printstatfs(tcp, tcp->u_arg[1]);
1528 }
1529 return 0;
1530}
1531
Roland McGrathab147c52003-07-17 09:03:02 +00001532#ifdef LINUX
1533static void
1534printstatfs64(tcp, addr)
1535struct tcb *tcp;
1536long addr;
1537{
1538 struct statfs64 statbuf;
1539
1540 if (syserror(tcp) || !verbose(tcp)) {
1541 tprintf("%#lx", addr);
1542 return;
1543 }
1544 if (umove(tcp, addr, &statbuf) < 0) {
1545 tprintf("{...}");
1546 return;
1547 }
Roland McGrath08738432005-06-03 02:40:39 +00001548 tprintf("{f_type=%s, f_bsize=%llu, f_blocks=%llu, f_bfree=%llu, ",
Roland McGrathab147c52003-07-17 09:03:02 +00001549 sprintfstype(statbuf.f_type),
Roland McGrath08738432005-06-03 02:40:39 +00001550 (unsigned long long)statbuf.f_bsize,
1551 (unsigned long long)statbuf.f_blocks,
1552 (unsigned long long)statbuf.f_bfree);
1553 tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}",
1554 (unsigned long long)statbuf.f_bavail,
1555 (unsigned long long)statbuf.f_files,
1556 (unsigned long long)statbuf.f_ffree,
Roland McGrathab147c52003-07-17 09:03:02 +00001557 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]);
1558 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
Roland McGrathab147c52003-07-17 09:03:02 +00001559#ifdef _STATFS_F_FRSIZE
Roland McGrath08738432005-06-03 02:40:39 +00001560 tprintf(", f_frsize=%llu", (unsigned long long)statbuf.f_frsize);
Roland McGrathab147c52003-07-17 09:03:02 +00001561#endif
1562 tprintf("}");
1563}
1564
1565int
1566sys_statfs64(tcp)
1567struct tcb *tcp;
1568{
1569 if (entering(tcp)) {
1570 printpath(tcp, tcp->u_arg[0]);
1571 tprintf(", %lu, ", tcp->u_arg[1]);
1572 } else {
1573 if (tcp->u_arg[1] == sizeof (struct statfs64))
1574 printstatfs64(tcp, tcp->u_arg[2]);
1575 else
1576 tprintf("{???}");
1577 }
1578 return 0;
1579}
1580
1581int
1582sys_fstatfs64(tcp)
1583struct tcb *tcp;
1584{
1585 if (entering(tcp)) {
1586 tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
1587 } else {
1588 if (tcp->u_arg[1] == sizeof (struct statfs64))
1589 printstatfs64(tcp, tcp->u_arg[2]);
1590 else
1591 tprintf("{???}");
1592 }
1593 return 0;
1594}
1595#endif
1596
Michal Ludvig53b320f2002-09-23 13:30:09 +00001597#if defined(LINUX) && defined(__alpha)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001598
1599int
1600osf_statfs(tcp)
1601struct tcb *tcp;
1602{
1603 if (entering(tcp)) {
1604 printpath(tcp, tcp->u_arg[0]);
1605 tprintf(", ");
1606 } else {
1607 printstatfs(tcp, tcp->u_arg[1]);
1608 tprintf(", %lu", tcp->u_arg[2]);
1609 }
1610 return 0;
1611}
1612
1613int
1614osf_fstatfs(tcp)
1615struct tcb *tcp;
1616{
1617 if (entering(tcp)) {
1618 tprintf("%lu, ", tcp->u_arg[0]);
1619 } else {
1620 printstatfs(tcp, tcp->u_arg[1]);
1621 tprintf(", %lu", tcp->u_arg[2]);
1622 }
1623 return 0;
1624}
Michal Ludvig53b320f2002-09-23 13:30:09 +00001625#endif /* LINUX && __alpha */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001626
1627#endif /* !SVR4 */
1628
1629#ifdef SUNOS4
1630
1631int
1632sys_ustat(tcp)
1633struct tcb *tcp;
1634{
1635 struct ustat statbuf;
1636
1637 if (entering(tcp)) {
1638 tprintf("makedev(%lu, %lu), ",
1639 (long) major(tcp->u_arg[0]),
1640 (long) minor(tcp->u_arg[0]));
1641 }
1642 else {
1643 if (syserror(tcp) || !verbose(tcp))
1644 tprintf("%#lx", tcp->u_arg[1]);
1645 else if (umove(tcp, tcp->u_arg[1], &statbuf) < 0)
1646 tprintf("{...}");
1647 else {
1648 tprintf("{f_tfree=%lu, f_tinode=%lu, ",
1649 statbuf.f_tfree, statbuf.f_tinode);
1650 tprintf("f_fname=\"%.*s\", ",
1651 (int) sizeof(statbuf.f_fname),
1652 statbuf.f_fname);
1653 tprintf("f_fpack=\"%.*s\"}",
1654 (int) sizeof(statbuf.f_fpack),
1655 statbuf.f_fpack);
1656 }
1657 }
1658 return 0;
1659}
1660
1661#endif /* SUNOS4 */
1662
Wichert Akkermanc7926982000-04-10 22:22:31 +00001663int
1664sys_pivotroot(tcp)
1665struct tcb *tcp;
1666{
1667 if (entering(tcp)) {
1668 printpath(tcp, tcp->u_arg[0]);
1669 tprintf(", ");
1670 printpath(tcp, tcp->u_arg[1]);
1671 }
1672 return 0;
1673}
1674
1675
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001676/* directory */
1677int
1678sys_chdir(tcp)
1679struct tcb *tcp;
1680{
1681 if (entering(tcp)) {
1682 printpath(tcp, tcp->u_arg[0]);
1683 }
1684 return 0;
1685}
1686
1687int
1688sys_mkdir(tcp)
1689struct tcb *tcp;
1690{
1691 if (entering(tcp)) {
1692 printpath(tcp, tcp->u_arg[0]);
1693 tprintf(", %#lo", tcp->u_arg[1]);
1694 }
1695 return 0;
1696}
1697
1698int
1699sys_rmdir(tcp)
1700struct tcb *tcp;
1701{
1702 if (entering(tcp)) {
1703 printpath(tcp, tcp->u_arg[0]);
1704 }
1705 return 0;
1706}
1707
1708int
1709sys_fchdir(tcp)
1710struct tcb *tcp;
1711{
1712 if (entering(tcp)) {
1713 tprintf("%ld", tcp->u_arg[0]);
1714 }
1715 return 0;
1716}
1717
1718int
1719sys_chroot(tcp)
1720struct tcb *tcp;
1721{
1722 if (entering(tcp)) {
1723 printpath(tcp, tcp->u_arg[0]);
1724 }
1725 return 0;
1726}
1727
1728int
1729sys_fchroot(tcp)
1730struct tcb *tcp;
1731{
1732 if (entering(tcp)) {
1733 tprintf("%ld", tcp->u_arg[0]);
1734 }
1735 return 0;
1736}
1737
1738int
1739sys_link(tcp)
1740struct tcb *tcp;
1741{
1742 if (entering(tcp)) {
1743 printpath(tcp, tcp->u_arg[0]);
1744 tprintf(", ");
1745 printpath(tcp, tcp->u_arg[1]);
1746 }
1747 return 0;
1748}
1749
1750int
1751sys_unlink(tcp)
1752struct tcb *tcp;
1753{
1754 if (entering(tcp)) {
1755 printpath(tcp, tcp->u_arg[0]);
1756 }
1757 return 0;
1758}
1759
1760int
1761sys_symlink(tcp)
1762struct tcb *tcp;
1763{
1764 if (entering(tcp)) {
1765 printpath(tcp, tcp->u_arg[0]);
1766 tprintf(", ");
1767 printpath(tcp, tcp->u_arg[1]);
1768 }
1769 return 0;
1770}
1771
1772int
1773sys_readlink(tcp)
1774struct tcb *tcp;
1775{
1776 if (entering(tcp)) {
1777 printpath(tcp, tcp->u_arg[0]);
1778 tprintf(", ");
1779 } else {
1780 if (syserror(tcp))
1781 tprintf("%#lx", tcp->u_arg[1]);
1782 else
1783 printpathn(tcp, tcp->u_arg[1], tcp->u_rval);
1784 tprintf(", %lu", tcp->u_arg[2]);
1785 }
1786 return 0;
1787}
1788
1789int
1790sys_rename(tcp)
1791struct tcb *tcp;
1792{
1793 if (entering(tcp)) {
1794 printpath(tcp, tcp->u_arg[0]);
1795 tprintf(", ");
1796 printpath(tcp, tcp->u_arg[1]);
1797 }
1798 return 0;
1799}
1800
1801int
1802sys_chown(tcp)
1803struct tcb *tcp;
1804{
1805 if (entering(tcp)) {
1806 printpath(tcp, tcp->u_arg[0]);
Roland McGrath6bc12202003-11-13 22:32:27 +00001807 printuid(", ", tcp->u_arg[1]);
1808 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001809 }
1810 return 0;
1811}
1812
1813int
1814sys_fchown(tcp)
1815struct tcb *tcp;
1816{
1817 if (entering(tcp)) {
Roland McGrath6bc12202003-11-13 22:32:27 +00001818 tprintf("%ld", tcp->u_arg[0]);
1819 printuid(", ", tcp->u_arg[1]);
1820 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001821 }
1822 return 0;
1823}
1824
1825int
1826sys_chmod(tcp)
1827struct tcb *tcp;
1828{
1829 if (entering(tcp)) {
1830 printpath(tcp, tcp->u_arg[0]);
1831 tprintf(", %#lo", tcp->u_arg[1]);
1832 }
1833 return 0;
1834}
1835
1836int
1837sys_fchmod(tcp)
1838struct tcb *tcp;
1839{
1840 if (entering(tcp)) {
1841 tprintf("%ld, %#lo", tcp->u_arg[0], tcp->u_arg[1]);
1842 }
1843 return 0;
1844}
1845
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001846#ifdef ALPHA
1847int
1848sys_osf_utimes(tcp)
1849struct tcb *tcp;
1850{
1851 if (entering(tcp)) {
1852 printpath(tcp, tcp->u_arg[0]);
1853 tprintf(", ");
1854 printtv32(tcp, tcp->u_arg[1]);
1855 }
1856 return 0;
1857}
1858#endif
1859
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001860int
1861sys_utimes(tcp)
1862struct tcb *tcp;
1863{
1864 if (entering(tcp)) {
1865 printpath(tcp, tcp->u_arg[0]);
1866 tprintf(", ");
1867 printtv(tcp, tcp->u_arg[1]);
1868 }
1869 return 0;
1870}
1871
1872int
1873sys_utime(tcp)
1874struct tcb *tcp;
1875{
1876 long ut[2];
1877
1878 if (entering(tcp)) {
1879 printpath(tcp, tcp->u_arg[0]);
1880 tprintf(", ");
1881 if (!tcp->u_arg[1])
1882 tprintf("NULL");
1883 else if (!verbose(tcp))
1884 tprintf("%#lx", tcp->u_arg[1]);
1885 else if (umoven(tcp, tcp->u_arg[1], sizeof ut,
1886 (char *) ut) < 0)
1887 tprintf("[?, ?]");
1888 else {
1889 tprintf("[%s,", sprinttime(ut[0]));
1890 tprintf(" %s]", sprinttime(ut[1]));
1891 }
1892 }
1893 return 0;
1894}
1895
1896int
1897sys_mknod(tcp)
1898struct tcb *tcp;
1899{
1900 int mode = tcp->u_arg[1];
1901
1902 if (entering(tcp)) {
1903 printpath(tcp, tcp->u_arg[0]);
1904 tprintf(", %s", sprintmode(mode));
1905 switch (mode & S_IFMT) {
1906 case S_IFCHR: case S_IFBLK:
1907#ifdef LINUXSPARC
1908 if (current_personality == 1)
1909 tprintf(", makedev(%lu, %lu)",
1910 (unsigned long) ((tcp->u_arg[2] >> 18) & 0x3fff),
1911 (unsigned long) (tcp->u_arg[2] & 0x3ffff));
1912 else
Roland McGrath186c5ac2002-12-15 23:58:23 +00001913#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001914 tprintf(", makedev(%lu, %lu)",
1915 (unsigned long) major(tcp->u_arg[2]),
1916 (unsigned long) minor(tcp->u_arg[2]));
1917 break;
1918 default:
1919 break;
1920 }
1921 }
1922 return 0;
1923}
1924
1925int
1926sys_mkfifo(tcp)
1927struct tcb *tcp;
1928{
1929 if (entering(tcp)) {
1930 printpath(tcp, tcp->u_arg[0]);
1931 tprintf(", %#lo", tcp->u_arg[1]);
1932 }
1933 return 0;
1934}
1935
1936int
1937sys_fsync(tcp)
1938struct tcb *tcp;
1939{
1940 if (entering(tcp)) {
1941 tprintf("%ld", tcp->u_arg[0]);
1942 }
1943 return 0;
1944}
1945
Michal Ludvig53b320f2002-09-23 13:30:09 +00001946#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001947
1948static void
1949printdir(tcp, addr)
1950struct tcb *tcp;
1951long addr;
1952{
1953 struct dirent d;
1954
1955 if (!verbose(tcp)) {
1956 tprintf("%#lx", addr);
1957 return;
1958 }
1959 if (umove(tcp, addr, &d) < 0) {
1960 tprintf("{...}");
1961 return;
1962 }
1963 tprintf("{d_ino=%ld, ", (unsigned long) d.d_ino);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001964 tprintf("d_name=");
1965 printpathn(tcp, (long) ((struct dirent *) addr)->d_name, d.d_reclen);
1966 tprintf("}");
1967}
1968
1969int
1970sys_readdir(tcp)
1971struct tcb *tcp;
1972{
1973 if (entering(tcp)) {
1974 tprintf("%lu, ", tcp->u_arg[0]);
1975 } else {
1976 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
1977 tprintf("%#lx", tcp->u_arg[1]);
1978 else
1979 printdir(tcp, tcp->u_arg[1]);
1980 /* Not much point in printing this out, it is always 1. */
1981 if (tcp->u_arg[2] != 1)
1982 tprintf(", %lu", tcp->u_arg[2]);
1983 }
1984 return 0;
1985}
1986
Michal Ludvig53b320f2002-09-23 13:30:09 +00001987#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001988
Roland McGrath40542842004-01-13 09:47:49 +00001989#if defined FREEBSD || defined LINUX
Roland McGrathd9f816f2004-09-04 03:39:20 +00001990const struct xlat direnttypes[] = {
Roland McGrath40542842004-01-13 09:47:49 +00001991 { DT_UNKNOWN, "DT_UNKNOWN" },
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001992 { DT_FIFO, "DT_FIFO" },
1993 { DT_CHR, "DT_CHR" },
1994 { DT_DIR, "DT_DIR" },
1995 { DT_BLK, "DT_BLK" },
1996 { DT_REG, "DT_REG" },
1997 { DT_LNK, "DT_LNK" },
1998 { DT_SOCK, "DT_SOCK" },
1999 { DT_WHT, "DT_WHT" },
2000 { 0, NULL },
2001};
2002
2003#endif
2004
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002005int
2006sys_getdents(tcp)
2007struct tcb *tcp;
2008{
2009 int i, len, dents = 0;
2010 char *buf;
2011
2012 if (entering(tcp)) {
2013 tprintf("%lu, ", tcp->u_arg[0]);
2014 return 0;
2015 }
2016 if (syserror(tcp) || !verbose(tcp)) {
2017 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
2018 return 0;
2019 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002020 len = tcp->u_rval;
2021 if ((buf = malloc(len)) == NULL) {
Roland McGrath46100d02005-06-01 18:55:42 +00002022 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
2023 fprintf(stderr, "out of memory\n");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002024 return 0;
2025 }
2026 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
Roland McGrath46100d02005-06-01 18:55:42 +00002027 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002028 free(buf);
2029 return 0;
2030 }
2031 if (!abbrev(tcp))
2032 tprintf("{");
2033 for (i = 0; i < len;) {
Wichert Akkerman9524bb91999-05-25 23:11:18 +00002034 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
Michal Ludvig53b320f2002-09-23 13:30:09 +00002035#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002036 if (!abbrev(tcp)) {
2037 tprintf("%s{d_ino=%lu, d_off=%lu, ",
2038 i ? " " : "", d->d_ino, d->d_off);
2039 tprintf("d_reclen=%u, d_name=\"%s\"}",
2040 d->d_reclen, d->d_name);
2041 }
Michal Ludvig53b320f2002-09-23 13:30:09 +00002042#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002043#ifdef SVR4
2044 if (!abbrev(tcp)) {
2045 tprintf("%s{d_ino=%lu, d_off=%lu, ",
Roland McGrath186c5ac2002-12-15 23:58:23 +00002046 i ? " " : "",
2047 (unsigned long) d->d_ino,
2048 (unsigned long) d->d_off);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002049 tprintf("d_reclen=%u, d_name=\"%s\"}",
2050 d->d_reclen, d->d_name);
2051 }
2052#endif /* SVR4 */
2053#ifdef SUNOS4
2054 if (!abbrev(tcp)) {
2055 tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
2056 i ? " " : "", d->d_off, d->d_fileno,
2057 d->d_reclen);
2058 tprintf("d_namlen=%u, d_name=\"%.*s\"}",
2059 d->d_namlen, d->d_namlen, d->d_name);
2060 }
2061#endif /* SUNOS4 */
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002062#ifdef FREEBSD
2063 if (!abbrev(tcp)) {
2064 tprintf("%s{d_fileno=%u, d_reclen=%u, d_type=",
2065 i ? " " : "", d->d_fileno, d->d_reclen);
2066 printxval(direnttypes, d->d_type, "DT_???");
2067 tprintf(", d_namlen=%u, d_name=\"%.*s\"}",
2068 d->d_namlen, d->d_namlen, d->d_name);
2069 }
Roland McGrath186c5ac2002-12-15 23:58:23 +00002070#endif /* FREEBSD */
Pavel Machek9a9f10b2000-02-01 16:22:52 +00002071 if (!d->d_reclen) {
2072 tprintf("/* d_reclen == 0, problem here */");
2073 break;
2074 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002075 i += d->d_reclen;
2076 dents++;
2077 }
2078 if (!abbrev(tcp))
2079 tprintf("}");
2080 else
2081 tprintf("/* %u entries */", dents);
2082 tprintf(", %lu", tcp->u_arg[2]);
2083 free(buf);
2084 return 0;
2085}
2086
John Hughesbdf48f52001-03-06 15:08:09 +00002087
2088#if _LFS64_LARGEFILE
2089int
2090sys_getdents64(tcp)
2091struct tcb *tcp;
2092{
2093 int i, len, dents = 0;
2094 char *buf;
2095
2096 if (entering(tcp)) {
2097 tprintf("%lu, ", tcp->u_arg[0]);
2098 return 0;
2099 }
2100 if (syserror(tcp) || !verbose(tcp)) {
2101 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
2102 return 0;
2103 }
2104 len = tcp->u_rval;
2105 if ((buf = malloc(len)) == NULL) {
Roland McGrath46100d02005-06-01 18:55:42 +00002106 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
2107 fprintf(stderr, "out of memory\n");
John Hughesbdf48f52001-03-06 15:08:09 +00002108 return 0;
2109 }
2110 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
Roland McGrath46100d02005-06-01 18:55:42 +00002111 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
John Hughesbdf48f52001-03-06 15:08:09 +00002112 free(buf);
2113 return 0;
2114 }
2115 if (!abbrev(tcp))
2116 tprintf("{");
2117 for (i = 0; i < len;) {
2118 struct dirent64 *d = (struct dirent64 *) &buf[i];
Michal Ludvig53b320f2002-09-23 13:30:09 +00002119#if defined(LINUX) || defined(SVR4)
John Hughesbdf48f52001-03-06 15:08:09 +00002120 if (!abbrev(tcp)) {
Roland McGrath92053242004-01-13 10:16:47 +00002121 tprintf("%s{d_ino=%llu, d_off=%llu, ",
Roland McGrath186c5ac2002-12-15 23:58:23 +00002122 i ? " " : "",
Roland McGrath92053242004-01-13 10:16:47 +00002123 d->d_ino,
2124 d->d_off);
Roland McGrath40542842004-01-13 09:47:49 +00002125#ifdef LINUX
2126 tprintf("d_type=");
2127 printxval(direnttypes, d->d_type, "DT_???");
2128 tprintf(", ");
2129#endif
John Hughesbdf48f52001-03-06 15:08:09 +00002130 tprintf("d_reclen=%u, d_name=\"%s\"}",
2131 d->d_reclen, d->d_name);
2132 }
Michal Ludvig53b320f2002-09-23 13:30:09 +00002133#endif /* LINUX || SVR4 */
John Hughesbdf48f52001-03-06 15:08:09 +00002134#ifdef SUNOS4
2135 if (!abbrev(tcp)) {
2136 tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
2137 i ? " " : "", d->d_off, d->d_fileno,
2138 d->d_reclen);
2139 tprintf("d_namlen=%u, d_name=\"%.*s\"}",
2140 d->d_namlen, d->d_namlen, d->d_name);
2141 }
2142#endif /* SUNOS4 */
2143 i += d->d_reclen;
2144 dents++;
2145 }
2146 if (!abbrev(tcp))
2147 tprintf("}");
2148 else
2149 tprintf("/* %u entries */", dents);
2150 tprintf(", %lu", tcp->u_arg[2]);
2151 free(buf);
2152 return 0;
2153}
2154#endif
Roland McGrath186c5ac2002-12-15 23:58:23 +00002155
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002156#ifdef FREEBSD
2157int
2158sys_getdirentries(tcp)
2159struct tcb * tcp;
2160{
2161 int i, len, dents = 0;
2162 long basep;
2163 char *buf;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002164
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002165 if (entering(tcp)) {
2166 tprintf("%lu, ", tcp->u_arg[0]);
2167 return 0;
2168 }
2169 if (syserror(tcp) || !verbose(tcp)) {
2170 tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
2171 return 0;
2172 }
2173 len = tcp->u_rval;
2174 if ((buf = malloc(len)) == NULL) {
Roland McGrath46100d02005-06-01 18:55:42 +00002175 tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
2176 fprintf(stderr, "out of memory\n");
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002177 return 0;
2178 }
2179 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
Roland McGrath46100d02005-06-01 18:55:42 +00002180 tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002181 free(buf);
2182 return 0;
2183 }
2184 if (!abbrev(tcp))
2185 tprintf("{");
2186 for (i = 0; i < len;) {
2187 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
2188 if (!abbrev(tcp)) {
2189 tprintf("%s{d_fileno=%u, d_reclen=%u, d_type=",
2190 i ? " " : "", d->d_fileno, d->d_reclen);
2191 printxval(direnttypes, d->d_type, "DT_???");
2192 tprintf(", d_namlen=%u, d_name=\"%.*s\"}",
2193 d->d_namlen, d->d_namlen, d->d_name);
2194 }
2195 i += d->d_reclen;
2196 dents++;
2197 }
2198 if (!abbrev(tcp))
2199 tprintf("}");
2200 else
2201 tprintf("/* %u entries */", dents);
2202 free(buf);
2203 tprintf(", %lu", tcp->u_arg[2]);
2204 if (umove(tcp, tcp->u_arg[3], &basep) < 0)
2205 tprintf(", %#lx", tcp->u_arg[3]);
2206 else
2207 tprintf(", [%lu]", basep);
2208 return 0;
2209}
2210#endif
2211
Michal Ludvig53b320f2002-09-23 13:30:09 +00002212#ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002213int
2214sys_getcwd(tcp)
2215struct tcb *tcp;
2216{
2217 if (exiting(tcp)) {
2218 if (syserror(tcp))
2219 tprintf("%#lx", tcp->u_arg[0]);
2220 else
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00002221 printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002222 tprintf(", %lu", tcp->u_arg[1]);
2223 }
2224 return 0;
2225}
Michal Ludvig53b320f2002-09-23 13:30:09 +00002226#endif /* LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002227
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002228#ifdef FREEBSD
2229int
2230sys___getcwd(tcp)
2231struct tcb *tcp;
2232{
2233 if (exiting(tcp)) {
2234 if (syserror(tcp))
2235 tprintf("%#lx", tcp->u_arg[0]);
2236 else
2237 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
2238 tprintf(", %lu", tcp->u_arg[1]);
2239 }
2240 return 0;
2241}
2242#endif
2243
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002244#ifdef HAVE_SYS_ASYNCH_H
2245
2246int
2247sys_aioread(tcp)
2248struct tcb *tcp;
2249{
2250 struct aio_result_t res;
2251
2252 if (entering(tcp)) {
2253 tprintf("%lu, ", tcp->u_arg[0]);
2254 } else {
2255 if (syserror(tcp))
2256 tprintf("%#lx", tcp->u_arg[1]);
2257 else
2258 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
2259 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
2260 printxval(whence, tcp->u_arg[4], "L_???");
2261 if (syserror(tcp) || tcp->u_arg[5] == 0
2262 || umove(tcp, tcp->u_arg[5], &res) < 0)
2263 tprintf(", %#lx", tcp->u_arg[5]);
2264 else
2265 tprintf(", {aio_return %d aio_errno %d}",
2266 res.aio_return, res.aio_errno);
2267 }
2268 return 0;
2269}
2270
2271int
2272sys_aiowrite(tcp)
2273struct tcb *tcp;
2274{
2275 struct aio_result_t res;
2276
2277 if (entering(tcp)) {
2278 tprintf("%lu, ", tcp->u_arg[0]);
2279 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
2280 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
2281 printxval(whence, tcp->u_arg[4], "L_???");
2282 }
2283 else {
2284 if (tcp->u_arg[5] == 0)
2285 tprintf(", NULL");
2286 else if (syserror(tcp)
2287 || umove(tcp, tcp->u_arg[5], &res) < 0)
2288 tprintf(", %#lx", tcp->u_arg[5]);
2289 else
2290 tprintf(", {aio_return %d aio_errno %d}",
2291 res.aio_return, res.aio_errno);
2292 }
2293 return 0;
2294}
2295
2296int
2297sys_aiowait(tcp)
2298struct tcb *tcp;
2299{
2300 if (entering(tcp))
2301 printtv(tcp, tcp->u_arg[0]);
2302 return 0;
2303}
2304
2305int
2306sys_aiocancel(tcp)
2307struct tcb *tcp;
2308{
2309 struct aio_result_t res;
2310
2311 if (exiting(tcp)) {
2312 if (tcp->u_arg[0] == 0)
2313 tprintf("NULL");
2314 else if (syserror(tcp)
2315 || umove(tcp, tcp->u_arg[0], &res) < 0)
2316 tprintf("%#lx", tcp->u_arg[0]);
2317 else
2318 tprintf("{aio_return %d aio_errno %d}",
2319 res.aio_return, res.aio_errno);
2320 }
2321 return 0;
2322}
2323
2324#endif /* HAVE_SYS_ASYNCH_H */
Roland McGrath186c5ac2002-12-15 23:58:23 +00002325
Roland McGrathd9f816f2004-09-04 03:39:20 +00002326const struct xlat xattrflags[] = {
Roland McGrath561c7992003-04-02 01:10:44 +00002327#ifdef XATTR_CREATE
Roland McGrath186c5ac2002-12-15 23:58:23 +00002328 { XATTR_CREATE, "XATTR_CREATE" },
2329 { XATTR_REPLACE, "XATTR_REPLACE" },
Roland McGrath561c7992003-04-02 01:10:44 +00002330#endif
Roland McGrath186c5ac2002-12-15 23:58:23 +00002331 { 0, NULL }
2332};
2333
Roland McGrath3292e222004-08-31 06:30:48 +00002334static void
2335print_xattr_val(tcp, failed, arg, insize, size)
2336struct tcb *tcp;
2337int failed;
2338unsigned long arg;
Roland McGrathaa524c82005-06-01 19:22:06 +00002339unsigned long insize, size;
Roland McGrath3292e222004-08-31 06:30:48 +00002340{
Roland McGrath883567c2005-02-02 03:38:32 +00002341 if (!failed) {
Roland McGrathaa524c82005-06-01 19:22:06 +00002342 unsigned long capacity = 4 * size + 1;
2343 unsigned char *buf = (capacity < size) ? NULL : malloc(capacity);
Roland McGrath883567c2005-02-02 03:38:32 +00002344 if (buf == NULL || /* probably a bogus size argument */
Roland McGrathf7746422005-03-01 23:02:32 +00002345 umoven(tcp, arg, size, (char *) &buf[3 * size]) < 0) {
Roland McGrath883567c2005-02-02 03:38:32 +00002346 failed = 1;
2347 }
2348 else {
2349 unsigned char *out = buf;
2350 unsigned char *in = &buf[3 * size];
2351 size_t i;
2352 for (i = 0; i < size; ++i)
2353 if (isprint(in[i]))
2354 *out++ = in[i];
2355 else {
Roland McGrath3292e222004-08-31 06:30:48 +00002356#define tohex(n) "0123456789abcdef"[n]
Roland McGrath883567c2005-02-02 03:38:32 +00002357 *out++ = '\\';
2358 *out++ = 'x';
2359 *out++ = tohex(in[i] / 16);
2360 *out++ = tohex(in[i] % 16);
2361 }
2362 /* Don't print terminating NUL if there is one. */
2363 if (in[i - 1] == '\0')
2364 out -= 4;
2365 *out = '\0';
2366 tprintf(", \"%s\", %ld", buf, insize);
2367 }
2368 free(buf);
2369 }
2370 if (failed)
2371 tprintf(", 0x%lx, %ld", arg, insize);
Roland McGrath3292e222004-08-31 06:30:48 +00002372}
2373
Roland McGrath186c5ac2002-12-15 23:58:23 +00002374int
2375sys_setxattr(tcp)
2376struct tcb *tcp;
2377{
2378 if (entering(tcp)) {
2379 printpath(tcp, tcp->u_arg[0]);
2380 tprintf(", ");
2381 printstr(tcp, tcp->u_arg[1], -1);
Roland McGrath3292e222004-08-31 06:30:48 +00002382 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
2383 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002384 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
Roland McGrath186c5ac2002-12-15 23:58:23 +00002385 }
2386 return 0;
2387}
2388
2389int
2390sys_fsetxattr(tcp)
2391struct tcb *tcp;
2392{
2393 if (entering(tcp)) {
2394 tprintf("%ld, ", tcp->u_arg[0]);
2395 printstr(tcp, tcp->u_arg[1], -1);
Roland McGrath3292e222004-08-31 06:30:48 +00002396 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
2397 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002398 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
Roland McGrath186c5ac2002-12-15 23:58:23 +00002399 }
2400 return 0;
2401}
2402
2403int
2404sys_getxattr(tcp)
2405struct tcb *tcp;
2406{
2407 if (entering(tcp)) {
2408 printpath(tcp, tcp->u_arg[0]);
2409 tprintf(", ");
2410 printstr(tcp, tcp->u_arg[1], -1);
2411 } else {
Roland McGrath3292e222004-08-31 06:30:48 +00002412 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
2413 tcp->u_rval);
Roland McGrath186c5ac2002-12-15 23:58:23 +00002414 }
2415 return 0;
2416}
2417
2418int
2419sys_fgetxattr(tcp)
2420struct tcb *tcp;
2421{
2422 if (entering(tcp)) {
2423 tprintf("%ld, ", tcp->u_arg[0]);
2424 printstr(tcp, tcp->u_arg[1], -1);
2425 } else {
Roland McGrath3292e222004-08-31 06:30:48 +00002426 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
2427 tcp->u_rval);
Roland McGrath186c5ac2002-12-15 23:58:23 +00002428 }
2429 return 0;
2430}
2431
2432int
2433sys_listxattr(tcp)
2434struct tcb *tcp;
2435{
2436 if (entering(tcp)) {
2437 printpath(tcp, tcp->u_arg[0]);
2438 } else {
2439 /* XXX Print value in format */
2440 tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
2441 }
2442 return 0;
2443}
2444
2445int
2446sys_flistxattr(tcp)
2447struct tcb *tcp;
2448{
2449 if (entering(tcp)) {
2450 tprintf("%ld", tcp->u_arg[0]);
2451 } else {
2452 /* XXX Print value in format */
2453 tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
2454 }
2455 return 0;
2456}
2457
2458int
2459sys_removexattr(tcp)
2460struct tcb *tcp;
2461{
2462 if (entering(tcp)) {
2463 printpath(tcp, tcp->u_arg[0]);
2464 tprintf(", ");
2465 printstr(tcp, tcp->u_arg[1], -1);
2466 }
2467 return 0;
2468}
2469
2470int
2471sys_fremovexattr(tcp)
2472struct tcb *tcp;
2473{
2474 if (entering(tcp)) {
2475 tprintf("%ld, ", tcp->u_arg[0]);
2476 printstr(tcp, tcp->u_arg[1], -1);
2477 }
2478 return 0;
2479}
Roland McGrathdf13e8f2004-10-07 18:51:19 +00002480
2481
2482static const struct xlat advise[] = {
2483 { POSIX_FADV_NORMAL, "POSIX_FADV_NORMAL" },
2484 { POSIX_FADV_RANDOM, "POSIX_FADV_RANDOM" },
2485 { POSIX_FADV_SEQUENTIAL, "POSIX_FADV_SEQUENTIAL" },
2486 { POSIX_FADV_WILLNEED, "POSIX_FADV_WILLNEED" },
2487 { POSIX_FADV_DONTNEED, "POSIX_FADV_DONTNEED" },
2488 { POSIX_FADV_NOREUSE, "POSIX_FADV_NOREUSE" },
2489 { 0, NULL }
2490};
2491
2492
Roland McGrathe27ed342004-10-20 02:24:19 +00002493#ifdef LINUX
Roland McGrathdf13e8f2004-10-07 18:51:19 +00002494int
2495sys_fadvise64(tcp)
2496struct tcb *tcp;
2497{
2498 if (entering(tcp)) {
2499 tprintf("%ld, %lld, %ld, ",
2500 tcp->u_arg[0],
2501# if defined IA64 || defined X86_64 || defined ALPHA
2502 (long long int) tcp->u_arg[1], tcp->u_arg[2]);
2503 printxval(advise, tcp->u_arg[3], "POSIX_FADV_???");
2504#else
Roland McGrath2fe2a3e2004-10-07 19:09:16 +00002505 LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]), tcp->u_arg[3]);
2506 printxval(advise, tcp->u_arg[4], "POSIX_FADV_???");
Roland McGrathdf13e8f2004-10-07 18:51:19 +00002507#endif
2508 }
2509 return 0;
2510}
2511#endif
2512
2513
2514int
2515sys_fadvise64_64(tcp)
2516struct tcb *tcp;
2517{
2518 if (entering(tcp)) {
2519 tprintf("%ld, %lld, %lld, ",
2520 tcp->u_arg[0],
2521# if defined IA64 || defined X86_64 || defined ALPHA
2522 (long long int) tcp->u_arg[1], (long long int) tcp->u_arg[2]);
2523 printxval(advise, tcp->u_arg[3], "POSIX_FADV_???");
2524#else
Roland McGrath2fe2a3e2004-10-07 19:09:16 +00002525 LONG_LONG(tcp->u_arg[1], tcp->u_arg[2]),
2526 LONG_LONG(tcp->u_arg[3], tcp->u_arg[4]));
Roland McGrathdf13e8f2004-10-07 18:51:19 +00002527 printxval(advise, tcp->u_arg[5], "POSIX_FADV_???");
2528#endif
2529 }
2530 return 0;
2531}