]> granicus.if.org Git - strace/blob - file.c
e285c5872cb43ac1fd79ab6048ec62b69d008492
[strace] / file.c
1 /*
2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  *      $Id$
31  */
32
33 #include "defs.h"
34
35 #include <dirent.h>
36 #ifdef linux
37 #define dirent kernel_dirent
38 #include <linux/types.h>
39 #include <linux/dirent.h>
40 #undef dirent
41 #else
42 #define kernel_dirent dirent
43 #endif
44
45 #ifdef linux
46 #  ifdef LINUXSPARC
47 struct stat {
48         unsigned short  st_dev;
49         unsigned int    st_ino;
50         unsigned short  st_mode;
51         short           st_nlink;
52         unsigned short  st_uid;
53         unsigned short  st_gid;
54         unsigned short  st_rdev;
55         unsigned int    st_size;
56         int             st_atime;
57         unsigned int    __unused1;
58         int             st_mtime;
59         unsigned int    __unused2;
60         int             st_ctime;
61         unsigned int    __unused3;
62         int             st_blksize;
63         int             st_blocks;
64         unsigned int    __unused4[2];
65 };
66 #    define stat kernel_stat
67 #    include <asm/stat.h>
68 #    undef stat
69 #  else
70 #    undef dev_t
71 #    undef ino_t
72 #    undef mode_t
73 #    undef nlink_t
74 #    undef uid_t
75 #    undef gid_t
76 #    undef off_t
77 #    undef loff_t
78
79 #    define dev_t __kernel_dev_t
80 #    define ino_t __kernel_ino_t
81 #    define mode_t __kernel_mode_t
82 #    define nlink_t __kernel_nlink_t
83 #    define uid_t __kernel_uid_t
84 #    define gid_t __kernel_gid_t
85 #    define off_t __kernel_off_t
86 #    define loff_t __kernel_loff_t
87
88 #    include <asm/stat.h>
89
90 #    undef dev_t
91 #    undef ino_t
92 #    undef mode_t
93 #    undef nlink_t
94 #    undef uid_t
95 #    undef gid_t
96 #    undef off_t
97 #    undef loff_t
98
99 #    define dev_t dev_t
100 #    define ino_t ino_t
101 #    define mode_t mode_t
102 #    define nlink_t nlink_t
103 #    define uid_t uid_t
104 #    define gid_t gid_t
105 #    define off_t off_t
106 #    define loff_t loff_t
107 #  endif
108 #  define stat libc_stat
109 #  define stat64 libc_stat64
110 #  include <sys/stat.h>
111 #  undef stat
112 #  undef stat64
113 #else
114 #  include <sys/stat.h>
115 #endif
116
117 #include <fcntl.h>
118
119 #ifdef SVR4
120 #  include <sys/cred.h>
121 #endif /* SVR4 */
122
123 #include <sys/vfs.h>
124
125 #ifdef MAJOR_IN_SYSMACROS
126 #include <sys/sysmacros.h>
127 #endif
128
129 #ifdef MAJOR_IN_MKDEV
130 #include <sys/mkdev.h>
131 #endif
132
133 #ifdef HAVE_SYS_ASYNCH_H
134 #include <sys/asynch.h>
135 #endif
136
137 #ifdef SUNOS4
138 #include <ustat.h>
139 #endif
140
141 /*
142  * This is a really dirty trick but it should always work.  Traditional
143  * Unix says r/w/rw are 0/1/2, so we make them true flags 1/2/3 by
144  * adding 1.  Just remember to add 1 to any arg decoded with openmodes.
145  */
146 struct xlat openmodes[] = {
147         { O_RDWR+1,     "O_RDWR"        },
148         { O_RDONLY+1,   "O_RDONLY"      },
149         { O_WRONLY+1,   "O_WRONLY"      },
150         { O_NONBLOCK,   "O_NONBLOCK"    },
151         { O_APPEND,     "O_APPEND"      },
152         { O_CREAT,      "O_CREAT"       },
153         { O_TRUNC,      "O_TRUNC"       },
154         { O_EXCL,       "O_EXCL"        },
155         { O_NOCTTY,     "O_NOCTTY"      },
156 #ifdef O_SYNC
157         { O_SYNC,       "O_SYNC"        },
158 #endif
159 #ifdef O_ASYNC
160         { O_ASYNC,      "O_ASYNC"       },
161 #endif
162 #ifdef O_DSYNC
163         { O_DSYNC,      "O_DSYNC"       },
164 #endif
165 #ifdef O_RSYNC
166         { O_RSYNC,      "O_RSYNC"       },
167 #endif
168 #ifdef O_NDELAY
169         { O_NDELAY,     "O_NDELAY"      },
170 #endif
171 #ifdef O_PRIV
172         { O_PRIV,       "O_PRIV"        },
173 #endif
174 #ifdef O_DIRECT
175         { O_DIRECT,     "O_DIRECT"      },
176 #endif
177 #ifdef O_LARGEFILE
178         { O_LARGEFILE,  "O_LARGEFILE"   },
179 #endif
180 #ifdef O_DIRECTORY
181         { O_DIRECTORY,  "O_DIRECTORY"   },
182 #endif
183 #ifdef O_NOFOLLOW
184         { O_NOFOLLOW,   "O_NOFOLLOW"    },
185 #endif
186
187 #ifdef FNDELAY
188         { FNDELAY,      "FNDELAY"       },
189 #endif
190 #ifdef FAPPEND
191         { FAPPEND,      "FAPPEND"       },
192 #endif
193 #ifdef FMARK
194         { FMARK,        "FMARK"         },
195 #endif
196 #ifdef FDEFER
197         { FDEFER,       "FDEFER"        },
198 #endif
199 #ifdef FASYNC
200         { FASYNC,       "FASYNC"        },
201 #endif
202 #ifdef FSHLOCK
203         { FSHLOCK,      "FSHLOCK"       },
204 #endif
205 #ifdef FEXLOCK
206         { FEXLOCK,      "FEXLOCK"       },
207 #endif
208 #ifdef FCREAT
209         { FCREAT,       "FCREAT"        },
210 #endif
211 #ifdef FTRUNC
212         { FTRUNC,       "FTRUNC"        },
213 #endif
214 #ifdef FEXCL
215         { FEXCL,        "FEXCL"         },
216 #endif
217 #ifdef FNBIO
218         { FNBIO,        "FNBIO"         },
219 #endif
220 #ifdef FSYNC
221         { FSYNC,        "FSYNC"         },
222 #endif
223 #ifdef FNOCTTY
224         { FNOCTTY,      "FNOCTTY"       },
225 #endif
226         { 0,            NULL            },
227 };
228
229 int
230 sys_open(tcp)
231 struct tcb *tcp;
232 {
233         if (entering(tcp)) {
234                 printpath(tcp, tcp->u_arg[0]);
235                 tprintf(", ");
236                 /* flags */
237                 printflags(openmodes, tcp->u_arg[1] + 1);
238                 if (tcp->u_arg[1] & O_CREAT) {
239                         /* mode */
240                         tprintf(", %#lo", tcp->u_arg[2]);
241                 }
242         }
243         return 0;
244 }
245
246 #ifdef LINUXSPARC
247 struct xlat openmodessol[] = {
248         { 0,            "O_RDWR"        },
249         { 1,            "O_RDONLY"      },
250         { 2,            "O_WRONLY"      },
251         { 0x80,         "O_NONBLOCK"    },
252         { 8,            "O_APPEND"      },
253         { 0x100,        "O_CREAT"       },
254         { 0x200,        "O_TRUNC"       },
255         { 0x400,        "O_EXCL"        },
256         { 0x800,        "O_NOCTTY"      },
257         { 0x10,         "O_SYNC"        },
258         { 0x40,         "O_DSYNC"       },
259         { 0x8000,       "O_RSYNC"       },
260         { 4,            "O_NDELAY"      },
261         { 0x1000,       "O_PRIV"        },
262         { 0,            NULL            },
263 };
264
265 int
266 solaris_open(tcp)
267 struct tcb *tcp;
268 {
269         if (entering(tcp)) {
270                 printpath(tcp, tcp->u_arg[0]);
271                 tprintf(", ");
272                 /* flags */
273                 printflags(openmodessol, tcp->u_arg[1] + 1);
274                 if (tcp->u_arg[1] & 0x100) {
275                         /* mode */
276                         tprintf(", %#lo", tcp->u_arg[2]);
277                 }
278         }
279         return 0;
280 }
281
282 #endif
283
284 int
285 sys_creat(tcp)
286 struct tcb *tcp;
287 {
288         if (entering(tcp)) {
289                 printpath(tcp, tcp->u_arg[0]);
290                 tprintf(", %#lo", tcp->u_arg[1]);
291         }
292         return 0;
293 }
294
295 static struct xlat access_flags[] = {
296         { F_OK,         "F_OK",         },
297         { R_OK,         "R_OK"          },
298         { W_OK,         "W_OK"          },
299         { X_OK,         "X_OK"          },
300 #ifdef EFF_ONLY_OK
301         { EFF_ONLY_OK,  "EFF_ONLY_OK"   },
302 #endif
303 #ifdef EX_OK
304         { EX_OK,        "EX_OK"         },
305 #endif
306         { 0,            NULL            },
307 };
308
309 int
310 sys_access(tcp)
311 struct tcb *tcp;
312 {
313         if (entering(tcp)) {
314                 printpath(tcp, tcp->u_arg[0]);
315                 tprintf(", ");
316                 printflags(access_flags, tcp->u_arg[1]);
317         }
318         return 0;
319 }
320
321 int
322 sys_umask(tcp)
323 struct tcb *tcp;
324 {
325         if (entering(tcp)) {
326                 tprintf("%#lo", tcp->u_arg[0]);
327         }
328         return RVAL_OCTAL;
329 }
330
331 static struct xlat whence[] = {
332         { SEEK_SET,     "SEEK_SET"      },
333         { SEEK_CUR,     "SEEK_CUR"      },
334         { SEEK_END,     "SEEK_END"      },
335         { 0,            NULL            },
336 };
337
338 int
339 sys_lseek(tcp)
340 struct tcb *tcp;
341 {
342         if (entering(tcp)) {
343                 tprintf("%ld, ", tcp->u_arg[0]);
344                 if (tcp->u_arg[2] == SEEK_SET)
345                         tprintf("%lu, ", tcp->u_arg[1]);
346                 else
347                         tprintf("%ld, ", tcp->u_arg[1]);
348                 printxval(whence, tcp->u_arg[2], "SEEK_???");
349         }
350         return RVAL_UDECIMAL;
351 }
352
353 #ifdef linux
354 int
355 sys_llseek (tcp)
356 struct tcb *tcp;
357 {
358     if (entering(tcp)) {
359         if (tcp->u_arg[4] == SEEK_SET)
360             tprintf("%ld, %llu, ", tcp->u_arg[0],
361                     (((long long int) tcp->u_arg[1]) << 32
362                      | (unsigned long long) tcp->u_arg[2]));
363         else
364             tprintf("%ld, %lld, ", tcp->u_arg[0],
365                     (((long long int) tcp->u_arg[1]) << 32
366                      | (unsigned long long) tcp->u_arg[2]));
367     }
368     else {
369         long long int off;
370         if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0)
371             tprintf("%#lx, ", tcp->u_arg[3]);
372         else
373             tprintf("[%llu], ", off);
374         printxval(whence, tcp->u_arg[4], "SEEK_???");
375     }
376     return 0;
377 }
378 #endif
379
380 int
381 sys_truncate(tcp)
382 struct tcb *tcp;
383 {
384         if (entering(tcp)) {
385                 printpath(tcp, tcp->u_arg[0]);
386                 tprintf(", %lu", tcp->u_arg[1]);
387         }
388         return 0;
389 }
390
391 int
392 sys_ftruncate(tcp)
393 struct tcb *tcp;
394 {
395         if (entering(tcp)) {
396                 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
397         }
398         return 0;
399 }
400
401 /* several stats */
402
403 static struct xlat modetypes[] = {
404         { S_IFREG,      "S_IFREG"       },
405         { S_IFSOCK,     "S_IFSOCK"      },
406         { S_IFIFO,      "S_IFIFO"       },
407         { S_IFLNK,      "S_IFLNK"       },
408         { S_IFDIR,      "S_IFDIR"       },
409         { S_IFBLK,      "S_IFBLK"       },
410         { S_IFCHR,      "S_IFCHR"       },
411         { 0,            NULL            },
412 };
413
414 static char *
415 sprintmode(mode)
416 int mode;
417 {
418         static char buf[64];
419         char *s;
420
421         if ((mode & S_IFMT) == 0)
422                 s = "";
423         else if ((s = xlookup(modetypes, mode & S_IFMT)) == NULL) {
424                 sprintf(buf, "%#o", mode);
425                 return buf;
426         }
427         sprintf(buf, "%s%s%s%s", s,
428                 (mode & S_ISUID) ? "|S_ISUID" : "",
429                 (mode & S_ISGID) ? "|S_ISGID" : "",
430                 (mode & S_ISVTX) ? "|S_ISVTX" : "");
431         mode &= ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX);
432         if (mode)
433                 sprintf(buf + strlen(buf), "|%#o", mode);
434         s = (*buf == '|') ? buf + 1 : buf;
435         return *s ? s : "0";
436 }
437
438 static char *
439 sprinttime(t)
440 time_t t;
441 {
442         struct tm *tmp;
443         static char buf[32];
444
445         if (t == 0) {
446                 sprintf(buf, "0");
447                 return buf;
448         }
449         tmp = localtime(&t);
450         sprintf(buf, "%02d/%02d/%02d-%02d:%02d:%02d",
451                 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
452                 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
453         return buf;
454 }
455
456 #ifdef LINUXSPARC
457 typedef struct {
458         int     tv_sec;
459         int     tv_nsec;
460 } timestruct_t;
461
462 struct solstat {
463         unsigned        st_dev;
464         int             st_pad1[3];     /* network id */
465         unsigned        st_ino;
466         unsigned        st_mode;
467         unsigned        st_nlink;
468         unsigned        st_uid;
469         unsigned        st_gid;
470         unsigned        st_rdev;
471         int             st_pad2[2];
472         int             st_size;
473         int             st_pad3;        /* st_size, off_t expansion */
474         timestruct_t    st_atime;
475         timestruct_t    st_mtime;
476         timestruct_t    st_ctime;
477         int             st_blksize;
478         int             st_blocks;
479         char            st_fstype[16];
480         int             st_pad4[8];     /* expansion area */
481 };
482
483 static void
484 printstatsol(tcp, addr)
485 struct tcb *tcp;
486 long addr;
487 {
488         struct solstat statbuf;
489
490         if (!addr) {
491                 tprintf("NULL");
492                 return;
493         }
494         if (syserror(tcp) || !verbose(tcp)) {
495                 tprintf("%#lx", addr);
496                 return;
497         }
498         if (umove(tcp, addr, &statbuf) < 0) {
499                 tprintf("{...}");
500                 return;
501         }
502         if (!abbrev(tcp)) {
503                 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
504                         (unsigned long) ((statbuf.st_dev >> 18) & 0x3fff),
505                         (unsigned long) (statbuf.st_dev & 0x3ffff),
506                         (unsigned long) statbuf.st_ino,
507                         sprintmode(statbuf.st_mode));
508                 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
509                         (unsigned long) statbuf.st_nlink,
510                         (unsigned long) statbuf.st_uid,
511                         (unsigned long) statbuf.st_gid);
512                 tprintf("st_blksize=%lu, ", (unsigned long) statbuf.st_blksize);
513                 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
514         }
515         else
516                 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
517         switch (statbuf.st_mode & S_IFMT) {
518         case S_IFCHR: case S_IFBLK:
519                 tprintf("st_rdev=makedev(%lu, %lu), ",
520                         (unsigned long) ((statbuf.st_rdev >> 18) & 0x3fff),
521                         (unsigned long) (statbuf.st_rdev & 0x3ffff));
522                 break;
523         default:
524                 tprintf("st_size=%u, ", statbuf.st_size);
525                 break;
526         }
527         if (!abbrev(tcp)) {
528                 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
529                 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
530                 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
531         }
532         else
533                 tprintf("...}");
534 }
535 #endif /* LINUXSPARC */
536
537 static void
538 realprintstat(tcp, statbuf)
539 struct tcb *tcp;
540 struct stat *statbuf;
541 {
542     if (!abbrev(tcp)) {
543             tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
544                     (unsigned long) major(statbuf->st_dev),
545                     (unsigned long) minor(statbuf->st_dev),
546                     (unsigned long) statbuf->st_ino,
547                     sprintmode(statbuf->st_mode));
548             tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
549                     (unsigned long) statbuf->st_nlink,
550                     (unsigned long) statbuf->st_uid,
551                     (unsigned long) statbuf->st_gid);
552 #ifdef HAVE_ST_BLKSIZE
553             tprintf("st_blksize=%lu, ", (unsigned long) statbuf->st_blksize);
554 #endif /* HAVE_ST_BLKSIZE */
555 #ifdef HAVE_ST_BLOCKS
556             tprintf("st_blocks=%lu, ", (unsigned long) statbuf->st_blocks);
557 #endif /* HAVE_ST_BLOCKS */
558     }
559     else
560             tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode));
561     switch (statbuf->st_mode & S_IFMT) {
562     case S_IFCHR: case S_IFBLK:
563 #ifdef HAVE_ST_RDEV
564             tprintf("st_rdev=makedev(%lu, %lu), ",
565                     (unsigned long) major(statbuf->st_rdev),
566                     (unsigned long) minor(statbuf->st_rdev));
567 #else /* !HAVE_ST_RDEV */
568             tprintf("st_size=makedev(%lu, %lu), ",
569                     (unsigned long) major(statbuf->st_size),
570                     (unsigned long) minor(statbuf->st_size));
571 #endif /* !HAVE_ST_RDEV */
572             break;
573     default:
574             tprintf("st_size=%lu, ", statbuf->st_size);
575             break;
576     }
577     if (!abbrev(tcp)) {
578             tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
579             tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
580             tprintf("st_ctime=%s}", sprinttime(statbuf->st_ctime));
581     }
582     else
583             tprintf("...}");
584 }
585
586
587 static void
588 printstat(tcp, addr)
589 struct tcb *tcp;
590 long addr;
591 {
592         struct stat statbuf;
593
594 #ifdef LINUXSPARC
595         if (current_personality == 1) {
596                 printstatsol(tcp, addr);
597                 return;
598         }
599 #endif /* LINUXSPARC */
600
601         if (!addr) {
602                 tprintf("NULL");
603                 return;
604         }
605         if (syserror(tcp) || !verbose(tcp)) {
606                 tprintf("%#lx", addr);
607                 return;
608         }
609         if (umove(tcp, addr, &statbuf) < 0) {
610                 tprintf("{...}");
611                 return;
612         }
613
614         realprintstat(tcp, &statbuf);
615 }
616
617 #ifdef HAVE_STAT64
618 static void
619 printstat64(tcp, addr)
620 struct tcb *tcp;
621 long addr;
622 {
623         struct stat64 statbuf;
624
625 #ifdef LINUXSPARC
626         if (current_personality == 1) {
627                 printstatsol(tcp, addr);
628                 return;
629         }
630 #endif /* LINUXSPARC */
631
632         if (!addr) {
633                 tprintf("NULL");
634                 return;
635         }
636         if (syserror(tcp) || !verbose(tcp)) {
637                 tprintf("%#lx", addr);
638                 return;
639         }
640         if (umove(tcp, addr, &statbuf) < 0) {
641                 tprintf("{...}");
642                 return;
643         }
644
645         if (!abbrev(tcp)) {
646                 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
647                         (unsigned long) major(statbuf.st_dev),
648                         (unsigned long) minor(statbuf.st_dev),
649                         (unsigned long) statbuf.st_ino,
650                         sprintmode(statbuf.st_mode));
651                 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
652                         (unsigned long) statbuf.st_nlink,
653                         (unsigned long) statbuf.st_uid,
654                         (unsigned long) statbuf.st_gid);
655 #ifdef HAVE_ST_BLKSIZE
656                 tprintf("st_blksize=%lu, ",
657                         (unsigned long) statbuf.st_blksize);
658 #endif /* HAVE_ST_BLKSIZE */
659 #ifdef HAVE_ST_BLOCKS
660                 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
661 #endif /* HAVE_ST_BLOCKS */
662         }
663         else
664                 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
665         switch (statbuf.st_mode & S_IFMT) {
666         case S_IFCHR: case S_IFBLK:
667 #ifdef HAVE_ST_RDEV
668                 tprintf("st_rdev=makedev(%lu, %lu), ",
669                         (unsigned long) major(statbuf.st_rdev),
670                         (unsigned long) minor(statbuf.st_rdev));
671 #else /* !HAVE_ST_RDEV */
672                 tprintf("st_size=makedev(%lu, %lu), ",
673                         (unsigned long) major(statbuf.st_size),
674                         (unsigned long) minor(statbuf.st_size));
675 #endif /* !HAVE_ST_RDEV */
676                 break;
677         default:
678                 tprintf("st_size=%llu, ", statbuf.st_size);
679                 break;
680         }
681         if (!abbrev(tcp)) {
682                 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
683                 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
684                 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
685         }
686         else
687                 tprintf("...}");
688 }
689 #endif /* HAVE_STAT64 */
690
691 #if defined(linux) && !defined(IA64)
692 static void
693 convertoldstat(oldbuf, newbuf)
694 const struct __old_kernel_stat *oldbuf;
695 struct stat *newbuf;
696 {
697     newbuf->st_dev=oldbuf->st_dev;
698     newbuf->st_ino=oldbuf->st_ino;
699     newbuf->st_mode=oldbuf->st_mode;
700     newbuf->st_nlink=oldbuf->st_nlink;
701     newbuf->st_uid=oldbuf->st_uid;
702     newbuf->st_gid=oldbuf->st_gid;
703     newbuf->st_rdev=oldbuf->st_rdev;
704     newbuf->st_size=oldbuf->st_size;
705     newbuf->st_atime=oldbuf->st_atime;
706     newbuf->st_mtime=oldbuf->st_mtime;
707     newbuf->st_ctime=oldbuf->st_ctime;
708     newbuf->st_blksize=0;       /* not supported in old_stat */
709     newbuf->st_blocks=0;                /* not supported in old_stat */
710 }
711
712
713 static void
714 printoldstat(tcp, addr)
715 struct tcb *tcp;
716 long addr;
717 {
718         struct __old_kernel_stat statbuf;
719         struct stat newstatbuf;
720
721 #ifdef LINUXSPARC
722         if (current_personality == 1) {
723                 printstatsol(tcp, addr);
724                 return;
725         }
726 #endif /* LINUXSPARC */
727
728         if (!addr) {
729                 tprintf("NULL");
730                 return;
731         }
732         if (syserror(tcp) || !verbose(tcp)) {
733                 tprintf("%#lx", addr);
734                 return;
735         }
736         if (umove(tcp, addr, &statbuf) < 0) {
737                 tprintf("{...}");
738                 return;
739         }
740
741         convertoldstat(&statbuf, &newstatbuf);
742         realprintstat(tcp, &newstatbuf);
743 }
744 #endif /* linux && !IA64 */
745
746
747 int
748 sys_stat(tcp)
749 struct tcb *tcp;
750 {
751         if (entering(tcp)) {
752                 printpath(tcp, tcp->u_arg[0]);
753                 tprintf(", ");
754         } else {
755                 printstat(tcp, tcp->u_arg[1]);
756         }
757         return 0;
758 }
759
760 #ifdef linux
761 int
762 sys_stat64(tcp)
763 struct tcb *tcp;
764 {
765 #ifdef HAVE_STAT64
766         if (entering(tcp)) {
767                 printpath(tcp, tcp->u_arg[0]);
768                 tprintf(", ");
769         } else {
770                 printstat64(tcp, tcp->u_arg[1]);
771         }
772         return 0;
773 #else
774         return printargs(tcp);
775 #endif
776 }
777
778 # if !defined(IA64)
779 int
780 sys_oldstat(tcp)
781 struct tcb *tcp;
782 {
783         if (entering(tcp)) {
784                 printpath(tcp, tcp->u_arg[0]);
785                 tprintf(", ");
786         } else {
787                 printoldstat(tcp, tcp->u_arg[1]);
788         }
789         return 0;
790 }
791 # endif /* !IA64 */
792 #endif /* linux */
793
794 int
795 sys_fstat(tcp)
796 struct tcb *tcp;
797 {
798         if (entering(tcp))
799                 tprintf("%ld, ", tcp->u_arg[0]);
800         else {
801                 printstat(tcp, tcp->u_arg[1]);
802         }
803         return 0;
804 }
805
806 #ifdef linux
807 int
808 sys_fstat64(tcp)
809 struct tcb *tcp;
810 {
811 #ifdef HAVE_STAT64
812         if (entering(tcp))
813                 tprintf("%ld, ", tcp->u_arg[0]);
814         else {
815                 printstat64(tcp, tcp->u_arg[1]);
816         }
817         return 0;
818 #else
819         return printargs(tcp);
820 #endif
821 }
822
823 # if !defined(IA64)
824 int
825 sys_oldfstat(tcp)
826 struct tcb *tcp;
827 {
828         if (entering(tcp))
829                 tprintf("%ld, ", tcp->u_arg[0]);
830         else {
831                 printoldstat(tcp, tcp->u_arg[1]);
832         }
833         return 0;
834 }
835 # endif /* !IA64 */
836 #endif
837
838 int
839 sys_lstat(tcp)
840 struct tcb *tcp;
841 {
842         if (entering(tcp)) {
843                 printpath(tcp, tcp->u_arg[0]);
844                 tprintf(", ");
845         } else {
846                 printstat(tcp, tcp->u_arg[1]);
847         }
848         return 0;
849 }
850
851 #ifdef linux
852 int
853 sys_lstat64(tcp)
854 struct tcb *tcp;
855 {
856 #ifdef HAVE_STAT64
857         if (entering(tcp)) {
858                 printpath(tcp, tcp->u_arg[0]);
859                 tprintf(", ");
860         } else {
861                 printstat64(tcp, tcp->u_arg[1]);
862         }
863         return 0;
864 #else
865         return printargs(tcp);
866 #endif
867 }
868
869 # if !defined(IA64)
870 int
871 sys_oldlstat(tcp)
872 struct tcb *tcp;
873 {
874         if (entering(tcp)) {
875                 printpath(tcp, tcp->u_arg[0]);
876                 tprintf(", ");
877         } else {
878                 printoldstat(tcp, tcp->u_arg[1]);
879         }
880         return 0;
881 }
882 # endif /* !IA64 */
883 #endif
884
885
886 #if defined(SVR4) || defined(LINUXSPARC)
887
888 int
889 sys_xstat(tcp)
890 struct tcb *tcp;
891 {
892         if (entering(tcp)) {
893                 tprintf("%ld, ", tcp->u_arg[0]);
894                 printpath(tcp, tcp->u_arg[1]);
895                 tprintf(", ");
896         } else {
897                 printstat(tcp, tcp->u_arg[2]);
898         }
899         return 0;
900 }
901
902 int
903 sys_fxstat(tcp)
904 struct tcb *tcp;
905 {
906         if (entering(tcp))
907                 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]);
908         else {
909                 printstat(tcp, tcp->u_arg[2]);
910         }
911         return 0;
912 }
913
914 int
915 sys_lxstat(tcp)
916 struct tcb *tcp;
917 {
918         if (entering(tcp)) {
919                 tprintf("%ld, ", tcp->u_arg[0]);
920                 printpath(tcp, tcp->u_arg[1]);
921                 tprintf(", ");
922         } else {
923                 printstat(tcp, tcp->u_arg[2]);
924         }
925         return 0;
926 }
927
928 int
929 sys_xmknod(tcp)
930 struct tcb *tcp;
931 {
932         int mode = tcp->u_arg[2];
933
934         if (entering(tcp)) {
935                 tprintf("%ld, ", tcp->u_arg[0]);
936                 printpath(tcp, tcp->u_arg[1]);
937                 tprintf(", %s", sprintmode(mode));
938                 switch (mode & S_IFMT) {
939                 case S_IFCHR: case S_IFBLK:
940 #ifdef LINUXSPARC
941                         tprintf(", makedev(%lu, %lu)",
942                                 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
943                                 (unsigned long) (tcp->u_arg[3] & 0x3ffff));
944 #else           
945                         tprintf(", makedev(%lu, %lu)",
946                                 (unsigned long) major(tcp->u_arg[3]),
947                                 (unsigned long) minor(tcp->u_arg[3]));
948 #endif                          
949                         break;
950                 default:
951                         break;
952                 }
953         }
954         return 0;
955 }
956
957 #ifdef HAVE_SYS_ACL_H
958
959 #include <sys/acl.h>
960
961 struct xlat aclcmds[] = {
962 #ifdef SETACL
963         { SETACL,       "SETACL"        },
964 #endif
965 #ifdef GETACL
966         { GETACL,       "GETACL"        },
967 #endif
968 #ifdef GETACLCNT
969         { GETACLCNT,    "GETACLCNT"     },
970 #endif
971 #ifdef ACL_GET
972         { ACL_GET,      "ACL_GET"       },
973 #endif  
974 #ifdef ACL_SET
975         { ACL_SET,      "ACL_SET"       },
976 #endif  
977 #ifdef ACL_CNT
978         { ACL_CNT,      "ACL_CNT"       },
979 #endif  
980         { 0,            NULL            },
981 };
982
983 int
984 sys_acl(tcp)
985 struct tcb *tcp;
986 {
987         if (entering(tcp)) {
988                 printpath(tcp, tcp->u_arg[0]);
989                 tprintf(", ");
990                 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
991                 tprintf(", %ld", tcp->u_arg[2]);
992                 /*
993                  * FIXME - dump out the list of aclent_t's pointed to
994                  * by "tcp->u_arg[3]" if it's not NULL.
995                  */
996                 if (tcp->u_arg[3])
997                         tprintf(", %#lx", tcp->u_arg[3]);
998                 else
999                         tprintf(", NULL");
1000         }
1001         return 0;
1002 }
1003
1004
1005 int
1006 sys_facl(tcp)
1007 struct tcb *tcp;
1008 {
1009         if (entering(tcp)) {
1010                 tprintf("%ld, ", tcp->u_arg[0]);
1011                 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
1012                 tprintf(", %ld", tcp->u_arg[2]);
1013                 /*
1014                  * FIXME - dump out the list of aclent_t's pointed to
1015                  * by "tcp->u_arg[3]" if it's not NULL.
1016                  */
1017                 if (tcp->u_arg[3])
1018                         tprintf(", %#lx", tcp->u_arg[3]);
1019                 else
1020                         tprintf(", NULL");
1021         }
1022         return 0;
1023 }
1024
1025
1026 struct xlat aclipc[] = {
1027 #ifdef IPC_SHM
1028         { IPC_SHM,      "IPC_SHM"       },
1029 #endif  
1030 #ifdef IPC_SEM
1031         { IPC_SEM,      "IPC_SEM"       },
1032 #endif  
1033 #ifdef IPC_MSG
1034         { IPC_MSG,      "IPC_MSG"       },
1035 #endif  
1036         { 0,            NULL            },
1037 };
1038
1039
1040 int
1041 sys_aclipc(tcp)
1042 struct tcb *tcp;
1043 {
1044         if (entering(tcp)) {
1045                 printxval(aclipc, tcp->u_arg[0], "???IPC???");
1046                 tprintf(", %#lx, ", tcp->u_arg[1]);
1047                 printxval(aclcmds, tcp->u_arg[2], "???ACL???");
1048                 tprintf(", %ld", tcp->u_arg[3]);
1049                 /*
1050                  * FIXME - dump out the list of aclent_t's pointed to
1051                  * by "tcp->u_arg[4]" if it's not NULL.
1052                  */
1053                 if (tcp->u_arg[4])
1054                         tprintf(", %#lx", tcp->u_arg[4]);
1055                 else
1056                         tprintf(", NULL");
1057         }
1058         return 0;
1059 }
1060
1061
1062
1063 #endif /* HAVE_SYS_ACL_H */
1064
1065 #endif /* SVR4 || LINUXSPARC */
1066
1067 #ifdef linux
1068
1069 static struct xlat fsmagic[] = {
1070         { 0x73757245,   "CODA_SUPER_MAGIC"      },
1071         { 0x012ff7b7,   "COH_SUPER_MAGIC"       },
1072         { 0x1373,       "DEVFS_SUPER_MAGIC"     },
1073         { 0x1cd1,       "DEVPTS_SUPER_MAGIC"    },
1074         { 0x414A53,     "EFS_SUPER_MAGIC"       },
1075         { 0xef51,       "EXT2_OLD_SUPER_MAGIC"  },
1076         { 0xef53,       "EXT2_SUPER_MAGIC"      },
1077         { 0x137d,       "EXT_SUPER_MAGIC"       },
1078         { 0xf995e849,   "HPFS_SUPER_MAGIC"      },
1079         { 0x9660,       "ISOFS_SUPER_MAGIC"     },
1080         { 0x137f,       "MINIX_SUPER_MAGIC"     },
1081         { 0x138f,       "MINIX_SUPER_MAGIC2"    },
1082         { 0x2468,       "MINIX2_SUPER_MAGIC"    },
1083         { 0x2478,       "MINIX2_SUPER_MAGIC2"   },
1084         { 0x4d44,       "MSDOS_SUPER_MAGIC"     },
1085         { 0x564c,       "NCP_SUPER_MAGIC"       },
1086         { 0x6969,       "NFS_SUPER_MAGIC"       },
1087         { 0x9fa0,       "PROC_SUPER_MAGIC"      },
1088         { 0x002f,       "QNX4_SUPER_MAGIC"      },
1089         { 0x52654973,   "REISERFS_SUPER_MAGIC"  },
1090         { 0x02011994,   "SHMFS_SUPER_MAGIC"     },
1091         { 0x517b,       "SMB_SUPER_MAGIC"       },
1092         { 0x012ff7b6,   "SYSV2_SUPER_MAGIC"     },
1093         { 0x012ff7b5,   "SYSV4_SUPER_MAGIC"     },
1094         { 0x00011954,   "UFS_MAGIC"             },
1095         { 0x54190100,   "UFS_CIGAM"             },
1096         { 0x012ff7b4,   "XENIX_SUPER_MAGIC"     },
1097         { 0x012fd16d,   "XIAFS_SUPER_MAGIC"     },
1098         { 0,            NULL                    },
1099 };
1100
1101 #endif /* linux */
1102
1103 #ifndef SVR4
1104
1105 static char *
1106 sprintfstype(magic)
1107 int magic;
1108 {
1109         static char buf[32];
1110 #ifdef linux
1111         char *s;
1112
1113         s = xlookup(fsmagic, magic);
1114         if (s) {
1115                 sprintf(buf, "\"%s\"", s);
1116                 return buf;
1117         }
1118 #endif /* linux */
1119         sprintf(buf, "%#x", magic);
1120         return buf;
1121 }
1122
1123 static void
1124 printstatfs(tcp, addr)
1125 struct tcb *tcp;
1126 long addr;
1127 {
1128         struct statfs statbuf;
1129
1130         if (syserror(tcp) || !verbose(tcp)) {
1131                 tprintf("%#lx", addr);
1132                 return;
1133         }
1134         if (umove(tcp, addr, &statbuf) < 0) {
1135                 tprintf("{...}");
1136                 return;
1137         }
1138 #ifdef ALPHA
1139
1140         tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ",
1141                 sprintfstype(statbuf.f_type),
1142                 statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree);
1143         tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_namelen=%u",
1144                 statbuf.f_bavail,statbuf.f_files, statbuf.f_ffree, statbuf.f_namelen);
1145 #else /* !ALPHA */
1146         tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ",
1147                 sprintfstype(statbuf.f_type),
1148                 (unsigned long)statbuf.f_bsize,
1149                 (unsigned long)statbuf.f_blocks,
1150                 (unsigned long)statbuf.f_bfree);
1151         tprintf("f_files=%lu, f_ffree=%lu",
1152                 (unsigned long)statbuf.f_files,
1153                 (unsigned long)statbuf.f_ffree);
1154 #ifdef linux
1155         tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
1156 #endif /* linux */
1157 #endif /* !ALPHA */
1158         tprintf("}");
1159 }
1160
1161 int
1162 sys_statfs(tcp)
1163 struct tcb *tcp;
1164 {
1165         if (entering(tcp)) {
1166                 printpath(tcp, tcp->u_arg[0]);
1167                 tprintf(", ");
1168         } else {
1169                 printstatfs(tcp, tcp->u_arg[1]);
1170         }
1171         return 0;
1172 }
1173
1174 int
1175 sys_fstatfs(tcp)
1176 struct tcb *tcp;
1177 {
1178         if (entering(tcp)) {
1179                 tprintf("%lu, ", tcp->u_arg[0]);
1180         } else {
1181                 printstatfs(tcp, tcp->u_arg[1]);
1182         }
1183         return 0;
1184 }
1185
1186 #if defined(linux) && defined(__alpha)
1187
1188 int
1189 osf_statfs(tcp)
1190 struct tcb *tcp;
1191 {
1192         if (entering(tcp)) {
1193                 printpath(tcp, tcp->u_arg[0]);
1194                 tprintf(", ");
1195         } else {
1196                 printstatfs(tcp, tcp->u_arg[1]);
1197                 tprintf(", %lu", tcp->u_arg[2]);
1198         }
1199         return 0;
1200 }
1201
1202 int
1203 osf_fstatfs(tcp)
1204 struct tcb *tcp;
1205 {
1206         if (entering(tcp)) {
1207                 tprintf("%lu, ", tcp->u_arg[0]);
1208         } else {
1209                 printstatfs(tcp, tcp->u_arg[1]);
1210                 tprintf(", %lu", tcp->u_arg[2]);
1211         }
1212         return 0;
1213 }
1214 #endif /* linux && __alpha */
1215
1216 #endif /* !SVR4 */
1217
1218 #ifdef SUNOS4
1219
1220 int
1221 sys_ustat(tcp)
1222 struct tcb *tcp;
1223 {
1224         struct ustat statbuf;
1225
1226         if (entering(tcp)) {
1227                 tprintf("makedev(%lu, %lu), ",
1228                                 (long) major(tcp->u_arg[0]),
1229                                 (long) minor(tcp->u_arg[0]));
1230         }
1231         else {
1232                 if (syserror(tcp) || !verbose(tcp))
1233                         tprintf("%#lx", tcp->u_arg[1]);
1234                 else if (umove(tcp, tcp->u_arg[1], &statbuf) < 0)
1235                         tprintf("{...}");
1236                 else {
1237                         tprintf("{f_tfree=%lu, f_tinode=%lu, ",
1238                                 statbuf.f_tfree, statbuf.f_tinode);
1239                         tprintf("f_fname=\"%.*s\", ",
1240                                 (int) sizeof(statbuf.f_fname),
1241                                 statbuf.f_fname);
1242                         tprintf("f_fpack=\"%.*s\"}",
1243                                 (int) sizeof(statbuf.f_fpack),
1244                                 statbuf.f_fpack);
1245                 }
1246         }
1247         return 0;
1248 }
1249
1250 #endif /* SUNOS4 */
1251
1252 int
1253 sys_pivotroot(tcp)
1254 struct tcb *tcp;
1255 {
1256         if (entering(tcp)) {
1257                 printpath(tcp, tcp->u_arg[0]);
1258                 tprintf(", ");
1259                 printpath(tcp, tcp->u_arg[1]);
1260         }
1261         return 0;
1262 }
1263
1264
1265 /* directory */
1266 int
1267 sys_chdir(tcp)
1268 struct tcb *tcp;
1269 {
1270         if (entering(tcp)) {
1271                 printpath(tcp, tcp->u_arg[0]);
1272         }
1273         return 0;
1274 }
1275
1276 int
1277 sys_mkdir(tcp)
1278 struct tcb *tcp;
1279 {
1280         if (entering(tcp)) {
1281                 printpath(tcp, tcp->u_arg[0]);
1282                 tprintf(", %#lo", tcp->u_arg[1]);
1283         }
1284         return 0;
1285 }
1286
1287 int
1288 sys_rmdir(tcp)
1289 struct tcb *tcp;
1290 {
1291         if (entering(tcp)) {
1292                 printpath(tcp, tcp->u_arg[0]);
1293         }
1294         return 0;
1295 }
1296
1297 int
1298 sys_fchdir(tcp)
1299 struct tcb *tcp;
1300 {
1301         if (entering(tcp)) {
1302                 tprintf("%ld", tcp->u_arg[0]);
1303         }
1304         return 0;
1305 }
1306
1307 int
1308 sys_chroot(tcp)
1309 struct tcb *tcp;
1310 {
1311         if (entering(tcp)) {
1312                 printpath(tcp, tcp->u_arg[0]);
1313         }
1314         return 0;
1315 }
1316
1317 int
1318 sys_fchroot(tcp)
1319 struct tcb *tcp;
1320 {
1321         if (entering(tcp)) {
1322                 tprintf("%ld", tcp->u_arg[0]);
1323         }
1324         return 0;
1325 }
1326
1327 int
1328 sys_link(tcp)
1329 struct tcb *tcp;
1330 {
1331         if (entering(tcp)) {
1332                 printpath(tcp, tcp->u_arg[0]);
1333                 tprintf(", ");
1334                 printpath(tcp, tcp->u_arg[1]);
1335         }
1336         return 0;
1337 }
1338
1339 int
1340 sys_unlink(tcp)
1341 struct tcb *tcp;
1342 {
1343         if (entering(tcp)) {
1344                 printpath(tcp, tcp->u_arg[0]);
1345         }
1346         return 0;
1347 }
1348
1349 int
1350 sys_symlink(tcp)
1351 struct tcb *tcp;
1352 {
1353         if (entering(tcp)) {
1354                 printpath(tcp, tcp->u_arg[0]);
1355                 tprintf(", ");
1356                 printpath(tcp, tcp->u_arg[1]);
1357         }
1358         return 0;
1359 }
1360
1361 int
1362 sys_readlink(tcp)
1363 struct tcb *tcp;
1364 {
1365         if (entering(tcp)) {
1366                 printpath(tcp, tcp->u_arg[0]);
1367                 tprintf(", ");
1368         } else {
1369                 if (syserror(tcp))
1370                         tprintf("%#lx", tcp->u_arg[1]);
1371                 else
1372                         printpathn(tcp, tcp->u_arg[1], tcp->u_rval);
1373                 tprintf(", %lu", tcp->u_arg[2]);
1374         }
1375         return 0;
1376 }
1377
1378 int
1379 sys_rename(tcp)
1380 struct tcb *tcp;
1381 {
1382         if (entering(tcp)) {
1383                 printpath(tcp, tcp->u_arg[0]);
1384                 tprintf(", ");
1385                 printpath(tcp, tcp->u_arg[1]);
1386         }
1387         return 0;
1388 }
1389
1390 int
1391 sys_chown(tcp)
1392 struct tcb *tcp;
1393 {
1394         if (entering(tcp)) {
1395                 printpath(tcp, tcp->u_arg[0]);
1396                 tprintf(", %lu, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1397         }
1398         return 0;
1399 }
1400
1401 int
1402 sys_fchown(tcp)
1403 struct tcb *tcp;
1404 {
1405         if (entering(tcp)) {
1406                 tprintf("%ld, %lu, %lu",
1407                         tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
1408         }
1409         return 0;
1410 }
1411
1412 int
1413 sys_chmod(tcp)
1414 struct tcb *tcp;
1415 {
1416         if (entering(tcp)) {
1417                 printpath(tcp, tcp->u_arg[0]);
1418                 tprintf(", %#lo", tcp->u_arg[1]);
1419         }
1420         return 0;
1421 }
1422
1423 int
1424 sys_fchmod(tcp)
1425 struct tcb *tcp;
1426 {
1427         if (entering(tcp)) {
1428                 tprintf("%ld, %#lo", tcp->u_arg[0], tcp->u_arg[1]);
1429         }
1430         return 0;
1431 }
1432
1433 #ifdef ALPHA
1434 int
1435 sys_osf_utimes(tcp)
1436 struct tcb *tcp;
1437 {
1438     if (entering(tcp)) {
1439         printpath(tcp, tcp->u_arg[0]);
1440         tprintf(", ");
1441         printtv32(tcp, tcp->u_arg[1]);
1442     }
1443     return 0;
1444 }
1445 #endif
1446
1447 int
1448 sys_utimes(tcp)
1449 struct tcb *tcp;
1450 {
1451         if (entering(tcp)) {
1452                 printpath(tcp, tcp->u_arg[0]);
1453                 tprintf(", ");
1454                 printtv(tcp, tcp->u_arg[1]);
1455         }
1456         return 0;
1457 }
1458
1459 int
1460 sys_utime(tcp)
1461 struct tcb *tcp;
1462 {
1463         long ut[2];
1464
1465         if (entering(tcp)) {
1466                 printpath(tcp, tcp->u_arg[0]);
1467                 tprintf(", ");
1468                 if (!tcp->u_arg[1])
1469                         tprintf("NULL");
1470                 else if (!verbose(tcp))
1471                         tprintf("%#lx", tcp->u_arg[1]);
1472                 else if (umoven(tcp, tcp->u_arg[1], sizeof ut,
1473                     (char *) ut) < 0)
1474                         tprintf("[?, ?]");
1475                 else {
1476                         tprintf("[%s,", sprinttime(ut[0]));
1477                         tprintf(" %s]", sprinttime(ut[1]));
1478                 }
1479         }
1480         return 0;
1481 }
1482
1483 int
1484 sys_mknod(tcp)
1485 struct tcb *tcp;
1486 {
1487         int mode = tcp->u_arg[1];
1488
1489         if (entering(tcp)) {
1490                 printpath(tcp, tcp->u_arg[0]);
1491                 tprintf(", %s", sprintmode(mode));
1492                 switch (mode & S_IFMT) {
1493                 case S_IFCHR: case S_IFBLK:
1494 #ifdef LINUXSPARC
1495                         if (current_personality == 1)
1496                         tprintf(", makedev(%lu, %lu)",
1497                                 (unsigned long) ((tcp->u_arg[2] >> 18) & 0x3fff),
1498                                 (unsigned long) (tcp->u_arg[2] & 0x3ffff));
1499                         else
1500 #endif  
1501                         tprintf(", makedev(%lu, %lu)",
1502                                 (unsigned long) major(tcp->u_arg[2]),
1503                                 (unsigned long) minor(tcp->u_arg[2]));
1504                         break;
1505                 default:
1506                         break;
1507                 }
1508         }
1509         return 0;
1510 }
1511
1512 int
1513 sys_mkfifo(tcp)
1514 struct tcb *tcp;
1515 {
1516         if (entering(tcp)) {
1517                 printpath(tcp, tcp->u_arg[0]);
1518                 tprintf(", %#lo", tcp->u_arg[1]);
1519         }
1520         return 0;
1521 }
1522
1523 int
1524 sys_fsync(tcp)
1525 struct tcb *tcp;
1526 {
1527         if (entering(tcp)) {
1528                 tprintf("%ld", tcp->u_arg[0]);
1529         }
1530         return 0;
1531 }
1532
1533 #ifdef linux
1534
1535 static void
1536 printdir(tcp, addr)
1537 struct tcb *tcp;
1538 long addr;
1539 {
1540         struct dirent d;
1541
1542         if (!verbose(tcp)) {
1543                 tprintf("%#lx", addr);
1544                 return;
1545         }
1546         if (umove(tcp, addr, &d) < 0) {
1547                 tprintf("{...}");
1548                 return;
1549         }
1550         tprintf("{d_ino=%ld, ", (unsigned long) d.d_ino);
1551         tprintf("d_name=");
1552         printpathn(tcp, (long) ((struct dirent *) addr)->d_name, d.d_reclen);
1553         tprintf("}");
1554 }
1555
1556 int
1557 sys_readdir(tcp)
1558 struct tcb *tcp;
1559 {
1560         if (entering(tcp)) {
1561                 tprintf("%lu, ", tcp->u_arg[0]);
1562         } else {
1563                 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
1564                         tprintf("%#lx", tcp->u_arg[1]);
1565                 else
1566                         printdir(tcp, tcp->u_arg[1]);
1567                 /* Not much point in printing this out, it is always 1. */
1568                 if (tcp->u_arg[2] != 1)
1569                         tprintf(", %lu", tcp->u_arg[2]);
1570         }
1571         return 0;
1572 }
1573
1574 #endif /* linux */
1575
1576 int
1577 sys_getdents(tcp)
1578 struct tcb *tcp;
1579 {
1580         int i, len, dents = 0;
1581         char *buf;
1582
1583         if (entering(tcp)) {
1584                 tprintf("%lu, ", tcp->u_arg[0]);
1585                 return 0;
1586         }
1587         if (syserror(tcp) || !verbose(tcp)) {
1588                 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1589                 return 0;
1590         }
1591         len = tcp->u_rval;
1592         if ((buf = malloc(len)) == NULL) {
1593                 tprintf("out of memory\n");
1594                 return 0;
1595         }
1596         if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
1597                 tprintf("{...}, %lu", tcp->u_arg[2]);
1598                 free(buf);
1599                 return 0;
1600         }
1601         if (!abbrev(tcp))
1602                 tprintf("{");
1603         for (i = 0; i < len;) {
1604                 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
1605 #ifdef linux
1606                 if (!abbrev(tcp)) {
1607                         tprintf("%s{d_ino=%lu, d_off=%lu, ",
1608                                 i ? " " : "", d->d_ino, d->d_off);
1609                         tprintf("d_reclen=%u, d_name=\"%s\"}",
1610                                 d->d_reclen, d->d_name);
1611                 }
1612 #endif /* linux */
1613 #ifdef SVR4
1614                 if (!abbrev(tcp)) {
1615                         tprintf("%s{d_ino=%lu, d_off=%lu, ",
1616                                 i ? " " : "", d->d_ino, d->d_off);
1617                         tprintf("d_reclen=%u, d_name=\"%s\"}",
1618                                 d->d_reclen, d->d_name);
1619                 }
1620 #endif /* SVR4 */
1621 #ifdef SUNOS4
1622                 if (!abbrev(tcp)) {
1623                         tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
1624                                 i ? " " : "", d->d_off, d->d_fileno,
1625                                 d->d_reclen);
1626                         tprintf("d_namlen=%u, d_name=\"%.*s\"}",
1627                                 d->d_namlen, d->d_namlen, d->d_name);
1628                 }
1629 #endif /* SUNOS4 */
1630                 if (!d->d_reclen) {
1631                         tprintf("/* d_reclen == 0, problem here */");
1632                         break;
1633                 }
1634                 i += d->d_reclen;
1635                 dents++;
1636         }
1637         if (!abbrev(tcp))
1638                 tprintf("}");
1639         else
1640                 tprintf("/* %u entries */", dents);
1641         tprintf(", %lu", tcp->u_arg[2]);
1642         free(buf);
1643         return 0;
1644 }
1645
1646 #ifdef linux
1647
1648 int
1649 sys_getcwd(tcp)
1650 struct tcb *tcp;
1651 {
1652     if (exiting(tcp)) {
1653         if (syserror(tcp))
1654             tprintf("%#lx", tcp->u_arg[0]);
1655         else
1656             printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
1657         tprintf(", %lu", tcp->u_arg[1]);
1658     }
1659     return 0;
1660 }
1661 #endif /* linux */
1662
1663 #ifdef HAVE_SYS_ASYNCH_H
1664
1665 int
1666 sys_aioread(tcp)
1667 struct tcb *tcp;
1668 {
1669         struct aio_result_t res;
1670
1671         if (entering(tcp)) {
1672                 tprintf("%lu, ", tcp->u_arg[0]);
1673         } else {
1674                 if (syserror(tcp))
1675                         tprintf("%#lx", tcp->u_arg[1]);
1676                 else
1677                         printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1678                 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1679                 printxval(whence, tcp->u_arg[4], "L_???");
1680                 if (syserror(tcp) || tcp->u_arg[5] == 0
1681                     || umove(tcp, tcp->u_arg[5], &res) < 0)
1682                         tprintf(", %#lx", tcp->u_arg[5]);
1683                 else
1684                         tprintf(", {aio_return %d aio_errno %d}",
1685                                 res.aio_return, res.aio_errno);
1686         }
1687         return 0;
1688 }
1689
1690 int
1691 sys_aiowrite(tcp)
1692 struct tcb *tcp;
1693 {
1694         struct aio_result_t res;
1695
1696         if (entering(tcp)) {
1697                 tprintf("%lu, ", tcp->u_arg[0]);
1698                 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1699                 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1700                 printxval(whence, tcp->u_arg[4], "L_???");
1701         }
1702         else {
1703                 if (tcp->u_arg[5] == 0)
1704                         tprintf(", NULL");
1705                 else if (syserror(tcp)
1706                     || umove(tcp, tcp->u_arg[5], &res) < 0)
1707                         tprintf(", %#lx", tcp->u_arg[5]);
1708                 else
1709                         tprintf(", {aio_return %d aio_errno %d}",
1710                                 res.aio_return, res.aio_errno);
1711         }
1712         return 0;
1713 }
1714
1715 int
1716 sys_aiowait(tcp)
1717 struct tcb *tcp;
1718 {
1719         if (entering(tcp))
1720                 printtv(tcp, tcp->u_arg[0]);
1721         return 0;
1722 }
1723
1724 int
1725 sys_aiocancel(tcp)
1726 struct tcb *tcp;
1727 {
1728         struct aio_result_t res;
1729
1730         if (exiting(tcp)) {
1731                 if (tcp->u_arg[0] == 0)
1732                         tprintf("NULL");
1733                 else if (syserror(tcp)
1734                     || umove(tcp, tcp->u_arg[0], &res) < 0)
1735                         tprintf("%#lx", tcp->u_arg[0]);
1736                 else
1737                         tprintf("{aio_return %d aio_errno %d}",
1738                                 res.aio_return, res.aio_errno);
1739         }
1740         return 0;
1741 }
1742
1743 #endif /* HAVE_SYS_ASYNCH_H */
1744
1745 #if UNIXWARE >= 7
1746 int
1747 sys_lseek64 (tcp)
1748 struct tcb *tcp;
1749 {
1750         if (entering(tcp)) {
1751                 long long offset = * (long long *) & tcp->u_arg [1];
1752                 if (tcp->u_arg[3] == SEEK_SET)
1753                         tprintf("%ld, %llu, ", tcp->u_arg[0], offset);
1754                 else
1755                         tprintf("%ld, %lld, ", tcp->u_arg[0], offset);
1756                 printxval(whence, tcp->u_arg[3], "SEEK_???");
1757         }
1758         return RVAL_LDECIMAL;
1759 }
1760 #endif