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