Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl>
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     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.
     18  *
     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.
     29  *
     30  *	$Id$
     31  */
     32 
     33 #include "defs.h"
     34 
     35 #include <dirent.h>
     36 
     37 #ifdef LINUX
     38 struct kernel_dirent {
     39 	unsigned long   d_ino;
     40 	unsigned long   d_off;
     41 	unsigned short  d_reclen;
     42 	char            d_name[1];
     43 };
     44 #else
     45 # define kernel_dirent dirent
     46 #endif
     47 
     48 #ifdef HAVE_ANDROID_OS
     49 #include <linux/fadvise.h>
     50 
     51 // ANDROID: From linux/dirent.h
     52 
     53 struct dirent64 {
     54  __u64 d_ino;
     55  __s64 d_off;
     56  unsigned short d_reclen;
     57  unsigned char d_type;
     58  char d_name[256];
     59 };
     60 
     61 // ANDROID: From kernel_headers/asm/statfs.h
     62 
     63 /*
     64  * With EABI there is 4 bytes of padding added to this structure.
     65  * Let's pack it so the padding goes away to simplify dual ABI support.
     66  * Note that user space does NOT have to pack this structure.
     67  */
     68 struct statfs64 {
     69         __u32 f_type;
     70         __u32 f_bsize;
     71         __u64 f_blocks;
     72         __u64 f_bfree;
     73         __u64 f_bavail;
     74         __u64 f_files;
     75         __u64 f_ffree;
     76         __kernel_fsid_t f_fsid;
     77         __u32 f_namelen;
     78         __u32 f_frsize;
     79         __u32 f_spare[5];
     80 } __attribute__ ((packed,aligned(4)));
     81 #endif /* HAVE_ANDROID_OS */
     82 
     83 #ifdef LINUX
     84 #  ifdef LINUXSPARC
     85 struct stat {
     86 	unsigned short	st_dev;
     87 	unsigned int	st_ino;
     88 	unsigned short	st_mode;
     89 	short		st_nlink;
     90 	unsigned short	st_uid;
     91 	unsigned short	st_gid;
     92 	unsigned short	st_rdev;
     93 	unsigned int	st_size;
     94 	int		st_atime;
     95 	unsigned int	__unused1;
     96 	int		st_mtime;
     97 	unsigned int	__unused2;
     98 	int		st_ctime;
     99 	unsigned int	__unused3;
    100 	int		st_blksize;
    101 	int		st_blocks;
    102 	unsigned int	__unused4[2];
    103 };
    104 #if defined(SPARC64)
    105 struct stat_sparc64 {
    106 	unsigned int	st_dev;
    107 	unsigned long	st_ino;
    108 	unsigned int	st_mode;
    109 	unsigned int	st_nlink;
    110 	unsigned int	st_uid;
    111 	unsigned int	st_gid;
    112 	unsigned int	st_rdev;
    113 	long		st_size;
    114 	long		st_atime;
    115 	long		st_mtime;
    116 	long		st_ctime;
    117 	long		st_blksize;
    118 	long		st_blocks;
    119 	unsigned long	__unused4[2];
    120 };
    121 #endif /* SPARC64 */
    122 #    define stat kernel_stat
    123 #    include <asm/stat.h>
    124 #    undef stat
    125 #  else
    126 #    undef dev_t
    127 #    undef ino_t
    128 #    undef mode_t
    129 #    undef nlink_t
    130 #    undef uid_t
    131 #    undef gid_t
    132 #    undef off_t
    133 #    undef loff_t
    134 
    135 #    define dev_t __kernel_dev_t
    136 #    define ino_t __kernel_ino_t
    137 #    define mode_t __kernel_mode_t
    138 #    define nlink_t __kernel_nlink_t
    139 #    define uid_t __kernel_uid_t
    140 #    define gid_t __kernel_gid_t
    141 #    define off_t __kernel_off_t
    142 #    define loff_t __kernel_loff_t
    143 
    144 #    include <asm/stat.h>
    145 
    146 #    undef dev_t
    147 #    undef ino_t
    148 #    undef mode_t
    149 #    undef nlink_t
    150 #    undef uid_t
    151 #    undef gid_t
    152 #    undef off_t
    153 #    undef loff_t
    154 
    155 #    define dev_t dev_t
    156 #    define ino_t ino_t
    157 #    define mode_t mode_t
    158 #    define nlink_t nlink_t
    159 #    define uid_t uid_t
    160 #    define gid_t gid_t
    161 #    define off_t off_t
    162 #    define loff_t loff_t
    163 #  endif
    164 #  ifdef HPPA	/* asm-parisc/stat.h defines stat64 */
    165 #    undef stat64
    166 #  endif
    167 #  define stat libc_stat
    168 #  define stat64 libc_stat64
    169 #  include <sys/stat.h>
    170 #  undef stat
    171 #  undef stat64
    172    /* These might be macros. */
    173 #  undef st_atime
    174 #  undef st_mtime
    175 #  undef st_ctime
    176 #  ifdef HPPA
    177 #    define stat64 hpux_stat64
    178 #  endif
    179 #else
    180 #  include <sys/stat.h>
    181 #endif
    182 
    183 #include <fcntl.h>
    184 
    185 #ifdef SVR4
    186 #  include <sys/cred.h>
    187 #endif /* SVR4 */
    188 
    189 #ifdef HAVE_SYS_VFS_H
    190 #include <sys/vfs.h>
    191 #endif
    192 
    193 #ifdef HAVE_LINUX_XATTR_H
    194 #include <linux/xattr.h>
    195 #elif defined linux
    196 #define XATTR_CREATE 1
    197 #define XATTR_REPLACE 2
    198 #endif
    199 
    200 #ifdef FREEBSD
    201 #include <sys/param.h>
    202 #include <sys/mount.h>
    203 #include <sys/stat.h>
    204 #endif
    205 
    206 #if _LFS64_LARGEFILE && (defined(LINUX) || defined(SVR4))
    207 # ifdef HAVE_INTTYPES_H
    208 #  include <inttypes.h>
    209 # else
    210 #  define PRId64 "lld"
    211 #  define PRIu64 "llu"
    212 # endif
    213 #endif
    214 
    215 #if HAVE_LONG_LONG_OFF_T
    216 /*
    217  * Ugly hacks for systems that have typedef long long off_t
    218  */
    219 
    220 #define stat64 stat
    221 #define HAVE_STAT64 1	/* Ugly hack */
    222 
    223 #define	sys_stat64	sys_stat
    224 #define sys_fstat64	sys_fstat
    225 #define sys_lstat64	sys_lstat
    226 #define sys_lseek64	sys_lseek
    227 #define sys_truncate64	sys_truncate
    228 #define sys_ftruncate64	sys_ftruncate
    229 #endif
    230 
    231 #ifdef MAJOR_IN_SYSMACROS
    232 #include <sys/sysmacros.h>
    233 #endif
    234 
    235 #ifdef MAJOR_IN_MKDEV
    236 #include <sys/mkdev.h>
    237 #endif
    238 
    239 #ifdef HAVE_SYS_ASYNCH_H
    240 #include <sys/asynch.h>
    241 #endif
    242 
    243 #ifdef SUNOS4
    244 #include <ustat.h>
    245 #endif
    246 
    247 const struct xlat open_access_modes[] = {
    248 	{ O_RDONLY,	"O_RDONLY"	},
    249 	{ O_WRONLY,	"O_WRONLY"	},
    250 	{ O_RDWR,	"O_RDWR"	},
    251 #ifdef O_ACCMODE
    252 	{ O_ACCMODE,	"O_ACCMODE"	},
    253 #endif
    254 	{ 0,		NULL		},
    255 };
    256 
    257 const struct xlat open_mode_flags[] = {
    258 	{ O_CREAT,	"O_CREAT"	},
    259 	{ O_EXCL,	"O_EXCL"	},
    260 	{ O_NOCTTY,	"O_NOCTTY"	},
    261 	{ O_TRUNC,	"O_TRUNC"	},
    262 	{ O_APPEND,	"O_APPEND"	},
    263 	{ O_NONBLOCK,	"O_NONBLOCK"	},
    264 #ifdef O_SYNC
    265 	{ O_SYNC,	"O_SYNC"	},
    266 #endif
    267 #ifdef O_ASYNC
    268 	{ O_ASYNC,	"O_ASYNC"	},
    269 #endif
    270 #ifdef O_DSYNC
    271 	{ O_DSYNC,	"O_DSYNC"	},
    272 #endif
    273 #ifdef O_RSYNC
    274 	{ O_RSYNC,	"O_RSYNC"	},
    275 #endif
    276 #if defined(O_NDELAY) && (O_NDELAY != O_NONBLOCK)
    277 	{ O_NDELAY,	"O_NDELAY"	},
    278 #endif
    279 #ifdef O_PRIV
    280 	{ O_PRIV,	"O_PRIV"	},
    281 #endif
    282 #ifdef O_DIRECT
    283 	{ O_DIRECT,	"O_DIRECT"	},
    284 #endif
    285 #ifdef O_LARGEFILE
    286 # if O_LARGEFILE == 0		/* biarch platforms in 64-bit mode */
    287 #  undef O_LARGEFILE
    288 #  ifdef SPARC64
    289 #   define O_LARGEFILE	0x40000
    290 #  elif defined X86_64 || defined S390X
    291 #   define O_LARGEFILE	0100000
    292 #  endif
    293 # endif
    294 # ifdef O_LARGEFILE
    295 	{ O_LARGEFILE,	"O_LARGEFILE"   },
    296 # endif
    297 #endif
    298 #ifdef O_DIRECTORY
    299 	{ O_DIRECTORY,	"O_DIRECTORY"   },
    300 #endif
    301 #ifdef O_NOFOLLOW
    302 	{ O_NOFOLLOW, 	"O_NOFOLLOW"	},
    303 #endif
    304 #ifdef O_NOATIME
    305 	{ O_NOATIME, 	"O_NOATIME"	},
    306 #endif
    307 #ifdef O_CLOEXEC
    308 	{ O_CLOEXEC,	"O_CLOEXEC"	},
    309 #endif
    310 
    311 #ifdef FNDELAY
    312 	{ FNDELAY,	"FNDELAY"	},
    313 #endif
    314 #ifdef FAPPEND
    315 	{ FAPPEND,	"FAPPEND"	},
    316 #endif
    317 #ifdef FMARK
    318 	{ FMARK,	"FMARK"		},
    319 #endif
    320 #ifdef FDEFER
    321 	{ FDEFER,	"FDEFER"	},
    322 #endif
    323 #ifdef FASYNC
    324 	{ FASYNC,	"FASYNC"	},
    325 #endif
    326 #ifdef FSHLOCK
    327 	{ FSHLOCK,	"FSHLOCK"	},
    328 #endif
    329 #ifdef FEXLOCK
    330 	{ FEXLOCK,	"FEXLOCK"	},
    331 #endif
    332 #ifdef FCREAT
    333 	{ FCREAT,	"FCREAT"	},
    334 #endif
    335 #ifdef FTRUNC
    336 	{ FTRUNC,	"FTRUNC"	},
    337 #endif
    338 #ifdef FEXCL
    339 	{ FEXCL,	"FEXCL"		},
    340 #endif
    341 #ifdef FNBIO
    342 	{ FNBIO,	"FNBIO"		},
    343 #endif
    344 #ifdef FSYNC
    345 	{ FSYNC,	"FSYNC"		},
    346 #endif
    347 #ifdef FNOCTTY
    348 	{ FNOCTTY,	"FNOCTTY"	},
    349 #endif
    350 #ifdef O_SHLOCK
    351 	{ O_SHLOCK,	"O_SHLOCK"	},
    352 #endif
    353 #ifdef O_EXLOCK
    354 	{ O_EXLOCK,	"O_EXLOCK"	},
    355 #endif
    356 	{ 0,		NULL		},
    357 };
    358 
    359 #ifdef LINUX
    360 
    361 #ifndef AT_FDCWD
    362 # define AT_FDCWD                -100
    363 #endif
    364 
    365 /* The fd is an "int", so when decoding x86 on x86_64, we need to force sign
    366  * extension to get the right value.  We do this by declaring fd as int here.
    367  */
    368 static void
    369 print_dirfd(struct tcb *tcp, int fd)
    370 {
    371 	if (fd == AT_FDCWD)
    372 		tprintf("AT_FDCWD, ");
    373 	else
    374 	{
    375 		printfd(tcp, fd);
    376 		tprintf(", ");
    377 	}
    378 }
    379 #endif
    380 
    381 /*
    382  * Pity stpcpy() is not standardized...
    383  */
    384 static char *
    385 str_append(char *dst, const char *src)
    386 {
    387 	while ((*dst = *src++) != '\0')
    388 		dst++;
    389 	return dst;
    390 }
    391 
    392 /*
    393  * low bits of the open(2) flags define access mode,
    394  * other bits are real flags.
    395  */
    396 const char *
    397 sprint_open_modes(mode_t flags)
    398 {
    399 	static char outstr[1024];
    400 	char *p;
    401 	char sep = 0;
    402 	const char *str;
    403 	const struct xlat *x;
    404 
    405 	p = str_append(outstr, "flags ");
    406 	str = xlookup(open_access_modes, flags & 3);
    407 	if (str) {
    408 		p = str_append(p, str);
    409 		flags &= ~3;
    410 		if (!flags)
    411 			return outstr;
    412 		sep = '|';
    413 	}
    414 
    415 	for (x = open_mode_flags; x->str; x++) {
    416 		if ((flags & x->val) == x->val) {
    417 			if (sep)
    418 				*p++ = sep;
    419 			p = str_append(p, x->str);
    420 			flags &= ~x->val;
    421 			if (!flags)
    422 				return outstr;
    423 			sep = '|';
    424 		}
    425 	}
    426 	/* flags is still nonzero */
    427 	if (sep)
    428 		*p++ = sep;
    429 	sprintf(p, "%#x", flags);
    430 	return outstr;
    431 }
    432 
    433 void
    434 tprint_open_modes(mode_t flags)
    435 {
    436 	tprintf("%s", sprint_open_modes(flags) + sizeof("flags"));
    437 }
    438 
    439 static int
    440 decode_open(struct tcb *tcp, int offset)
    441 {
    442 	if (entering(tcp)) {
    443 		printpath(tcp, tcp->u_arg[offset]);
    444 		tprintf(", ");
    445 		/* flags */
    446 		tprint_open_modes(tcp->u_arg[offset + 1]);
    447 		if (tcp->u_arg[offset + 1] & O_CREAT) {
    448 			/* mode */
    449 			tprintf(", %#lo", tcp->u_arg[offset + 2]);
    450 		}
    451 	}
    452 	return 0;
    453 }
    454 
    455 int
    456 sys_open(struct tcb *tcp)
    457 {
    458 	return decode_open(tcp, 0);
    459 }
    460 
    461 #ifdef LINUX
    462 int
    463 sys_openat(struct tcb *tcp)
    464 {
    465 	if (entering(tcp))
    466 		print_dirfd(tcp, tcp->u_arg[0]);
    467 	return decode_open(tcp, 1);
    468 }
    469 #endif
    470 
    471 #ifdef LINUXSPARC
    472 static const struct xlat openmodessol[] = {
    473 	{ 0,		"O_RDWR"	},
    474 	{ 1,		"O_RDONLY"	},
    475 	{ 2,		"O_WRONLY"	},
    476 	{ 0x80,		"O_NONBLOCK"	},
    477 	{ 8,		"O_APPEND"	},
    478 	{ 0x100,	"O_CREAT"	},
    479 	{ 0x200,	"O_TRUNC"	},
    480 	{ 0x400,	"O_EXCL"	},
    481 	{ 0x800,	"O_NOCTTY"	},
    482 	{ 0x10,		"O_SYNC"	},
    483 	{ 0x40,		"O_DSYNC"	},
    484 	{ 0x8000,	"O_RSYNC"	},
    485 	{ 4,		"O_NDELAY"	},
    486 	{ 0x1000,	"O_PRIV"	},
    487 	{ 0,		NULL		},
    488 };
    489 
    490 int
    491 solaris_open(struct tcb *tcp)
    492 {
    493 	if (entering(tcp)) {
    494 		printpath(tcp, tcp->u_arg[0]);
    495 		tprintf(", ");
    496 		/* flags */
    497 		printflags(openmodessol, tcp->u_arg[1] + 1, "O_???");
    498 		if (tcp->u_arg[1] & 0x100) {
    499 			/* mode */
    500 			tprintf(", %#lo", tcp->u_arg[2]);
    501 		}
    502 	}
    503 	return 0;
    504 }
    505 
    506 #endif
    507 
    508 int
    509 sys_creat(struct tcb *tcp)
    510 {
    511 	if (entering(tcp)) {
    512 		printpath(tcp, tcp->u_arg[0]);
    513 		tprintf(", %#lo", tcp->u_arg[1]);
    514 	}
    515 	return 0;
    516 }
    517 
    518 static const struct xlat access_flags[] = {
    519 	{ F_OK,		"F_OK",		},
    520 	{ R_OK,		"R_OK"		},
    521 	{ W_OK,		"W_OK"		},
    522 	{ X_OK,		"X_OK"		},
    523 #ifdef EFF_ONLY_OK
    524 	{ EFF_ONLY_OK,	"EFF_ONLY_OK"	},
    525 #endif
    526 #ifdef EX_OK
    527 	{ EX_OK,	"EX_OK"		},
    528 #endif
    529 	{ 0,		NULL		},
    530 };
    531 
    532 static int
    533 decode_access(struct tcb *tcp, int offset)
    534 {
    535 	if (entering(tcp)) {
    536 		printpath(tcp, tcp->u_arg[offset]);
    537 		tprintf(", ");
    538 		printflags(access_flags, tcp->u_arg[offset + 1], "?_OK");
    539 	}
    540 	return 0;
    541 }
    542 
    543 int
    544 sys_access(struct tcb *tcp)
    545 {
    546 	return decode_access(tcp, 0);
    547 }
    548 
    549 #ifdef LINUX
    550 int
    551 sys_faccessat(struct tcb *tcp)
    552 {
    553 	if (entering(tcp))
    554 		print_dirfd(tcp, tcp->u_arg[0]);
    555 	return decode_access(tcp, 1);
    556 }
    557 #endif
    558 
    559 int
    560 sys_umask(struct tcb *tcp)
    561 {
    562 	if (entering(tcp)) {
    563 		tprintf("%#lo", tcp->u_arg[0]);
    564 	}
    565 	return RVAL_OCTAL;
    566 }
    567 
    568 static const struct xlat whence[] = {
    569 	{ SEEK_SET,	"SEEK_SET"	},
    570 	{ SEEK_CUR,	"SEEK_CUR"	},
    571 	{ SEEK_END,	"SEEK_END"	},
    572 	{ 0,		NULL		},
    573 };
    574 
    575 #ifndef HAVE_LONG_LONG_OFF_T
    576 #if defined (LINUX_MIPSN32)
    577 int
    578 sys_lseek(struct tcb *tcp)
    579 {
    580 	long long offset;
    581 	int _whence;
    582 
    583 	if (entering(tcp)) {
    584 		printfd(tcp, tcp->u_arg[0]);
    585 		tprintf(", ");
    586 		offset = tcp->ext_arg[1];
    587 		_whence = tcp->u_arg[2];
    588 		if (_whence == SEEK_SET)
    589 			tprintf("%llu, ", offset);
    590 		else
    591 			tprintf("%lld, ", offset);
    592 		printxval(whence, _whence, "SEEK_???");
    593 	}
    594 	return RVAL_UDECIMAL;
    595 }
    596 #else /* !LINUX_MIPSN32 */
    597 int
    598 sys_lseek(struct tcb *tcp)
    599 {
    600 	off_t offset;
    601 	int _whence;
    602 
    603 	if (entering(tcp)) {
    604 		printfd(tcp, tcp->u_arg[0]);
    605 		tprintf(", ");
    606 		offset = tcp->u_arg[1];
    607 		_whence = tcp->u_arg[2];
    608 		if (_whence == SEEK_SET)
    609 			tprintf("%lu, ", offset);
    610 		else
    611 			tprintf("%ld, ", offset);
    612 		printxval(whence, _whence, "SEEK_???");
    613 	}
    614 	return RVAL_UDECIMAL;
    615 }
    616 #endif /* LINUX_MIPSN32 */
    617 #endif
    618 
    619 #ifdef LINUX
    620 int
    621 sys_llseek(struct tcb *tcp)
    622 {
    623 	if (entering(tcp)) {
    624 		printfd(tcp, tcp->u_arg[0]);
    625 		/*
    626 		 * This one call takes explicitly two 32-bit arguments hi, lo,
    627 		 * rather than one 64-bit argument for which LONG_LONG works
    628 		 * appropriate for the native byte order.
    629 		 */
    630 		if (tcp->u_arg[4] == SEEK_SET)
    631 			tprintf(", %llu, ",
    632 				((long long int) tcp->u_arg[1]) << 32 |
    633 				(unsigned long long) (unsigned) tcp->u_arg[2]);
    634 		else
    635 			tprintf(", %lld, ",
    636 				((long long int) tcp->u_arg[1]) << 32 |
    637 				(unsigned long long) (unsigned) tcp->u_arg[2]);
    638 	}
    639 	else {
    640 		long long int off;
    641 		if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0)
    642 			tprintf("%#lx, ", tcp->u_arg[3]);
    643 		else
    644 			tprintf("[%llu], ", off);
    645 		printxval(whence, tcp->u_arg[4], "SEEK_???");
    646 	}
    647 	return 0;
    648 }
    649 
    650 int
    651 sys_readahead(struct tcb *tcp)
    652 {
    653 	if (entering(tcp)) {
    654 		int argn;
    655 		printfd(tcp, tcp->u_arg[0]);
    656 		tprintf(", ");
    657 		argn = printllval(tcp, "%lld", 1);
    658 		tprintf(", %ld", tcp->u_arg[argn]);
    659 	}
    660 	return 0;
    661 }
    662 #endif
    663 
    664 #if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
    665 int
    666 sys_lseek64(struct tcb *tcp)
    667 {
    668 	if (entering(tcp)) {
    669 		int argn;
    670 		printfd(tcp, tcp->u_arg[0]);
    671 		tprintf(", ");
    672 		if (tcp->u_arg[3] == SEEK_SET)
    673 			argn = printllval(tcp, "%llu, ", 1);
    674 		else
    675 			argn = printllval(tcp, "%lld, ", 1);
    676 		printxval(whence, tcp->u_arg[argn], "SEEK_???");
    677 	}
    678 	return RVAL_LUDECIMAL;
    679 }
    680 #endif
    681 
    682 #ifndef HAVE_LONG_LONG_OFF_T
    683 int
    684 sys_truncate(struct tcb *tcp)
    685 {
    686 	if (entering(tcp)) {
    687 		printpath(tcp, tcp->u_arg[0]);
    688 		tprintf(", %lu", tcp->u_arg[1]);
    689 	}
    690 	return 0;
    691 }
    692 #endif
    693 
    694 #if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
    695 int
    696 sys_truncate64(struct tcb *tcp)
    697 {
    698 	if (entering(tcp)) {
    699 		printpath(tcp, tcp->u_arg[0]);
    700 		printllval(tcp, ", %llu", 1);
    701 	}
    702 	return 0;
    703 }
    704 #endif
    705 
    706 #ifndef HAVE_LONG_LONG_OFF_T
    707 int
    708 sys_ftruncate(struct tcb *tcp)
    709 {
    710 	if (entering(tcp)) {
    711 		printfd(tcp, tcp->u_arg[0]);
    712 		tprintf(", %lu", tcp->u_arg[1]);
    713 	}
    714 	return 0;
    715 }
    716 #endif
    717 
    718 #if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
    719 int
    720 sys_ftruncate64(struct tcb *tcp)
    721 {
    722 	if (entering(tcp)) {
    723 		printfd(tcp, tcp->u_arg[0]);
    724 		tprintf(", ");
    725 		printllval(tcp, "%llu", 1);
    726 	}
    727 	return 0;
    728 }
    729 #endif
    730 
    731 /* several stats */
    732 
    733 static const struct xlat modetypes[] = {
    734 	{ S_IFREG,	"S_IFREG"	},
    735 	{ S_IFSOCK,	"S_IFSOCK"	},
    736 	{ S_IFIFO,	"S_IFIFO"	},
    737 	{ S_IFLNK,	"S_IFLNK"	},
    738 	{ S_IFDIR,	"S_IFDIR"	},
    739 	{ S_IFBLK,	"S_IFBLK"	},
    740 	{ S_IFCHR,	"S_IFCHR"	},
    741 	{ 0,		NULL		},
    742 };
    743 
    744 static const char *
    745 sprintmode(int mode)
    746 {
    747 	static char buf[64];
    748 	const char *s;
    749 
    750 	if ((mode & S_IFMT) == 0)
    751 		s = "";
    752 	else if ((s = xlookup(modetypes, mode & S_IFMT)) == NULL) {
    753 		sprintf(buf, "%#o", mode);
    754 		return buf;
    755 	}
    756 	sprintf(buf, "%s%s%s%s", s,
    757 		(mode & S_ISUID) ? "|S_ISUID" : "",
    758 		(mode & S_ISGID) ? "|S_ISGID" : "",
    759 		(mode & S_ISVTX) ? "|S_ISVTX" : "");
    760 	mode &= ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX);
    761 	if (mode)
    762 		sprintf(buf + strlen(buf), "|%#o", mode);
    763 	s = (*buf == '|') ? buf + 1 : buf;
    764 	return *s ? s : "0";
    765 }
    766 
    767 static char *
    768 sprinttime(time_t t)
    769 {
    770 	struct tm *tmp;
    771 	static char buf[32];
    772 
    773 	if (t == 0) {
    774 		strcpy(buf, "0");
    775 		return buf;
    776 	}
    777 	if ((tmp = localtime(&t)))
    778 		snprintf(buf, sizeof buf, "%02d/%02d/%02d-%02d:%02d:%02d",
    779 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
    780 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
    781 	else
    782 		snprintf(buf, sizeof buf, "%lu", (unsigned long) t);
    783 
    784 	return buf;
    785 }
    786 
    787 #ifdef LINUXSPARC
    788 typedef struct {
    789 	int     tv_sec;
    790 	int     tv_nsec;
    791 } timestruct_t;
    792 
    793 struct solstat {
    794 	unsigned        st_dev;
    795 	int             st_pad1[3];     /* network id */
    796 	unsigned        st_ino;
    797 	unsigned        st_mode;
    798 	unsigned        st_nlink;
    799 	unsigned        st_uid;
    800 	unsigned        st_gid;
    801 	unsigned        st_rdev;
    802 	int             st_pad2[2];
    803 	int             st_size;
    804 	int             st_pad3;        /* st_size, off_t expansion */
    805 	timestruct_t    st_atime;
    806 	timestruct_t    st_mtime;
    807 	timestruct_t    st_ctime;
    808 	int             st_blksize;
    809 	int             st_blocks;
    810 	char            st_fstype[16];
    811 	int             st_pad4[8];     /* expansion area */
    812 };
    813 
    814 static void
    815 printstatsol(struct tcb *tcp, long addr)
    816 {
    817 	struct solstat statbuf;
    818 
    819 	if (umove(tcp, addr, &statbuf) < 0) {
    820 		tprintf("{...}");
    821 		return;
    822 	}
    823 	if (!abbrev(tcp)) {
    824 		tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
    825 			(unsigned long) ((statbuf.st_dev >> 18) & 0x3fff),
    826 			(unsigned long) (statbuf.st_dev & 0x3ffff),
    827 			(unsigned long) statbuf.st_ino,
    828 			sprintmode(statbuf.st_mode));
    829 		tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
    830 			(unsigned long) statbuf.st_nlink,
    831 			(unsigned long) statbuf.st_uid,
    832 			(unsigned long) statbuf.st_gid);
    833 		tprintf("st_blksize=%lu, ", (unsigned long) statbuf.st_blksize);
    834 		tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
    835 	}
    836 	else
    837 		tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
    838 	switch (statbuf.st_mode & S_IFMT) {
    839 	case S_IFCHR: case S_IFBLK:
    840 		tprintf("st_rdev=makedev(%lu, %lu), ",
    841 			(unsigned long) ((statbuf.st_rdev >> 18) & 0x3fff),
    842 			(unsigned long) (statbuf.st_rdev & 0x3ffff));
    843 		break;
    844 	default:
    845 		tprintf("st_size=%u, ", statbuf.st_size);
    846 		break;
    847 	}
    848 	if (!abbrev(tcp)) {
    849 		tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime.tv_sec));
    850 		tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime.tv_sec));
    851 		tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime.tv_sec));
    852 	}
    853 	else
    854 		tprintf("...}");
    855 }
    856 
    857 #if defined (SPARC64)
    858 static void
    859 printstat_sparc64(struct tcb *tcp, long addr)
    860 {
    861 	struct stat_sparc64 statbuf;
    862 
    863 	if (umove(tcp, addr, &statbuf) < 0) {
    864 		tprintf("{...}");
    865 		return;
    866 	}
    867 
    868 	if (!abbrev(tcp)) {
    869 		tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
    870 			(unsigned long) major(statbuf.st_dev),
    871 			(unsigned long) minor(statbuf.st_dev),
    872 			(unsigned long) statbuf.st_ino,
    873 			sprintmode(statbuf.st_mode));
    874 		tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
    875 			(unsigned long) statbuf.st_nlink,
    876 			(unsigned long) statbuf.st_uid,
    877 			(unsigned long) statbuf.st_gid);
    878 		tprintf("st_blksize=%lu, ",
    879 			(unsigned long) statbuf.st_blksize);
    880 		tprintf("st_blocks=%lu, ",
    881 			(unsigned long) statbuf.st_blocks);
    882 	}
    883 	else
    884 		tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
    885 	switch (statbuf.st_mode & S_IFMT) {
    886 	case S_IFCHR: case S_IFBLK:
    887 		tprintf("st_rdev=makedev(%lu, %lu), ",
    888 			(unsigned long) major(statbuf.st_rdev),
    889 			(unsigned long) minor(statbuf.st_rdev));
    890 		break;
    891 	default:
    892 		tprintf("st_size=%lu, ", statbuf.st_size);
    893 		break;
    894 	}
    895 	if (!abbrev(tcp)) {
    896 		tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
    897 		tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
    898 		tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime));
    899 		tprintf("}");
    900 	}
    901 	else
    902 		tprintf("...}");
    903 }
    904 #endif /* SPARC64 */
    905 #endif /* LINUXSPARC */
    906 
    907 #if defined LINUX && defined POWERPC64
    908 struct stat_powerpc32 {
    909 	unsigned int	st_dev;
    910 	unsigned int	st_ino;
    911 	unsigned int	st_mode;
    912 	unsigned short	st_nlink;
    913 	unsigned int	st_uid;
    914 	unsigned int	st_gid;
    915 	unsigned int	st_rdev;
    916 	unsigned int	st_size;
    917 	unsigned int	st_blksize;
    918 	unsigned int	st_blocks;
    919 	unsigned int	st_atime;
    920 	unsigned int	st_atime_nsec;
    921 	unsigned int	st_mtime;
    922 	unsigned int	st_mtime_nsec;
    923 	unsigned int	st_ctime;
    924 	unsigned int	st_ctime_nsec;
    925 	unsigned int	__unused4;
    926 	unsigned int	__unused5;
    927 };
    928 
    929 static void
    930 printstat_powerpc32(struct tcb *tcp, long addr)
    931 {
    932 	struct stat_powerpc32 statbuf;
    933 
    934 	if (umove(tcp, addr, &statbuf) < 0) {
    935 		tprintf("{...}");
    936 		return;
    937 	}
    938 
    939 	if (!abbrev(tcp)) {
    940 		tprintf("{st_dev=makedev(%u, %u), st_ino=%u, st_mode=%s, ",
    941 			major(statbuf.st_dev), minor(statbuf.st_dev),
    942 			statbuf.st_ino,
    943 			sprintmode(statbuf.st_mode));
    944 		tprintf("st_nlink=%u, st_uid=%u, st_gid=%u, ",
    945 			statbuf.st_nlink, statbuf.st_uid, statbuf.st_gid);
    946 		tprintf("st_blksize=%u, ", statbuf.st_blksize);
    947 		tprintf("st_blocks=%u, ", statbuf.st_blocks);
    948 	}
    949 	else
    950 		tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
    951 	switch (statbuf.st_mode & S_IFMT) {
    952 	case S_IFCHR: case S_IFBLK:
    953 		tprintf("st_rdev=makedev(%lu, %lu), ",
    954 			(unsigned long) major(statbuf.st_rdev),
    955 			(unsigned long) minor(statbuf.st_rdev));
    956 		break;
    957 	default:
    958 		tprintf("st_size=%u, ", statbuf.st_size);
    959 		break;
    960 	}
    961 	if (!abbrev(tcp)) {
    962 		tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
    963 		tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
    964 		tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime));
    965 		tprintf("}");
    966 	}
    967 	else
    968 		tprintf("...}");
    969 }
    970 #endif /* LINUX && POWERPC64 */
    971 
    972 static const struct xlat fileflags[] = {
    973 #ifdef FREEBSD
    974 	{ UF_NODUMP,	"UF_NODUMP"	},
    975 	{ UF_IMMUTABLE,	"UF_IMMUTABLE"	},
    976 	{ UF_APPEND,	"UF_APPEND"	},
    977 	{ UF_OPAQUE,	"UF_OPAQUE"	},
    978 	{ UF_NOUNLINK,	"UF_NOUNLINK"	},
    979 	{ SF_ARCHIVED,	"SF_ARCHIVED"	},
    980 	{ SF_IMMUTABLE,	"SF_IMMUTABLE"	},
    981 	{ SF_APPEND,	"SF_APPEND"	},
    982 	{ SF_NOUNLINK,	"SF_NOUNLINK"	},
    983 #elif UNIXWARE >= 2
    984 #ifdef 	_S_ISMLD
    985 	{ _S_ISMLD, 	"_S_ISMLD"	},
    986 #endif
    987 #ifdef 	_S_ISMOUNTED
    988 	{ _S_ISMOUNTED, "_S_ISMOUNTED"	},
    989 #endif
    990 #endif
    991 	{ 0,		NULL		},
    992 };
    993 
    994 #ifdef FREEBSD
    995 int
    996 sys_chflags(struct tcb *tcp)
    997 {
    998 	if (entering(tcp)) {
    999 		printpath(tcp, tcp->u_arg[0]);
   1000 		tprintf(", ");
   1001 		printflags(fileflags, tcp->u_arg[1], "UF_???");
   1002 	}
   1003 	return 0;
   1004 }
   1005 
   1006 int
   1007 sys_fchflags(struct tcb *tcp)
   1008 {
   1009 	if (entering(tcp)) {
   1010 		tprintf("%ld, ", tcp->u_arg[0]);
   1011 		printflags(fileflags, tcp->u_arg[1], "UF_???");
   1012 	}
   1013 	return 0;
   1014 }
   1015 #endif
   1016 
   1017 #ifndef HAVE_LONG_LONG_OFF_T
   1018 static void
   1019 realprintstat(struct tcb *tcp, struct stat *statbuf)
   1020 {
   1021 	if (!abbrev(tcp)) {
   1022 		tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
   1023 			(unsigned long) major(statbuf->st_dev),
   1024 			(unsigned long) minor(statbuf->st_dev),
   1025 			(unsigned long) statbuf->st_ino,
   1026 			sprintmode(statbuf->st_mode));
   1027 		tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
   1028 			(unsigned long) statbuf->st_nlink,
   1029 			(unsigned long) statbuf->st_uid,
   1030 			(unsigned long) statbuf->st_gid);
   1031 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
   1032 		tprintf("st_blksize=%lu, ", (unsigned long) statbuf->st_blksize);
   1033 #endif
   1034 #ifdef HAVE_STRUCT_STAT_ST_BLOCKS
   1035 		tprintf("st_blocks=%lu, ", (unsigned long) statbuf->st_blocks);
   1036 #endif
   1037 	}
   1038 	else
   1039 		tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode));
   1040 	switch (statbuf->st_mode & S_IFMT) {
   1041 	case S_IFCHR: case S_IFBLK:
   1042 #ifdef HAVE_STRUCT_STAT_ST_RDEV
   1043 		tprintf("st_rdev=makedev(%lu, %lu), ",
   1044 			(unsigned long) major(statbuf->st_rdev),
   1045 			(unsigned long) minor(statbuf->st_rdev));
   1046 #else /* !HAVE_STRUCT_STAT_ST_RDEV */
   1047 		tprintf("st_size=makedev(%lu, %lu), ",
   1048 			(unsigned long) major(statbuf->st_size),
   1049 			(unsigned long) minor(statbuf->st_size));
   1050 #endif /* !HAVE_STRUCT_STAT_ST_RDEV */
   1051 		break;
   1052 	default:
   1053 		tprintf("st_size=%lu, ", (unsigned long) statbuf->st_size);
   1054 		break;
   1055 	}
   1056 	if (!abbrev(tcp)) {
   1057 		tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
   1058 		tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
   1059 		tprintf("st_ctime=%s", sprinttime(statbuf->st_ctime));
   1060 #if HAVE_STRUCT_STAT_ST_FLAGS
   1061 		tprintf(", st_flags=");
   1062 		printflags(fileflags, statbuf->st_flags, "UF_???");
   1063 #endif
   1064 #if HAVE_STRUCT_STAT_ST_ACLCNT
   1065 		tprintf(", st_aclcnt=%d", statbuf->st_aclcnt);
   1066 #endif
   1067 #if HAVE_STRUCT_STAT_ST_LEVEL
   1068 		tprintf(", st_level=%ld", statbuf->st_level);
   1069 #endif
   1070 #if HAVE_STRUCT_STAT_ST_FSTYPE
   1071 		tprintf(", st_fstype=%.*s",
   1072 			(int) sizeof statbuf->st_fstype, statbuf->st_fstype);
   1073 #endif
   1074 #if HAVE_STRUCT_STAT_ST_GEN
   1075 		tprintf(", st_gen=%u", statbuf->st_gen);
   1076 #endif
   1077 		tprintf("}");
   1078 	}
   1079 	else
   1080 		tprintf("...}");
   1081 }
   1082 
   1083 
   1084 static void
   1085 printstat(struct tcb *tcp, long addr)
   1086 {
   1087 	struct stat statbuf;
   1088 
   1089 	if (!addr) {
   1090 		tprintf("NULL");
   1091 		return;
   1092 	}
   1093 	if (syserror(tcp) || !verbose(tcp)) {
   1094 		tprintf("%#lx", addr);
   1095 		return;
   1096 	}
   1097 
   1098 #ifdef LINUXSPARC
   1099 	if (current_personality == 1) {
   1100 		printstatsol(tcp, addr);
   1101 		return;
   1102 	}
   1103 #ifdef SPARC64
   1104 	else if (current_personality == 2) {
   1105 		printstat_sparc64(tcp, addr);
   1106 		return;
   1107 	}
   1108 #endif
   1109 #endif /* LINUXSPARC */
   1110 
   1111 #if defined LINUX && defined POWERPC64
   1112 	if (current_personality == 1) {
   1113 		printstat_powerpc32(tcp, addr);
   1114 		return;
   1115 	}
   1116 #endif
   1117 
   1118 	if (umove(tcp, addr, &statbuf) < 0) {
   1119 		tprintf("{...}");
   1120 		return;
   1121 	}
   1122 
   1123 	realprintstat(tcp, &statbuf);
   1124 }
   1125 #endif	/* !HAVE_LONG_LONG_OFF_T */
   1126 
   1127 #if !defined HAVE_STAT64 && defined LINUX && defined X86_64
   1128 /*
   1129  * Linux x86_64 has unified `struct stat' but its i386 biarch needs
   1130  * `struct stat64'.  Its <asm-i386/stat.h> definition expects 32-bit `long'.
   1131  * <linux/include/asm-x86_64/ia32.h> is not in the public includes set.
   1132  * __GNUC__ is needed for the required __attribute__ below.
   1133  */
   1134 struct stat64 {
   1135 	unsigned long long	st_dev;
   1136 	unsigned char	__pad0[4];
   1137 	unsigned int	__st_ino;
   1138 	unsigned int	st_mode;
   1139 	unsigned int	st_nlink;
   1140 	unsigned int	st_uid;
   1141 	unsigned int	st_gid;
   1142 	unsigned long long	st_rdev;
   1143 	unsigned char	__pad3[4];
   1144 	long long	st_size;
   1145 	unsigned int	st_blksize;
   1146 	unsigned long long	st_blocks;
   1147 	unsigned int	st_atime;
   1148 	unsigned int	st_atime_nsec;
   1149 	unsigned int	st_mtime;
   1150 	unsigned int	st_mtime_nsec;
   1151 	unsigned int	st_ctime;
   1152 	unsigned int	st_ctime_nsec;
   1153 	unsigned long long	st_ino;
   1154 } __attribute__((packed));
   1155 # define HAVE_STAT64	1
   1156 # define STAT64_SIZE	96
   1157 #endif
   1158 
   1159 #ifdef HAVE_STAT64
   1160 static void
   1161 printstat64(struct tcb *tcp, long addr)
   1162 {
   1163 	struct stat64 statbuf;
   1164 
   1165 #ifdef STAT64_SIZE
   1166 	(void) sizeof(char[sizeof statbuf == STAT64_SIZE ? 1 : -1]);
   1167 #endif
   1168 
   1169 	if (!addr) {
   1170 		tprintf("NULL");
   1171 		return;
   1172 	}
   1173 	if (syserror(tcp) || !verbose(tcp)) {
   1174 		tprintf("%#lx", addr);
   1175 		return;
   1176 	}
   1177 
   1178 #ifdef LINUXSPARC
   1179 	if (current_personality == 1) {
   1180 		printstatsol(tcp, addr);
   1181 		return;
   1182 	}
   1183 # ifdef SPARC64
   1184 	else if (current_personality == 2) {
   1185 		printstat_sparc64(tcp, addr);
   1186 		return;
   1187 	}
   1188 # endif
   1189 #endif /* LINUXSPARC */
   1190 
   1191 #if defined LINUX && defined X86_64
   1192 	if (current_personality == 0) {
   1193 		printstat(tcp, addr);
   1194 		return;
   1195 	}
   1196 #endif
   1197 
   1198 	if (umove(tcp, addr, &statbuf) < 0) {
   1199 		tprintf("{...}");
   1200 		return;
   1201 	}
   1202 
   1203 	if (!abbrev(tcp)) {
   1204 #ifdef HAVE_LONG_LONG
   1205 		tprintf("{st_dev=makedev(%lu, %lu), st_ino=%llu, st_mode=%s, ",
   1206 #else
   1207 		tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
   1208 #endif
   1209 			(unsigned long) major(statbuf.st_dev),
   1210 			(unsigned long) minor(statbuf.st_dev),
   1211 #ifdef HAVE_LONG_LONG
   1212 			(unsigned long long) statbuf.st_ino,
   1213 #else
   1214 			(unsigned long) statbuf.st_ino,
   1215 #endif
   1216 			sprintmode(statbuf.st_mode));
   1217 		tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
   1218 			(unsigned long) statbuf.st_nlink,
   1219 			(unsigned long) statbuf.st_uid,
   1220 			(unsigned long) statbuf.st_gid);
   1221 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
   1222 		tprintf("st_blksize=%lu, ",
   1223 			(unsigned long) statbuf.st_blksize);
   1224 #endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
   1225 #ifdef HAVE_STRUCT_STAT_ST_BLOCKS
   1226 		tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
   1227 #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
   1228 	}
   1229 	else
   1230 		tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
   1231 	switch (statbuf.st_mode & S_IFMT) {
   1232 	case S_IFCHR: case S_IFBLK:
   1233 #ifdef HAVE_STRUCT_STAT_ST_RDEV
   1234 		tprintf("st_rdev=makedev(%lu, %lu), ",
   1235 			(unsigned long) major(statbuf.st_rdev),
   1236 			(unsigned long) minor(statbuf.st_rdev));
   1237 #else /* !HAVE_STRUCT_STAT_ST_RDEV */
   1238 		tprintf("st_size=makedev(%lu, %lu), ",
   1239 			(unsigned long) major(statbuf.st_size),
   1240 			(unsigned long) minor(statbuf.st_size));
   1241 #endif /* !HAVE_STRUCT_STAT_ST_RDEV */
   1242 		break;
   1243 	default:
   1244 #ifdef HAVE_LONG_LONG
   1245 		tprintf("st_size=%llu, ", (unsigned long long) statbuf.st_size);
   1246 #else
   1247 		tprintf("st_size=%lu, ", (unsigned long) statbuf.st_size);
   1248 #endif
   1249 		break;
   1250 	}
   1251 	if (!abbrev(tcp)) {
   1252 		tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
   1253 		tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
   1254 		tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime));
   1255 #if HAVE_STRUCT_STAT_ST_FLAGS
   1256 		tprintf(", st_flags=");
   1257 		printflags(fileflags, statbuf.st_flags, "UF_???");
   1258 #endif
   1259 #if HAVE_STRUCT_STAT_ST_ACLCNT
   1260 		tprintf(", st_aclcnt=%d", statbuf.st_aclcnt);
   1261 #endif
   1262 #if HAVE_STRUCT_STAT_ST_LEVEL
   1263 		tprintf(", st_level=%ld", statbuf.st_level);
   1264 #endif
   1265 #if HAVE_STRUCT_STAT_ST_FSTYPE
   1266 		tprintf(", st_fstype=%.*s",
   1267 			(int) sizeof statbuf.st_fstype, statbuf.st_fstype);
   1268 #endif
   1269 #if HAVE_STRUCT_STAT_ST_GEN
   1270 		tprintf(", st_gen=%u", statbuf.st_gen);
   1271 #endif
   1272 		tprintf("}");
   1273 	}
   1274 	else
   1275 		tprintf("...}");
   1276 }
   1277 #endif /* HAVE_STAT64 */
   1278 
   1279 #if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
   1280 static void
   1281 convertoldstat(const struct __old_kernel_stat *oldbuf, struct stat *newbuf)
   1282 {
   1283 	newbuf->st_dev = oldbuf->st_dev;
   1284 	newbuf->st_ino = oldbuf->st_ino;
   1285 	newbuf->st_mode = oldbuf->st_mode;
   1286 	newbuf->st_nlink = oldbuf->st_nlink;
   1287 	newbuf->st_uid = oldbuf->st_uid;
   1288 	newbuf->st_gid = oldbuf->st_gid;
   1289 	newbuf->st_rdev = oldbuf->st_rdev;
   1290 	newbuf->st_size = oldbuf->st_size;
   1291 	newbuf->st_atime = oldbuf->st_atime;
   1292 	newbuf->st_mtime = oldbuf->st_mtime;
   1293 	newbuf->st_ctime = oldbuf->st_ctime;
   1294 	newbuf->st_blksize = 0; /* not supported in old_stat */
   1295 	newbuf->st_blocks = 0; /* not supported in old_stat */
   1296 }
   1297 
   1298 
   1299 static void
   1300 printoldstat(struct tcb *tcp, long addr)
   1301 {
   1302 	struct __old_kernel_stat statbuf;
   1303 	struct stat newstatbuf;
   1304 
   1305 	if (!addr) {
   1306 		tprintf("NULL");
   1307 		return;
   1308 	}
   1309 	if (syserror(tcp) || !verbose(tcp)) {
   1310 		tprintf("%#lx", addr);
   1311 		return;
   1312 	}
   1313 
   1314 #ifdef LINUXSPARC
   1315 	if (current_personality == 1) {
   1316 		printstatsol(tcp, addr);
   1317 		return;
   1318 	}
   1319 #endif /* LINUXSPARC */
   1320 
   1321 	if (umove(tcp, addr, &statbuf) < 0) {
   1322 		tprintf("{...}");
   1323 		return;
   1324 	}
   1325 
   1326 	convertoldstat(&statbuf, &newstatbuf);
   1327 	realprintstat(tcp, &newstatbuf);
   1328 }
   1329 #endif /* LINUX && !IA64 && !HPPA && !X86_64 && !S390 && !S390X */
   1330 
   1331 #ifndef HAVE_LONG_LONG_OFF_T
   1332 int
   1333 sys_stat(struct tcb *tcp)
   1334 {
   1335 	if (entering(tcp)) {
   1336 		printpath(tcp, tcp->u_arg[0]);
   1337 		tprintf(", ");
   1338 	} else {
   1339 		printstat(tcp, tcp->u_arg[1]);
   1340 	}
   1341 	return 0;
   1342 }
   1343 #endif
   1344 
   1345 int
   1346 sys_stat64(struct tcb *tcp)
   1347 {
   1348 #ifdef HAVE_STAT64
   1349 	if (entering(tcp)) {
   1350 		printpath(tcp, tcp->u_arg[0]);
   1351 		tprintf(", ");
   1352 	} else {
   1353 		printstat64(tcp, tcp->u_arg[1]);
   1354 	}
   1355 	return 0;
   1356 #else
   1357 	return printargs(tcp);
   1358 #endif
   1359 }
   1360 
   1361 #ifdef LINUX
   1362 static const struct xlat fstatatflags[] = {
   1363 #ifndef AT_SYMLINK_NOFOLLOW
   1364 # define AT_SYMLINK_NOFOLLOW     0x100
   1365 #endif
   1366 	{ AT_SYMLINK_NOFOLLOW,	"AT_SYMLINK_NOFOLLOW"	},
   1367 	{ 0,			NULL			},
   1368 };
   1369 #define utimensatflags fstatatflags
   1370 
   1371 int
   1372 sys_newfstatat(struct tcb *tcp)
   1373 {
   1374 	if (entering(tcp)) {
   1375 		print_dirfd(tcp, tcp->u_arg[0]);
   1376 		printpath(tcp, tcp->u_arg[1]);
   1377 		tprintf(", ");
   1378 	} else {
   1379 #ifdef POWERPC64
   1380 		if (current_personality == 0)
   1381 			printstat(tcp, tcp->u_arg[2]);
   1382 		else
   1383 			printstat64(tcp, tcp->u_arg[2]);
   1384 #elif defined HAVE_STAT64
   1385 		printstat64(tcp, tcp->u_arg[2]);
   1386 #else
   1387 		printstat(tcp, tcp->u_arg[2]);
   1388 #endif
   1389 		tprintf(", ");
   1390 		printflags(fstatatflags, tcp->u_arg[3], "AT_???");
   1391 	}
   1392 	return 0;
   1393 }
   1394 #endif
   1395 
   1396 #if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
   1397 int
   1398 sys_oldstat(struct tcb *tcp)
   1399 {
   1400 	if (entering(tcp)) {
   1401 		printpath(tcp, tcp->u_arg[0]);
   1402 		tprintf(", ");
   1403 	} else {
   1404 		printoldstat(tcp, tcp->u_arg[1]);
   1405 	}
   1406 	return 0;
   1407 }
   1408 #endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
   1409 
   1410 #ifndef HAVE_LONG_LONG_OFF_T
   1411 int
   1412 sys_fstat(struct tcb *tcp)
   1413 {
   1414 	if (entering(tcp)) {
   1415 		printfd(tcp, tcp->u_arg[0]);
   1416 		tprintf(", ");
   1417 	} else {
   1418 		printstat(tcp, tcp->u_arg[1]);
   1419 	}
   1420 	return 0;
   1421 }
   1422 #endif
   1423 
   1424 int
   1425 sys_fstat64(struct tcb *tcp)
   1426 {
   1427 #ifdef HAVE_STAT64
   1428 	if (entering(tcp)) {
   1429 		printfd(tcp, tcp->u_arg[0]);
   1430 		tprintf(", ");
   1431 	} else {
   1432 		printstat64(tcp, tcp->u_arg[1]);
   1433 	}
   1434 	return 0;
   1435 #else
   1436 	return printargs(tcp);
   1437 #endif
   1438 }
   1439 
   1440 #if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
   1441 int
   1442 sys_oldfstat(struct tcb *tcp)
   1443 {
   1444 	if (entering(tcp)) {
   1445 		printfd(tcp, tcp->u_arg[0]);
   1446 		tprintf(", ");
   1447 	} else {
   1448 		printoldstat(tcp, tcp->u_arg[1]);
   1449 	}
   1450 	return 0;
   1451 }
   1452 #endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
   1453 
   1454 #ifndef HAVE_LONG_LONG_OFF_T
   1455 int
   1456 sys_lstat(struct tcb *tcp)
   1457 {
   1458 	if (entering(tcp)) {
   1459 		printpath(tcp, tcp->u_arg[0]);
   1460 		tprintf(", ");
   1461 	} else {
   1462 		printstat(tcp, tcp->u_arg[1]);
   1463 	}
   1464 	return 0;
   1465 }
   1466 #endif
   1467 
   1468 int
   1469 sys_lstat64(struct tcb *tcp)
   1470 {
   1471 #ifdef HAVE_STAT64
   1472 	if (entering(tcp)) {
   1473 		printpath(tcp, tcp->u_arg[0]);
   1474 		tprintf(", ");
   1475 	} else {
   1476 		printstat64(tcp, tcp->u_arg[1]);
   1477 	}
   1478 	return 0;
   1479 #else
   1480 	return printargs(tcp);
   1481 #endif
   1482 }
   1483 
   1484 #if defined(LINUX) && defined(HAVE_STRUCT___OLD_KERNEL_STAT)
   1485 int
   1486 sys_oldlstat(struct tcb *tcp)
   1487 {
   1488 	if (entering(tcp)) {
   1489 		printpath(tcp, tcp->u_arg[0]);
   1490 		tprintf(", ");
   1491 	} else {
   1492 		printoldstat(tcp, tcp->u_arg[1]);
   1493 	}
   1494 	return 0;
   1495 }
   1496 #endif /* LINUX && HAVE_STRUCT___OLD_KERNEL_STAT */
   1497 
   1498 
   1499 #if defined(SVR4) || defined(LINUXSPARC)
   1500 
   1501 int
   1502 sys_xstat(struct tcb *tcp)
   1503 {
   1504 	if (entering(tcp)) {
   1505 		tprintf("%ld, ", tcp->u_arg[0]);
   1506 		printpath(tcp, tcp->u_arg[1]);
   1507 		tprintf(", ");
   1508 	} else {
   1509 #ifdef _STAT64_VER
   1510 		if (tcp->u_arg[0] == _STAT64_VER)
   1511 			printstat64 (tcp, tcp->u_arg[2]);
   1512 		else
   1513 #endif
   1514 		printstat(tcp, tcp->u_arg[2]);
   1515 	}
   1516 	return 0;
   1517 }
   1518 
   1519 int
   1520 sys_fxstat(struct tcb *tcp)
   1521 {
   1522 	if (entering(tcp))
   1523 		tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]);
   1524 	else {
   1525 #ifdef _STAT64_VER
   1526 		if (tcp->u_arg[0] == _STAT64_VER)
   1527 			printstat64 (tcp, tcp->u_arg[2]);
   1528 		else
   1529 #endif
   1530 		printstat(tcp, tcp->u_arg[2]);
   1531 	}
   1532 	return 0;
   1533 }
   1534 
   1535 int
   1536 sys_lxstat(struct tcb *tcp)
   1537 {
   1538 	if (entering(tcp)) {
   1539 		tprintf("%ld, ", tcp->u_arg[0]);
   1540 		printpath(tcp, tcp->u_arg[1]);
   1541 		tprintf(", ");
   1542 	} else {
   1543 #ifdef _STAT64_VER
   1544 		if (tcp->u_arg[0] == _STAT64_VER)
   1545 			printstat64 (tcp, tcp->u_arg[2]);
   1546 		else
   1547 #endif
   1548 		printstat(tcp, tcp->u_arg[2]);
   1549 	}
   1550 	return 0;
   1551 }
   1552 
   1553 int
   1554 sys_xmknod(struct tcb *tcp)
   1555 {
   1556 	int mode = tcp->u_arg[2];
   1557 
   1558 	if (entering(tcp)) {
   1559 		tprintf("%ld, ", tcp->u_arg[0]);
   1560 		printpath(tcp, tcp->u_arg[1]);
   1561 		tprintf(", %s", sprintmode(mode));
   1562 		switch (mode & S_IFMT) {
   1563 		case S_IFCHR: case S_IFBLK:
   1564 #ifdef LINUXSPARC
   1565 			tprintf(", makedev(%lu, %lu)",
   1566 				(unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
   1567 				(unsigned long) (tcp->u_arg[3] & 0x3ffff));
   1568 #else
   1569 			tprintf(", makedev(%lu, %lu)",
   1570 				(unsigned long) major(tcp->u_arg[3]),
   1571 				(unsigned long) minor(tcp->u_arg[3]));
   1572 #endif
   1573 			break;
   1574 		default:
   1575 			break;
   1576 		}
   1577 	}
   1578 	return 0;
   1579 }
   1580 
   1581 #ifdef HAVE_SYS_ACL_H
   1582 
   1583 #include <sys/acl.h>
   1584 
   1585 static const struct xlat aclcmds[] = {
   1586 #ifdef SETACL
   1587 	{ SETACL,	"SETACL"	},
   1588 #endif
   1589 #ifdef GETACL
   1590 	{ GETACL,	"GETACL"	},
   1591 #endif
   1592 #ifdef GETACLCNT
   1593 	{ GETACLCNT,	"GETACLCNT"	},
   1594 #endif
   1595 #ifdef ACL_GET
   1596 	{ ACL_GET,	"ACL_GET"	},
   1597 #endif
   1598 #ifdef ACL_SET
   1599 	{ ACL_SET,	"ACL_SET"	},
   1600 #endif
   1601 #ifdef ACL_CNT
   1602 	{ ACL_CNT,	"ACL_CNT"	},
   1603 #endif
   1604 	{ 0,		NULL		},
   1605 };
   1606 
   1607 int
   1608 sys_acl(struct tcb *tcp)
   1609 {
   1610 	if (entering(tcp)) {
   1611 		printpath(tcp, tcp->u_arg[0]);
   1612 		tprintf(", ");
   1613 		printxval(aclcmds, tcp->u_arg[1], "???ACL???");
   1614 		tprintf(", %ld", tcp->u_arg[2]);
   1615 		/*
   1616 		 * FIXME - dump out the list of aclent_t's pointed to
   1617 		 * by "tcp->u_arg[3]" if it's not NULL.
   1618 		 */
   1619 		if (tcp->u_arg[3])
   1620 			tprintf(", %#lx", tcp->u_arg[3]);
   1621 		else
   1622 			tprintf(", NULL");
   1623 	}
   1624 	return 0;
   1625 }
   1626 
   1627 
   1628 int
   1629 sys_facl(struct tcb *tcp)
   1630 {
   1631 	if (entering(tcp)) {
   1632 		tprintf("%ld, ", tcp->u_arg[0]);
   1633 		printxval(aclcmds, tcp->u_arg[1], "???ACL???");
   1634 		tprintf(", %ld", tcp->u_arg[2]);
   1635 		/*
   1636 		 * FIXME - dump out the list of aclent_t's pointed to
   1637 		 * by "tcp->u_arg[3]" if it's not NULL.
   1638 		 */
   1639 		if (tcp->u_arg[3])
   1640 			tprintf(", %#lx", tcp->u_arg[3]);
   1641 		else
   1642 			tprintf(", NULL");
   1643 	}
   1644 	return 0;
   1645 }
   1646 
   1647 
   1648 static const struct xlat aclipc[] = {
   1649 #ifdef IPC_SHM
   1650 	{ IPC_SHM,	"IPC_SHM"	},
   1651 #endif
   1652 #ifdef IPC_SEM
   1653 	{ IPC_SEM,	"IPC_SEM"	},
   1654 #endif
   1655 #ifdef IPC_MSG
   1656 	{ IPC_MSG,	"IPC_MSG"	},
   1657 #endif
   1658 	{ 0,		NULL		},
   1659 };
   1660 
   1661 
   1662 int
   1663 sys_aclipc(struct tcb *tcp)
   1664 {
   1665 	if (entering(tcp)) {
   1666 		printxval(aclipc, tcp->u_arg[0], "???IPC???");
   1667 		tprintf(", %#lx, ", tcp->u_arg[1]);
   1668 		printxval(aclcmds, tcp->u_arg[2], "???ACL???");
   1669 		tprintf(", %ld", tcp->u_arg[3]);
   1670 		/*
   1671 		 * FIXME - dump out the list of aclent_t's pointed to
   1672 		 * by "tcp->u_arg[4]" if it's not NULL.
   1673 		 */
   1674 		if (tcp->u_arg[4])
   1675 			tprintf(", %#lx", tcp->u_arg[4]);
   1676 		else
   1677 			tprintf(", NULL");
   1678 	}
   1679 	return 0;
   1680 }
   1681 
   1682 #endif /* HAVE_SYS_ACL_H */
   1683 
   1684 #endif /* SVR4 || LINUXSPARC */
   1685 
   1686 #ifdef LINUX
   1687 
   1688 static const struct xlat fsmagic[] = {
   1689 	{ 0x73757245,	"CODA_SUPER_MAGIC"	},
   1690 	{ 0x012ff7b7,	"COH_SUPER_MAGIC"	},
   1691 	{ 0x1373,	"DEVFS_SUPER_MAGIC"	},
   1692 	{ 0x1cd1,	"DEVPTS_SUPER_MAGIC"	},
   1693 	{ 0x414A53,	"EFS_SUPER_MAGIC"	},
   1694 	{ 0xef51,	"EXT2_OLD_SUPER_MAGIC"	},
   1695 	{ 0xef53,	"EXT2_SUPER_MAGIC"	},
   1696 	{ 0x137d,	"EXT_SUPER_MAGIC"	},
   1697 	{ 0xf995e849,	"HPFS_SUPER_MAGIC"	},
   1698 	{ 0x9660,	"ISOFS_SUPER_MAGIC"	},
   1699 	{ 0x137f,	"MINIX_SUPER_MAGIC"	},
   1700 	{ 0x138f,	"MINIX_SUPER_MAGIC2"	},
   1701 	{ 0x2468,	"MINIX2_SUPER_MAGIC"	},
   1702 	{ 0x2478,	"MINIX2_SUPER_MAGIC2"	},
   1703 	{ 0x4d44,	"MSDOS_SUPER_MAGIC"	},
   1704 	{ 0x564c,	"NCP_SUPER_MAGIC"	},
   1705 	{ 0x6969,	"NFS_SUPER_MAGIC"	},
   1706 	{ 0x9fa0,	"PROC_SUPER_MAGIC"	},
   1707 	{ 0x002f,	"QNX4_SUPER_MAGIC"	},
   1708 	{ 0x52654973,	"REISERFS_SUPER_MAGIC"	},
   1709 	{ 0x02011994,	"SHMFS_SUPER_MAGIC"	},
   1710 	{ 0x517b,	"SMB_SUPER_MAGIC"	},
   1711 	{ 0x012ff7b6,	"SYSV2_SUPER_MAGIC"	},
   1712 	{ 0x012ff7b5,	"SYSV4_SUPER_MAGIC"	},
   1713 	{ 0x00011954,	"UFS_MAGIC"		},
   1714 	{ 0x54190100,	"UFS_CIGAM"		},
   1715 	{ 0x012ff7b4,	"XENIX_SUPER_MAGIC"	},
   1716 	{ 0x012fd16d,	"XIAFS_SUPER_MAGIC"	},
   1717 	{ 0x62656572,	"SYSFS_MAGIC"		},
   1718 	{ 0,		NULL			},
   1719 };
   1720 
   1721 #endif /* LINUX */
   1722 
   1723 #ifndef SVR4
   1724 
   1725 static const char *
   1726 sprintfstype(int magic)
   1727 {
   1728 	static char buf[32];
   1729 #ifdef LINUX
   1730 	const char *s;
   1731 
   1732 	s = xlookup(fsmagic, magic);
   1733 	if (s) {
   1734 		sprintf(buf, "\"%s\"", s);
   1735 		return buf;
   1736 	}
   1737 #endif /* LINUX */
   1738 	sprintf(buf, "%#x", magic);
   1739 	return buf;
   1740 }
   1741 
   1742 static void
   1743 printstatfs(struct tcb *tcp, long addr)
   1744 {
   1745 	struct statfs statbuf;
   1746 
   1747 	if (syserror(tcp) || !verbose(tcp)) {
   1748 		tprintf("%#lx", addr);
   1749 		return;
   1750 	}
   1751 	if (umove(tcp, addr, &statbuf) < 0) {
   1752 		tprintf("{...}");
   1753 		return;
   1754 	}
   1755 #ifdef ALPHA
   1756 
   1757 	tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ",
   1758 		sprintfstype(statbuf.f_type),
   1759 		statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree);
   1760 	tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_fsid={%d, %d}, f_namelen=%u",
   1761 		statbuf.f_bavail,statbuf.f_files, statbuf.f_ffree,
   1762 		statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1],
   1763 		statbuf.f_namelen);
   1764 #else /* !ALPHA */
   1765 	tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ",
   1766 		sprintfstype(statbuf.f_type),
   1767 		(unsigned long)statbuf.f_bsize,
   1768 		(unsigned long)statbuf.f_blocks,
   1769 		(unsigned long)statbuf.f_bfree);
   1770 	tprintf("f_bavail=%lu, f_files=%lu, f_ffree=%lu, f_fsid={%d, %d}",
   1771 		(unsigned long)statbuf.f_bavail,
   1772 		(unsigned long)statbuf.f_files,
   1773 		(unsigned long)statbuf.f_ffree,
   1774 		statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]);
   1775 #ifdef LINUX
   1776 	tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
   1777 #endif /* LINUX */
   1778 #endif /* !ALPHA */
   1779 #ifdef _STATFS_F_FRSIZE
   1780 	tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize);
   1781 #endif
   1782 	tprintf("}");
   1783 }
   1784 
   1785 int
   1786 sys_statfs(struct tcb *tcp)
   1787 {
   1788 	if (entering(tcp)) {
   1789 		printpath(tcp, tcp->u_arg[0]);
   1790 		tprintf(", ");
   1791 	} else {
   1792 		printstatfs(tcp, tcp->u_arg[1]);
   1793 	}
   1794 	return 0;
   1795 }
   1796 
   1797 int
   1798 sys_fstatfs(struct tcb *tcp)
   1799 {
   1800 	if (entering(tcp)) {
   1801 		printfd(tcp, tcp->u_arg[0]);
   1802 		tprintf(", ");
   1803 	} else {
   1804 		printstatfs(tcp, tcp->u_arg[1]);
   1805 	}
   1806 	return 0;
   1807 }
   1808 
   1809 #if defined LINUX && defined HAVE_STATFS64
   1810 static void
   1811 printstatfs64(struct tcb *tcp, long addr)
   1812 {
   1813 	struct statfs64 statbuf;
   1814 
   1815 	if (syserror(tcp) || !verbose(tcp)) {
   1816 		tprintf("%#lx", addr);
   1817 		return;
   1818 	}
   1819 	if (umove(tcp, addr, &statbuf) < 0) {
   1820 		tprintf("{...}");
   1821 		return;
   1822 	}
   1823 	tprintf("{f_type=%s, f_bsize=%llu, f_blocks=%llu, f_bfree=%llu, ",
   1824 		sprintfstype(statbuf.f_type),
   1825 		(unsigned long long)statbuf.f_bsize,
   1826 		(unsigned long long)statbuf.f_blocks,
   1827 		(unsigned long long)statbuf.f_bfree);
   1828 	tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}",
   1829 		(unsigned long long)statbuf.f_bavail,
   1830 		(unsigned long long)statbuf.f_files,
   1831 		(unsigned long long)statbuf.f_ffree,
   1832 		statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]);
   1833 	tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
   1834 #ifdef _STATFS_F_FRSIZE
   1835 	tprintf(", f_frsize=%llu", (unsigned long long)statbuf.f_frsize);
   1836 #endif
   1837 	tprintf("}");
   1838 }
   1839 
   1840 int
   1841 sys_statfs64(struct tcb *tcp)
   1842 {
   1843 	if (entering(tcp)) {
   1844 		printpath(tcp, tcp->u_arg[0]);
   1845 		tprintf(", %lu, ", tcp->u_arg[1]);
   1846 	} else {
   1847 		if (tcp->u_arg[1] == sizeof (struct statfs64))
   1848 			printstatfs64(tcp, tcp->u_arg[2]);
   1849 		else
   1850 			tprintf("{???}");
   1851 	}
   1852 	return 0;
   1853 }
   1854 
   1855 int
   1856 sys_fstatfs64(struct tcb *tcp)
   1857 {
   1858 	if (entering(tcp)) {
   1859 		printfd(tcp, tcp->u_arg[0]);
   1860 		tprintf(", %lu, ", tcp->u_arg[1]);
   1861 	} else {
   1862 		if (tcp->u_arg[1] == sizeof (struct statfs64))
   1863 			printstatfs64(tcp, tcp->u_arg[2]);
   1864 		else
   1865 			tprintf("{???}");
   1866 	}
   1867 	return 0;
   1868 }
   1869 #endif
   1870 
   1871 #if defined(LINUX) && defined(__alpha)
   1872 
   1873 int
   1874 osf_statfs(struct tcb *tcp)
   1875 {
   1876 	if (entering(tcp)) {
   1877 		printpath(tcp, tcp->u_arg[0]);
   1878 		tprintf(", ");
   1879 	} else {
   1880 		printstatfs(tcp, tcp->u_arg[1]);
   1881 		tprintf(", %lu", tcp->u_arg[2]);
   1882 	}
   1883 	return 0;
   1884 }
   1885 
   1886 int
   1887 osf_fstatfs(struct tcb *tcp)
   1888 {
   1889 	if (entering(tcp)) {
   1890 		tprintf("%lu, ", tcp->u_arg[0]);
   1891 	} else {
   1892 		printstatfs(tcp, tcp->u_arg[1]);
   1893 		tprintf(", %lu", tcp->u_arg[2]);
   1894 	}
   1895 	return 0;
   1896 }
   1897 #endif /* LINUX && __alpha */
   1898 
   1899 #endif /* !SVR4 */
   1900 
   1901 #ifdef SUNOS4
   1902 int
   1903 sys_ustat(struct tcb *tcp)
   1904 {
   1905 	struct ustat statbuf;
   1906 
   1907 	if (entering(tcp)) {
   1908 		tprintf("makedev(%lu, %lu), ",
   1909 				(long) major(tcp->u_arg[0]),
   1910 				(long) minor(tcp->u_arg[0]));
   1911 	}
   1912 	else {
   1913 		if (syserror(tcp) || !verbose(tcp))
   1914 			tprintf("%#lx", tcp->u_arg[1]);
   1915 		else if (umove(tcp, tcp->u_arg[1], &statbuf) < 0)
   1916 			tprintf("{...}");
   1917 		else {
   1918 			tprintf("{f_tfree=%lu, f_tinode=%lu, ",
   1919 				statbuf.f_tfree, statbuf.f_tinode);
   1920 			tprintf("f_fname=\"%.*s\", ",
   1921 				(int) sizeof(statbuf.f_fname),
   1922 				statbuf.f_fname);
   1923 			tprintf("f_fpack=\"%.*s\"}",
   1924 				(int) sizeof(statbuf.f_fpack),
   1925 				statbuf.f_fpack);
   1926 		}
   1927 	}
   1928 	return 0;
   1929 }
   1930 #endif /* SUNOS4 */
   1931 
   1932 int
   1933 sys_pivotroot(struct tcb *tcp)
   1934 {
   1935 	if (entering(tcp)) {
   1936 		printpath(tcp, tcp->u_arg[0]);
   1937 		tprintf(", ");
   1938 		printpath(tcp, tcp->u_arg[1]);
   1939 	}
   1940 	return 0;
   1941 }
   1942 
   1943 
   1944 /* directory */
   1945 int
   1946 sys_chdir(struct tcb *tcp)
   1947 {
   1948 	if (entering(tcp)) {
   1949 		printpath(tcp, tcp->u_arg[0]);
   1950 	}
   1951 	return 0;
   1952 }
   1953 
   1954 static int
   1955 decode_mkdir(struct tcb *tcp, int offset)
   1956 {
   1957 	if (entering(tcp)) {
   1958 		printpath(tcp, tcp->u_arg[offset]);
   1959 		tprintf(", %#lo", tcp->u_arg[offset + 1]);
   1960 	}
   1961 	return 0;
   1962 }
   1963 
   1964 int
   1965 sys_mkdir(struct tcb *tcp)
   1966 {
   1967 	return decode_mkdir(tcp, 0);
   1968 }
   1969 
   1970 #ifdef LINUX
   1971 int
   1972 sys_mkdirat(struct tcb *tcp)
   1973 {
   1974 	if (entering(tcp))
   1975 		print_dirfd(tcp, tcp->u_arg[0]);
   1976 	return decode_mkdir(tcp, 1);
   1977 }
   1978 #endif
   1979 
   1980 int
   1981 sys_rmdir(struct tcb *tcp)
   1982 {
   1983 	if (entering(tcp)) {
   1984 		printpath(tcp, tcp->u_arg[0]);
   1985 	}
   1986 	return 0;
   1987 }
   1988 
   1989 int
   1990 sys_fchdir(struct tcb *tcp)
   1991 {
   1992 	if (entering(tcp)) {
   1993 		printfd(tcp, tcp->u_arg[0]);
   1994 	}
   1995 	return 0;
   1996 }
   1997 
   1998 int
   1999 sys_chroot(struct tcb *tcp)
   2000 {
   2001 	if (entering(tcp)) {
   2002 		printpath(tcp, tcp->u_arg[0]);
   2003 	}
   2004 	return 0;
   2005 }
   2006 
   2007 #if defined(SUNOS4) || defined(SVR4)
   2008 int
   2009 sys_fchroot(struct tcb *tcp)
   2010 {
   2011 	if (entering(tcp)) {
   2012 		printfd(tcp, tcp->u_arg[0]);
   2013 	}
   2014 	return 0;
   2015 }
   2016 #endif /* SUNOS4 || SVR4 */
   2017 
   2018 int
   2019 sys_link(struct tcb *tcp)
   2020 {
   2021 	if (entering(tcp)) {
   2022 		printpath(tcp, tcp->u_arg[0]);
   2023 		tprintf(", ");
   2024 		printpath(tcp, tcp->u_arg[1]);
   2025 	}
   2026 	return 0;
   2027 }
   2028 
   2029 #ifdef LINUX
   2030 int
   2031 sys_linkat(struct tcb *tcp)
   2032 {
   2033 	if (entering(tcp)) {
   2034 		print_dirfd(tcp, tcp->u_arg[0]);
   2035 		printpath(tcp, tcp->u_arg[1]);
   2036 		tprintf(", ");
   2037 		print_dirfd(tcp, tcp->u_arg[2]);
   2038 		printpath(tcp, tcp->u_arg[3]);
   2039 		tprintf(", ");
   2040 		printfd(tcp, tcp->u_arg[4]);
   2041 	}
   2042 	return 0;
   2043 }
   2044 #endif
   2045 
   2046 int
   2047 sys_unlink(struct tcb *tcp)
   2048 {
   2049 	if (entering(tcp)) {
   2050 		printpath(tcp, tcp->u_arg[0]);
   2051 	}
   2052 	return 0;
   2053 }
   2054 
   2055 #ifdef LINUX
   2056 static const struct xlat unlinkatflags[] = {
   2057 #ifndef AT_REMOVEDIR
   2058 # define AT_REMOVEDIR            0x200
   2059 #endif
   2060 	{ AT_REMOVEDIR,	"AT_REMOVEDIR"	},
   2061 	{ 0,		NULL		},
   2062 };
   2063 
   2064 int
   2065 sys_unlinkat(struct tcb *tcp)
   2066 {
   2067 	if (entering(tcp)) {
   2068 		print_dirfd(tcp, tcp->u_arg[0]);
   2069 		printpath(tcp, tcp->u_arg[1]);
   2070 		tprintf(", ");
   2071 		printflags(unlinkatflags, tcp->u_arg[2], "AT_???");
   2072 	}
   2073 	return 0;
   2074 }
   2075 #endif
   2076 
   2077 int
   2078 sys_symlink(struct tcb *tcp)
   2079 {
   2080 	if (entering(tcp)) {
   2081 		printpath(tcp, tcp->u_arg[0]);
   2082 		tprintf(", ");
   2083 		printpath(tcp, tcp->u_arg[1]);
   2084 	}
   2085 	return 0;
   2086 }
   2087 
   2088 #ifdef LINUX
   2089 int
   2090 sys_symlinkat(struct tcb *tcp)
   2091 {
   2092 	if (entering(tcp)) {
   2093 		printpath(tcp, tcp->u_arg[0]);
   2094 		tprintf(", ");
   2095 		print_dirfd(tcp, tcp->u_arg[1]);
   2096 		printpath(tcp, tcp->u_arg[2]);
   2097 	}
   2098 	return 0;
   2099 }
   2100 #endif
   2101 
   2102 static int
   2103 decode_readlink(struct tcb *tcp, int offset)
   2104 {
   2105 	if (entering(tcp)) {
   2106 		printpath(tcp, tcp->u_arg[offset]);
   2107 		tprintf(", ");
   2108 	} else {
   2109 		if (syserror(tcp))
   2110 			tprintf("%#lx", tcp->u_arg[offset + 1]);
   2111 		else
   2112 			printpathn(tcp, tcp->u_arg[offset + 1], tcp->u_rval);
   2113 		tprintf(", %lu", tcp->u_arg[offset + 2]);
   2114 	}
   2115 	return 0;
   2116 }
   2117 
   2118 int
   2119 sys_readlink(struct tcb *tcp)
   2120 {
   2121 	return decode_readlink(tcp, 0);
   2122 }
   2123 
   2124 #ifdef LINUX
   2125 int
   2126 sys_readlinkat(struct tcb *tcp)
   2127 {
   2128 	if (entering(tcp))
   2129 		print_dirfd(tcp, tcp->u_arg[0]);
   2130 	return decode_readlink(tcp, 1);
   2131 }
   2132 #endif
   2133 
   2134 int
   2135 sys_rename(struct tcb *tcp)
   2136 {
   2137 	if (entering(tcp)) {
   2138 		printpath(tcp, tcp->u_arg[0]);
   2139 		tprintf(", ");
   2140 		printpath(tcp, tcp->u_arg[1]);
   2141 	}
   2142 	return 0;
   2143 }
   2144 
   2145 #ifdef LINUX
   2146 int
   2147 sys_renameat(struct tcb *tcp)
   2148 {
   2149 	if (entering(tcp)) {
   2150 		print_dirfd(tcp, tcp->u_arg[0]);
   2151 		printpath(tcp, tcp->u_arg[1]);
   2152 		tprintf(", ");
   2153 		print_dirfd(tcp, tcp->u_arg[2]);
   2154 		printpath(tcp, tcp->u_arg[3]);
   2155 	}
   2156 	return 0;
   2157 }
   2158 #endif
   2159 
   2160 int
   2161 sys_chown(struct tcb *tcp)
   2162 {
   2163 	if (entering(tcp)) {
   2164 		printpath(tcp, tcp->u_arg[0]);
   2165 		printuid(", ", tcp->u_arg[1]);
   2166 		printuid(", ", tcp->u_arg[2]);
   2167 	}
   2168 	return 0;
   2169 }
   2170 
   2171 #ifdef LINUX
   2172 int
   2173 sys_fchownat(struct tcb *tcp)
   2174 {
   2175 	if (entering(tcp)) {
   2176 		print_dirfd(tcp, tcp->u_arg[0]);
   2177 		printpath(tcp, tcp->u_arg[1]);
   2178 		printuid(", ", tcp->u_arg[2]);
   2179 		printuid(", ", tcp->u_arg[3]);
   2180 		tprintf(", ");
   2181 		printflags(fstatatflags, tcp->u_arg[4], "AT_???");
   2182 	}
   2183 	return 0;
   2184 }
   2185 #endif
   2186 
   2187 int
   2188 sys_fchown(struct tcb *tcp)
   2189 {
   2190 	if (entering(tcp)) {
   2191 		printfd(tcp, tcp->u_arg[0]);
   2192 		printuid(", ", tcp->u_arg[1]);
   2193 		printuid(", ", tcp->u_arg[2]);
   2194 	}
   2195 	return 0;
   2196 }
   2197 
   2198 static int
   2199 decode_chmod(struct tcb *tcp, int offset)
   2200 {
   2201 	if (entering(tcp)) {
   2202 		printpath(tcp, tcp->u_arg[offset]);
   2203 		tprintf(", %#lo", tcp->u_arg[offset + 1]);
   2204 	}
   2205 	return 0;
   2206 }
   2207 
   2208 int
   2209 sys_chmod(struct tcb *tcp)
   2210 {
   2211 	return decode_chmod(tcp, 0);
   2212 }
   2213 
   2214 #ifdef LINUX
   2215 int
   2216 sys_fchmodat(struct tcb *tcp)
   2217 {
   2218 	if (entering(tcp))
   2219 		print_dirfd(tcp, tcp->u_arg[0]);
   2220 	return decode_chmod(tcp, 1);
   2221 }
   2222 #endif
   2223 
   2224 int
   2225 sys_fchmod(struct tcb *tcp)
   2226 {
   2227 	if (entering(tcp)) {
   2228 		printfd(tcp, tcp->u_arg[0]);
   2229 		tprintf(", %#lo", tcp->u_arg[1]);
   2230 	}
   2231 	return 0;
   2232 }
   2233 
   2234 #ifdef ALPHA
   2235 int
   2236 sys_osf_utimes(struct tcb *tcp)
   2237 {
   2238 	if (entering(tcp)) {
   2239 		printpath(tcp, tcp->u_arg[0]);
   2240 		tprintf(", ");
   2241 		printtv_bitness(tcp, tcp->u_arg[1], BITNESS_32,  0);
   2242 	}
   2243 	return 0;
   2244 }
   2245 #endif
   2246 
   2247 static int
   2248 decode_utimes(struct tcb *tcp, int offset, int special)
   2249 {
   2250 	if (entering(tcp)) {
   2251 		printpath(tcp, tcp->u_arg[offset]);
   2252 		tprintf(", ");
   2253 		if (tcp->u_arg[offset + 1] == 0)
   2254 			tprintf("NULL");
   2255 		else {
   2256 			tprintf("{");
   2257 			printtv_bitness(tcp, tcp->u_arg[offset + 1],
   2258 					BITNESS_CURRENT, special);
   2259 			tprintf(", ");
   2260 			printtv_bitness(tcp, tcp->u_arg[offset + 1]
   2261 					+ sizeof (struct timeval),
   2262 					BITNESS_CURRENT, special);
   2263 			tprintf("}");
   2264 		}
   2265 	}
   2266 	return 0;
   2267 }
   2268 
   2269 int
   2270 sys_utimes(struct tcb *tcp)
   2271 {
   2272 	return decode_utimes(tcp, 0, 0);
   2273 }
   2274 
   2275 #ifdef LINUX
   2276 int
   2277 sys_futimesat(struct tcb *tcp)
   2278 {
   2279 	if (entering(tcp))
   2280 		print_dirfd(tcp, tcp->u_arg[0]);
   2281 	return decode_utimes(tcp, 1, 0);
   2282 }
   2283 
   2284 int
   2285 sys_utimensat(struct tcb *tcp)
   2286 {
   2287 	if (entering(tcp)) {
   2288 		print_dirfd(tcp, tcp->u_arg[0]);
   2289 		decode_utimes(tcp, 1, 1);
   2290 		tprintf(", ");
   2291 		printflags(utimensatflags, tcp->u_arg[3], "AT_???");
   2292 	}
   2293 	return 0;
   2294 }
   2295 #endif
   2296 
   2297 int
   2298 sys_utime(struct tcb *tcp)
   2299 {
   2300 	union {
   2301 		long utl[2];
   2302 		int uti[2];
   2303 	} u;
   2304 
   2305 	if (entering(tcp)) {
   2306 		printpath(tcp, tcp->u_arg[0]);
   2307 		tprintf(", ");
   2308 		if (!tcp->u_arg[1])
   2309 			tprintf("NULL");
   2310 		else if (!verbose(tcp))
   2311 			tprintf("%#lx", tcp->u_arg[1]);
   2312 		else if (umoven(tcp, tcp->u_arg[1],
   2313 				2 * personality_wordsize[current_personality],
   2314 				(char *) &u) < 0)
   2315 			tprintf("[?, ?]");
   2316 		else if (personality_wordsize[current_personality]
   2317 			 == sizeof u.utl[0]) {
   2318 			tprintf("[%s,", sprinttime(u.utl[0]));
   2319 			tprintf(" %s]", sprinttime(u.utl[1]));
   2320 		}
   2321 		else if (personality_wordsize[current_personality]
   2322 			 == sizeof u.uti[0]) {
   2323 			tprintf("[%s,", sprinttime(u.uti[0]));
   2324 			tprintf(" %s]", sprinttime(u.uti[1]));
   2325 		}
   2326 		else
   2327 			abort();
   2328 	}
   2329 	return 0;
   2330 }
   2331 
   2332 static int
   2333 decode_mknod(struct tcb *tcp, int offset)
   2334 {
   2335 	int mode = tcp->u_arg[offset + 1];
   2336 
   2337 	if (entering(tcp)) {
   2338 		printpath(tcp, tcp->u_arg[offset]);
   2339 		tprintf(", %s", sprintmode(mode));
   2340 		switch (mode & S_IFMT) {
   2341 		case S_IFCHR: case S_IFBLK:
   2342 #ifdef LINUXSPARC
   2343 			if (current_personality == 1)
   2344 			tprintf(", makedev(%lu, %lu)",
   2345 				(unsigned long) ((tcp->u_arg[offset + 2] >> 18) & 0x3fff),
   2346 				(unsigned long) (tcp->u_arg[offset + 2] & 0x3ffff));
   2347 			else
   2348 #endif
   2349 			tprintf(", makedev(%lu, %lu)",
   2350 				(unsigned long) major(tcp->u_arg[offset + 2]),
   2351 				(unsigned long) minor(tcp->u_arg[offset + 2]));
   2352 			break;
   2353 		default:
   2354 			break;
   2355 		}
   2356 	}
   2357 	return 0;
   2358 }
   2359 
   2360 int
   2361 sys_mknod(struct tcb *tcp)
   2362 {
   2363 	return decode_mknod(tcp, 0);
   2364 }
   2365 
   2366 #ifdef LINUX
   2367 int
   2368 sys_mknodat(struct tcb *tcp)
   2369 {
   2370 	if (entering(tcp))
   2371 		print_dirfd(tcp, tcp->u_arg[0]);
   2372 	return decode_mknod(tcp, 1);
   2373 }
   2374 #endif
   2375 
   2376 #ifdef FREEBSD
   2377 int
   2378 sys_mkfifo(struct tcb *tcp)
   2379 {
   2380 	if (entering(tcp)) {
   2381 		printpath(tcp, tcp->u_arg[0]);
   2382 		tprintf(", %#lo", tcp->u_arg[1]);
   2383 	}
   2384 	return 0;
   2385 }
   2386 #endif /* FREEBSD */
   2387 
   2388 int
   2389 sys_fsync(struct tcb *tcp)
   2390 {
   2391 	if (entering(tcp)) {
   2392 		printfd(tcp, tcp->u_arg[0]);
   2393 	}
   2394 	return 0;
   2395 }
   2396 
   2397 #ifdef LINUX
   2398 
   2399 static void
   2400 printdir(struct tcb *tcp, long addr)
   2401 {
   2402 	struct dirent d;
   2403 
   2404 	if (!verbose(tcp)) {
   2405 		tprintf("%#lx", addr);
   2406 		return;
   2407 	}
   2408 	if (umove(tcp, addr, &d) < 0) {
   2409 		tprintf("{...}");
   2410 		return;
   2411 	}
   2412 	tprintf("{d_ino=%ld, ", (unsigned long) d.d_ino);
   2413 	tprintf("d_name=");
   2414 	printpathn(tcp, (long) ((struct dirent *) addr)->d_name, d.d_reclen);
   2415 	tprintf("}");
   2416 }
   2417 
   2418 int
   2419 sys_readdir(struct tcb *tcp)
   2420 {
   2421 	if (entering(tcp)) {
   2422 		printfd(tcp, tcp->u_arg[0]);
   2423 		tprintf(", ");
   2424 	} else {
   2425 		if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
   2426 			tprintf("%#lx", tcp->u_arg[1]);
   2427 		else
   2428 			printdir(tcp, tcp->u_arg[1]);
   2429 		/* Not much point in printing this out, it is always 1. */
   2430 		if (tcp->u_arg[2] != 1)
   2431 			tprintf(", %lu", tcp->u_arg[2]);
   2432 	}
   2433 	return 0;
   2434 }
   2435 
   2436 #endif /* LINUX */
   2437 
   2438 #if defined FREEBSD || defined LINUX
   2439 static const struct xlat direnttypes[] = {
   2440 	{ DT_UNKNOWN,	"DT_UNKNOWN" 	},
   2441 	{ DT_FIFO,	"DT_FIFO" 	},
   2442 	{ DT_CHR,	"DT_CHR" 	},
   2443 	{ DT_DIR,	"DT_DIR" 	},
   2444 	{ DT_BLK,	"DT_BLK" 	},
   2445 	{ DT_REG,	"DT_REG" 	},
   2446 	{ DT_LNK,	"DT_LNK" 	},
   2447 	{ DT_SOCK,	"DT_SOCK" 	},
   2448 	{ DT_WHT,	"DT_WHT" 	},
   2449 	{ 0,		NULL		},
   2450 };
   2451 
   2452 #endif
   2453 
   2454 int
   2455 sys_getdents(struct tcb *tcp)
   2456 {
   2457 	int i, len, dents = 0;
   2458 	char *buf;
   2459 
   2460 	if (entering(tcp)) {
   2461 		printfd(tcp, tcp->u_arg[0]);
   2462 		tprintf(", ");
   2463 		return 0;
   2464 	}
   2465 	if (syserror(tcp) || !verbose(tcp)) {
   2466 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2467 		return 0;
   2468 	}
   2469 	len = tcp->u_rval;
   2470 	buf = len ? malloc(len) : NULL;
   2471 	if (len && !buf) {
   2472 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2473 		fprintf(stderr, "out of memory\n");
   2474 		return 0;
   2475 	}
   2476 	if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
   2477 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2478 		free(buf);
   2479 		return 0;
   2480 	}
   2481 	if (!abbrev(tcp))
   2482 		tprintf("{");
   2483 	for (i = 0; i < len;) {
   2484 		struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
   2485 #ifdef LINUX
   2486 		if (!abbrev(tcp)) {
   2487 			tprintf("%s{d_ino=%lu, d_off=%lu, ",
   2488 				i ? " " : "", d->d_ino, d->d_off);
   2489 			tprintf("d_reclen=%u, d_name=\"%s\"}",
   2490 				d->d_reclen, d->d_name);
   2491 		}
   2492 #endif /* LINUX */
   2493 #ifdef SVR4
   2494 		if (!abbrev(tcp)) {
   2495 			tprintf("%s{d_ino=%lu, d_off=%lu, ",
   2496 				i ? " " : "",
   2497 				(unsigned long) d->d_ino,
   2498 				(unsigned long) d->d_off);
   2499 			tprintf("d_reclen=%u, d_name=\"%s\"}",
   2500 				d->d_reclen, d->d_name);
   2501 		}
   2502 #endif /* SVR4 */
   2503 #ifdef SUNOS4
   2504 		if (!abbrev(tcp)) {
   2505 			tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
   2506 				i ? " " : "", d->d_off, d->d_fileno,
   2507 				d->d_reclen);
   2508 			tprintf("d_namlen=%u, d_name=\"%.*s\"}",
   2509 				d->d_namlen, d->d_namlen, d->d_name);
   2510 		}
   2511 #endif /* SUNOS4 */
   2512 #ifdef FREEBSD
   2513 		if (!abbrev(tcp)) {
   2514 			tprintf("%s{d_fileno=%u, d_reclen=%u, d_type=",
   2515 				i ? " " : "", d->d_fileno, d->d_reclen);
   2516 			printxval(direnttypes, d->d_type, "DT_???");
   2517 			tprintf(", d_namlen=%u, d_name=\"%.*s\"}",
   2518 				d->d_namlen, d->d_namlen, d->d_name);
   2519 		}
   2520 #endif /* FREEBSD */
   2521 		if (!d->d_reclen) {
   2522 			tprintf("/* d_reclen == 0, problem here */");
   2523 			break;
   2524 		}
   2525 		i += d->d_reclen;
   2526 		dents++;
   2527 	}
   2528 	if (!abbrev(tcp))
   2529 		tprintf("}");
   2530 	else
   2531 		tprintf("/* %u entries */", dents);
   2532 	tprintf(", %lu", tcp->u_arg[2]);
   2533 	free(buf);
   2534 	return 0;
   2535 }
   2536 
   2537 
   2538 #if _LFS64_LARGEFILE
   2539 int
   2540 sys_getdents64(struct tcb *tcp)
   2541 {
   2542 	int i, len, dents = 0;
   2543 	char *buf;
   2544 
   2545 	if (entering(tcp)) {
   2546 		printfd(tcp, tcp->u_arg[0]);
   2547 		tprintf(", ");
   2548 		return 0;
   2549 	}
   2550 	if (syserror(tcp) || !verbose(tcp)) {
   2551 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2552 		return 0;
   2553 	}
   2554 	len = tcp->u_rval;
   2555 	buf = len ? malloc(len) : NULL;
   2556 	if (len && !buf) {
   2557 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2558 		fprintf(stderr, "out of memory\n");
   2559 		return 0;
   2560 	}
   2561 	if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
   2562 		tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
   2563 		free(buf);
   2564 		return 0;
   2565 	}
   2566 	if (!abbrev(tcp))
   2567 		tprintf("{");
   2568 	for (i = 0; i < len;) {
   2569 		struct dirent64 *d = (struct dirent64 *) &buf[i];
   2570 #if defined(LINUX) || defined(SVR4)
   2571 		if (!abbrev(tcp)) {
   2572 			tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64 ", ",
   2573 				i ? " " : "",
   2574 				d->d_ino,
   2575 				d->d_off);
   2576 #ifdef LINUX
   2577 			tprintf("d_type=");
   2578 			printxval(direnttypes, d->d_type, "DT_???");
   2579 			tprintf(", ");
   2580 #endif
   2581 			tprintf("d_reclen=%u, d_name=\"%s\"}",
   2582 				d->d_reclen, d->d_name);
   2583 		}
   2584 #endif /* LINUX || SVR4 */
   2585 #ifdef SUNOS4
   2586 		if (!abbrev(tcp)) {
   2587 			tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
   2588 				i ? " " : "", d->d_off, d->d_fileno,
   2589 				d->d_reclen);
   2590 			tprintf("d_namlen=%u, d_name=\"%.*s\"}",
   2591 				d->d_namlen, d->d_namlen, d->d_name);
   2592 		}
   2593 #endif /* SUNOS4 */
   2594 		if (!d->d_reclen) {
   2595 			tprintf("/* d_reclen == 0, problem here */");
   2596 			break;
   2597 		}
   2598 		i += d->d_reclen;
   2599 		dents++;
   2600 	}
   2601 	if (!abbrev(tcp))
   2602 		tprintf("}");
   2603 	else
   2604 		tprintf("/* %u entries */", dents);
   2605 	tprintf(", %lu", tcp->u_arg[2]);
   2606 	free(buf);
   2607 	return 0;
   2608 }
   2609 #endif
   2610 
   2611 #ifdef FREEBSD
   2612 int
   2613 sys_getdirentries(struct tcb *tcp)
   2614 {
   2615 	int i, len, dents = 0;
   2616 	long basep;
   2617 	char *buf;
   2618 
   2619 	if (entering(tcp)) {
   2620 		printfd(tcp, tcp->u_arg[0]);
   2621 		tprintf(", ");
   2622 		return 0;
   2623 	}
   2624 	if (syserror(tcp) || !verbose(tcp)) {
   2625 		tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
   2626 		return 0;
   2627 	}
   2628 	len = tcp->u_rval;
   2629 	if ((buf = malloc(len)) == NULL) {
   2630 		tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
   2631 		fprintf(stderr, "out of memory\n");
   2632 		return 0;
   2633 	}
   2634 	if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
   2635 		tprintf("%#lx, %lu, %#lx", tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
   2636 		free(buf);
   2637 		return 0;
   2638 	}
   2639 	if (!abbrev(tcp))
   2640 		tprintf("{");
   2641 	for (i = 0; i < len;) {
   2642 		struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
   2643 		if (!abbrev(tcp)) {
   2644 			tprintf("%s{d_fileno=%u, d_reclen=%u, d_type=",
   2645 				i ? " " : "", d->d_fileno, d->d_reclen);
   2646 			printxval(direnttypes, d->d_type, "DT_???");
   2647 			tprintf(", d_namlen=%u, d_name=\"%.*s\"}",
   2648 				d->d_namlen, d->d_namlen, d->d_name);
   2649 		}
   2650 		if (!d->d_reclen) {
   2651 			tprintf("/* d_reclen == 0, problem here */");
   2652 			break;
   2653 		}
   2654 		i += d->d_reclen;
   2655 		dents++;
   2656 	}
   2657 	if (!abbrev(tcp))
   2658 		tprintf("}");
   2659 	else
   2660 		tprintf("/* %u entries */", dents);
   2661 	free(buf);
   2662 	tprintf(", %lu", tcp->u_arg[2]);
   2663 	if (umove(tcp, tcp->u_arg[3], &basep) < 0)
   2664 		tprintf(", %#lx", tcp->u_arg[3]);
   2665 	else
   2666 		tprintf(", [%lu]", basep);
   2667 	return 0;
   2668 }
   2669 #endif
   2670 
   2671 #ifdef LINUX
   2672 int
   2673 sys_getcwd(struct tcb *tcp)
   2674 {
   2675 	if (exiting(tcp)) {
   2676 		if (syserror(tcp))
   2677 			tprintf("%#lx", tcp->u_arg[0]);
   2678 		else
   2679 			printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
   2680 		tprintf(", %lu", tcp->u_arg[1]);
   2681 	}
   2682 	return 0;
   2683 }
   2684 #endif /* LINUX */
   2685 
   2686 #ifdef FREEBSD
   2687 int
   2688 sys___getcwd(struct tcb *tcp)
   2689 {
   2690 	if (exiting(tcp)) {
   2691 		if (syserror(tcp))
   2692 			tprintf("%#lx", tcp->u_arg[0]);
   2693 		else
   2694 			printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
   2695 		tprintf(", %lu", tcp->u_arg[1]);
   2696 	}
   2697 	return 0;
   2698 }
   2699 #endif
   2700 
   2701 #ifdef HAVE_SYS_ASYNCH_H
   2702 
   2703 int
   2704 sys_aioread(struct tcb *tcp)
   2705 {
   2706 	struct aio_result_t res;
   2707 
   2708 	if (entering(tcp)) {
   2709 		tprintf("%lu, ", tcp->u_arg[0]);
   2710 	} else {
   2711 		if (syserror(tcp))
   2712 			tprintf("%#lx", tcp->u_arg[1]);
   2713 		else
   2714 			printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
   2715 		tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
   2716 		printxval(whence, tcp->u_arg[4], "L_???");
   2717 		if (syserror(tcp) || tcp->u_arg[5] == 0
   2718 		    || umove(tcp, tcp->u_arg[5], &res) < 0)
   2719 			tprintf(", %#lx", tcp->u_arg[5]);
   2720 		else
   2721 			tprintf(", {aio_return %d aio_errno %d}",
   2722 				res.aio_return, res.aio_errno);
   2723 	}
   2724 	return 0;
   2725 }
   2726 
   2727 int
   2728 sys_aiowrite(struct tcb *tcp)
   2729 {
   2730 	struct aio_result_t res;
   2731 
   2732 	if (entering(tcp)) {
   2733 		tprintf("%lu, ", tcp->u_arg[0]);
   2734 		printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
   2735 		tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
   2736 		printxval(whence, tcp->u_arg[4], "L_???");
   2737 	}
   2738 	else {
   2739 		if (tcp->u_arg[5] == 0)
   2740 			tprintf(", NULL");
   2741 		else if (syserror(tcp)
   2742 		    || umove(tcp, tcp->u_arg[5], &res) < 0)
   2743 			tprintf(", %#lx", tcp->u_arg[5]);
   2744 		else
   2745 			tprintf(", {aio_return %d aio_errno %d}",
   2746 				res.aio_return, res.aio_errno);
   2747 	}
   2748 	return 0;
   2749 }
   2750 
   2751 int
   2752 sys_aiowait(struct tcb *tcp)
   2753 {
   2754 	if (entering(tcp))
   2755 		printtv(tcp, tcp->u_arg[0]);
   2756 	return 0;
   2757 }
   2758 
   2759 int
   2760 sys_aiocancel(struct tcb *tcp)
   2761 {
   2762 	struct aio_result_t res;
   2763 
   2764 	if (exiting(tcp)) {
   2765 		if (tcp->u_arg[0] == 0)
   2766 			tprintf("NULL");
   2767 		else if (syserror(tcp)
   2768 		    || umove(tcp, tcp->u_arg[0], &res) < 0)
   2769 			tprintf("%#lx", tcp->u_arg[0]);
   2770 		else
   2771 			tprintf("{aio_return %d aio_errno %d}",
   2772 				res.aio_return, res.aio_errno);
   2773 	}
   2774 	return 0;
   2775 }
   2776 
   2777 #endif /* HAVE_SYS_ASYNCH_H */
   2778 
   2779 static const struct xlat xattrflags[] = {
   2780 #ifdef XATTR_CREATE
   2781 	{ XATTR_CREATE,	 "XATTR_CREATE" },
   2782 	{ XATTR_REPLACE, "XATTR_REPLACE" },
   2783 #endif
   2784 	{ 0,		 NULL }
   2785 };
   2786 
   2787 static void
   2788 print_xattr_val(struct tcb *tcp, int failed,
   2789 		unsigned long arg,
   2790 		unsigned long insize,
   2791 		unsigned long size)
   2792 {
   2793 	if (!failed) {
   2794 		unsigned long capacity = 4 * size + 1;
   2795 		unsigned char *buf = (capacity < size) ? NULL : malloc(capacity);
   2796 		if (buf == NULL || /* probably a bogus size argument */
   2797 			umoven(tcp, arg, size, (char *) &buf[3 * size]) < 0) {
   2798 			failed = 1;
   2799 		}
   2800 		else {
   2801 			unsigned char *out = buf;
   2802 			unsigned char *in = &buf[3 * size];
   2803 			size_t i;
   2804 			for (i = 0; i < size; ++i) {
   2805 				if (isprint(in[i]))
   2806 					*out++ = in[i];
   2807 				else {
   2808 #define tohex(n) "0123456789abcdef"[n]
   2809 					*out++ = '\\';
   2810 					*out++ = 'x';
   2811 					*out++ = tohex(in[i] / 16);
   2812 					*out++ = tohex(in[i] % 16);
   2813 				}
   2814 			}
   2815 			/* Don't print terminating NUL if there is one.  */
   2816 			if (i > 0 && in[i - 1] == '\0')
   2817 				out -= 4;
   2818 			*out = '\0';
   2819 			tprintf(", \"%s\", %ld", buf, insize);
   2820 		}
   2821 		free(buf);
   2822 	}
   2823 	if (failed)
   2824 		tprintf(", 0x%lx, %ld", arg, insize);
   2825 }
   2826 
   2827 int
   2828 sys_setxattr(struct tcb *tcp)
   2829 {
   2830 	if (entering(tcp)) {
   2831 		printpath(tcp, tcp->u_arg[0]);
   2832 		tprintf(", ");
   2833 		printstr(tcp, tcp->u_arg[1], -1);
   2834 		print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
   2835 		tprintf(", ");
   2836 		printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
   2837 	}
   2838 	return 0;
   2839 }
   2840 
   2841 int
   2842 sys_fsetxattr(struct tcb *tcp)
   2843 {
   2844 	if (entering(tcp)) {
   2845 		printfd(tcp, tcp->u_arg[0]);
   2846 		tprintf(", ");
   2847 		printstr(tcp, tcp->u_arg[1], -1);
   2848 		print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
   2849 		tprintf(", ");
   2850 		printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
   2851 	}
   2852 	return 0;
   2853 }
   2854 
   2855 int
   2856 sys_getxattr(struct tcb *tcp)
   2857 {
   2858 	if (entering(tcp)) {
   2859 		printpath(tcp, tcp->u_arg[0]);
   2860 		tprintf(", ");
   2861 		printstr(tcp, tcp->u_arg[1], -1);
   2862 	} else {
   2863 		print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
   2864 				tcp->u_rval);
   2865 	}
   2866 	return 0;
   2867 }
   2868 
   2869 int
   2870 sys_fgetxattr(struct tcb *tcp)
   2871 {
   2872 	if (entering(tcp)) {
   2873 		printfd(tcp, tcp->u_arg[0]);
   2874 		tprintf(", ");
   2875 		printstr(tcp, tcp->u_arg[1], -1);
   2876 	} else {
   2877 		print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3],
   2878 				tcp->u_rval);
   2879 	}
   2880 	return 0;
   2881 }
   2882 
   2883 int
   2884 sys_listxattr(struct tcb *tcp)
   2885 {
   2886 	if (entering(tcp)) {
   2887 		printpath(tcp, tcp->u_arg[0]);
   2888 	} else {
   2889 		/* XXX Print value in format */
   2890 		tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
   2891 	}
   2892 	return 0;
   2893 }
   2894 
   2895 int
   2896 sys_flistxattr(struct tcb *tcp)
   2897 {
   2898 	if (entering(tcp)) {
   2899 		printfd(tcp, tcp->u_arg[0]);
   2900 	} else {
   2901 		/* XXX Print value in format */
   2902 		tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
   2903 	}
   2904 	return 0;
   2905 }
   2906 
   2907 int
   2908 sys_removexattr(struct tcb *tcp)
   2909 {
   2910 	if (entering(tcp)) {
   2911 		printpath(tcp, tcp->u_arg[0]);
   2912 		tprintf(", ");
   2913 		printstr(tcp, tcp->u_arg[1], -1);
   2914 	}
   2915 	return 0;
   2916 }
   2917 
   2918 int
   2919 sys_fremovexattr(struct tcb *tcp)
   2920 {
   2921 	if (entering(tcp)) {
   2922 		printfd(tcp, tcp->u_arg[0]);
   2923 		tprintf(", ");
   2924 		printstr(tcp, tcp->u_arg[1], -1);
   2925 	}
   2926 	return 0;
   2927 }
   2928 
   2929 
   2930 static const struct xlat advise[] = {
   2931   { POSIX_FADV_NORMAL,		"POSIX_FADV_NORMAL"	},
   2932   { POSIX_FADV_RANDOM,		"POSIX_FADV_RANDOM"	},
   2933   { POSIX_FADV_SEQUENTIAL,	"POSIX_FADV_SEQUENTIAL"	},
   2934   { POSIX_FADV_WILLNEED,	"POSIX_FADV_WILLNEED"	},
   2935   { POSIX_FADV_DONTNEED,	"POSIX_FADV_DONTNEED"	},
   2936   { POSIX_FADV_NOREUSE,		"POSIX_FADV_NOREUSE"	},
   2937   { 0,				NULL			}
   2938 };
   2939 
   2940 
   2941 #ifdef LINUX
   2942 int
   2943 sys_fadvise64(struct tcb *tcp)
   2944 {
   2945 	if (entering(tcp)) {
   2946 		int argn;
   2947 		printfd(tcp, tcp->u_arg[0]);
   2948 		tprintf(", ");
   2949 		argn = printllval(tcp, "%lld", 1);
   2950 		tprintf(", %ld, ", tcp->u_arg[argn++]);
   2951 		printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
   2952 	}
   2953 	return 0;
   2954 }
   2955 #endif
   2956 
   2957 
   2958 int
   2959 sys_fadvise64_64(struct tcb *tcp)
   2960 {
   2961 	if (entering(tcp)) {
   2962 		int argn;
   2963 		printfd(tcp, tcp->u_arg[0]);
   2964 		tprintf(", ");
   2965 #if defined ARM || defined POWERPC
   2966 		argn = printllval(tcp, "%lld, ", 2);
   2967 #else
   2968 		argn = printllval(tcp, "%lld, ", 1);
   2969 #endif
   2970 		argn = printllval(tcp, "%lld, ", argn);
   2971 #if defined ARM || defined POWERPC
   2972 		printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
   2973 #else
   2974 		printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
   2975 #endif
   2976 	}
   2977 	return 0;
   2978 }
   2979 
   2980 #ifdef LINUX
   2981 static const struct xlat inotify_modes[] = {
   2982 	{ 0x00000001,	"IN_ACCESS"	},
   2983 	{ 0x00000002,	"IN_MODIFY"	},
   2984 	{ 0x00000004,	"IN_ATTRIB"	},
   2985 	{ 0x00000008,	"IN_CLOSE_WRITE"},
   2986 	{ 0x00000010,	"IN_CLOSE_NOWRITE"},
   2987 	{ 0x00000020,	"IN_OPEN"	},
   2988 	{ 0x00000040,	"IN_MOVED_FROM"	},
   2989 	{ 0x00000080,	"IN_MOVED_TO"	},
   2990 	{ 0x00000100,	"IN_CREATE"	},
   2991 	{ 0x00000200,	"IN_DELETE"	},
   2992 	{ 0x00000400,	"IN_DELETE_SELF"},
   2993 	{ 0x00000800,	"IN_MOVE_SELF"	},
   2994 	{ 0x00002000,	"IN_UNMOUNT"	},
   2995 	{ 0x00004000,	"IN_Q_OVERFLOW"	},
   2996 	{ 0x00008000,	"IN_IGNORED"	},
   2997 	{ 0x01000000,	"IN_ONLYDIR"	},
   2998 	{ 0x02000000,	"IN_DONT_FOLLOW"},
   2999 	{ 0x20000000,	"IN_MASK_ADD"	},
   3000 	{ 0x40000000,	"IN_ISDIR"	},
   3001 	{ 0x80000000,	"IN_ONESHOT"	},
   3002 	{ 0,		NULL		}
   3003 };
   3004 
   3005 static const struct xlat inotify_init_flags[] = {
   3006 	{ 0x00000800,	"IN_NONBLOCK"	},
   3007 	{ 0x00080000,	"IN_CLOEXEC" 	},
   3008 	{ 0,		NULL 		}
   3009 };
   3010 
   3011 int
   3012 sys_inotify_add_watch(struct tcb *tcp)
   3013 {
   3014 	if (entering(tcp)) {
   3015 		printfd(tcp, tcp->u_arg[0]);
   3016 		tprintf(", ");
   3017 		printpath(tcp, tcp->u_arg[1]);
   3018 		tprintf(", ");
   3019 		printflags(inotify_modes, tcp->u_arg[2], "IN_???");
   3020 	}
   3021 	return 0;
   3022 }
   3023 
   3024 int
   3025 sys_inotify_rm_watch(struct tcb *tcp)
   3026 {
   3027 	if (entering(tcp)) {
   3028 		printfd(tcp, tcp->u_arg[0]);
   3029 		tprintf(", %ld", tcp->u_arg[1]);
   3030 	}
   3031 	return 0;
   3032 }
   3033 
   3034 int
   3035 sys_inotify_init1(struct tcb *tcp)
   3036 {
   3037 	if (entering(tcp))
   3038 		printflags(inotify_init_flags, tcp->u_arg[0], "IN_???");
   3039 	return 0;
   3040 }
   3041 
   3042 int
   3043 sys_fallocate(struct tcb *tcp)
   3044 {
   3045 	if (entering(tcp)) {
   3046 		int argn;
   3047 		printfd(tcp, tcp->u_arg[0]);		/* fd */
   3048 		tprintf(", ");
   3049 		tprintf("%#lo, ", tcp->u_arg[1]);	/* mode */
   3050 		argn = printllval(tcp, "%llu, ", 2);	/* offset */
   3051 		printllval(tcp, "%llu", argn);		/* len */
   3052 	}
   3053 	return 0;
   3054 }
   3055 #endif
   3056