blob: a53d229b204a5ad67db84e367c306f5e7c7cfbdc [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
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000175 { O_DIRECT, "O_DIRECT" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000176#endif
177#ifdef O_LARGEFILE
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000178 { O_LARGEFILE, "O_LARGEFILE" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000179#endif
180#ifdef O_DIRECTORY
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000181 { O_DIRECTORY, "O_DIRECTORY" },
182#endif
183#ifdef O_NOFOLLOW
184 { O_NOFOLLOW, "O_NOFOLLOW" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000185#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
229int
230sys_open(tcp)
231struct 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
247struct 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
265int
266solaris_open(tcp)
267struct 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
284int
285sys_creat(tcp)
286struct 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
295static 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
309int
310sys_access(tcp)
311struct 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
321int
322sys_umask(tcp)
323struct tcb *tcp;
324{
325 if (entering(tcp)) {
326 tprintf("%#lo", tcp->u_arg[0]);
327 }
328 return RVAL_OCTAL;
329}
330
331static struct xlat whence[] = {
332 { SEEK_SET, "SEEK_SET" },
333 { SEEK_CUR, "SEEK_CUR" },
334 { SEEK_END, "SEEK_END" },
335 { 0, NULL },
336};
337
338int
339sys_lseek(tcp)
340struct 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
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000353#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000354int
355sys_llseek (tcp)
356struct tcb *tcp;
357{
358 if (entering(tcp)) {
359 if (tcp->u_arg[4] == SEEK_SET)
360 tprintf("%ld, %llu, ", tcp->u_arg[0],
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000361 (((long long int) tcp->u_arg[1]) << 32
362 | (unsigned long long) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000363 else
364 tprintf("%ld, %lld, ", tcp->u_arg[0],
365 (((long long int) tcp->u_arg[1]) << 32
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000366 | (unsigned long long) tcp->u_arg[2]));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000367 }
368 else {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000369 long long int off;
370 if (syserror(tcp) || umove(tcp, tcp->u_arg[3], &off) < 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371 tprintf("%#lx, ", tcp->u_arg[3]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000372 else
373 tprintf("[%llu], ", off);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000374 printxval(whence, tcp->u_arg[4], "SEEK_???");
375 }
376 return 0;
377}
378#endif
379
380int
381sys_truncate(tcp)
382struct 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
391int
392sys_ftruncate(tcp)
393struct 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
403static 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
414static char *
415sprintmode(mode)
416int 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
438static char *
439sprinttime(t)
440time_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",
Wichert Akkerman3ed6dc22000-01-11 14:41:09 +0000451 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000452 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
453 return buf;
454}
455
456#ifdef LINUXSPARC
457typedef struct {
458 int tv_sec;
459 int tv_nsec;
460} timestruct_t;
461
462struct 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
483static void
484printstatsol(tcp, addr)
485struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000486long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000487{
488 struct solstat statbuf;
489
490 if (!addr) {
491 tprintf("NULL");
492 return;
493 }
494 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000495 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000496 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}
Wichert Akkermanb859bea1999-04-18 22:50:50 +0000535#endif /* LINUXSPARC */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000536
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000537static void
538realprintstat(tcp, statbuf)
539struct tcb *tcp;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000540struct stat *statbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000541{
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
Nate Sammons771a6ff1999-04-05 22:39:31 +0000586
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000587static void
588printstat(tcp, addr)
589struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000590long addr;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000591{
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000592 struct stat statbuf;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000593
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)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000606 tprintf("%#lx", addr);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000607 return;
608 }
609 if (umove(tcp, addr, &statbuf) < 0) {
610 tprintf("{...}");
611 return;
612 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000613
614 realprintstat(tcp, &statbuf);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000615}
616
Wichert Akkermanc7926982000-04-10 22:22:31 +0000617#ifdef HAVE_STAT64
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000618static void
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000619printstat64(tcp, addr)
620struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000621long addr;
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000622{
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)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000637 tprintf("%#lx", addr);
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000638 return;
639 }
640 if (umove(tcp, addr, &statbuf) < 0) {
641 tprintf("{...}");
642 return;
643 }
644
645 if (!abbrev(tcp)) {
Wichert Akkermand077c452000-08-10 18:16:15 +0000646#ifdef HAVE_LONG_LONG
647 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%llu, st_mode=%s, ",
648#else
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000649 tprintf("{st_dev=makedev(%lu, %lu), st_ino=%lu, st_mode=%s, ",
Wichert Akkermand077c452000-08-10 18:16:15 +0000650#endif
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000651 (unsigned long) major(statbuf.st_dev),
652 (unsigned long) minor(statbuf.st_dev),
Wichert Akkermand077c452000-08-10 18:16:15 +0000653#ifdef HAVE_LONG_LONG
654 (unsigned long long) statbuf.st_ino,
655#else
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000656 (unsigned long) statbuf.st_ino,
Wichert Akkermand077c452000-08-10 18:16:15 +0000657#endif
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000658 sprintmode(statbuf.st_mode));
659 tprintf("st_nlink=%lu, st_uid=%lu, st_gid=%lu, ",
660 (unsigned long) statbuf.st_nlink,
661 (unsigned long) statbuf.st_uid,
662 (unsigned long) statbuf.st_gid);
663#ifdef HAVE_ST_BLKSIZE
664 tprintf("st_blksize=%lu, ",
665 (unsigned long) statbuf.st_blksize);
666#endif /* HAVE_ST_BLKSIZE */
667#ifdef HAVE_ST_BLOCKS
668 tprintf("st_blocks=%lu, ", (unsigned long) statbuf.st_blocks);
669#endif /* HAVE_ST_BLOCKS */
670 }
671 else
672 tprintf("{st_mode=%s, ", sprintmode(statbuf.st_mode));
673 switch (statbuf.st_mode & S_IFMT) {
674 case S_IFCHR: case S_IFBLK:
675#ifdef HAVE_ST_RDEV
676 tprintf("st_rdev=makedev(%lu, %lu), ",
677 (unsigned long) major(statbuf.st_rdev),
678 (unsigned long) minor(statbuf.st_rdev));
679#else /* !HAVE_ST_RDEV */
680 tprintf("st_size=makedev(%lu, %lu), ",
681 (unsigned long) major(statbuf.st_size),
682 (unsigned long) minor(statbuf.st_size));
683#endif /* !HAVE_ST_RDEV */
684 break;
685 default:
686 tprintf("st_size=%llu, ", statbuf.st_size);
687 break;
688 }
689 if (!abbrev(tcp)) {
690 tprintf("st_atime=%s, ", sprinttime(statbuf.st_atime));
691 tprintf("st_mtime=%s, ", sprinttime(statbuf.st_mtime));
692 tprintf("st_ctime=%s}", sprinttime(statbuf.st_ctime));
693 }
694 else
695 tprintf("...}");
696}
Wichert Akkermanc7926982000-04-10 22:22:31 +0000697#endif /* HAVE_STAT64 */
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000698
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000699#if defined(linux) && !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000700static void
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000701convertoldstat(oldbuf, newbuf)
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +0000702const struct __old_kernel_stat *oldbuf;
703struct stat *newbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000704{
705 newbuf->st_dev=oldbuf->st_dev;
706 newbuf->st_ino=oldbuf->st_ino;
707 newbuf->st_mode=oldbuf->st_mode;
708 newbuf->st_nlink=oldbuf->st_nlink;
709 newbuf->st_uid=oldbuf->st_uid;
710 newbuf->st_gid=oldbuf->st_gid;
711 newbuf->st_rdev=oldbuf->st_rdev;
712 newbuf->st_size=oldbuf->st_size;
713 newbuf->st_atime=oldbuf->st_atime;
714 newbuf->st_mtime=oldbuf->st_mtime;
715 newbuf->st_ctime=oldbuf->st_ctime;
716 newbuf->st_blksize=0; /* not supported in old_stat */
717 newbuf->st_blocks=0; /* not supported in old_stat */
718}
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000719
720
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000721static void
722printoldstat(tcp, addr)
723struct tcb *tcp;
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000724long addr;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000725{
Wichert Akkerman25d0c4f1999-04-18 19:35:42 +0000726 struct __old_kernel_stat statbuf;
727 struct stat newstatbuf;
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000728
729#ifdef LINUXSPARC
730 if (current_personality == 1) {
731 printstatsol(tcp, addr);
732 return;
733 }
734#endif /* LINUXSPARC */
735
736 if (!addr) {
737 tprintf("NULL");
738 return;
739 }
740 if (syserror(tcp) || !verbose(tcp)) {
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000741 tprintf("%#lx", addr);
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000742 return;
743 }
744 if (umove(tcp, addr, &statbuf) < 0) {
745 tprintf("{...}");
746 return;
747 }
748
749 convertoldstat(&statbuf, &newstatbuf);
750 realprintstat(tcp, &newstatbuf);
751}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000752#endif /* linux && !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000753
754
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000755int
756sys_stat(tcp)
757struct tcb *tcp;
758{
759 if (entering(tcp)) {
760 printpath(tcp, tcp->u_arg[0]);
761 tprintf(", ");
762 } else {
763 printstat(tcp, tcp->u_arg[1]);
764 }
765 return 0;
766}
767
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000768#ifdef linux
769int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000770sys_stat64(tcp)
771struct tcb *tcp;
772{
773#ifdef HAVE_STAT64
774 if (entering(tcp)) {
775 printpath(tcp, tcp->u_arg[0]);
776 tprintf(", ");
777 } else {
778 printstat64(tcp, tcp->u_arg[1]);
779 }
780 return 0;
781#else
782 return printargs(tcp);
783#endif
784}
785
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000786# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000787int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000788sys_oldstat(tcp)
789struct tcb *tcp;
790{
791 if (entering(tcp)) {
792 printpath(tcp, tcp->u_arg[0]);
793 tprintf(", ");
794 } else {
795 printoldstat(tcp, tcp->u_arg[1]);
796 }
797 return 0;
798}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000799# endif /* !IA64 */
800#endif /* linux */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000801
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000802int
803sys_fstat(tcp)
804struct tcb *tcp;
805{
806 if (entering(tcp))
807 tprintf("%ld, ", tcp->u_arg[0]);
808 else {
809 printstat(tcp, tcp->u_arg[1]);
810 }
811 return 0;
812}
813
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000814#ifdef linux
815int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000816sys_fstat64(tcp)
817struct tcb *tcp;
818{
819#ifdef HAVE_STAT64
820 if (entering(tcp))
821 tprintf("%ld, ", tcp->u_arg[0]);
822 else {
823 printstat64(tcp, tcp->u_arg[1]);
824 }
825 return 0;
826#else
827 return printargs(tcp);
828#endif
829}
830
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000831# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000832int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000833sys_oldfstat(tcp)
834struct tcb *tcp;
835{
836 if (entering(tcp))
837 tprintf("%ld, ", tcp->u_arg[0]);
838 else {
839 printoldstat(tcp, tcp->u_arg[1]);
840 }
841 return 0;
842}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000843# endif /* !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000844#endif
845
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000846int
847sys_lstat(tcp)
848struct tcb *tcp;
849{
850 if (entering(tcp)) {
851 printpath(tcp, tcp->u_arg[0]);
852 tprintf(", ");
853 } else {
854 printstat(tcp, tcp->u_arg[1]);
855 }
856 return 0;
857}
858
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000859#ifdef linux
860int
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000861sys_lstat64(tcp)
862struct tcb *tcp;
863{
864#ifdef HAVE_STAT64
865 if (entering(tcp)) {
866 printpath(tcp, tcp->u_arg[0]);
867 tprintf(", ");
868 } else {
869 printstat64(tcp, tcp->u_arg[1]);
870 }
871 return 0;
872#else
873 return printargs(tcp);
874#endif
875}
876
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000877# if !defined(IA64)
Ulrich Drepper7f02c4d1999-12-24 08:01:34 +0000878int
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000879sys_oldlstat(tcp)
880struct tcb *tcp;
881{
882 if (entering(tcp)) {
883 printpath(tcp, tcp->u_arg[0]);
884 tprintf(", ");
885 } else {
886 printoldstat(tcp, tcp->u_arg[1]);
887 }
888 return 0;
889}
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000890# endif /* !IA64 */
Wichert Akkerman328c5e71999-04-16 00:21:26 +0000891#endif
892
893
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000894#if defined(SVR4) || defined(LINUXSPARC)
895
896int
897sys_xstat(tcp)
898struct tcb *tcp;
899{
900 if (entering(tcp)) {
901 tprintf("%ld, ", tcp->u_arg[0]);
902 printpath(tcp, tcp->u_arg[1]);
903 tprintf(", ");
904 } else {
905 printstat(tcp, tcp->u_arg[2]);
906 }
907 return 0;
908}
909
910int
911sys_fxstat(tcp)
912struct tcb *tcp;
913{
914 if (entering(tcp))
915 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]);
916 else {
917 printstat(tcp, tcp->u_arg[2]);
918 }
919 return 0;
920}
921
922int
923sys_lxstat(tcp)
924struct tcb *tcp;
925{
926 if (entering(tcp)) {
927 tprintf("%ld, ", tcp->u_arg[0]);
928 printpath(tcp, tcp->u_arg[1]);
929 tprintf(", ");
930 } else {
931 printstat(tcp, tcp->u_arg[2]);
932 }
933 return 0;
934}
935
936int
937sys_xmknod(tcp)
938struct tcb *tcp;
939{
940 int mode = tcp->u_arg[2];
941
942 if (entering(tcp)) {
943 tprintf("%ld, ", tcp->u_arg[0]);
944 printpath(tcp, tcp->u_arg[1]);
945 tprintf(", %s", sprintmode(mode));
946 switch (mode & S_IFMT) {
947 case S_IFCHR: case S_IFBLK:
948#ifdef LINUXSPARC
949 tprintf(", makedev(%lu, %lu)",
950 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
951 (unsigned long) (tcp->u_arg[3] & 0x3ffff));
952#else
953 tprintf(", makedev(%lu, %lu)",
954 (unsigned long) major(tcp->u_arg[3]),
955 (unsigned long) minor(tcp->u_arg[3]));
956#endif
957 break;
958 default:
959 break;
960 }
961 }
962 return 0;
963}
964
Wichert Akkerman8829a551999-06-11 13:18:40 +0000965#ifdef HAVE_SYS_ACL_H
966
967#include <sys/acl.h>
968
969struct xlat aclcmds[] = {
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000970#ifdef SETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +0000971 { SETACL, "SETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000972#endif
973#ifdef GETACL
Wichert Akkerman8829a551999-06-11 13:18:40 +0000974 { GETACL, "GETACL" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000975#endif
976#ifdef GETACLCNT
Wichert Akkerman8829a551999-06-11 13:18:40 +0000977 { GETACLCNT, "GETACLCNT" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000978#endif
979#ifdef ACL_GET
980 { ACL_GET, "ACL_GET" },
981#endif
982#ifdef ACL_SET
983 { ACL_SET, "ACL_SET" },
984#endif
985#ifdef ACL_CNT
986 { ACL_CNT, "ACL_CNT" },
987#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000988 { 0, NULL },
989};
990
991int
992sys_acl(tcp)
993struct tcb *tcp;
994{
995 if (entering(tcp)) {
996 printpath(tcp, tcp->u_arg[0]);
997 tprintf(", ");
998 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
999 tprintf(", %ld", tcp->u_arg[2]);
1000 /*
1001 * FIXME - dump out the list of aclent_t's pointed to
1002 * by "tcp->u_arg[3]" if it's not NULL.
1003 */
1004 if (tcp->u_arg[3])
1005 tprintf(", %#lx", tcp->u_arg[3]);
1006 else
1007 tprintf(", NULL");
1008 }
1009 return 0;
1010}
1011
1012
1013int
1014sys_facl(tcp)
1015struct tcb *tcp;
1016{
1017 if (entering(tcp)) {
1018 tprintf("%ld, ", tcp->u_arg[0]);
1019 printxval(aclcmds, tcp->u_arg[1], "???ACL???");
1020 tprintf(", %ld", tcp->u_arg[2]);
1021 /*
1022 * FIXME - dump out the list of aclent_t's pointed to
1023 * by "tcp->u_arg[3]" if it's not NULL.
1024 */
1025 if (tcp->u_arg[3])
1026 tprintf(", %#lx", tcp->u_arg[3]);
1027 else
1028 tprintf(", NULL");
1029 }
1030 return 0;
1031}
1032
Wichert Akkermane4aafd41999-11-26 09:54:08 +00001033
1034struct xlat aclipc[] = {
1035#ifdef IPC_SHM
1036 { IPC_SHM, "IPC_SHM" },
1037#endif
1038#ifdef IPC_SEM
1039 { IPC_SEM, "IPC_SEM" },
1040#endif
1041#ifdef IPC_MSG
1042 { IPC_MSG, "IPC_MSG" },
1043#endif
1044 { 0, NULL },
1045};
1046
1047
1048int
1049sys_aclipc(tcp)
1050struct tcb *tcp;
1051{
1052 if (entering(tcp)) {
1053 printxval(aclipc, tcp->u_arg[0], "???IPC???");
1054 tprintf(", %#lx, ", tcp->u_arg[1]);
1055 printxval(aclcmds, tcp->u_arg[2], "???ACL???");
1056 tprintf(", %ld", tcp->u_arg[3]);
1057 /*
1058 * FIXME - dump out the list of aclent_t's pointed to
1059 * by "tcp->u_arg[4]" if it's not NULL.
1060 */
1061 if (tcp->u_arg[4])
1062 tprintf(", %#lx", tcp->u_arg[4]);
1063 else
1064 tprintf(", NULL");
1065 }
1066 return 0;
1067}
1068
1069
1070
Wichert Akkerman8829a551999-06-11 13:18:40 +00001071#endif /* HAVE_SYS_ACL_H */
1072
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001073#endif /* SVR4 || LINUXSPARC */
1074
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001075#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001076
1077static struct xlat fsmagic[] = {
Wichert Akkerman43a74822000-06-27 17:33:32 +00001078 { 0x73757245, "CODA_SUPER_MAGIC" },
1079 { 0x012ff7b7, "COH_SUPER_MAGIC" },
1080 { 0x1373, "DEVFS_SUPER_MAGIC" },
1081 { 0x1cd1, "DEVPTS_SUPER_MAGIC" },
1082 { 0x414A53, "EFS_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001083 { 0xef51, "EXT2_OLD_SUPER_MAGIC" },
1084 { 0xef53, "EXT2_SUPER_MAGIC" },
1085 { 0x137d, "EXT_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001086 { 0xf995e849, "HPFS_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001087 { 0x9660, "ISOFS_SUPER_MAGIC" },
1088 { 0x137f, "MINIX_SUPER_MAGIC" },
1089 { 0x138f, "MINIX_SUPER_MAGIC2" },
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001090 { 0x2468, "MINIX2_SUPER_MAGIC" },
1091 { 0x2478, "MINIX2_SUPER_MAGIC2" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001092 { 0x4d44, "MSDOS_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001093 { 0x564c, "NCP_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001094 { 0x6969, "NFS_SUPER_MAGIC" },
1095 { 0x9fa0, "PROC_SUPER_MAGIC" },
Wichert Akkerman43a74822000-06-27 17:33:32 +00001096 { 0x002f, "QNX4_SUPER_MAGIC" },
1097 { 0x52654973, "REISERFS_SUPER_MAGIC" },
1098 { 0x02011994, "SHMFS_SUPER_MAGIC" },
1099 { 0x517b, "SMB_SUPER_MAGIC" },
1100 { 0x012ff7b6, "SYSV2_SUPER_MAGIC" },
1101 { 0x012ff7b5, "SYSV4_SUPER_MAGIC" },
1102 { 0x00011954, "UFS_MAGIC" },
1103 { 0x54190100, "UFS_CIGAM" },
1104 { 0x012ff7b4, "XENIX_SUPER_MAGIC" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001105 { 0x012fd16d, "XIAFS_SUPER_MAGIC" },
1106 { 0, NULL },
1107};
1108
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001109#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001110
1111#ifndef SVR4
1112
1113static char *
1114sprintfstype(magic)
1115int magic;
1116{
1117 static char buf[32];
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001118#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001119 char *s;
1120
1121 s = xlookup(fsmagic, magic);
1122 if (s) {
1123 sprintf(buf, "\"%s\"", s);
1124 return buf;
1125 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001126#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001127 sprintf(buf, "%#x", magic);
1128 return buf;
1129}
1130
1131static void
1132printstatfs(tcp, addr)
1133struct tcb *tcp;
1134long addr;
1135{
1136 struct statfs statbuf;
1137
1138 if (syserror(tcp) || !verbose(tcp)) {
1139 tprintf("%#lx", addr);
1140 return;
1141 }
1142 if (umove(tcp, addr, &statbuf) < 0) {
1143 tprintf("{...}");
1144 return;
1145 }
1146#ifdef ALPHA
1147
1148 tprintf("{f_type=%s, f_fbsize=%u, f_blocks=%u, f_bfree=%u, ",
1149 sprintfstype(statbuf.f_type),
1150 statbuf.f_bsize, statbuf.f_blocks, statbuf.f_bfree);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001151 tprintf("f_bavail=%u, f_files=%u, f_ffree=%u, f_namelen=%u",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152 statbuf.f_bavail,statbuf.f_files, statbuf.f_ffree, statbuf.f_namelen);
1153#else /* !ALPHA */
1154 tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ",
1155 sprintfstype(statbuf.f_type),
Nate Sammons5c74d201999-04-06 01:37:51 +00001156 (unsigned long)statbuf.f_bsize,
1157 (unsigned long)statbuf.f_blocks,
1158 (unsigned long)statbuf.f_bfree);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001159 tprintf("f_files=%lu, f_ffree=%lu",
Nate Sammons5c74d201999-04-06 01:37:51 +00001160 (unsigned long)statbuf.f_files,
1161 (unsigned long)statbuf.f_ffree);
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001162#ifdef linux
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001163 tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen);
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001164#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001165#endif /* !ALPHA */
1166 tprintf("}");
1167}
1168
1169int
1170sys_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 }
1179 return 0;
1180}
1181
1182int
1183sys_fstatfs(tcp)
1184struct tcb *tcp;
1185{
1186 if (entering(tcp)) {
1187 tprintf("%lu, ", tcp->u_arg[0]);
1188 } else {
1189 printstatfs(tcp, tcp->u_arg[1]);
1190 }
1191 return 0;
1192}
1193
Wichert Akkermana0f36c61999-04-16 14:01:34 +00001194#if defined(linux) && defined(__alpha)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001195
1196int
1197osf_statfs(tcp)
1198struct tcb *tcp;
1199{
1200 if (entering(tcp)) {
1201 printpath(tcp, tcp->u_arg[0]);
1202 tprintf(", ");
1203 } else {
1204 printstatfs(tcp, tcp->u_arg[1]);
1205 tprintf(", %lu", tcp->u_arg[2]);
1206 }
1207 return 0;
1208}
1209
1210int
1211osf_fstatfs(tcp)
1212struct tcb *tcp;
1213{
1214 if (entering(tcp)) {
1215 tprintf("%lu, ", tcp->u_arg[0]);
1216 } else {
1217 printstatfs(tcp, tcp->u_arg[1]);
1218 tprintf(", %lu", tcp->u_arg[2]);
1219 }
1220 return 0;
1221}
Wichert Akkermana0f36c61999-04-16 14:01:34 +00001222#endif /* linux && __alpha */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001223
1224#endif /* !SVR4 */
1225
1226#ifdef SUNOS4
1227
1228int
1229sys_ustat(tcp)
1230struct tcb *tcp;
1231{
1232 struct ustat statbuf;
1233
1234 if (entering(tcp)) {
1235 tprintf("makedev(%lu, %lu), ",
1236 (long) major(tcp->u_arg[0]),
1237 (long) minor(tcp->u_arg[0]));
1238 }
1239 else {
1240 if (syserror(tcp) || !verbose(tcp))
1241 tprintf("%#lx", tcp->u_arg[1]);
1242 else if (umove(tcp, tcp->u_arg[1], &statbuf) < 0)
1243 tprintf("{...}");
1244 else {
1245 tprintf("{f_tfree=%lu, f_tinode=%lu, ",
1246 statbuf.f_tfree, statbuf.f_tinode);
1247 tprintf("f_fname=\"%.*s\", ",
1248 (int) sizeof(statbuf.f_fname),
1249 statbuf.f_fname);
1250 tprintf("f_fpack=\"%.*s\"}",
1251 (int) sizeof(statbuf.f_fpack),
1252 statbuf.f_fpack);
1253 }
1254 }
1255 return 0;
1256}
1257
1258#endif /* SUNOS4 */
1259
Wichert Akkermanc7926982000-04-10 22:22:31 +00001260int
1261sys_pivotroot(tcp)
1262struct tcb *tcp;
1263{
1264 if (entering(tcp)) {
1265 printpath(tcp, tcp->u_arg[0]);
1266 tprintf(", ");
1267 printpath(tcp, tcp->u_arg[1]);
1268 }
1269 return 0;
1270}
1271
1272
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001273/* directory */
1274int
1275sys_chdir(tcp)
1276struct tcb *tcp;
1277{
1278 if (entering(tcp)) {
1279 printpath(tcp, tcp->u_arg[0]);
1280 }
1281 return 0;
1282}
1283
1284int
1285sys_mkdir(tcp)
1286struct tcb *tcp;
1287{
1288 if (entering(tcp)) {
1289 printpath(tcp, tcp->u_arg[0]);
1290 tprintf(", %#lo", tcp->u_arg[1]);
1291 }
1292 return 0;
1293}
1294
1295int
1296sys_rmdir(tcp)
1297struct tcb *tcp;
1298{
1299 if (entering(tcp)) {
1300 printpath(tcp, tcp->u_arg[0]);
1301 }
1302 return 0;
1303}
1304
1305int
1306sys_fchdir(tcp)
1307struct tcb *tcp;
1308{
1309 if (entering(tcp)) {
1310 tprintf("%ld", tcp->u_arg[0]);
1311 }
1312 return 0;
1313}
1314
1315int
1316sys_chroot(tcp)
1317struct tcb *tcp;
1318{
1319 if (entering(tcp)) {
1320 printpath(tcp, tcp->u_arg[0]);
1321 }
1322 return 0;
1323}
1324
1325int
1326sys_fchroot(tcp)
1327struct tcb *tcp;
1328{
1329 if (entering(tcp)) {
1330 tprintf("%ld", tcp->u_arg[0]);
1331 }
1332 return 0;
1333}
1334
1335int
1336sys_link(tcp)
1337struct tcb *tcp;
1338{
1339 if (entering(tcp)) {
1340 printpath(tcp, tcp->u_arg[0]);
1341 tprintf(", ");
1342 printpath(tcp, tcp->u_arg[1]);
1343 }
1344 return 0;
1345}
1346
1347int
1348sys_unlink(tcp)
1349struct tcb *tcp;
1350{
1351 if (entering(tcp)) {
1352 printpath(tcp, tcp->u_arg[0]);
1353 }
1354 return 0;
1355}
1356
1357int
1358sys_symlink(tcp)
1359struct tcb *tcp;
1360{
1361 if (entering(tcp)) {
1362 printpath(tcp, tcp->u_arg[0]);
1363 tprintf(", ");
1364 printpath(tcp, tcp->u_arg[1]);
1365 }
1366 return 0;
1367}
1368
1369int
1370sys_readlink(tcp)
1371struct tcb *tcp;
1372{
1373 if (entering(tcp)) {
1374 printpath(tcp, tcp->u_arg[0]);
1375 tprintf(", ");
1376 } else {
1377 if (syserror(tcp))
1378 tprintf("%#lx", tcp->u_arg[1]);
1379 else
1380 printpathn(tcp, tcp->u_arg[1], tcp->u_rval);
1381 tprintf(", %lu", tcp->u_arg[2]);
1382 }
1383 return 0;
1384}
1385
1386int
1387sys_rename(tcp)
1388struct tcb *tcp;
1389{
1390 if (entering(tcp)) {
1391 printpath(tcp, tcp->u_arg[0]);
1392 tprintf(", ");
1393 printpath(tcp, tcp->u_arg[1]);
1394 }
1395 return 0;
1396}
1397
1398int
1399sys_chown(tcp)
1400struct tcb *tcp;
1401{
1402 if (entering(tcp)) {
1403 printpath(tcp, tcp->u_arg[0]);
1404 tprintf(", %lu, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1405 }
1406 return 0;
1407}
1408
1409int
1410sys_fchown(tcp)
1411struct tcb *tcp;
1412{
1413 if (entering(tcp)) {
1414 tprintf("%ld, %lu, %lu",
1415 tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
1416 }
1417 return 0;
1418}
1419
1420int
1421sys_chmod(tcp)
1422struct tcb *tcp;
1423{
1424 if (entering(tcp)) {
1425 printpath(tcp, tcp->u_arg[0]);
1426 tprintf(", %#lo", tcp->u_arg[1]);
1427 }
1428 return 0;
1429}
1430
1431int
1432sys_fchmod(tcp)
1433struct tcb *tcp;
1434{
1435 if (entering(tcp)) {
1436 tprintf("%ld, %#lo", tcp->u_arg[0], tcp->u_arg[1]);
1437 }
1438 return 0;
1439}
1440
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001441#ifdef ALPHA
1442int
1443sys_osf_utimes(tcp)
1444struct tcb *tcp;
1445{
1446 if (entering(tcp)) {
1447 printpath(tcp, tcp->u_arg[0]);
1448 tprintf(", ");
1449 printtv32(tcp, tcp->u_arg[1]);
1450 }
1451 return 0;
1452}
1453#endif
1454
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001455int
1456sys_utimes(tcp)
1457struct tcb *tcp;
1458{
1459 if (entering(tcp)) {
1460 printpath(tcp, tcp->u_arg[0]);
1461 tprintf(", ");
1462 printtv(tcp, tcp->u_arg[1]);
1463 }
1464 return 0;
1465}
1466
1467int
1468sys_utime(tcp)
1469struct tcb *tcp;
1470{
1471 long ut[2];
1472
1473 if (entering(tcp)) {
1474 printpath(tcp, tcp->u_arg[0]);
1475 tprintf(", ");
1476 if (!tcp->u_arg[1])
1477 tprintf("NULL");
1478 else if (!verbose(tcp))
1479 tprintf("%#lx", tcp->u_arg[1]);
1480 else if (umoven(tcp, tcp->u_arg[1], sizeof ut,
1481 (char *) ut) < 0)
1482 tprintf("[?, ?]");
1483 else {
1484 tprintf("[%s,", sprinttime(ut[0]));
1485 tprintf(" %s]", sprinttime(ut[1]));
1486 }
1487 }
1488 return 0;
1489}
1490
1491int
1492sys_mknod(tcp)
1493struct tcb *tcp;
1494{
1495 int mode = tcp->u_arg[1];
1496
1497 if (entering(tcp)) {
1498 printpath(tcp, tcp->u_arg[0]);
1499 tprintf(", %s", sprintmode(mode));
1500 switch (mode & S_IFMT) {
1501 case S_IFCHR: case S_IFBLK:
1502#ifdef LINUXSPARC
1503 if (current_personality == 1)
1504 tprintf(", makedev(%lu, %lu)",
1505 (unsigned long) ((tcp->u_arg[2] >> 18) & 0x3fff),
1506 (unsigned long) (tcp->u_arg[2] & 0x3ffff));
1507 else
1508#endif
1509 tprintf(", makedev(%lu, %lu)",
1510 (unsigned long) major(tcp->u_arg[2]),
1511 (unsigned long) minor(tcp->u_arg[2]));
1512 break;
1513 default:
1514 break;
1515 }
1516 }
1517 return 0;
1518}
1519
1520int
1521sys_mkfifo(tcp)
1522struct tcb *tcp;
1523{
1524 if (entering(tcp)) {
1525 printpath(tcp, tcp->u_arg[0]);
1526 tprintf(", %#lo", tcp->u_arg[1]);
1527 }
1528 return 0;
1529}
1530
1531int
1532sys_fsync(tcp)
1533struct tcb *tcp;
1534{
1535 if (entering(tcp)) {
1536 tprintf("%ld", tcp->u_arg[0]);
1537 }
1538 return 0;
1539}
1540
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001541#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001542
1543static void
1544printdir(tcp, addr)
1545struct tcb *tcp;
1546long addr;
1547{
1548 struct dirent d;
1549
1550 if (!verbose(tcp)) {
1551 tprintf("%#lx", addr);
1552 return;
1553 }
1554 if (umove(tcp, addr, &d) < 0) {
1555 tprintf("{...}");
1556 return;
1557 }
1558 tprintf("{d_ino=%ld, ", (unsigned long) d.d_ino);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001559 tprintf("d_name=");
1560 printpathn(tcp, (long) ((struct dirent *) addr)->d_name, d.d_reclen);
1561 tprintf("}");
1562}
1563
1564int
1565sys_readdir(tcp)
1566struct tcb *tcp;
1567{
1568 if (entering(tcp)) {
1569 tprintf("%lu, ", tcp->u_arg[0]);
1570 } else {
1571 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
1572 tprintf("%#lx", tcp->u_arg[1]);
1573 else
1574 printdir(tcp, tcp->u_arg[1]);
1575 /* Not much point in printing this out, it is always 1. */
1576 if (tcp->u_arg[2] != 1)
1577 tprintf(", %lu", tcp->u_arg[2]);
1578 }
1579 return 0;
1580}
1581
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001582#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001583
1584int
1585sys_getdents(tcp)
1586struct tcb *tcp;
1587{
1588 int i, len, dents = 0;
1589 char *buf;
1590
1591 if (entering(tcp)) {
1592 tprintf("%lu, ", tcp->u_arg[0]);
1593 return 0;
1594 }
1595 if (syserror(tcp) || !verbose(tcp)) {
1596 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
1597 return 0;
1598 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001599 len = tcp->u_rval;
1600 if ((buf = malloc(len)) == NULL) {
1601 tprintf("out of memory\n");
1602 return 0;
1603 }
1604 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
1605 tprintf("{...}, %lu", tcp->u_arg[2]);
1606 free(buf);
1607 return 0;
1608 }
1609 if (!abbrev(tcp))
1610 tprintf("{");
1611 for (i = 0; i < len;) {
Wichert Akkerman9524bb91999-05-25 23:11:18 +00001612 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001613#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001614 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 }
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001620#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001621#ifdef SVR4
1622 if (!abbrev(tcp)) {
1623 tprintf("%s{d_ino=%lu, d_off=%lu, ",
1624 i ? " " : "", d->d_ino, d->d_off);
1625 tprintf("d_reclen=%u, d_name=\"%s\"}",
1626 d->d_reclen, d->d_name);
1627 }
1628#endif /* SVR4 */
1629#ifdef SUNOS4
1630 if (!abbrev(tcp)) {
1631 tprintf("%s{d_off=%lu, d_fileno=%lu, d_reclen=%u, ",
1632 i ? " " : "", d->d_off, d->d_fileno,
1633 d->d_reclen);
1634 tprintf("d_namlen=%u, d_name=\"%.*s\"}",
1635 d->d_namlen, d->d_namlen, d->d_name);
1636 }
1637#endif /* SUNOS4 */
Pavel Machek9a9f10b2000-02-01 16:22:52 +00001638 if (!d->d_reclen) {
1639 tprintf("/* d_reclen == 0, problem here */");
1640 break;
1641 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001642 i += d->d_reclen;
1643 dents++;
1644 }
1645 if (!abbrev(tcp))
1646 tprintf("}");
1647 else
1648 tprintf("/* %u entries */", dents);
1649 tprintf(", %lu", tcp->u_arg[2]);
1650 free(buf);
1651 return 0;
1652}
1653
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001654#ifdef linux
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001655
1656int
1657sys_getcwd(tcp)
1658struct tcb *tcp;
1659{
1660 if (exiting(tcp)) {
1661 if (syserror(tcp))
1662 tprintf("%#lx", tcp->u_arg[0]);
1663 else
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001664 printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001665 tprintf(", %lu", tcp->u_arg[1]);
1666 }
1667 return 0;
1668}
Wichert Akkerman328c5e71999-04-16 00:21:26 +00001669#endif /* linux */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001670
1671#ifdef HAVE_SYS_ASYNCH_H
1672
1673int
1674sys_aioread(tcp)
1675struct tcb *tcp;
1676{
1677 struct aio_result_t res;
1678
1679 if (entering(tcp)) {
1680 tprintf("%lu, ", tcp->u_arg[0]);
1681 } else {
1682 if (syserror(tcp))
1683 tprintf("%#lx", tcp->u_arg[1]);
1684 else
1685 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1686 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1687 printxval(whence, tcp->u_arg[4], "L_???");
1688 if (syserror(tcp) || tcp->u_arg[5] == 0
1689 || umove(tcp, tcp->u_arg[5], &res) < 0)
1690 tprintf(", %#lx", tcp->u_arg[5]);
1691 else
1692 tprintf(", {aio_return %d aio_errno %d}",
1693 res.aio_return, res.aio_errno);
1694 }
1695 return 0;
1696}
1697
1698int
1699sys_aiowrite(tcp)
1700struct tcb *tcp;
1701{
1702 struct aio_result_t res;
1703
1704 if (entering(tcp)) {
1705 tprintf("%lu, ", tcp->u_arg[0]);
1706 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
1707 tprintf(", %lu, %lu, ", tcp->u_arg[2], tcp->u_arg[3]);
1708 printxval(whence, tcp->u_arg[4], "L_???");
1709 }
1710 else {
1711 if (tcp->u_arg[5] == 0)
1712 tprintf(", NULL");
1713 else if (syserror(tcp)
1714 || umove(tcp, tcp->u_arg[5], &res) < 0)
1715 tprintf(", %#lx", tcp->u_arg[5]);
1716 else
1717 tprintf(", {aio_return %d aio_errno %d}",
1718 res.aio_return, res.aio_errno);
1719 }
1720 return 0;
1721}
1722
1723int
1724sys_aiowait(tcp)
1725struct tcb *tcp;
1726{
1727 if (entering(tcp))
1728 printtv(tcp, tcp->u_arg[0]);
1729 return 0;
1730}
1731
1732int
1733sys_aiocancel(tcp)
1734struct tcb *tcp;
1735{
1736 struct aio_result_t res;
1737
1738 if (exiting(tcp)) {
1739 if (tcp->u_arg[0] == 0)
1740 tprintf("NULL");
1741 else if (syserror(tcp)
1742 || umove(tcp, tcp->u_arg[0], &res) < 0)
1743 tprintf("%#lx", tcp->u_arg[0]);
1744 else
1745 tprintf("{aio_return %d aio_errno %d}",
1746 res.aio_return, res.aio_errno);
1747 }
1748 return 0;
1749}
1750
1751#endif /* HAVE_SYS_ASYNCH_H */
Wichert Akkerman16a03d22000-08-10 02:14:04 +00001752
1753#if UNIXWARE >= 7
1754int
1755sys_lseek64 (tcp)
1756struct tcb *tcp;
1757{
1758 if (entering(tcp)) {
1759 long long offset = * (long long *) & tcp->u_arg [1];
1760 if (tcp->u_arg[3] == SEEK_SET)
1761 tprintf("%ld, %llu, ", tcp->u_arg[0], offset);
1762 else
1763 tprintf("%ld, %lld, ", tcp->u_arg[0], offset);
1764 printxval(whence, tcp->u_arg[3], "SEEK_???");
1765 }
1766 return RVAL_LDECIMAL;
1767}
1768#endif