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