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