blob: 8dd285711ea4e638fee6f458f6d24800f1946bc0 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
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>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00006 * 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>
Wichert Akkerman9524bb91999-05-25 23:11:18 +000036#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
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000044
Wichert Akkerman8bc6cfd1999-04-21 15:57:38 +000045#ifdef linux
Wichert Akkermandacfb6e1999-06-03 14:21:07 +000046# ifdef LINUXSPARC
47struct 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
Wichert Akkerman5b4d1281999-07-09 00:32:54 +000070# 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
Wichert Akkermana6013701999-07-08 14:00:58 +000079# 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
Wichert Akkermandacfb6e1999-06-03 14:21:07 +000088# include <asm/stat.h>
Wichert Akkermana6013701999-07-08 14:00:58 +000089
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
Wichert Akkerman5b4d1281999-07-09 00:32:54 +000098
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
Wichert Akkermandacfb6e1999-06-03 14:21:07 +0000107# endif
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000108# define stat libc_stat
Ulrich Drepper0fa01d71999-12-24 07:18:28 +0000109# define stat64 libc_stat64
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000110# include <sys/stat.h>
111# undef stat
Ulrich Drepper0fa01d71999-12-24 07:18:28 +0000112# undef stat64
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000113#else
114# include <sys/stat.h>
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000115#endif
Wichert Akkermand4d8e921999-04-18 23:30:29 +0000116
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000117#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 */
146struct 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
184#ifdef FNDELAY
185 { FNDELAY, "FNDELAY" },
186#endif
187#ifdef FAPPEND
188 { FAPPEND, "FAPPEND" },
189#endif
190#ifdef FMARK
191 { FMARK, "FMARK" },
192#endif
193#ifdef FDEFER
194 { FDEFER, "FDEFER" },
195#endif
196#ifdef FASYNC
197 { FASYNC, "FASYNC" },
198#endif
199#ifdef FSHLOCK
200 { FSHLOCK, "FSHLOCK" },
201#endif
202#ifdef FEXLOCK
203 { FEXLOCK, "FEXLOCK" },
204#endif
205#ifdef FCREAT
206 { FCREAT, "FCREAT" },
207#endif
208#ifdef FTRUNC
209 { FTRUNC, "FTRUNC" },
210#endif
211#ifdef FEXCL
212 { FEXCL, "FEXCL" },
213#endif
214#ifdef FNBIO
215 { FNBIO, "FNBIO" },
216#endif
217#ifdef FSYNC
218 { FSYNC, "FSYNC" },
219#endif
220#ifdef FNOCTTY
221 { FNOCTTY, "FNOCTTY" },
222#endif
223 { 0, NULL },
224};
225
226int
227sys_open(tcp)
228struct tcb *tcp;
229{
230 if (entering(tcp)) {
231 printpath(tcp, tcp->u_arg[0]);
232 tprintf(", ");
233 /* flags */
234 printflags(openmodes, tcp->u_arg[1] + 1);
235 if (tcp->u_arg[1] & O_CREAT) {
236 /* mode */
237 tprintf(", %#lo", tcp->u_arg[2]);
238 }
239 }
240 return 0;
241}
242
243#ifdef LINUXSPARC
244struct xlat openmodessol[] = {
245 { 0, "O_RDWR" },
246 { 1, "O_RDONLY" },
247 { 2, "O_WRONLY" },
248 { 0x80, "O_NONBLOCK" },
249 { 8, "O_APPEND" },
250 { 0x100, "O_CREAT" },
251 { 0x200, "O_TRUNC" },
252 { 0x400, "O_EXCL" },
253 { 0x800, "O_NOCTTY" },
254 { 0x10, "O_SYNC" },
255 { 0x40, "O_DSYNC" },
256 { 0x8000, "O_RSYNC" },
257 { 4, "O_NDELAY" },
258 { 0x1000, "O_PRIV" },
259 { 0, NULL },
260};
261
262int
263solaris_open(tcp)
264struct tcb *tcp;
265{
266 if (entering(tcp)) {
267 printpath(tcp, tcp->u_arg[0]);
268 tprintf(", ");
269 /* flags */
270 printflags(openmodessol, tcp->u_arg[1] + 1);
271 if (tcp->u_arg[1] & 0x100) {
272 /* mode */
273 tprintf(", %#lo", tcp->u_arg[2]);
274 }
275 }
276 return 0;
277}
278
279#endif
280
281int
282sys_creat(tcp)
283struct tcb *tcp;
284{
285 if (entering(tcp)) {
286 printpath(tcp, tcp->u_arg[0]);
287 tprintf(", %#lo", tcp->u_arg[1]);
288 }
289 return 0;
290}
291
292static struct xlat access_flags[] = {
293 { F_OK, "F_OK", },
294 { R_OK, "R_OK" },
295 { W_OK, "W_OK" },
296 { X_OK, "X_OK" },
297#ifdef EFF_ONLY_OK
298 { EFF_ONLY_OK, "EFF_ONLY_OK" },
299#endif
300#ifdef EX_OK
301 { EX_OK, "EX_OK" },
302#endif
303 { 0, NULL },
304};
305
306int
307sys_access(tcp)
308struct tcb *tcp;
309{
310 if (entering(tcp)) {
311 printpath(tcp, tcp->u_arg[0]);
312 tprintf(", ");
313 printflags(access_flags, tcp->u_arg[1]);
314 }
315 return 0;
316}
317
318int
319sys_umask(tcp)
320struct tcb *tcp;
321{
322 if (entering(tcp)) {
323 tprintf("%#lo", tcp->u_arg[0]);
324 }
325 return RVAL_OCTAL;
326}
327
328static struct xlat whence[] = {
329 { SEEK_SET, "SEEK_SET" },
330 { SEEK_CUR, "SEEK_CUR" },
331 { SEEK_END, "SEEK_END" },
332 { 0, NULL },
333};
334
335int
336sys_lseek(tcp)
337struct tcb *tcp;
338{
339 if (entering(tcp)) {
340 tprintf("%ld, ", tcp->u_arg[0]);
341 if (tcp->u_arg[2] == SEEK_SET)
342 tprintf("%lu, ", tcp->u_arg[1]);
343 else
344 tprintf("%ld, ", tcp->u_arg[1]);
345 printxval(whence, tcp->u_arg[2], "SEEK_???");
346 }
347 return RVAL_UDECIMAL;
348}
349
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000350#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000351int
352sys_llseek (tcp)
353struct tcb *tcp;
354{
355 if (entering(tcp)) {
356 if (tcp->u_arg[4] == SEEK_SET)
357 tprintf("%ld, %llu, ", tcp->u_arg[0],
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000358 (((long long int) tcp->u_arg[1]) << 32
359 | (unsigned long long) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000360 else
361 tprintf("%ld, %lld, ", tcp->u_arg[0],
362 (((long long int) tcp->u_arg[1]) << 32
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000363 | (unsigned long long) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000364 }
365 else {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000366 long long int off;
367 if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000368 tprintf("%#lx, ", tcp->u_arg[3]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000369 else
370 tprintf("[%llu], ", off);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371 printxval(whence, tcp->u_arg[4], "SEEK_???");
372 }
373 return 0;
374}
375#endif
376
377int
378sys_truncate(tcp)
379struct tcb *tcp;
380{
381 if (entering(tcp)) {
382 printpath(tcp, tcp->u_arg[0]);
383 tprintf(", %lu", tcp->u_arg[1]);
384 }
385 return 0;
386}
387
388int
389sys_ftruncate(tcp)
390struct tcb *tcp;
391{
392 if (entering(tcp)) {
393 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
394 }
395 return 0;
396}
397
398/* several stats */
399
400static struct xlat modetypes[] = {
401 { S_IFREG, "S_IFREG" },
402 { S_IFSOCK, "S_IFSOCK" },
403 { S_IFIFO, "S_IFIFO" },
404 { S_IFLNK, "S_IFLNK" },
405 { S_IFDIR, "S_IFDIR" },
406 { S_IFBLK, "S_IFBLK" },
407 { S_IFCHR, "S_IFCHR" },
408 { 0, NULL },
409};
410
411static char *
412sprintmode(mode)
413int mode;
414{
415 static char buf[64];
416 char *s;
417
418 if ((mode & S_IFMT) == 0)
419 s = "";
420 else if ((s = xlookup(modetypes, mode & S_IFMT)) == NULL) {
421 sprintf(buf, "%#o", mode);
422 return buf;
423 }
424 sprintf(buf, "%s%s%s%s", s,
425 (mode & S_ISUID) ? "|S_ISUID" : "",
426 (mode & S_ISGID) ? "|S_ISGID" : "",
427 (mode & S_ISVTX) ? "|S_ISVTX" : "");
428 mode &= ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX);
429 if (mode)
430 sprintf(buf + strlen(buf), "|%#o", mode);
431 s = (*buf == '|') ? buf + 1 : buf;
432 return *s ? s : "0";
433}
434
435static char *
436sprinttime(t)
437time_t t;
438{
439 struct tm *tmp;
440 static char buf[32];
441
442 if (t == 0) {
443 sprintf(buf, "0");
444 return buf;
445 }
446 tmp = localtime(&t);
447 sprintf(buf, "%02d/%02d/%02d-%02d:%02d:%02d",
Wichert Akkerman3ed6dc22000-01-11 14:41:09 +0000448 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000449 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
450 return buf;
451}
452
453#ifdef LINUXSPARC
454typedef struct {
455 int tv_sec;
456 int tv_nsec;
457} timestruct_t;
458
459struct solstat {
460 unsigned st_dev;
461 int st_pad1[3]; /* network id */
462 unsigned st_ino;
463 unsigned st_mode;
464 unsigned st_nlink;
465 unsigned st_uid;
466 unsigned st_gid;
467 unsigned st_rdev;
468 int st_pad2[2];
469 int st_size;
470 int st_pad3; /* st_size, off_t expansion */
471 timestruct_t st_atime;
472 timestruct_t st_mtime;
473 timestruct_t st_ctime;
474 int st_blksize;
475 int st_blocks;
476 char st_fstype[16];
477 int st_pad4[8]; /* expansion area */
478};
479
480static void
481printstatsol(tcp, addr)
482struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000483long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484{
485 struct solstat statbuf;
486
487 if (!addr) {
488 tprintf("NULL");
489 return;
490 }
491 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000492 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000493 return;
494 }
495 if (umove(tcp, addr, &statbuf) < 0) {
496 tprintf("{...}");
497 return;
498 }
499 if (!abbrev(tcp)) {
500 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
501 (unsigned long) ((statbuf.st_dev >> 18) & 0x3fff),
502 (unsigned long) (statbuf.st_dev & 0x3ffff),
503 (unsigned long) statbuf.st_ino,
504 sprintmode(statbuf.st_mode));
505 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
506 (unsigned long) statbuf.st_nlink,
507 (unsigned long) statbuf.st_uid,
508 (unsigned long) statbuf.st_gid);
509 tprintf("st_blksize=%lu, ", (unsigned long) statbuf.st_blksize);
510 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
511 }
512 else
513 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
514 switch (statbuf.st_mode & S_IFMT) {
515 case S_IFCHR: case S_IFBLK:
516 tprintf("st_rdev=makedev(%lu, %lu), ",
517 (unsigned long) ((statbuf.st_rdev >> 18) & 0x3fff),
518 (unsigned long) (statbuf.st_rdev & 0x3ffff));
519 break;
520 default:
521 tprintf("st_size=%u, ", statbuf.st_size);
522 break;
523 }
524 if (!abbrev(tcp)) {
525 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
526 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
527 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
528 }
529 else
530 tprintf("...}");
531}
Wichert Akkermanb859bea1999-04-18 22:50:50 +0000532#endif /* LINUXSPARC */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000533
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000534static void
535realprintstat(tcp, statbuf)
536struct tcb *tcp;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000537struct stat *statbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000538{
539 if (!abbrev(tcp)) {
540 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
541 (unsigned long) major(statbuf->st_dev),
542 (unsigned long) minor(statbuf->st_dev),
543 (unsigned long) statbuf->st_ino,
544 sprintmode(statbuf->st_mode));
545 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
546 (unsigned long) statbuf->st_nlink,
547 (unsigned long) statbuf->st_uid,
548 (unsigned long) statbuf->st_gid);
549#ifdef HAVE_ST_BLKSIZE
550 tprintf("st_blksize=%lu, ", (unsigned long) statbuf->st_blksize);
551#endif /* HAVE_ST_BLKSIZE */
552#ifdef HAVE_ST_BLOCKS
553 tprintf("st_blocks=%lu, ", (unsigned long) statbuf->st_blocks);
554#endif /* HAVE_ST_BLOCKS */
555 }
556 else
557 tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode));
558 switch (statbuf->st_mode & S_IFMT) {
559 case S_IFCHR: case S_IFBLK:
560#ifdef HAVE_ST_RDEV
561 tprintf("st_rdev=makedev(%lu, %lu), ",
562 (unsigned long) major(statbuf->st_rdev),
563 (unsigned long) minor(statbuf->st_rdev));
564#else /* !HAVE_ST_RDEV */
565 tprintf("st_size=makedev(%lu, %lu), ",
566 (unsigned long) major(statbuf->st_size),
567 (unsigned long) minor(statbuf->st_size));
568#endif /* !HAVE_ST_RDEV */
569 break;
570 default:
571 tprintf("st_size=%lu, ", statbuf->st_size);
572 break;
573 }
574 if (!abbrev(tcp)) {
575 tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
576 tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
577 tprintf("st_ctime=%s}", sprinttime(statbuf->st_ctime));
578 }
579 else
580 tprintf("...}");
581}
582
Nate Sammons771a6ff1999-04-05 22:39:31 +0000583
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000584static void
585printstat(tcp, addr)
586struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000587long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000588{
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000589 struct stat statbuf;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000590
591#ifdef LINUXSPARC
592 if (current_personality == 1) {
593 printstatsol(tcp, addr);
594 return;
595 }
596#endif /* LINUXSPARC */
597
598 if (!addr) {
599 tprintf("NULL");
600 return;
601 }
602 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000603 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000604 return;
605 }
606 if (umove(tcp, addr, &statbuf) < 0) {
607 tprintf("{...}");
608 return;
609 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000610
611 realprintstat(tcp, &statbuf);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000612}
613
Wichert Akkerman0396bdc1999-12-24 23:11:57 +0000614#ifdef STAT64
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000615static void
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000616printstat64(tcp, addr)
617struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000618long addr;
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000619{
620 struct stat64 statbuf;
621
622#ifdef LINUXSPARC
623 if (current_personality == 1) {
624 printstatsol(tcp, addr);
625 return;
626 }
627#endif /* LINUXSPARC */
628
629 if (!addr) {
630 tprintf("NULL");
631 return;
632 }
633 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000634 tprintf("%#lx", addr);
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000635 return;
636 }
637 if (umove(tcp, addr, &statbuf) < 0) {
638 tprintf("{...}");
639 return;
640 }
641
642 if (!abbrev(tcp)) {
643 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
644 (unsigned long) major(statbuf.st_dev),
645 (unsigned long) minor(statbuf.st_dev),
646 (unsigned long) statbuf.st_ino,
647 sprintmode(statbuf.st_mode));
648 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
649 (unsigned long) statbuf.st_nlink,
650 (unsigned long) statbuf.st_uid,
651 (unsigned long) statbuf.st_gid);
652#ifdef HAVE_ST_BLKSIZE
653 tprintf("st_blksize=%lu, ",
654 (unsigned long) statbuf.st_blksize);
655#endif /* HAVE_ST_BLKSIZE */
656#ifdef HAVE_ST_BLOCKS
657 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
658#endif /* HAVE_ST_BLOCKS */
659 }
660 else
661 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
662 switch (statbuf.st_mode & S_IFMT) {
663 case S_IFCHR: case S_IFBLK:
664#ifdef HAVE_ST_RDEV
665 tprintf("st_rdev=makedev(%lu, %lu), ",
666 (unsigned long) major(statbuf.st_rdev),
667 (unsigned long) minor(statbuf.st_rdev));
668#else /* !HAVE_ST_RDEV */
669 tprintf("st_size=makedev(%lu, %lu), ",
670 (unsigned long) major(statbuf.st_size),
671 (unsigned long) minor(statbuf.st_size));
672#endif /* !HAVE_ST_RDEV */
673 break;
674 default:
675 tprintf("st_size=%llu, ", statbuf.st_size);
676 break;
677 }
678 if (!abbrev(tcp)) {
679 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
680 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
681 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
682 }
683 else
684 tprintf("...}");
685}
Wichert Akkerman0396bdc1999-12-24 23:11:57 +0000686#endif /* STAT64 */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000687
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000688#if defined(linux) && !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000689static void
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000690convertoldstat(oldbuf, newbuf)
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +0000691const struct __old_kernel_stat *oldbuf;
692struct stat *newbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000693{
694 newbuf->st_dev=oldbuf->st_dev;
695 newbuf->st_ino=oldbuf->st_ino;
696 newbuf->st_mode=oldbuf->st_mode;
697 newbuf->st_nlink=oldbuf->st_nlink;
698 newbuf->st_uid=oldbuf->st_uid;
699 newbuf->st_gid=oldbuf->st_gid;
700 newbuf->st_rdev=oldbuf->st_rdev;
701 newbuf->st_size=oldbuf->st_size;
702 newbuf->st_atime=oldbuf->st_atime;
703 newbuf->st_mtime=oldbuf->st_mtime;
704 newbuf->st_ctime=oldbuf->st_ctime;
705 newbuf->st_blksize=0; /* not supported in old_stat */
706 newbuf->st_blocks=0; /* not supported in old_stat */
707}
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000708
709
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000710static void
711printoldstat(tcp, addr)
712struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000713long addr;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000714{
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +0000715 struct __old_kernel_stat statbuf;
716 struct stat newstatbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000717
718#ifdef LINUXSPARC
719 if (current_personality == 1) {
720 printstatsol(tcp, addr);
721 return;
722 }
723#endif /* LINUXSPARC */
724
725 if (!addr) {
726 tprintf("NULL");
727 return;
728 }
729 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000730 tprintf("%#lx", addr);
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000731 return;
732 }
733 if (umove(tcp, addr, &statbuf) < 0) {
734 tprintf("{...}");
735 return;
736 }
737
738 convertoldstat(&statbuf, &newstatbuf);
739 realprintstat(tcp, &newstatbuf);
740}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000741#endif /* linux && !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000742
743
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000744int
745sys_stat(tcp)
746struct tcb *tcp;
747{
748 if (entering(tcp)) {
749 printpath(tcp, tcp->u_arg[0]);
750 tprintf(", ");
751 } else {
752 printstat(tcp, tcp->u_arg[1]);
753 }
754 return 0;
755}
756
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000757#ifdef linux
758int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000759sys_stat64(tcp)
760struct tcb *tcp;
761{
762#ifdef HAVE_STAT64
763 if (entering(tcp)) {
764 printpath(tcp, tcp->u_arg[0]);
765 tprintf(", ");
766 } else {
767 printstat64(tcp, tcp->u_arg[1]);
768 }
769 return 0;
770#else
771 return printargs(tcp);
772#endif
773}
774
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000775# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000776int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000777sys_oldstat(tcp)
778struct tcb *tcp;
779{
780 if (entering(tcp)) {
781 printpath(tcp, tcp->u_arg[0]);
782 tprintf(", ");
783 } else {
784 printoldstat(tcp, tcp->u_arg[1]);
785 }
786 return 0;
787}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000788# endif /* !IA64 */
789#endif /* linux */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000790
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000791int
792sys_fstat(tcp)
793struct tcb *tcp;
794{
795 if (entering(tcp))
796 tprintf("%ld, ", tcp->u_arg[0]);
797 else {
798 printstat(tcp, tcp->u_arg[1]);
799 }
800 return 0;
801}
802
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000803#ifdef linux
804int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000805sys_fstat64(tcp)
806struct tcb *tcp;
807{
808#ifdef HAVE_STAT64
809 if (entering(tcp))
810 tprintf("%ld, ", tcp->u_arg[0]);
811 else {
812 printstat64(tcp, tcp->u_arg[1]);
813 }
814 return 0;
815#else
816 return printargs(tcp);
817#endif
818}
819
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000820# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000821int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000822sys_oldfstat(tcp)
823struct tcb *tcp;
824{
825 if (entering(tcp))
826 tprintf("%ld, ", tcp->u_arg[0]);
827 else {
828 printoldstat(tcp, tcp->u_arg[1]);
829 }
830 return 0;
831}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000832# endif /* !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000833#endif
834
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000835int
836sys_lstat(tcp)
837struct tcb *tcp;
838{
839 if (entering(tcp)) {
840 printpath(tcp, tcp->u_arg[0]);
841 tprintf(", ");
842 } else {
843 printstat(tcp, tcp->u_arg[1]);
844 }
845 return 0;
846}
847
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000848#ifdef linux
849int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000850sys_lstat64(tcp)
851struct tcb *tcp;
852{
853#ifdef HAVE_STAT64
854 if (entering(tcp)) {
855 printpath(tcp, tcp->u_arg[0]);
856 tprintf(", ");
857 } else {
858 printstat64(tcp, tcp->u_arg[1]);
859 }
860 return 0;
861#else
862 return printargs(tcp);
863#endif
864}
865
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000866# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000867int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000868sys_oldlstat(tcp)
869struct tcb *tcp;
870{
871 if (entering(tcp)) {
872 printpath(tcp, tcp->u_arg[0]);
873 tprintf(", ");
874 } else {
875 printoldstat(tcp, tcp->u_arg[1]);
876 }
877 return 0;
878}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000879# endif /* !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000880#endif
881
882
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000883#if defined(SVR4) || defined(LINUXSPARC)
884
885int
886sys_xstat(tcp)
887struct tcb *tcp;
888{
889 if (entering(tcp)) {
890 tprintf("%ld, ", tcp->u_arg[0]);
891 printpath(tcp, tcp->u_arg[1]);
892 tprintf(", ");
893 } else {
894 printstat(tcp, tcp->u_arg[2]);
895 }
896 return 0;
897}
898
899int
900sys_fxstat(tcp)
901struct tcb *tcp;
902{
903 if (entering(tcp))
904 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]);
905 else {
906 printstat(tcp, tcp->u_arg[2]);
907 }
908 return 0;
909}
910
911int
912sys_lxstat(tcp)
913struct tcb *tcp;
914{
915 if (entering(tcp)) {
916 tprintf("%ld, ", tcp->u_arg[0]);
917 printpath(tcp, tcp->u_arg[1]);
918 tprintf(", ");
919 } else {
920 printstat(tcp, tcp->u_arg[2]);
921 }
922 return 0;
923}
924
925int
926sys_xmknod(tcp)
927struct tcb *tcp;
928{
929 int mode = tcp->u_arg[2];
930
931 if (entering(tcp)) {
932 tprintf("%ld, ", tcp->u_arg[0]);
933 printpath(tcp, tcp->u_arg[1]);
934 tprintf(", %s", sprintmode(mode));
935 switch (mode & S_IFMT) {
936 case S_IFCHR: case S_IFBLK:
937#ifdef LINUXSPARC
938 tprintf(", makedev(%lu, %lu)",
939 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
940 (unsigned long) (tcp->u_arg[3] & 0x3ffff));
941#else
942 tprintf(", makedev(%lu, %lu)",
943 (unsigned long) major(tcp->u_arg[3]),
944 (unsigned long) minor(tcp->u_arg[3]));
945#endif
946 break;
947 default:
948 break;
949 }
950 }
951 return 0;
952}
953
Wichert Akkerman8829a551999-06-11 13:18:40 +0000954#ifdef HAVE_SYS_ACL_H
955
956#include <sys/acl.h>
957
958struct xlat aclcmds[] = {
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000959#ifdef SETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +0000960 { SETACL, "SETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000961#endif
962#ifdef GETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +0000963 { GETACL, "GETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000964#endif
965#ifdef GETACLCNT
Wichert Akkerman8829a551999-06-11 13:18:40 +0000966 { GETACLCNT, "GETACLCNT" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000967#endif
968#ifdef ACL_GET
969 { ACL_GET, "ACL_GET" },
970#endif
971#ifdef ACL_SET
972 { ACL_SET, "ACL_SET" },
973#endif
974#ifdef ACL_CNT
975 { ACL_CNT, "ACL_CNT" },
976#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000977 { 0, NULL },
978};
979
980int
981sys_acl(tcp)
982struct tcb *tcp;
983{
984 if (entering(tcp)) {
985 printpath(tcp, tcp->u_arg[0]);
986 tprintf(", ");
987 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
988 tprintf(", %ld", tcp->u_arg[2]);
989 /*
990 * FIXME - dump out the list of aclent_t's pointed to
991 * by "tcp->u_arg[3]" if it's not NULL.
992 */
993 if (tcp->u_arg[3])
994 tprintf(", %#lx", tcp->u_arg[3]);
995 else
996 tprintf(", NULL");
997 }
998 return 0;
999}
1000
1001
1002int
1003sys_facl(tcp)
1004struct tcb *tcp;
1005{
1006 if (entering(tcp)) {
1007 tprintf("%ld, ", tcp->u_arg[0]);
1008 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
1009 tprintf(", %ld", tcp->u_arg[2]);
1010 /*
1011 * FIXME - dump out the list of aclent_t's pointed to
1012 * by "tcp->u_arg[3]" if it's not NULL.
1013 */
1014 if (tcp->u_arg[3])
1015 tprintf(", %#lx", tcp->u_arg[3]);
1016 else
1017 tprintf(", NULL");
1018 }
1019 return 0;
1020}
1021
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001022
1023struct xlat aclipc[] = {
1024#ifdef IPC_SHM
1025 { IPC_SHM, "IPC_SHM" },
1026#endif
1027#ifdef IPC_SEM
1028 { IPC_SEM, "IPC_SEM" },
1029#endif
1030#ifdef IPC_MSG
1031 { IPC_MSG, "IPC_MSG" },
1032#endif
1033 { 0, NULL },
1034};
1035
1036
1037int
1038sys_aclipc(tcp)
1039struct tcb *tcp;
1040{
1041 if (entering(tcp)) {
1042 printxval(aclipc, tcp->u_arg[0], "???IPC???");
1043 tprintf(", %#lx, ", tcp->u_arg[1]);
1044 printxval(aclcmds, tcp->u_arg[2], "???ACL???");
1045 tprintf(", %ld", tcp->u_arg[3]);
1046 /*
1047 * FIXME - dump out the list of aclent_t's pointed to
1048 * by "tcp->u_arg[4]" if it's not NULL.
1049 */
1050 if (tcp->u_arg[4])
1051 tprintf(", %#lx", tcp->u_arg[4]);
1052 else
1053 tprintf(", NULL");
1054 }
1055 return 0;
1056}
1057
1058
1059
Wichert Akkerman8829a551999-06-11 13:18:40 +00001060#endif /* HAVE_SYS_ACL_H */
1061
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001062#endif /* SVR4 || LINUXSPARC */
1063
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001064#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001065
1066static struct xlat fsmagic[] = {
1067 { 0xef51, "EXT2_OLD_SUPER_MAGIC" },
1068 { 0xef53, "EXT2_SUPER_MAGIC" },
1069 { 0x137d, "EXT_SUPER_MAGIC" },
1070 { 0x9660, "ISOFS_SUPER_MAGIC" },
1071 { 0x137f, "MINIX_SUPER_MAGIC" },
1072 { 0x138f, "MINIX_SUPER_MAGIC2" },
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001073 { 0x2468, "MINIX2_SUPER_MAGIC" },
1074 { 0x2478, "MINIX2_SUPER_MAGIC2" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001075 { 0x4d44, "MSDOS_SUPER_MAGIC" },
1076 { 0x6969, "NFS_SUPER_MAGIC" },
1077 { 0x9fa0, "PROC_SUPER_MAGIC" },
1078 { 0x012fd16d, "XIAFS_SUPER_MAGIC" },
1079 { 0, NULL },
1080};
1081
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001082#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001083
1084#ifndef SVR4
1085
1086static char *
1087sprintfstype(magic)
1088int magic;
1089{
1090 static char buf[32];
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001091#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001092 char *s;
1093
1094 s = xlookup(fsmagic, magic);
1095 if (s) {
1096 sprintf(buf, "\"%s\"", s);
1097 return buf;
1098 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001099#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001100 sprintf(buf, "%#x", magic);
1101 return buf;
1102}
1103
1104static void
1105printstatfs(tcp, addr)
1106struct tcb *tcp;
1107long addr;
1108{
1109 struct statfs statbuf;
1110
1111 if (syserror(tcp) || !verbose(tcp)) {
1112 tprintf("%#lx", addr);
1113 return;
1114 }
1115 if (umove(tcp, addr, &statbuf) < 0) {
1116 tprintf("{...}");
1117 return;
1118 }
1119#ifdef ALPHA
1120
1121 tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ",
1122 sprintfstype(statbuf.f_type),
1123 statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001124 tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_namelen=%u",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001125 statbuf.f_bavail,statbuf.f_files, statbuf.f_ffree, statbuf.f_namelen);
1126#else /* !ALPHA */
1127 tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ",
1128 sprintfstype(statbuf.f_type),
Nate Sammons5c74d201999-04-06 01:37:51 +00001129 (unsigned long)statbuf.f_bsize,
1130 (unsigned long)statbuf.f_blocks,
1131 (unsigned long)statbuf.f_bfree);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001132 tprintf("f_files=%lu, f_ffree=%lu",
Nate Sammons5c74d201999-04-06 01:37:51 +00001133 (unsigned long)statbuf.f_files,
1134 (unsigned long)statbuf.f_ffree);
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001135#ifdef linux
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001136 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001137#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001138#endif /* !ALPHA */
1139 tprintf("}");
1140}
1141
1142int
1143sys_statfs(tcp)
1144struct tcb *tcp;
1145{
1146 if (entering(tcp)) {
1147 printpath(tcp, tcp->u_arg[0]);
1148 tprintf(", ");
1149 } else {
1150 printstatfs(tcp, tcp->u_arg[1]);
1151 }
1152 return 0;
1153}
1154
1155int
1156sys_fstatfs(tcp)
1157struct tcb *tcp;
1158{
1159 if (entering(tcp)) {
1160 tprintf("%lu, ", tcp->u_arg[0]);
1161 } else {
1162 printstatfs(tcp, tcp->u_arg[1]);
1163 }
1164 return 0;
1165}
1166
Wichert Akkermana0f36c61999-04-16 14:01:34 +00001167#if defined(linux) && defined(__alpha)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001168
1169int
1170osf_statfs(tcp)
1171struct tcb *tcp;
1172{
1173 if (entering(tcp)) {
1174 printpath(tcp, tcp->u_arg[0]);
1175 tprintf(", ");
1176 } else {
1177 printstatfs(tcp, tcp->u_arg[1]);
1178 tprintf(", %lu", tcp->u_arg[2]);
1179 }
1180 return 0;
1181}
1182
1183int
1184osf_fstatfs(tcp)
1185struct tcb *tcp;
1186{
1187 if (entering(tcp)) {
1188 tprintf("%lu, ", tcp->u_arg[0]);
1189 } else {
1190 printstatfs(tcp, tcp->u_arg[1]);
1191 tprintf(", %lu", tcp->u_arg[2]);
1192 }
1193 return 0;
1194}
Wichert Akkermana0f36c61999-04-16 14:01:34 +00001195#endif /* linux && __alpha */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001196
1197#endif /* !SVR4 */
1198
1199#ifdef SUNOS4
1200
1201int
1202sys_ustat(tcp)
1203struct tcb *tcp;
1204{
1205 struct ustat statbuf;
1206
1207 if (entering(tcp)) {
1208 tprintf("makedev(%lu, %lu), ",
1209 (long) major(tcp->u_arg[0]),
1210 (long) minor(tcp->u_arg[0]));
1211 }
1212 else {
1213 if (syserror(tcp) || !verbose(tcp))
1214 tprintf("%#lx", tcp->u_arg[1]);
1215 else if (umove(tcp, tcp->u_arg[1], &statbuf) < 0)
1216 tprintf("{...}");
1217 else {
1218 tprintf("{f_tfree=%lu, f_tinode=%lu, ",
1219 statbuf.f_tfree, statbuf.f_tinode);
1220 tprintf("f_fname=\"%.*s\", ",
1221 (int) sizeof(statbuf.f_fname),
1222 statbuf.f_fname);
1223 tprintf("f_fpack=\"%.*s\"}",
1224 (int) sizeof(statbuf.f_fpack),
1225 statbuf.f_fpack);
1226 }
1227 }
1228 return 0;
1229}
1230
1231#endif /* SUNOS4 */
1232
1233/* directory */
1234int
1235sys_chdir(tcp)
1236struct tcb *tcp;
1237{
1238 if (entering(tcp)) {
1239 printpath(tcp, tcp->u_arg[0]);
1240 }
1241 return 0;
1242}
1243
1244int
1245sys_mkdir(tcp)
1246struct tcb *tcp;
1247{
1248 if (entering(tcp)) {
1249 printpath(tcp, tcp->u_arg[0]);
1250 tprintf(", %#lo", tcp->u_arg[1]);
1251 }
1252 return 0;
1253}
1254
1255int
1256sys_rmdir(tcp)
1257struct tcb *tcp;
1258{
1259 if (entering(tcp)) {
1260 printpath(tcp, tcp->u_arg[0]);
1261 }
1262 return 0;
1263}
1264
1265int
1266sys_fchdir(tcp)
1267struct tcb *tcp;
1268{
1269 if (entering(tcp)) {
1270 tprintf("%ld", tcp->u_arg[0]);
1271 }
1272 return 0;
1273}
1274
1275int
1276sys_chroot(tcp)
1277struct tcb *tcp;
1278{
1279 if (entering(tcp)) {
1280 printpath(tcp, tcp->u_arg[0]);
1281 }
1282 return 0;
1283}
1284
1285int
1286sys_fchroot(tcp)
1287struct tcb *tcp;
1288{
1289 if (entering(tcp)) {
1290 tprintf("%ld", tcp->u_arg[0]);
1291 }
1292 return 0;
1293}
1294
1295int
1296sys_link(tcp)
1297struct tcb *tcp;
1298{
1299 if (entering(tcp)) {
1300 printpath(tcp, tcp->u_arg[0]);
1301 tprintf(", ");
1302 printpath(tcp, tcp->u_arg[1]);
1303 }
1304 return 0;
1305}
1306
1307int
1308sys_unlink(tcp)
1309struct tcb *tcp;
1310{
1311 if (entering(tcp)) {
1312 printpath(tcp, tcp->u_arg[0]);
1313 }
1314 return 0;
1315}
1316
1317int
1318sys_symlink(tcp)
1319struct tcb *tcp;
1320{
1321 if (entering(tcp)) {
1322 printpath(tcp, tcp->u_arg[0]);
1323 tprintf(", ");
1324 printpath(tcp, tcp->u_arg[1]);
1325 }
1326 return 0;
1327}
1328
1329int
1330sys_readlink(tcp)
1331struct tcb *tcp;
1332{
1333 if (entering(tcp)) {
1334 printpath(tcp, tcp->u_arg[0]);
1335 tprintf(", ");
1336 } else {
1337 if (syserror(tcp))
1338 tprintf("%#lx", tcp->u_arg[1]);
1339 else
1340 printpathn(tcp, tcp->u_arg[1], tcp->u_rval);
1341 tprintf(", %lu", tcp->u_arg[2]);
1342 }
1343 return 0;
1344}
1345
1346int
1347sys_rename(tcp)
1348struct tcb *tcp;
1349{
1350 if (entering(tcp)) {
1351 printpath(tcp, tcp->u_arg[0]);
1352 tprintf(", ");
1353 printpath(tcp, tcp->u_arg[1]);
1354 }
1355 return 0;
1356}
1357
1358int
1359sys_chown(tcp)
1360struct tcb *tcp;
1361{
1362 if (entering(tcp)) {
1363 printpath(tcp, tcp->u_arg[0]);
1364 tprintf(", %lu, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1365 }
1366 return 0;
1367}
1368
1369int
1370sys_fchown(tcp)
1371struct tcb *tcp;
1372{
1373 if (entering(tcp)) {
1374 tprintf("%ld, %lu, %lu",
1375 tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
1376 }
1377 return 0;
1378}
1379
1380int
1381sys_chmod(tcp)
1382struct tcb *tcp;
1383{
1384 if (entering(tcp)) {
1385 printpath(tcp, tcp->u_arg[0]);
1386 tprintf(", %#lo", tcp->u_arg[1]);
1387 }
1388 return 0;
1389}
1390
1391int
1392sys_fchmod(tcp)
1393struct tcb *tcp;
1394{
1395 if (entering(tcp)) {
1396 tprintf("%ld, %#lo", tcp->u_arg[0], tcp->u_arg[1]);
1397 }
1398 return 0;
1399}
1400
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001401#ifdef ALPHA
1402int
1403sys_osf_utimes(tcp)
1404struct tcb *tcp;
1405{
1406 if (entering(tcp)) {
1407 printpath(tcp, tcp->u_arg[0]);
1408 tprintf(", ");
1409 printtv32(tcp, tcp->u_arg[1]);
1410 }
1411 return 0;
1412}
1413#endif
1414
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001415int
1416sys_utimes(tcp)
1417struct tcb *tcp;
1418{
1419 if (entering(tcp)) {
1420 printpath(tcp, tcp->u_arg[0]);
1421 tprintf(", ");
1422 printtv(tcp, tcp->u_arg[1]);
1423 }
1424 return 0;
1425}
1426
1427int
1428sys_utime(tcp)
1429struct tcb *tcp;
1430{
1431 long ut[2];
1432
1433 if (entering(tcp)) {
1434 printpath(tcp, tcp->u_arg[0]);
1435 tprintf(", ");
1436 if (!tcp->u_arg[1])
1437 tprintf("NULL");
1438 else if (!verbose(tcp))
1439 tprintf("%#lx", tcp->u_arg[1]);
1440 else if (umoven(tcp, tcp->u_arg[1], sizeof ut,
1441 (char *) ut) < 0)
1442 tprintf("[?, ?]");
1443 else {
1444 tprintf("[%s,", sprinttime(ut[0]));
1445 tprintf(" %s]", sprinttime(ut[1]));
1446 }
1447 }
1448 return 0;
1449}
1450
1451int
1452sys_mknod(tcp)
1453struct tcb *tcp;
1454{
1455 int mode = tcp->u_arg[1];
1456
1457 if (entering(tcp)) {
1458 printpath(tcp, tcp->u_arg[0]);
1459 tprintf(", %s", sprintmode(mode));
1460 switch (mode & S_IFMT) {
1461 case S_IFCHR: case S_IFBLK:
1462#ifdef LINUXSPARC
1463 if (current_personality == 1)
1464 tprintf(", makedev(%lu, %lu)",
1465 (unsigned long) ((tcp->u_arg[2] >> 18) & 0x3fff),
1466 (unsigned long) (tcp->u_arg[2] & 0x3ffff));
1467 else
1468#endif
1469 tprintf(", makedev(%lu, %lu)",
1470 (unsigned long) major(tcp->u_arg[2]),
1471 (unsigned long) minor(tcp->u_arg[2]));
1472 break;
1473 default:
1474 break;
1475 }
1476 }
1477 return 0;
1478}
1479
1480int
1481sys_mkfifo(tcp)
1482struct tcb *tcp;
1483{
1484 if (entering(tcp)) {
1485 printpath(tcp, tcp->u_arg[0]);
1486 tprintf(", %#lo", tcp->u_arg[1]);
1487 }
1488 return 0;
1489}
1490
1491int
1492sys_fsync(tcp)
1493struct tcb *tcp;
1494{
1495 if (entering(tcp)) {
1496 tprintf("%ld", tcp->u_arg[0]);
1497 }
1498 return 0;
1499}
1500
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001501#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001502
1503static void
1504printdir(tcp, addr)
1505struct tcb *tcp;
1506long addr;
1507{
1508 struct dirent d;
1509
1510 if (!verbose(tcp)) {
1511 tprintf("%#lx", addr);
1512 return;
1513 }
1514 if (umove(tcp, addr, &d) < 0) {
1515 tprintf("{...}");
1516 return;
1517 }
1518 tprintf("{d_ino=%ld, ", (unsigned long) d.d_ino);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001519 tprintf("d_name=");
1520 printpathn(tcp, (long) ((struct dirent *) addr)->d_name, d.d_reclen);
1521 tprintf("}");
1522}
1523
1524int
1525sys_readdir(tcp)
1526struct tcb *tcp;
1527{
1528 if (entering(tcp)) {
1529 tprintf("%lu, ", tcp->u_arg[0]);
1530 } else {
1531 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
1532 tprintf("%#lx", tcp->u_arg[1]);
1533 else
1534 printdir(tcp, tcp->u_arg[1]);
1535 /* Not much point in printing this out, it is always 1. */
1536 if (tcp->u_arg[2] != 1)
1537 tprintf(", %lu", tcp->u_arg[2]);
1538 }
1539 return 0;
1540}
1541
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001542#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001543
1544int
1545sys_getdents(tcp)
1546struct tcb *tcp;
1547{
1548 int i, len, dents = 0;
1549 char *buf;
1550
1551 if (entering(tcp)) {
1552 tprintf("%lu, ", tcp->u_arg[0]);
1553 return 0;
1554 }
1555 if (syserror(tcp) || !verbose(tcp)) {
1556 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1557 return 0;
1558 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001559 len = tcp->u_rval;
1560 if ((buf = malloc(len)) == NULL) {
1561 tprintf("out of memory\n");
1562 return 0;
1563 }
1564 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
1565 tprintf("{...}, %lu", tcp->u_arg[2]);
1566 free(buf);
1567 return 0;
1568 }
1569 if (!abbrev(tcp))
1570 tprintf("{");
1571 for (i = 0; i < len;) {
Wichert Akkerman9524bb91999-05-25 23:11:18 +00001572 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001573#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001574 if (!abbrev(tcp)) {
1575 tprintf("%s{d_ino=%lu, d_off=%lu, ",
1576 i ? " " : "", d->d_ino, d->d_off);
1577 tprintf("d_reclen=%u, d_name=\"%s\"}",
1578 d->d_reclen, d->d_name);
1579 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001580#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001581#ifdef SVR4
1582 if (!abbrev(tcp)) {
1583 tprintf("%s{d_ino=%lu, d_off=%lu, ",
1584 i ? " " : "", d->d_ino, d->d_off);
1585 tprintf("d_reclen=%u, d_name=\"%s\"}",
1586 d->d_reclen, d->d_name);
1587 }
1588#endif /* SVR4 */
1589#ifdef SUNOS4
1590 if (!abbrev(tcp)) {
1591 tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
1592 i ? " " : "", d->d_off, d->d_fileno,
1593 d->d_reclen);
1594 tprintf("d_namlen=%u, d_name=\"%.*s\"}",
1595 d->d_namlen, d->d_namlen, d->d_name);
1596 }
1597#endif /* SUNOS4 */
Pavel Machek9a9f10b2000-02-01 16:22:52 +00001598 if (!d->d_reclen) {
1599 tprintf("/* d_reclen == 0, problem here */");
1600 break;
1601 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001602 i += d->d_reclen;
1603 dents++;
1604 }
1605 if (!abbrev(tcp))
1606 tprintf("}");
1607 else
1608 tprintf("/* %u entries */", dents);
1609 tprintf(", %lu", tcp->u_arg[2]);
1610 free(buf);
1611 return 0;
1612}
1613
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001614#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001615
1616int
1617sys_getcwd(tcp)
1618struct tcb *tcp;
1619{
1620 if (exiting(tcp)) {
1621 if (syserror(tcp))
1622 tprintf("%#lx", tcp->u_arg[0]);
1623 else
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001624 printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001625 tprintf(", %lu", tcp->u_arg[1]);
1626 }
1627 return 0;
1628}
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001629#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001630
1631#ifdef HAVE_SYS_ASYNCH_H
1632
1633int
1634sys_aioread(tcp)
1635struct tcb *tcp;
1636{
1637 struct aio_result_t res;
1638
1639 if (entering(tcp)) {
1640 tprintf("%lu, ", tcp->u_arg[0]);
1641 } else {
1642 if (syserror(tcp))
1643 tprintf("%#lx", tcp->u_arg[1]);
1644 else
1645 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1646 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1647 printxval(whence, tcp->u_arg[4], "L_???");
1648 if (syserror(tcp) || tcp->u_arg[5] == 0
1649 || umove(tcp, tcp->u_arg[5], &res) < 0)
1650 tprintf(", %#lx", tcp->u_arg[5]);
1651 else
1652 tprintf(", {aio_return %d aio_errno %d}",
1653 res.aio_return, res.aio_errno);
1654 }
1655 return 0;
1656}
1657
1658int
1659sys_aiowrite(tcp)
1660struct tcb *tcp;
1661{
1662 struct aio_result_t res;
1663
1664 if (entering(tcp)) {
1665 tprintf("%lu, ", tcp->u_arg[0]);
1666 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1667 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1668 printxval(whence, tcp->u_arg[4], "L_???");
1669 }
1670 else {
1671 if (tcp->u_arg[5] == 0)
1672 tprintf(", NULL");
1673 else if (syserror(tcp)
1674 || umove(tcp, tcp->u_arg[5], &res) < 0)
1675 tprintf(", %#lx", tcp->u_arg[5]);
1676 else
1677 tprintf(", {aio_return %d aio_errno %d}",
1678 res.aio_return, res.aio_errno);
1679 }
1680 return 0;
1681}
1682
1683int
1684sys_aiowait(tcp)
1685struct tcb *tcp;
1686{
1687 if (entering(tcp))
1688 printtv(tcp, tcp->u_arg[0]);
1689 return 0;
1690}
1691
1692int
1693sys_aiocancel(tcp)
1694struct tcb *tcp;
1695{
1696 struct aio_result_t res;
1697
1698 if (exiting(tcp)) {
1699 if (tcp->u_arg[0] == 0)
1700 tprintf("NULL");
1701 else if (syserror(tcp)
1702 || umove(tcp, tcp->u_arg[0], &res) < 0)
1703 tprintf("%#lx", tcp->u_arg[0]);
1704 else
1705 tprintf("{aio_return %d aio_errno %d}",
1706 res.aio_return, res.aio_errno);
1707 }
1708 return 0;
1709}
1710
1711#endif /* HAVE_SYS_ASYNCH_H */