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 31 #include "defs.h" 32 #include <dirent.h> 33 #include <sys/swap.h> 34 35 #if defined(SPARC) || defined(SPARC64) 36 struct stat { 37 unsigned short st_dev; 38 unsigned int st_ino; 39 unsigned short st_mode; 40 short st_nlink; 41 unsigned short st_uid; 42 unsigned short st_gid; 43 unsigned short st_rdev; 44 unsigned int st_size; 45 int st_atime; 46 unsigned int __unused1; 47 int st_mtime; 48 unsigned int __unused2; 49 int st_ctime; 50 unsigned int __unused3; 51 int st_blksize; 52 int st_blocks; 53 unsigned int __unused4[2]; 54 }; 55 # if defined(SPARC64) 56 struct stat_sparc64 { 57 unsigned int st_dev; 58 unsigned long st_ino; 59 unsigned int st_mode; 60 unsigned int st_nlink; 61 unsigned int st_uid; 62 unsigned int st_gid; 63 unsigned int st_rdev; 64 long st_size; 65 long st_atime; 66 long st_mtime; 67 long st_ctime; 68 long st_blksize; 69 long st_blocks; 70 unsigned long __unused4[2]; 71 }; 72 # endif /* SPARC64 */ 73 # define stat kernel_stat 74 # include <asm/stat.h> 75 # undef stat 76 #elif defined(X32) 77 struct stat { 78 unsigned long long st_dev; 79 unsigned long long st_ino; 80 unsigned long long st_nlink; 81 82 unsigned int st_mode; 83 unsigned int st_uid; 84 unsigned int st_gid; 85 unsigned int __pad0; 86 unsigned long long st_rdev; 87 long long st_size; 88 long long st_blksize; 89 long long st_blocks; 90 91 unsigned long long st_atime; 92 unsigned long long st_atime_nsec; 93 unsigned long long st_mtime; 94 unsigned long long st_mtime_nsec; 95 unsigned long long st_ctime; 96 unsigned long long st_ctime_nsec; 97 long long __unused[3]; 98 }; 99 100 struct stat64 { 101 unsigned long long st_dev; 102 unsigned char __pad0[4]; 103 unsigned long __st_ino; 104 unsigned int st_mode; 105 unsigned int st_nlink; 106 unsigned long st_uid; 107 unsigned long st_gid; 108 unsigned long long st_rdev; 109 unsigned char __pad3[4]; 110 long long st_size; 111 unsigned long st_blksize; 112 unsigned long long st_blocks; 113 unsigned long st_atime; 114 unsigned long st_atime_nsec; 115 unsigned long st_mtime; 116 unsigned int st_mtime_nsec; 117 unsigned long st_ctime; 118 unsigned long st_ctime_nsec; 119 unsigned long long st_ino; 120 } __attribute__((packed)); 121 # define HAVE_STAT64 1 122 123 struct __old_kernel_stat { 124 unsigned short st_dev; 125 unsigned short st_ino; 126 unsigned short st_mode; 127 unsigned short st_nlink; 128 unsigned short st_uid; 129 unsigned short st_gid; 130 unsigned short st_rdev; 131 unsigned int st_size; 132 unsigned int st_atime; 133 unsigned int st_mtime; 134 unsigned int st_ctime; 135 }; 136 #else 137 # undef dev_t 138 # undef ino_t 139 # undef mode_t 140 # undef nlink_t 141 # undef uid_t 142 # undef gid_t 143 # undef off_t 144 # undef loff_t 145 # define dev_t __kernel_dev_t 146 # define ino_t __kernel_ino_t 147 # define mode_t __kernel_mode_t 148 # define nlink_t __kernel_nlink_t 149 # define uid_t __kernel_uid_t 150 # define gid_t __kernel_gid_t 151 # define off_t __kernel_off_t 152 # define loff_t __kernel_loff_t 153 154 # include <asm/stat.h> 155 156 # undef dev_t 157 # undef ino_t 158 # undef mode_t 159 # undef nlink_t 160 # undef uid_t 161 # undef gid_t 162 # undef off_t 163 # undef loff_t 164 # define dev_t dev_t 165 # define ino_t ino_t 166 # define mode_t mode_t 167 # define nlink_t nlink_t 168 # define uid_t uid_t 169 # define gid_t gid_t 170 # define off_t off_t 171 # define loff_t loff_t 172 #endif 173 174 #define stat libc_stat 175 #define stat64 libc_stat64 176 #include <sys/stat.h> 177 #undef stat 178 #undef stat64 179 /* These might be macros. */ 180 #undef st_atime 181 #undef st_mtime 182 #undef st_ctime 183 184 #include <fcntl.h> 185 #ifdef HAVE_SYS_VFS_H 186 # include <sys/vfs.h> 187 #endif 188 #ifdef HAVE_LINUX_XATTR_H 189 # include <linux/xattr.h> 190 #else 191 # define XATTR_CREATE 1 192 # define XATTR_REPLACE 2 193 #endif 194 195 #ifdef MAJOR_IN_SYSMACROS 196 # include <sys/sysmacros.h> 197 #endif 198 199 #ifdef MAJOR_IN_MKDEV 200 # include <sys/mkdev.h> 201 #endif 202 203 #ifdef HAVE_SYS_ASYNCH_H 204 # include <sys/asynch.h> 205 #endif 206 207 struct kernel_dirent { 208 unsigned long d_ino; 209 unsigned long d_off; 210 unsigned short d_reclen; 211 char d_name[1]; 212 }; 213 214 #ifdef O_LARGEFILE 215 # if O_LARGEFILE == 0 /* biarch platforms in 64-bit mode */ 216 # undef O_LARGEFILE 217 # ifdef SPARC64 218 # define O_LARGEFILE 0x40000 219 # elif defined X86_64 || defined S390X 220 # define O_LARGEFILE 0100000 221 # endif 222 # endif 223 #endif 224 225 #include "xlat/open_access_modes.h" 226 #include "xlat/open_mode_flags.h" 227 228 #ifndef AT_FDCWD 229 # define AT_FDCWD -100 230 #endif 231 232 /* The fd is an "int", so when decoding x86 on x86_64, we need to force sign 233 * extension to get the right value. We do this by declaring fd as int here. 234 */ 235 void 236 print_dirfd(struct tcb *tcp, int fd) 237 { 238 if (fd == AT_FDCWD) 239 tprints("AT_FDCWD, "); 240 else { 241 printfd(tcp, fd); 242 tprints(", "); 243 } 244 } 245 246 /* 247 * low bits of the open(2) flags define access mode, 248 * other bits are real flags. 249 */ 250 const char * 251 sprint_open_modes(mode_t flags) 252 { 253 static char outstr[(1 + ARRAY_SIZE(open_mode_flags)) * sizeof("O_LARGEFILE")]; 254 char *p; 255 char sep; 256 const char *str; 257 const struct xlat *x; 258 259 sep = ' '; 260 p = stpcpy(outstr, "flags"); 261 str = xlookup(open_access_modes, flags & 3); 262 if (str) { 263 *p++ = sep; 264 p = stpcpy(p, str); 265 flags &= ~3; 266 if (!flags) 267 return outstr; 268 sep = '|'; 269 } 270 271 for (x = open_mode_flags; x->str; x++) { 272 if ((flags & x->val) == x->val) { 273 *p++ = sep; 274 p = stpcpy(p, x->str); 275 flags &= ~x->val; 276 if (!flags) 277 return outstr; 278 sep = '|'; 279 } 280 } 281 /* flags is still nonzero */ 282 *p++ = sep; 283 sprintf(p, "%#x", flags); 284 return outstr; 285 } 286 287 void 288 tprint_open_modes(mode_t flags) 289 { 290 tprints(sprint_open_modes(flags) + sizeof("flags")); 291 } 292 293 static int 294 decode_open(struct tcb *tcp, int offset) 295 { 296 if (entering(tcp)) { 297 printpath(tcp, tcp->u_arg[offset]); 298 tprints(", "); 299 /* flags */ 300 tprint_open_modes(tcp->u_arg[offset + 1]); 301 if (tcp->u_arg[offset + 1] & O_CREAT) { 302 /* mode */ 303 tprintf(", %#lo", tcp->u_arg[offset + 2]); 304 } 305 } 306 return RVAL_FD; 307 } 308 309 int 310 sys_open(struct tcb *tcp) 311 { 312 return decode_open(tcp, 0); 313 } 314 315 int 316 sys_openat(struct tcb *tcp) 317 { 318 if (entering(tcp)) 319 print_dirfd(tcp, tcp->u_arg[0]); 320 return decode_open(tcp, 1); 321 } 322 323 #if defined(SPARC) || defined(SPARC64) 324 #include "xlat/openmodessol.h" 325 326 int 327 solaris_open(struct tcb *tcp) 328 { 329 if (entering(tcp)) { 330 printpath(tcp, tcp->u_arg[0]); 331 tprints(", "); 332 /* flags */ 333 printflags(openmodessol, tcp->u_arg[1] + 1, "O_???"); 334 if (tcp->u_arg[1] & 0x100) { 335 /* mode */ 336 tprintf(", %#lo", tcp->u_arg[2]); 337 } 338 } 339 return 0; 340 } 341 342 #endif 343 344 int 345 sys_creat(struct tcb *tcp) 346 { 347 if (entering(tcp)) { 348 printpath(tcp, tcp->u_arg[0]); 349 tprintf(", %#lo", tcp->u_arg[1]); 350 } 351 return RVAL_FD; 352 } 353 354 #include "xlat/access_flags.h" 355 356 static int 357 decode_access(struct tcb *tcp, int offset) 358 { 359 if (entering(tcp)) { 360 printpath(tcp, tcp->u_arg[offset]); 361 tprints(", "); 362 printflags(access_flags, tcp->u_arg[offset + 1], "?_OK"); 363 } 364 return 0; 365 } 366 367 int 368 sys_access(struct tcb *tcp) 369 { 370 return decode_access(tcp, 0); 371 } 372 373 int 374 sys_faccessat(struct tcb *tcp) 375 { 376 if (entering(tcp)) 377 print_dirfd(tcp, tcp->u_arg[0]); 378 return decode_access(tcp, 1); 379 } 380 381 int 382 sys_umask(struct tcb *tcp) 383 { 384 if (entering(tcp)) { 385 tprintf("%#lo", tcp->u_arg[0]); 386 } 387 return RVAL_OCTAL; 388 } 389 390 #include "xlat/whence_codes.h" 391 392 /* Linux kernel has exactly one version of lseek: 393 * fs/read_write.c::SYSCALL_DEFINE3(lseek, unsigned, fd, off_t, offset, unsigned, origin) 394 * In kernel, off_t is always the same as (kernel's) long 395 * (see include/uapi/asm-generic/posix_types.h), 396 * which means that on x32 we need to use tcp->ext_arg[N] to get offset argument. 397 * Use test/x32_lseek.c to test lseek decoding. 398 */ 399 #if defined(LINUX_MIPSN32) || defined(X32) 400 int 401 sys_lseek(struct tcb *tcp) 402 { 403 long long offset; 404 int whence; 405 406 if (entering(tcp)) { 407 printfd(tcp, tcp->u_arg[0]); 408 offset = tcp->ext_arg[1]; 409 whence = tcp->u_arg[2]; 410 if (whence == SEEK_SET) 411 tprintf(", %llu, ", offset); 412 else 413 tprintf(", %lld, ", offset); 414 printxval(whence_codes, whence, "SEEK_???"); 415 } 416 return RVAL_LUDECIMAL; 417 } 418 #else 419 int 420 sys_lseek(struct tcb *tcp) 421 { 422 long offset; 423 int whence; 424 425 if (entering(tcp)) { 426 printfd(tcp, tcp->u_arg[0]); 427 offset = tcp->u_arg[1]; 428 whence = tcp->u_arg[2]; 429 if (whence == SEEK_SET) 430 tprintf(", %lu, ", offset); 431 else 432 tprintf(", %ld, ", offset); 433 printxval(whence_codes, whence, "SEEK_???"); 434 } 435 return RVAL_UDECIMAL; 436 } 437 #endif 438 439 /* llseek syscall takes explicitly two ulong arguments hi, lo, 440 * rather than one 64-bit argument for which LONG_LONG works 441 * appropriate for the native byte order. 442 * 443 * See kernel's fs/read_write.c::SYSCALL_DEFINE5(llseek, ...) 444 * 445 * hi,lo are "unsigned longs" and combined exactly this way in kernel: 446 * ((loff_t) hi << 32) | lo 447 * Note that for architectures with kernel's long wider than userspace long 448 * (such as x32), combining code will use *kernel's*, i.e. *wide* longs 449 * for hi and lo. We would need to use tcp->ext_arg[N] on x32... 450 * ...however, x32 (and x86_64) does not _have_ llseek syscall as such. 451 */ 452 int 453 sys_llseek(struct tcb *tcp) 454 { 455 if (entering(tcp)) { 456 printfd(tcp, tcp->u_arg[0]); 457 if (tcp->u_arg[4] == SEEK_SET) 458 tprintf(", %llu, ", 459 ((long long) tcp->u_arg[1]) << 32 | 460 (unsigned long long) (unsigned) tcp->u_arg[2]); 461 else 462 tprintf(", %lld, ", 463 ((long long) tcp->u_arg[1]) << 32 | 464 (unsigned long long) (unsigned) tcp->u_arg[2]); 465 } 466 else { 467 long long off; 468 if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0) 469 tprintf("%#lx, ", tcp->u_arg[3]); 470 else 471 tprintf("[%llu], ", off); 472 printxval(whence_codes, tcp->u_arg[4], "SEEK_???"); 473 } 474 return 0; 475 } 476 477 int 478 sys_readahead(struct tcb *tcp) 479 { 480 if (entering(tcp)) { 481 int argn; 482 printfd(tcp, tcp->u_arg[0]); 483 argn = printllval_aligned(tcp, ", %lld", 1); 484 tprintf(", %ld", tcp->u_arg[argn]); 485 } 486 return 0; 487 } 488 489 int 490 sys_truncate(struct tcb *tcp) 491 { 492 if (entering(tcp)) { 493 printpath(tcp, tcp->u_arg[0]); 494 tprintf(", %lu", tcp->u_arg[1]); 495 } 496 return 0; 497 } 498 499 int 500 sys_truncate64(struct tcb *tcp) 501 { 502 if (entering(tcp)) { 503 printpath(tcp, tcp->u_arg[0]); 504 printllval_aligned(tcp, ", %llu", 1); 505 } 506 return 0; 507 } 508 509 int 510 sys_ftruncate(struct tcb *tcp) 511 { 512 if (entering(tcp)) { 513 printfd(tcp, tcp->u_arg[0]); 514 tprintf(", %lu", tcp->u_arg[1]); 515 } 516 return 0; 517 } 518 519 int 520 sys_ftruncate64(struct tcb *tcp) 521 { 522 if (entering(tcp)) { 523 printfd(tcp, tcp->u_arg[0]); 524 printllval_aligned(tcp, ", %llu", 1); 525 } 526 return 0; 527 } 528 529 /* several stats */ 530 531 #include "xlat/modetypes.h" 532 533 static const char * 534 sprintmode(int mode) 535 { 536 static char buf[sizeof("S_IFSOCK|S_ISUID|S_ISGID|S_ISVTX|%o") 537 + sizeof(int)*3 538 + /*paranoia:*/ 8]; 539 const char *s; 540 541 if ((mode & S_IFMT) == 0) 542 s = ""; 543 else if ((s = xlookup(modetypes, mode & S_IFMT)) == NULL) { 544 sprintf(buf, "%#o", mode); 545 return buf; 546 } 547 s = buf + sprintf(buf, "%s%s%s%s", s, 548 (mode & S_ISUID) ? "|S_ISUID" : "", 549 (mode & S_ISGID) ? "|S_ISGID" : "", 550 (mode & S_ISVTX) ? "|S_ISVTX" : ""); 551 mode &= ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX); 552 if (mode) 553 sprintf((char*)s, "|%#o", mode); 554 s = (*buf == '|') ? buf + 1 : buf; 555 return *s ? s : "0"; 556 } 557 558 static char * 559 sprinttime(time_t t) 560 { 561 struct tm *tmp; 562 static char buf[sizeof("yyyy/mm/dd-hh:mm:ss")]; 563 564 if (t == 0) { 565 strcpy(buf, "0"); 566 return buf; 567 } 568 tmp = localtime(&t); 569 if (tmp) 570 snprintf(buf, sizeof buf, "%02d/%02d/%02d-%02d:%02d:%02d", 571 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, 572 tmp->tm_hour, tmp->tm_min, tmp->tm_sec); 573 else 574 snprintf(buf, sizeof buf, "%lu", (unsigned long) t); 575 576 return buf; 577 } 578 579 #if defined(SPARC) || defined(SPARC64) 580 typedef struct { 581 int tv_sec; 582 int tv_nsec; 583 } timestruct_t; 584 585 struct solstat { 586 unsigned st_dev; 587 int st_pad1[3]; /* network id */ 588 unsigned st_ino; 589 unsigned st_mode; 590 unsigned st_nlink; 591 unsigned st_uid; 592 unsigned st_gid; 593 unsigned st_rdev; 594 int st_pad2[2]; 595 int st_size; 596 int st_pad3; /* st_size, off_t expansion */ 597 timestruct_t st_atime; 598 timestruct_t st_mtime; 599 timestruct_t st_ctime; 600 int st_blksize; 601 int st_blocks; 602 char st_fstype[16]; 603 int st_pad4[8]; /* expansion area */ 604 }; 605 606 static void 607 printstatsol(struct tcb *tcp, long addr) 608 { 609 struct solstat statbuf; 610 611 if (umove(tcp, addr, &statbuf) < 0) { 612 tprints("{...}"); 613 return; 614 } 615 if (!abbrev(tcp)) { 616 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ", 617 (unsigned long) ((statbuf.st_dev >> 18) & 0x3fff), 618 (unsigned long) (statbuf.st_dev & 0x3ffff), 619 (unsigned long) statbuf.st_ino, 620 sprintmode(statbuf.st_mode)); 621 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ", 622 (unsigned long) statbuf.st_nlink, 623 (unsigned long) statbuf.st_uid, 624 (unsigned long) statbuf.st_gid); 625 tprintf("st_blksize=%lu, ", (unsigned long) statbuf.st_blksize); 626 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks); 627 } 628 else 629 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode)); 630 switch (statbuf.st_mode & S_IFMT) { 631 case S_IFCHR: case S_IFBLK: 632 tprintf("st_rdev=makedev(%lu, %lu), ", 633 (unsigned long) ((statbuf.st_rdev >> 18) & 0x3fff), 634 (unsigned long) (statbuf.st_rdev & 0x3ffff)); 635 break; 636 default: 637 tprintf("st_size=%u, ", statbuf.st_size); 638 break; 639 } 640 if (!abbrev(tcp)) { 641 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime.tv_sec)); 642 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime.tv_sec)); 643 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime.tv_sec)); 644 } 645 else 646 tprints("...}"); 647 } 648 649 # if defined(SPARC64) 650 static void 651 printstat_sparc64(struct tcb *tcp, long addr) 652 { 653 struct stat_sparc64 statbuf; 654 655 if (umove(tcp, addr, &statbuf) < 0) { 656 tprints("{...}"); 657 return; 658 } 659 660 if (!abbrev(tcp)) { 661 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ", 662 (unsigned long) major(statbuf.st_dev), 663 (unsigned long) minor(statbuf.st_dev), 664 (unsigned long) statbuf.st_ino, 665 sprintmode(statbuf.st_mode)); 666 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ", 667 (unsigned long) statbuf.st_nlink, 668 (unsigned long) statbuf.st_uid, 669 (unsigned long) statbuf.st_gid); 670 tprintf("st_blksize=%lu, ", 671 (unsigned long) statbuf.st_blksize); 672 tprintf("st_blocks=%lu, ", 673 (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) major(statbuf.st_rdev), 681 (unsigned long) minor(statbuf.st_rdev)); 682 break; 683 default: 684 tprintf("st_size=%lu, ", 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 tprints("...}"); 694 } 695 # endif /* SPARC64 */ 696 #endif /* SPARC[64] */ 697 698 #if defined POWERPC64 699 struct stat_powerpc32 { 700 unsigned int st_dev; 701 unsigned int st_ino; 702 unsigned int st_mode; 703 unsigned short st_nlink; 704 unsigned int st_uid; 705 unsigned int st_gid; 706 unsigned int st_rdev; 707 unsigned int st_size; 708 unsigned int st_blksize; 709 unsigned int st_blocks; 710 unsigned int st_atime; 711 unsigned int st_atime_nsec; 712 unsigned int st_mtime; 713 unsigned int st_mtime_nsec; 714 unsigned int st_ctime; 715 unsigned int st_ctime_nsec; 716 unsigned int __unused4; 717 unsigned int __unused5; 718 }; 719 720 static void 721 printstat_powerpc32(struct tcb *tcp, long addr) 722 { 723 struct stat_powerpc32 statbuf; 724 725 if (umove(tcp, addr, &statbuf) < 0) { 726 tprints("{...}"); 727 return; 728 } 729 730 if (!abbrev(tcp)) { 731 tprintf("{st_dev=makedev(%u, %u), st_ino=%u, st_mode=%s, ", 732 major(statbuf.st_dev), minor(statbuf.st_dev), 733 statbuf.st_ino, 734 sprintmode(statbuf.st_mode)); 735 tprintf("st_nlink=%u, st_uid=%u, st_gid=%u, ", 736 statbuf.st_nlink, statbuf.st_uid, statbuf.st_gid); 737 tprintf("st_blksize=%u, ", statbuf.st_blksize); 738 tprintf("st_blocks=%u, ", statbuf.st_blocks); 739 } 740 else 741 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode)); 742 switch (statbuf.st_mode & S_IFMT) { 743 case S_IFCHR: case S_IFBLK: 744 tprintf("st_rdev=makedev(%lu, %lu), ", 745 (unsigned long) major(statbuf.st_rdev), 746 (unsigned long) minor(statbuf.st_rdev)); 747 break; 748 default: 749 tprintf("st_size=%u, ", statbuf.st_size); 750 break; 751 } 752 if (!abbrev(tcp)) { 753 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime)); 754 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime)); 755 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime)); 756 } 757 else 758 tprints("...}"); 759 } 760 #endif /* POWERPC64 */ 761 762 #include "xlat/fileflags.h" 763 764 static void 765 realprintstat(struct tcb *tcp, struct stat *statbuf) 766 { 767 if (!abbrev(tcp)) { 768 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ", 769 (unsigned long) major(statbuf->st_dev), 770 (unsigned long) minor(statbuf->st_dev), 771 (unsigned long) statbuf->st_ino, 772 sprintmode(statbuf->st_mode)); 773 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ", 774 (unsigned long) statbuf->st_nlink, 775 (unsigned long) statbuf->st_uid, 776 (unsigned long) statbuf->st_gid); 777 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 778 tprintf("st_blksize=%lu, ", (unsigned long) statbuf->st_blksize); 779 #endif 780 #ifdef HAVE_STRUCT_STAT_ST_BLOCKS 781 tprintf("st_blocks=%lu, ", (unsigned long) statbuf->st_blocks); 782 #endif 783 } 784 else 785 tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode)); 786 switch (statbuf->st_mode & S_IFMT) { 787 case S_IFCHR: case S_IFBLK: 788 #ifdef HAVE_STRUCT_STAT_ST_RDEV 789 tprintf("st_rdev=makedev(%lu, %lu), ", 790 (unsigned long) major(statbuf->st_rdev), 791 (unsigned long) minor(statbuf->st_rdev)); 792 #else /* !HAVE_STRUCT_STAT_ST_RDEV */ 793 tprintf("st_size=makedev(%lu, %lu), ", 794 (unsigned long) major(statbuf->st_size), 795 (unsigned long) minor(statbuf->st_size)); 796 #endif /* !HAVE_STRUCT_STAT_ST_RDEV */ 797 break; 798 default: 799 tprintf("st_size=%lu, ", (unsigned long) statbuf->st_size); 800 break; 801 } 802 if (!abbrev(tcp)) { 803 tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime)); 804 tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime)); 805 tprintf("st_ctime=%s", sprinttime(statbuf->st_ctime)); 806 #if HAVE_STRUCT_STAT_ST_FLAGS 807 tprints(", st_flags="); 808 printflags(fileflags, statbuf->st_flags, "UF_???"); 809 #endif 810 #if HAVE_STRUCT_STAT_ST_ACLCNT 811 tprintf(", st_aclcnt=%d", statbuf->st_aclcnt); 812 #endif 813 #if HAVE_STRUCT_STAT_ST_LEVEL 814 tprintf(", st_level=%ld", statbuf->st_level); 815 #endif 816 #if HAVE_STRUCT_STAT_ST_FSTYPE 817 tprintf(", st_fstype=%.*s", 818 (int) sizeof statbuf->st_fstype, statbuf->st_fstype); 819 #endif 820 #if HAVE_STRUCT_STAT_ST_GEN 821 tprintf(", st_gen=%u", statbuf->st_gen); 822 #endif 823 tprints("}"); 824 } 825 else 826 tprints("...}"); 827 } 828 829 #ifndef X32 830 static void 831 printstat(struct tcb *tcp, long addr) 832 { 833 struct stat statbuf; 834 835 if (!addr) { 836 tprints("NULL"); 837 return; 838 } 839 if (syserror(tcp) || !verbose(tcp)) { 840 tprintf("%#lx", addr); 841 return; 842 } 843 844 #if defined(SPARC) || defined(SPARC64) 845 if (current_personality == 1) { 846 printstatsol(tcp, addr); 847 return; 848 } 849 #ifdef SPARC64 850 else if (current_personality == 2) { 851 printstat_sparc64(tcp, addr); 852 return; 853 } 854 #endif 855 #endif /* SPARC[64] */ 856 857 #if defined POWERPC64 858 if (current_personality == 1) { 859 printstat_powerpc32(tcp, addr); 860 return; 861 } 862 #endif 863 864 if (umove(tcp, addr, &statbuf) < 0) { 865 tprints("{...}"); 866 return; 867 } 868 869 realprintstat(tcp, &statbuf); 870 } 871 #else /* X32 */ 872 # define printstat printstat64 873 #endif 874 875 #if !defined HAVE_STAT64 && (defined AARCH64 || defined X86_64) 876 /* 877 * Linux x86_64 has unified `struct stat' but its i386 biarch needs 878 * `struct stat64'. Its <asm-i386/stat.h> definition expects 32-bit `long'. 879 * <linux/include/asm-x86_64/ia32.h> is not in the public includes set. 880 * __GNUC__ is needed for the required __attribute__ below. 881 * 882 * Similarly, aarch64 has a unified `struct stat' but its arm personality 883 * needs `struct stat64' (which also expects a 32-bit `long' but which 884 * shouldn't be packed). 885 */ 886 struct stat64 { 887 unsigned long long st_dev; 888 unsigned char __pad0[4]; 889 unsigned int __st_ino; 890 unsigned int st_mode; 891 unsigned int st_nlink; 892 unsigned int st_uid; 893 unsigned int st_gid; 894 unsigned long long st_rdev; 895 unsigned char __pad3[4]; 896 long long st_size; 897 unsigned int st_blksize; 898 unsigned long long st_blocks; 899 unsigned int st_atime; 900 unsigned int st_atime_nsec; 901 unsigned int st_mtime; 902 unsigned int st_mtime_nsec; 903 unsigned int st_ctime; 904 unsigned int st_ctime_nsec; 905 unsigned long long st_ino; 906 } 907 # if defined X86_64 908 __attribute__((packed)) 909 # define STAT64_SIZE 96 910 #else 911 # define STAT64_SIZE 104 912 # endif 913 ; 914 # define HAVE_STAT64 1 915 #endif 916 917 #ifdef HAVE_STAT64 918 static void 919 printstat64(struct tcb *tcp, long addr) 920 { 921 #ifdef X32 922 struct stat statbuf; 923 #else 924 struct stat64 statbuf; 925 #endif 926 927 #ifdef STAT64_SIZE 928 (void) sizeof(char[sizeof statbuf == STAT64_SIZE ? 1 : -1]); 929 #endif 930 931 if (!addr) { 932 tprints("NULL"); 933 return; 934 } 935 if (syserror(tcp) || !verbose(tcp)) { 936 tprintf("%#lx", addr); 937 return; 938 } 939 940 #if defined(SPARC) || defined(SPARC64) 941 if (current_personality == 1) { 942 printstatsol(tcp, addr); 943 return; 944 } 945 # ifdef SPARC64 946 else if (current_personality == 2) { 947 printstat_sparc64(tcp, addr); 948 return; 949 } 950 # endif 951 #endif /* SPARC[64] */ 952 953 #if defined AARCH64 954 if (current_personality != 0) { 955 printstat(tcp, addr); 956 return; 957 } 958 #endif 959 #if defined X86_64 960 if (current_personality != 1) { 961 printstat(tcp, addr); 962 return; 963 } 964 #endif 965 966 if (umove(tcp, addr, &statbuf) < 0) { 967 tprints("{...}"); 968 return; 969 } 970 971 if (!abbrev(tcp)) { 972 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%llu, st_mode=%s, ", 973 (unsigned long) major(statbuf.st_dev), 974 (unsigned long) minor(statbuf.st_dev), 975 (unsigned long long) statbuf.st_ino, 976 sprintmode(statbuf.st_mode)); 977 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ", 978 (unsigned long) statbuf.st_nlink, 979 (unsigned long) statbuf.st_uid, 980 (unsigned long) statbuf.st_gid); 981 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 982 tprintf("st_blksize=%lu, ", 983 (unsigned long) statbuf.st_blksize); 984 #endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */ 985 #ifdef HAVE_STRUCT_STAT_ST_BLOCKS 986 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks); 987 #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */ 988 } 989 else 990 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode)); 991 switch (statbuf.st_mode & S_IFMT) { 992 case S_IFCHR: case S_IFBLK: 993 #ifdef HAVE_STRUCT_STAT_ST_RDEV 994 tprintf("st_rdev=makedev(%lu, %lu), ", 995 (unsigned long) major(statbuf.st_rdev), 996 (unsigned long) minor(statbuf.st_rdev)); 997 #else /* !HAVE_STRUCT_STAT_ST_RDEV */ 998 tprintf("st_size=makedev(%lu, %lu), ", 999 (unsigned long) major(statbuf.st_size), 1000 (unsigned long) minor(statbuf.st_size)); 1001 #endif /* !HAVE_STRUCT_STAT_ST_RDEV */ 1002 break; 1003 default: 1004 tprintf("st_size=%llu, ", (unsigned long long) statbuf.st_size); 1005 break; 1006 } 1007 if (!abbrev(tcp)) { 1008 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime)); 1009 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime)); 1010 tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime)); 1011 #if HAVE_STRUCT_STAT_ST_FLAGS 1012 tprints(", st_flags="); 1013 printflags(fileflags, statbuf.st_flags, "UF_???"); 1014 #endif 1015 #if HAVE_STRUCT_STAT_ST_ACLCNT 1016 tprintf(", st_aclcnt=%d", statbuf.st_aclcnt); 1017 #endif 1018 #if HAVE_STRUCT_STAT_ST_LEVEL 1019 tprintf(", st_level=%ld", statbuf.st_level); 1020 #endif 1021 #if HAVE_STRUCT_STAT_ST_FSTYPE 1022 tprintf(", st_fstype=%.*s", 1023 (int) sizeof statbuf.st_fstype, statbuf.st_fstype); 1024 #endif 1025 #if HAVE_STRUCT_STAT_ST_GEN 1026 tprintf(", st_gen=%u", statbuf.st_gen); 1027 #endif 1028 tprints("}"); 1029 } 1030 else 1031 tprints("...}"); 1032 } 1033 #endif /* HAVE_STAT64 */ 1034 1035 #if defined(HAVE_STRUCT___OLD_KERNEL_STAT) 1036 static void 1037 convertoldstat(const struct __old_kernel_stat *oldbuf, struct stat *newbuf) 1038 { 1039 newbuf->st_dev = oldbuf->st_dev; 1040 newbuf->st_ino = oldbuf->st_ino; 1041 newbuf->st_mode = oldbuf->st_mode; 1042 newbuf->st_nlink = oldbuf->st_nlink; 1043 newbuf->st_uid = oldbuf->st_uid; 1044 newbuf->st_gid = oldbuf->st_gid; 1045 newbuf->st_rdev = oldbuf->st_rdev; 1046 newbuf->st_size = oldbuf->st_size; 1047 newbuf->st_atime = oldbuf->st_atime; 1048 newbuf->st_mtime = oldbuf->st_mtime; 1049 newbuf->st_ctime = oldbuf->st_ctime; 1050 newbuf->st_blksize = 0; /* not supported in old_stat */ 1051 newbuf->st_blocks = 0; /* not supported in old_stat */ 1052 } 1053 1054 static void 1055 printoldstat(struct tcb *tcp, long addr) 1056 { 1057 struct __old_kernel_stat statbuf; 1058 struct stat newstatbuf; 1059 1060 if (!addr) { 1061 tprints("NULL"); 1062 return; 1063 } 1064 if (syserror(tcp) || !verbose(tcp)) { 1065 tprintf("%#lx", addr); 1066 return; 1067 } 1068 1069 # if defined(SPARC) || defined(SPARC64) 1070 if (current_personality == 1) { 1071 printstatsol(tcp, addr); 1072 return; 1073 } 1074 # endif 1075 1076 if (umove(tcp, addr, &statbuf) < 0) { 1077 tprints("{...}"); 1078 return; 1079 } 1080 1081 convertoldstat(&statbuf, &newstatbuf); 1082 realprintstat(tcp, &newstatbuf); 1083 } 1084 #endif 1085 1086 int 1087 sys_stat(struct tcb *tcp) 1088 { 1089 if (entering(tcp)) { 1090 printpath(tcp, tcp->u_arg[0]); 1091 tprints(", "); 1092 } else { 1093 printstat(tcp, tcp->u_arg[1]); 1094 } 1095 return 0; 1096 } 1097 1098 #ifdef X32 1099 static void 1100 printstat64_x32(struct tcb *tcp, long addr) 1101 { 1102 struct stat64 statbuf; 1103 1104 if (!addr) { 1105 tprints("NULL"); 1106 return; 1107 } 1108 if (syserror(tcp) || !verbose(tcp)) { 1109 tprintf("%#lx", addr); 1110 return; 1111 } 1112 1113 if (umove(tcp, addr, &statbuf) < 0) { 1114 tprints("{...}"); 1115 return; 1116 } 1117 1118 if (!abbrev(tcp)) { 1119 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%llu, st_mode=%s, ", 1120 (unsigned long) major(statbuf.st_dev), 1121 (unsigned long) minor(statbuf.st_dev), 1122 (unsigned long long) statbuf.st_ino, 1123 sprintmode(statbuf.st_mode)); 1124 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ", 1125 (unsigned long) statbuf.st_nlink, 1126 (unsigned long) statbuf.st_uid, 1127 (unsigned long) statbuf.st_gid); 1128 tprintf("st_blksize=%lu, ", 1129 (unsigned long) statbuf.st_blksize); 1130 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks); 1131 } 1132 else 1133 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode)); 1134 switch (statbuf.st_mode & S_IFMT) { 1135 case S_IFCHR: case S_IFBLK: 1136 tprintf("st_rdev=makedev(%lu, %lu), ", 1137 (unsigned long) major(statbuf.st_rdev), 1138 (unsigned long) minor(statbuf.st_rdev)); 1139 break; 1140 default: 1141 tprintf("st_size=%llu, ", (unsigned long long) statbuf.st_size); 1142 break; 1143 } 1144 if (!abbrev(tcp)) { 1145 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime)); 1146 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime)); 1147 tprintf("st_ctime=%s", sprinttime(statbuf.st_ctime)); 1148 tprints("}"); 1149 } 1150 else 1151 tprints("...}"); 1152 } 1153 #endif /* X32 */ 1154 1155 int 1156 sys_stat64(struct tcb *tcp) 1157 { 1158 #ifdef HAVE_STAT64 1159 if (entering(tcp)) { 1160 printpath(tcp, tcp->u_arg[0]); 1161 tprints(", "); 1162 } else { 1163 # ifdef X32 1164 printstat64_x32(tcp, tcp->u_arg[1]); 1165 # else 1166 printstat64(tcp, tcp->u_arg[1]); 1167 # endif 1168 } 1169 return 0; 1170 #else 1171 return printargs(tcp); 1172 #endif 1173 } 1174 1175 #ifndef AT_SYMLINK_NOFOLLOW 1176 # define AT_SYMLINK_NOFOLLOW 0x100 1177 #endif 1178 #ifndef AT_REMOVEDIR 1179 # define AT_REMOVEDIR 0x200 1180 #endif 1181 #ifndef AT_SYMLINK_FOLLOW 1182 # define AT_SYMLINK_FOLLOW 0x400 1183 #endif 1184 #ifndef AT_NO_AUTOMOUNT 1185 # define AT_NO_AUTOMOUNT 0x800 1186 #endif 1187 #ifndef AT_EMPTY_PATH 1188 # define AT_EMPTY_PATH 0x1000 1189 #endif 1190 1191 #include "xlat/at_flags.h" 1192 1193 int 1194 sys_newfstatat(struct tcb *tcp) 1195 { 1196 if (entering(tcp)) { 1197 print_dirfd(tcp, tcp->u_arg[0]); 1198 printpath(tcp, tcp->u_arg[1]); 1199 tprints(", "); 1200 } else { 1201 #ifdef POWERPC64 1202 if (current_personality == 0) 1203 printstat(tcp, tcp->u_arg[2]); 1204 else 1205 printstat64(tcp, tcp->u_arg[2]); 1206 #elif defined HAVE_STAT64 1207 printstat64(tcp, tcp->u_arg[2]); 1208 #else 1209 printstat(tcp, tcp->u_arg[2]); 1210 #endif 1211 tprints(", "); 1212 printflags(at_flags, tcp->u_arg[3], "AT_???"); 1213 } 1214 return 0; 1215 } 1216 1217 #if defined(HAVE_STRUCT___OLD_KERNEL_STAT) 1218 int 1219 sys_oldstat(struct tcb *tcp) 1220 { 1221 if (entering(tcp)) { 1222 printpath(tcp, tcp->u_arg[0]); 1223 tprints(", "); 1224 } else { 1225 printoldstat(tcp, tcp->u_arg[1]); 1226 } 1227 return 0; 1228 } 1229 #endif 1230 1231 int 1232 sys_fstat(struct tcb *tcp) 1233 { 1234 if (entering(tcp)) { 1235 printfd(tcp, tcp->u_arg[0]); 1236 tprints(", "); 1237 } else { 1238 printstat(tcp, tcp->u_arg[1]); 1239 } 1240 return 0; 1241 } 1242 1243 int 1244 sys_fstat64(struct tcb *tcp) 1245 { 1246 #ifdef HAVE_STAT64 1247 if (entering(tcp)) { 1248 printfd(tcp, tcp->u_arg[0]); 1249 tprints(", "); 1250 } else { 1251 # ifdef X32 1252 printstat64_x32(tcp, tcp->u_arg[1]); 1253 # else 1254 printstat64(tcp, tcp->u_arg[1]); 1255 # endif 1256 } 1257 return 0; 1258 #else 1259 return printargs(tcp); 1260 #endif 1261 } 1262 1263 #if defined(HAVE_STRUCT___OLD_KERNEL_STAT) 1264 int 1265 sys_oldfstat(struct tcb *tcp) 1266 { 1267 if (entering(tcp)) { 1268 printfd(tcp, tcp->u_arg[0]); 1269 tprints(", "); 1270 } else { 1271 printoldstat(tcp, tcp->u_arg[1]); 1272 } 1273 return 0; 1274 } 1275 #endif 1276 1277 #if defined(SPARC) || defined(SPARC64) 1278 1279 int 1280 sys_xstat(struct tcb *tcp) 1281 { 1282 if (entering(tcp)) { 1283 tprintf("%ld, ", tcp->u_arg[0]); 1284 printpath(tcp, tcp->u_arg[1]); 1285 tprints(", "); 1286 } else { 1287 # ifdef _STAT64_VER 1288 if (tcp->u_arg[0] == _STAT64_VER) 1289 printstat64(tcp, tcp->u_arg[2]); 1290 else 1291 # endif 1292 printstat(tcp, tcp->u_arg[2]); 1293 } 1294 return 0; 1295 } 1296 1297 int 1298 sys_fxstat(struct tcb *tcp) 1299 { 1300 if (entering(tcp)) 1301 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]); 1302 else { 1303 # ifdef _STAT64_VER 1304 if (tcp->u_arg[0] == _STAT64_VER) 1305 printstat64(tcp, tcp->u_arg[2]); 1306 else 1307 # endif 1308 printstat(tcp, tcp->u_arg[2]); 1309 } 1310 return 0; 1311 } 1312 1313 int 1314 sys_lxstat(struct tcb *tcp) 1315 { 1316 if (entering(tcp)) { 1317 tprintf("%ld, ", tcp->u_arg[0]); 1318 printpath(tcp, tcp->u_arg[1]); 1319 tprints(", "); 1320 } else { 1321 # ifdef _STAT64_VER 1322 if (tcp->u_arg[0] == _STAT64_VER) 1323 printstat64(tcp, tcp->u_arg[2]); 1324 else 1325 # endif 1326 printstat(tcp, tcp->u_arg[2]); 1327 } 1328 return 0; 1329 } 1330 1331 int 1332 sys_xmknod(struct tcb *tcp) 1333 { 1334 int mode = tcp->u_arg[2]; 1335 1336 if (entering(tcp)) { 1337 tprintf("%ld, ", tcp->u_arg[0]); 1338 printpath(tcp, tcp->u_arg[1]); 1339 tprintf(", %s", sprintmode(mode)); 1340 switch (mode & S_IFMT) { 1341 case S_IFCHR: case S_IFBLK: 1342 tprintf(", makedev(%lu, %lu)", 1343 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff), 1344 (unsigned long) (tcp->u_arg[3] & 0x3ffff)); 1345 break; 1346 default: 1347 break; 1348 } 1349 } 1350 return 0; 1351 } 1352 1353 # ifdef HAVE_SYS_ACL_H 1354 1355 # include <sys/acl.h> 1356 1357 #include "xlat/aclcmds.h" 1358 1359 int 1360 sys_acl(struct tcb *tcp) 1361 { 1362 if (entering(tcp)) { 1363 printpath(tcp, tcp->u_arg[0]); 1364 tprints(", "); 1365 printxval(aclcmds, tcp->u_arg[1], "???ACL???"); 1366 tprintf(", %ld", tcp->u_arg[2]); 1367 /* 1368 * FIXME - dump out the list of aclent_t's pointed to 1369 * by "tcp->u_arg[3]" if it's not NULL. 1370 */ 1371 if (tcp->u_arg[3]) 1372 tprintf(", %#lx", tcp->u_arg[3]); 1373 else 1374 tprints(", NULL"); 1375 } 1376 return 0; 1377 } 1378 1379 int 1380 sys_facl(struct tcb *tcp) 1381 { 1382 if (entering(tcp)) { 1383 tprintf("%ld, ", tcp->u_arg[0]); 1384 printxval(aclcmds, tcp->u_arg[1], "???ACL???"); 1385 tprintf(", %ld", tcp->u_arg[2]); 1386 /* 1387 * FIXME - dump out the list of aclent_t's pointed to 1388 * by "tcp->u_arg[3]" if it's not NULL. 1389 */ 1390 if (tcp->u_arg[3]) 1391 tprintf(", %#lx", tcp->u_arg[3]); 1392 else 1393 tprints(", NULL"); 1394 } 1395 return 0; 1396 } 1397 1398 #include "xlat/aclipc.h" 1399 1400 int 1401 sys_aclipc(struct tcb *tcp) 1402 { 1403 if (entering(tcp)) { 1404 printxval(aclipc, tcp->u_arg[0], "???IPC???"); 1405 tprintf(", %#lx, ", tcp->u_arg[1]); 1406 printxval(aclcmds, tcp->u_arg[2], "???ACL???"); 1407 tprintf(", %ld", tcp->u_arg[3]); 1408 /* 1409 * FIXME - dump out the list of aclent_t's pointed to 1410 * by "tcp->u_arg[4]" if it's not NULL. 1411 */ 1412 if (tcp->u_arg[4]) 1413 tprintf(", %#lx", tcp->u_arg[4]); 1414 else 1415 tprints(", NULL"); 1416 } 1417 return 0; 1418 } 1419 1420 # endif /* HAVE_SYS_ACL_H */ 1421 1422 #endif /* SPARC[64] */ 1423 1424 #include "xlat/fsmagic.h" 1425 1426 static const char * 1427 sprintfstype(int magic) 1428 { 1429 static char buf[32]; 1430 const char *s; 1431 1432 s = xlookup(fsmagic, magic); 1433 if (s) { 1434 sprintf(buf, "\"%s\"", s); 1435 return buf; 1436 } 1437 sprintf(buf, "%#x", magic); 1438 return buf; 1439 } 1440 1441 static void 1442 printstatfs(struct tcb *tcp, long addr) 1443 { 1444 struct statfs statbuf; 1445 1446 if (syserror(tcp) || !verbose(tcp)) { 1447 tprintf("%#lx", addr); 1448 return; 1449 } 1450 if (umove(tcp, addr, &statbuf) < 0) { 1451 tprints("{...}"); 1452 return; 1453 } 1454 #ifdef ALPHA 1455 1456 tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ", 1457 sprintfstype(statbuf.f_type), 1458 statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree); 1459 tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_fsid={%d, %d}, f_namelen=%u", 1460 statbuf.f_bavail, statbuf.f_files, statbuf.f_ffree, 1461 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1], 1462 statbuf.f_namelen); 1463 #else /* !ALPHA */ 1464 tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ", 1465 sprintfstype(statbuf.f_type), 1466 (unsigned long)statbuf.f_bsize, 1467 (unsigned long)statbuf.f_blocks, 1468 (unsigned long)statbuf.f_bfree); 1469 tprintf("f_bavail=%lu, f_files=%lu, f_ffree=%lu, f_fsid={%d, %d}", 1470 (unsigned long)statbuf.f_bavail, 1471 (unsigned long)statbuf.f_files, 1472 (unsigned long)statbuf.f_ffree, 1473 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); 1474 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); 1475 #endif /* !ALPHA */ 1476 #ifdef _STATFS_F_FRSIZE 1477 tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize); 1478 #endif 1479 tprints("}"); 1480 } 1481 1482 int 1483 sys_statfs(struct tcb *tcp) 1484 { 1485 if (entering(tcp)) { 1486 printpath(tcp, tcp->u_arg[0]); 1487 tprints(", "); 1488 } else { 1489 printstatfs(tcp, tcp->u_arg[1]); 1490 } 1491 return 0; 1492 } 1493 1494 int 1495 sys_fstatfs(struct tcb *tcp) 1496 { 1497 if (entering(tcp)) { 1498 printfd(tcp, tcp->u_arg[0]); 1499 tprints(", "); 1500 } else { 1501 printstatfs(tcp, tcp->u_arg[1]); 1502 } 1503 return 0; 1504 } 1505 1506 #if defined HAVE_STATFS64 1507 static void 1508 printstatfs64(struct tcb *tcp, long addr) 1509 { 1510 struct statfs64 statbuf; 1511 1512 if (syserror(tcp) || !verbose(tcp)) { 1513 tprintf("%#lx", addr); 1514 return; 1515 } 1516 if (umove(tcp, addr, &statbuf) < 0) { 1517 tprints("{...}"); 1518 return; 1519 } 1520 tprintf("{f_type=%s, f_bsize=%llu, f_blocks=%llu, f_bfree=%llu, ", 1521 sprintfstype(statbuf.f_type), 1522 (unsigned long long)statbuf.f_bsize, 1523 (unsigned long long)statbuf.f_blocks, 1524 (unsigned long long)statbuf.f_bfree); 1525 tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}", 1526 (unsigned long long)statbuf.f_bavail, 1527 (unsigned long long)statbuf.f_files, 1528 (unsigned long long)statbuf.f_ffree, 1529 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); 1530 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); 1531 #ifdef _STATFS_F_FRSIZE 1532 tprintf(", f_frsize=%llu", (unsigned long long)statbuf.f_frsize); 1533 #endif 1534 #ifdef _STATFS_F_FLAGS 1535 tprintf(", f_flags=%llu", (unsigned long long)statbuf.f_flags); 1536 #endif 1537 tprints("}"); 1538 } 1539 1540 struct compat_statfs64 { 1541 uint32_t f_type; 1542 uint32_t f_bsize; 1543 uint64_t f_blocks; 1544 uint64_t f_bfree; 1545 uint64_t f_bavail; 1546 uint64_t f_files; 1547 uint64_t f_ffree; 1548 fsid_t f_fsid; 1549 uint32_t f_namelen; 1550 uint32_t f_frsize; 1551 uint32_t f_flags; 1552 uint32_t f_spare[4]; 1553 } 1554 #if defined(X86_64) || defined(IA64) 1555 __attribute__ ((packed, aligned(4))) 1556 #endif 1557 ; 1558 1559 static void 1560 printcompat_statfs64(struct tcb *tcp, long addr) 1561 { 1562 struct compat_statfs64 statbuf; 1563 1564 if (syserror(tcp) || !verbose(tcp)) { 1565 tprintf("%#lx", addr); 1566 return; 1567 } 1568 if (umove(tcp, addr, &statbuf) < 0) { 1569 tprints("{...}"); 1570 return; 1571 } 1572 tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%llu, f_bfree=%llu, ", 1573 sprintfstype(statbuf.f_type), 1574 (unsigned long)statbuf.f_bsize, 1575 (unsigned long long)statbuf.f_blocks, 1576 (unsigned long long)statbuf.f_bfree); 1577 tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}", 1578 (unsigned long long)statbuf.f_bavail, 1579 (unsigned long long)statbuf.f_files, 1580 (unsigned long long)statbuf.f_ffree, 1581 statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); 1582 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); 1583 tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize); 1584 tprintf(", f_flags=%lu}", (unsigned long)statbuf.f_frsize); 1585 } 1586 1587 int 1588 sys_statfs64(struct tcb *tcp) 1589 { 1590 if (entering(tcp)) { 1591 printpath(tcp, tcp->u_arg[0]); 1592 tprintf(", %lu, ", tcp->u_arg[1]); 1593 } else { 1594 if (tcp->u_arg[1] == sizeof(struct statfs64)) 1595 printstatfs64(tcp, tcp->u_arg[2]); 1596 else if (tcp->u_arg[1] == sizeof(struct compat_statfs64)) 1597 printcompat_statfs64(tcp, tcp->u_arg[2]); 1598 else 1599 tprints("{???}"); 1600 } 1601 return 0; 1602 } 1603 1604 int 1605 sys_fstatfs64(struct tcb *tcp) 1606 { 1607 if (entering(tcp)) { 1608 printfd(tcp, tcp->u_arg[0]); 1609 tprintf(", %lu, ", tcp->u_arg[1]); 1610 } else { 1611 if (tcp->u_arg[1] == sizeof(struct statfs64)) 1612 printstatfs64(tcp, tcp->u_arg[2]); 1613 else if (tcp->u_arg[1] == sizeof(struct compat_statfs64)) 1614 printcompat_statfs64(tcp, tcp->u_arg[2]); 1615 else 1616 tprints("{???}"); 1617 } 1618 return 0; 1619 } 1620 #endif 1621 1622 #if defined(ALPHA) 1623 int 1624 osf_statfs(struct tcb *tcp) 1625 { 1626 if (entering(tcp)) { 1627 printpath(tcp, tcp->u_arg[0]); 1628 tprints(", "); 1629 } else { 1630 printstatfs(tcp, tcp->u_arg[1]); 1631 tprintf(", %lu", tcp->u_arg[2]); 1632 } 1633 return 0; 1634 } 1635 1636 int 1637 osf_fstatfs(struct tcb *tcp) 1638 { 1639 if (entering(tcp)) { 1640 tprintf("%lu, ", tcp->u_arg[0]); 1641 } else { 1642 printstatfs(tcp, tcp->u_arg[1]); 1643 tprintf(", %lu", tcp->u_arg[2]); 1644 } 1645 return 0; 1646 } 1647 #endif 1648 1649 /* directory */ 1650 int 1651 sys_chdir(struct tcb *tcp) 1652 { 1653 if (entering(tcp)) { 1654 printpath(tcp, tcp->u_arg[0]); 1655 } 1656 return 0; 1657 } 1658 1659 static int 1660 decode_mkdir(struct tcb *tcp, int offset) 1661 { 1662 if (entering(tcp)) { 1663 printpath(tcp, tcp->u_arg[offset]); 1664 tprintf(", %#lo", tcp->u_arg[offset + 1]); 1665 } 1666 return 0; 1667 } 1668 1669 int 1670 sys_mkdir(struct tcb *tcp) 1671 { 1672 return decode_mkdir(tcp, 0); 1673 } 1674 1675 int 1676 sys_mkdirat(struct tcb *tcp) 1677 { 1678 if (entering(tcp)) 1679 print_dirfd(tcp, tcp->u_arg[0]); 1680 return decode_mkdir(tcp, 1); 1681 } 1682 1683 int 1684 sys_link(struct tcb *tcp) 1685 { 1686 if (entering(tcp)) { 1687 printpath(tcp, tcp->u_arg[0]); 1688 tprints(", "); 1689 printpath(tcp, tcp->u_arg[1]); 1690 } 1691 return 0; 1692 } 1693 1694 int 1695 sys_linkat(struct tcb *tcp) 1696 { 1697 if (entering(tcp)) { 1698 print_dirfd(tcp, tcp->u_arg[0]); 1699 printpath(tcp, tcp->u_arg[1]); 1700 tprints(", "); 1701 print_dirfd(tcp, tcp->u_arg[2]); 1702 printpath(tcp, tcp->u_arg[3]); 1703 tprints(", "); 1704 printflags(at_flags, tcp->u_arg[4], "AT_???"); 1705 } 1706 return 0; 1707 } 1708 1709 int 1710 sys_unlinkat(struct tcb *tcp) 1711 { 1712 if (entering(tcp)) { 1713 print_dirfd(tcp, tcp->u_arg[0]); 1714 printpath(tcp, tcp->u_arg[1]); 1715 tprints(", "); 1716 printflags(at_flags, tcp->u_arg[2], "AT_???"); 1717 } 1718 return 0; 1719 } 1720 1721 int 1722 sys_symlinkat(struct tcb *tcp) 1723 { 1724 if (entering(tcp)) { 1725 printpath(tcp, tcp->u_arg[0]); 1726 tprints(", "); 1727 print_dirfd(tcp, tcp->u_arg[1]); 1728 printpath(tcp, tcp->u_arg[2]); 1729 } 1730 return 0; 1731 } 1732 1733 static int 1734 decode_readlink(struct tcb *tcp, int offset) 1735 { 1736 if (entering(tcp)) { 1737 printpath(tcp, tcp->u_arg[offset]); 1738 tprints(", "); 1739 } else { 1740 if (syserror(tcp)) 1741 tprintf("%#lx", tcp->u_arg[offset + 1]); 1742 else 1743 /* Used to use printpathn(), but readlink 1744 * neither includes NUL in the returned count, 1745 * nor actually writes it into memory. 1746 * printpathn() would decide on printing 1747 * "..." continuation based on garbage 1748 * past return buffer's end. 1749 */ 1750 printstr(tcp, tcp->u_arg[offset + 1], tcp->u_rval); 1751 tprintf(", %lu", tcp->u_arg[offset + 2]); 1752 } 1753 return 0; 1754 } 1755 1756 int 1757 sys_readlink(struct tcb *tcp) 1758 { 1759 return decode_readlink(tcp, 0); 1760 } 1761 1762 int 1763 sys_readlinkat(struct tcb *tcp) 1764 { 1765 if (entering(tcp)) 1766 print_dirfd(tcp, tcp->u_arg[0]); 1767 return decode_readlink(tcp, 1); 1768 } 1769 1770 int 1771 sys_renameat(struct tcb *tcp) 1772 { 1773 if (entering(tcp)) { 1774 print_dirfd(tcp, tcp->u_arg[0]); 1775 printpath(tcp, tcp->u_arg[1]); 1776 tprints(", "); 1777 print_dirfd(tcp, tcp->u_arg[2]); 1778 printpath(tcp, tcp->u_arg[3]); 1779 } 1780 return 0; 1781 } 1782 1783 int 1784 sys_chown(struct tcb *tcp) 1785 { 1786 if (entering(tcp)) { 1787 printpath(tcp, tcp->u_arg[0]); 1788 printuid(", ", tcp->u_arg[1]); 1789 printuid(", ", tcp->u_arg[2]); 1790 } 1791 return 0; 1792 } 1793 1794 int 1795 sys_fchownat(struct tcb *tcp) 1796 { 1797 if (entering(tcp)) { 1798 print_dirfd(tcp, tcp->u_arg[0]); 1799 printpath(tcp, tcp->u_arg[1]); 1800 printuid(", ", tcp->u_arg[2]); 1801 printuid(", ", tcp->u_arg[3]); 1802 tprints(", "); 1803 printflags(at_flags, tcp->u_arg[4], "AT_???"); 1804 } 1805 return 0; 1806 } 1807 1808 int 1809 sys_fchown(struct tcb *tcp) 1810 { 1811 if (entering(tcp)) { 1812 printfd(tcp, tcp->u_arg[0]); 1813 printuid(", ", tcp->u_arg[1]); 1814 printuid(", ", tcp->u_arg[2]); 1815 } 1816 return 0; 1817 } 1818 1819 static int 1820 decode_chmod(struct tcb *tcp, int offset) 1821 { 1822 if (entering(tcp)) { 1823 printpath(tcp, tcp->u_arg[offset]); 1824 tprintf(", %#lo", tcp->u_arg[offset + 1]); 1825 } 1826 return 0; 1827 } 1828 1829 int 1830 sys_chmod(struct tcb *tcp) 1831 { 1832 return decode_chmod(tcp, 0); 1833 } 1834 1835 int 1836 sys_fchmodat(struct tcb *tcp) 1837 { 1838 if (entering(tcp)) 1839 print_dirfd(tcp, tcp->u_arg[0]); 1840 return decode_chmod(tcp, 1); 1841 } 1842 1843 int 1844 sys_fchmod(struct tcb *tcp) 1845 { 1846 if (entering(tcp)) { 1847 printfd(tcp, tcp->u_arg[0]); 1848 tprintf(", %#lo", tcp->u_arg[1]); 1849 } 1850 return 0; 1851 } 1852 1853 #ifdef ALPHA 1854 int 1855 sys_osf_utimes(struct tcb *tcp) 1856 { 1857 if (entering(tcp)) { 1858 printpath(tcp, tcp->u_arg[0]); 1859 tprints(", "); 1860 printtv_bitness(tcp, tcp->u_arg[1], BITNESS_32, 0); 1861 } 1862 return 0; 1863 } 1864 #endif 1865 1866 static int 1867 decode_utimes(struct tcb *tcp, int offset, int special) 1868 { 1869 if (entering(tcp)) { 1870 printpath(tcp, tcp->u_arg[offset]); 1871 tprints(", "); 1872 if (tcp->u_arg[offset + 1] == 0) 1873 tprints("NULL"); 1874 else { 1875 tprints("{"); 1876 printtv_bitness(tcp, tcp->u_arg[offset + 1], 1877 BITNESS_CURRENT, special); 1878 tprints(", "); 1879 printtv_bitness(tcp, tcp->u_arg[offset + 1] 1880 + sizeof(struct timeval), 1881 BITNESS_CURRENT, special); 1882 tprints("}"); 1883 } 1884 } 1885 return 0; 1886 } 1887 1888 int 1889 sys_utimes(struct tcb *tcp) 1890 { 1891 return decode_utimes(tcp, 0, 0); 1892 } 1893 1894 int 1895 sys_futimesat(struct tcb *tcp) 1896 { 1897 if (entering(tcp)) 1898 print_dirfd(tcp, tcp->u_arg[0]); 1899 return decode_utimes(tcp, 1, 0); 1900 } 1901 1902 int 1903 sys_utimensat(struct tcb *tcp) 1904 { 1905 if (entering(tcp)) { 1906 print_dirfd(tcp, tcp->u_arg[0]); 1907 decode_utimes(tcp, 1, 1); 1908 tprints(", "); 1909 printflags(at_flags, tcp->u_arg[3], "AT_???"); 1910 } 1911 return 0; 1912 } 1913 1914 int 1915 sys_utime(struct tcb *tcp) 1916 { 1917 union { 1918 long utl[2]; 1919 int uti[2]; 1920 long paranoia_for_huge_wordsize[4]; 1921 } u; 1922 unsigned wordsize; 1923 1924 if (entering(tcp)) { 1925 printpath(tcp, tcp->u_arg[0]); 1926 tprints(", "); 1927 1928 wordsize = current_wordsize; 1929 if (!tcp->u_arg[1]) 1930 tprints("NULL"); 1931 else if (!verbose(tcp)) 1932 tprintf("%#lx", tcp->u_arg[1]); 1933 else if (umoven(tcp, tcp->u_arg[1], 2 * wordsize, (char *) &u) < 0) 1934 tprints("[?, ?]"); 1935 else if (wordsize == sizeof u.utl[0]) { 1936 tprintf("[%s,", sprinttime(u.utl[0])); 1937 tprintf(" %s]", sprinttime(u.utl[1])); 1938 } 1939 else if (wordsize == sizeof u.uti[0]) { 1940 tprintf("[%s,", sprinttime(u.uti[0])); 1941 tprintf(" %s]", sprinttime(u.uti[1])); 1942 } 1943 else 1944 tprintf("<decode error: unsupported wordsize %d>", 1945 wordsize); 1946 } 1947 return 0; 1948 } 1949 1950 static int 1951 decode_mknod(struct tcb *tcp, int offset) 1952 { 1953 int mode = tcp->u_arg[offset + 1]; 1954 1955 if (entering(tcp)) { 1956 printpath(tcp, tcp->u_arg[offset]); 1957 tprintf(", %s", sprintmode(mode)); 1958 switch (mode & S_IFMT) { 1959 case S_IFCHR: 1960 case S_IFBLK: 1961 #if defined(SPARC) || defined(SPARC64) 1962 if (current_personality == 1) 1963 tprintf(", makedev(%lu, %lu)", 1964 (unsigned long) ((tcp->u_arg[offset + 2] >> 18) & 0x3fff), 1965 (unsigned long) (tcp->u_arg[offset + 2] & 0x3ffff)); 1966 else 1967 #endif 1968 tprintf(", makedev(%lu, %lu)", 1969 (unsigned long) major(tcp->u_arg[offset + 2]), 1970 (unsigned long) minor(tcp->u_arg[offset + 2])); 1971 break; 1972 default: 1973 break; 1974 } 1975 } 1976 return 0; 1977 } 1978 1979 int 1980 sys_mknod(struct tcb *tcp) 1981 { 1982 return decode_mknod(tcp, 0); 1983 } 1984 1985 int 1986 sys_mknodat(struct tcb *tcp) 1987 { 1988 if (entering(tcp)) 1989 print_dirfd(tcp, tcp->u_arg[0]); 1990 return decode_mknod(tcp, 1); 1991 } 1992 1993 static void 1994 print_old_dirent(struct tcb *tcp, long addr) 1995 { 1996 #ifdef SH64 1997 typedef struct kernel_dirent old_dirent_t; 1998 #else 1999 typedef struct { 2000 uint32_t d_ino; 2001 uint32_t d_off; 2002 unsigned short d_reclen; 2003 char d_name[1]; 2004 } old_dirent_t; 2005 #endif 2006 old_dirent_t d; 2007 2008 if (!verbose(tcp) || umove(tcp, addr, &d) < 0) { 2009 tprintf("%#lx", addr); 2010 return; 2011 } 2012 2013 tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=\"", 2014 (unsigned long) d.d_ino, (unsigned long) d.d_off, d.d_reclen); 2015 if (d.d_reclen > 256) 2016 d.d_reclen = 256; 2017 printpathn(tcp, addr + offsetof(old_dirent_t, d_name), d.d_reclen); 2018 tprints("\"}"); 2019 } 2020 2021 int 2022 sys_readdir(struct tcb *tcp) 2023 { 2024 if (entering(tcp)) { 2025 printfd(tcp, tcp->u_arg[0]); 2026 tprints(", "); 2027 } else { 2028 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp)) 2029 tprintf("%#lx", tcp->u_arg[1]); 2030 else 2031 print_old_dirent(tcp, tcp->u_arg[1]); 2032 /* Not much point in printing this out, it is always 1. */ 2033 if (tcp->u_arg[2] != 1) 2034 tprintf(", %lu", tcp->u_arg[2]); 2035 } 2036 return 0; 2037 } 2038 2039 #include "xlat/direnttypes.h" 2040 2041 int 2042 sys_getdents(struct tcb *tcp) 2043 { 2044 int i, len, dents = 0; 2045 char *buf; 2046 2047 if (entering(tcp)) { 2048 printfd(tcp, tcp->u_arg[0]); 2049 tprints(", "); 2050 return 0; 2051 } 2052 if (syserror(tcp) || !verbose(tcp)) { 2053 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]); 2054 return 0; 2055 } 2056 len = tcp->u_rval; 2057 /* Beware of insanely large or negative values in tcp->u_rval */ 2058 if (tcp->u_rval > 1024*1024) 2059 len = 1024*1024; 2060 if (tcp->u_rval < 0) 2061 len = 0; 2062 buf = len ? malloc(len) : NULL; 2063 if (len && !buf) 2064 die_out_of_memory(); 2065 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) { 2066 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]); 2067 free(buf); 2068 return 0; 2069 } 2070 if (!abbrev(tcp)) 2071 tprints("{"); 2072 for (i = 0; i < len;) { 2073 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i]; 2074 if (!abbrev(tcp)) { 2075 tprintf("%s{d_ino=%lu, d_off=%lu, ", 2076 i ? " " : "", d->d_ino, d->d_off); 2077 tprintf("d_reclen=%u, d_name=\"%s\", d_type=", 2078 d->d_reclen, d->d_name); 2079 printxval(direnttypes, buf[i + d->d_reclen - 1], "DT_???"); 2080 tprints("}"); 2081 } 2082 if (!d->d_reclen) { 2083 tprints("/* d_reclen == 0, problem here */"); 2084 break; 2085 } 2086 i += d->d_reclen; 2087 dents++; 2088 } 2089 if (!abbrev(tcp)) 2090 tprints("}"); 2091 else 2092 tprintf("/* %u entries */", dents); 2093 tprintf(", %lu", tcp->u_arg[2]); 2094 free(buf); 2095 return 0; 2096 } 2097 2098 int 2099 sys_getdents64(struct tcb *tcp) 2100 { 2101 int i, len, dents = 0; 2102 char *buf; 2103 2104 if (entering(tcp)) { 2105 printfd(tcp, tcp->u_arg[0]); 2106 tprints(", "); 2107 return 0; 2108 } 2109 if (syserror(tcp) || !verbose(tcp)) { 2110 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]); 2111 return 0; 2112 } 2113 2114 len = tcp->u_rval; 2115 /* Beware of insanely large or negative tcp->u_rval */ 2116 if (tcp->u_rval > 1024*1024) 2117 len = 1024*1024; 2118 if (tcp->u_rval < 0) 2119 len = 0; 2120 buf = len ? malloc(len) : NULL; 2121 if (len && !buf) 2122 die_out_of_memory(); 2123 2124 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) { 2125 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]); 2126 free(buf); 2127 return 0; 2128 } 2129 if (!abbrev(tcp)) 2130 tprints("{"); 2131 for (i = 0; i < len;) { 2132 struct dirent64 *d = (struct dirent64 *) &buf[i]; 2133 if (!abbrev(tcp)) { 2134 tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64 ", ", 2135 i ? " " : "", 2136 d->d_ino, 2137 d->d_off); 2138 tprints("d_type="); 2139 printxval(direnttypes, d->d_type, "DT_???"); 2140 tprints(", "); 2141 tprintf("d_reclen=%u, d_name=\"%s\"}", 2142 d->d_reclen, d->d_name); 2143 } 2144 if (!d->d_reclen) { 2145 tprints("/* d_reclen == 0, problem here */"); 2146 break; 2147 } 2148 i += d->d_reclen; 2149 dents++; 2150 } 2151 if (!abbrev(tcp)) 2152 tprints("}"); 2153 else 2154 tprintf("/* %u entries */", dents); 2155 tprintf(", %lu", tcp->u_arg[2]); 2156 free(buf); 2157 return 0; 2158 } 2159 2160 int 2161 sys_getcwd(struct tcb *tcp) 2162 { 2163 if (exiting(tcp)) { 2164 if (syserror(tcp)) 2165 tprintf("%#lx", tcp->u_arg[0]); 2166 else 2167 printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1); 2168 tprintf(", %lu", tcp->u_arg[1]); 2169 } 2170 return 0; 2171 } 2172 2173 #ifdef HAVE_SYS_ASYNCH_H 2174 2175 int 2176 sys_aioread(struct tcb *tcp) 2177 { 2178 struct aio_result_t res; 2179 2180 if (entering(tcp)) { 2181 tprintf("%lu, ", tcp->u_arg[0]); 2182 } else { 2183 if (syserror(tcp)) 2184 tprintf("%#lx", tcp->u_arg[1]); 2185 else 2186 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 2187 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]); 2188 printxval(whence, tcp->u_arg[4], "L_???"); 2189 if (syserror(tcp) || tcp->u_arg[5] == 0 2190 || umove(tcp, tcp->u_arg[5], &res) < 0) 2191 tprintf(", %#lx", tcp->u_arg[5]); 2192 else 2193 tprintf(", {aio_return %d aio_errno %d}", 2194 res.aio_return, res.aio_errno); 2195 } 2196 return 0; 2197 } 2198 2199 int 2200 sys_aiowrite(struct tcb *tcp) 2201 { 2202 struct aio_result_t res; 2203 2204 if (entering(tcp)) { 2205 tprintf("%lu, ", tcp->u_arg[0]); 2206 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 2207 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]); 2208 printxval(whence, tcp->u_arg[4], "L_???"); 2209 } 2210 else { 2211 if (tcp->u_arg[5] == 0) 2212 tprints(", NULL"); 2213 else if (syserror(tcp) 2214 || umove(tcp, tcp->u_arg[5], &res) < 0) 2215 tprintf(", %#lx", tcp->u_arg[5]); 2216 else 2217 tprintf(", {aio_return %d aio_errno %d}", 2218 res.aio_return, res.aio_errno); 2219 } 2220 return 0; 2221 } 2222 2223 int 2224 sys_aiowait(struct tcb *tcp) 2225 { 2226 if (entering(tcp)) 2227 printtv(tcp, tcp->u_arg[0]); 2228 return 0; 2229 } 2230 2231 int 2232 sys_aiocancel(struct tcb *tcp) 2233 { 2234 struct aio_result_t res; 2235 2236 if (exiting(tcp)) { 2237 if (tcp->u_arg[0] == 0) 2238 tprints("NULL"); 2239 else if (syserror(tcp) 2240 || umove(tcp, tcp->u_arg[0], &res) < 0) 2241 tprintf("%#lx", tcp->u_arg[0]); 2242 else 2243 tprintf("{aio_return %d aio_errno %d}", 2244 res.aio_return, res.aio_errno); 2245 } 2246 return 0; 2247 } 2248 2249 #endif /* HAVE_SYS_ASYNCH_H */ 2250 2251 #include "xlat/xattrflags.h" 2252 2253 static void 2254 print_xattr_val(struct tcb *tcp, int failed, 2255 unsigned long arg, 2256 unsigned long insize, 2257 unsigned long size) 2258 { 2259 if (insize == 0) 2260 failed = 1; 2261 if (!failed) { 2262 unsigned long capacity = 4 * size + 1; 2263 unsigned char *buf = (capacity < size) ? NULL : malloc(capacity); 2264 if (buf == NULL || /* probably a bogus size argument */ 2265 umoven(tcp, arg, size, (char *) &buf[3 * size]) < 0) { 2266 failed = 1; 2267 } 2268 else { 2269 unsigned char *out = buf; 2270 unsigned char *in = &buf[3 * size]; 2271 size_t i; 2272 for (i = 0; i < size; ++i) { 2273 if (in[i] >= ' ' && in[i] <= 0x7e) 2274 *out++ = in[i]; 2275 else { 2276 #define tohex(n) "0123456789abcdef"[n] 2277 *out++ = '\\'; 2278 *out++ = 'x'; 2279 *out++ = tohex(in[i] / 16); 2280 *out++ = tohex(in[i] % 16); 2281 } 2282 } 2283 /* Don't print terminating NUL if there is one. */ 2284 if (i > 0 && in[i - 1] == '\0') 2285 out -= 4; 2286 *out = '\0'; 2287 tprintf(", \"%s\", %ld", buf, insize); 2288 } 2289 free(buf); 2290 } 2291 if (failed) 2292 tprintf(", 0x%lx, %ld", arg, insize); 2293 } 2294 2295 int 2296 sys_setxattr(struct tcb *tcp) 2297 { 2298 if (entering(tcp)) { 2299 printpath(tcp, tcp->u_arg[0]); 2300 tprints(", "); 2301 printstr(tcp, tcp->u_arg[1], -1); 2302 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); 2303 tprints(", "); 2304 printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); 2305 } 2306 return 0; 2307 } 2308 2309 int 2310 sys_fsetxattr(struct tcb *tcp) 2311 { 2312 if (entering(tcp)) { 2313 printfd(tcp, tcp->u_arg[0]); 2314 tprints(", "); 2315 printstr(tcp, tcp->u_arg[1], -1); 2316 print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); 2317 tprints(", "); 2318 printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); 2319 } 2320 return 0; 2321 } 2322 2323 int 2324 sys_getxattr(struct tcb *tcp) 2325 { 2326 if (entering(tcp)) { 2327 printpath(tcp, tcp->u_arg[0]); 2328 tprints(", "); 2329 printstr(tcp, tcp->u_arg[1], -1); 2330 } else { 2331 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], 2332 tcp->u_rval); 2333 } 2334 return 0; 2335 } 2336 2337 int 2338 sys_fgetxattr(struct tcb *tcp) 2339 { 2340 if (entering(tcp)) { 2341 printfd(tcp, tcp->u_arg[0]); 2342 tprints(", "); 2343 printstr(tcp, tcp->u_arg[1], -1); 2344 } else { 2345 print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], 2346 tcp->u_rval); 2347 } 2348 return 0; 2349 } 2350 2351 static void 2352 print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size) 2353 { 2354 if (syserror(tcp)) { 2355 tprintf("%#lx", addr); 2356 } else { 2357 if (!addr) { 2358 tprints("NULL"); 2359 } else { 2360 unsigned long len = 2361 (size < tcp->u_rval) ? size : tcp->u_rval; 2362 printstr(tcp, addr, len); 2363 } 2364 } 2365 tprintf(", %lu", size); 2366 } 2367 2368 int 2369 sys_listxattr(struct tcb *tcp) 2370 { 2371 if (entering(tcp)) { 2372 printpath(tcp, tcp->u_arg[0]); 2373 tprints(", "); 2374 } else { 2375 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); 2376 } 2377 return 0; 2378 } 2379 2380 int 2381 sys_flistxattr(struct tcb *tcp) 2382 { 2383 if (entering(tcp)) { 2384 printfd(tcp, tcp->u_arg[0]); 2385 tprints(", "); 2386 } else { 2387 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); 2388 } 2389 return 0; 2390 } 2391 2392 int 2393 sys_removexattr(struct tcb *tcp) 2394 { 2395 if (entering(tcp)) { 2396 printpath(tcp, tcp->u_arg[0]); 2397 tprints(", "); 2398 printstr(tcp, tcp->u_arg[1], -1); 2399 } 2400 return 0; 2401 } 2402 2403 int 2404 sys_fremovexattr(struct tcb *tcp) 2405 { 2406 if (entering(tcp)) { 2407 printfd(tcp, tcp->u_arg[0]); 2408 tprints(", "); 2409 printstr(tcp, tcp->u_arg[1], -1); 2410 } 2411 return 0; 2412 } 2413 2414 #include "xlat/advise.h" 2415 2416 int 2417 sys_fadvise64(struct tcb *tcp) 2418 { 2419 if (entering(tcp)) { 2420 int argn; 2421 printfd(tcp, tcp->u_arg[0]); 2422 argn = printllval_aligned(tcp, ", %lld", 1); 2423 tprintf(", %ld, ", tcp->u_arg[argn++]); 2424 printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???"); 2425 } 2426 return 0; 2427 } 2428 2429 int 2430 sys_fadvise64_64(struct tcb *tcp) 2431 { 2432 if (entering(tcp)) { 2433 int argn; 2434 printfd(tcp, tcp->u_arg[0]); 2435 argn = printllval_aligned(tcp, ", %lld, ", 1); 2436 argn = printllval_aligned(tcp, "%lld, ", argn); 2437 #if defined __ARM_EABI__ || defined AARCH64 || defined POWERPC || defined XTENSA 2438 printxval(advise, tcp->u_arg[1], "POSIX_FADV_???"); 2439 #else 2440 printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???"); 2441 #endif 2442 } 2443 return 0; 2444 } 2445 2446 #include "xlat/sync_file_range_flags.h" 2447 2448 int 2449 sys_sync_file_range(struct tcb *tcp) 2450 { 2451 if (entering(tcp)) { 2452 int argn; 2453 printfd(tcp, tcp->u_arg[0]); 2454 argn = printllval_aligned(tcp, ", %lld, ", 1); 2455 argn = printllval_aligned(tcp, "%lld, ", argn); 2456 printflags(sync_file_range_flags, tcp->u_arg[argn], 2457 "SYNC_FILE_RANGE_???"); 2458 } 2459 return 0; 2460 } 2461 2462 int 2463 sys_sync_file_range2(struct tcb *tcp) 2464 { 2465 if (entering(tcp)) { 2466 int argn; 2467 printfd(tcp, tcp->u_arg[0]); 2468 printflags(sync_file_range_flags, 1, 2469 "SYNC_FILE_RANGE_???"); 2470 argn = printllval_aligned(tcp, ", %lld, ", 2); 2471 argn = printllval_aligned(tcp, "%lld, ", argn); 2472 } 2473 return 0; 2474 } 2475 2476 int 2477 sys_fallocate(struct tcb *tcp) 2478 { 2479 if (entering(tcp)) { 2480 int argn; 2481 printfd(tcp, tcp->u_arg[0]); /* fd */ 2482 tprintf(", %#lo, ", tcp->u_arg[1]); /* mode */ 2483 argn = printllval_aligned(tcp, "%llu, ", 2); /* offset */ 2484 printllval_aligned(tcp, "%llu", argn); /* len */ 2485 } 2486 return 0; 2487 } 2488 2489 #ifndef SWAP_FLAG_PREFER 2490 # define SWAP_FLAG_PREFER 0x8000 2491 #endif 2492 #ifndef SWAP_FLAG_DISCARD 2493 # define SWAP_FLAG_DISCARD 0x10000 2494 #endif 2495 #include "xlat/swap_flags.h" 2496 2497 int 2498 sys_swapon(struct tcb *tcp) 2499 { 2500 if (entering(tcp)) { 2501 int flags = tcp->u_arg[1]; 2502 printpath(tcp, tcp->u_arg[0]); 2503 tprints(", "); 2504 printflags(swap_flags, flags & ~SWAP_FLAG_PRIO_MASK, 2505 "SWAP_FLAG_???"); 2506 if (flags & SWAP_FLAG_PREFER) 2507 tprintf("|%d", flags & SWAP_FLAG_PRIO_MASK); 2508 } 2509 return 0; 2510 } 2511