kdump.c revision 190168
138032Speter/*-
2285303Sgshapiro * Copyright (c) 1988, 1993
364562Sgshapiro *	The Regents of the University of California.  All rights reserved.
438032Speter *
538032Speter * Redistribution and use in source and binary forms, with or without
638032Speter * modification, are permitted provided that the following conditions
738032Speter * are met:
838032Speter * 1. Redistributions of source code must retain the above copyright
938032Speter *    notice, this list of conditions and the following disclaimer.
1038032Speter * 2. Redistributions in binary form must reproduce the above copyright
1138032Speter *    notice, this list of conditions and the following disclaimer in the
1238032Speter *    documentation and/or other materials provided with the distribution.
1338032Speter * 3. All advertising materials mentioning features or use of this software
1464562Sgshapiro *    must display the following acknowledgement:
1538032Speter *	This product includes software developed by the University of
16266692Sgshapiro *	California, Berkeley and its contributors.
1764562Sgshapiro * 4. Neither the name of the University nor the names of its contributors
1864562Sgshapiro *    may be used to endorse or promote products derived from this software
1964562Sgshapiro *    without specific prior written permission.
2038032Speter *
2164562Sgshapiro * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2264562Sgshapiro * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2390792Sgshapiro * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2438032Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2590792Sgshapiro * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2690792Sgshapiro * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2790792Sgshapiro * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2890792Sgshapiro * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2990792Sgshapiro * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3038032Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3138032Speter * SUCH DAMAGE.
3238032Speter */
3338032Speter
3438032Speter#ifndef lint
3538032Speterstatic const char copyright[] =
3690792Sgshapiro"@(#) Copyright (c) 1988, 1993\n\
3738032Speter	The Regents of the University of California.  All rights reserved.\n";
3890792Sgshapiro#endif /* not lint */
3938032Speter
4090792Sgshapiro#ifndef lint
4190792Sgshapiro#if 0
4290792Sgshapirostatic char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
4364562Sgshapiro#endif
4464562Sgshapiro#endif /* not lint */
4564562Sgshapiro#include <sys/cdefs.h>
4690792Sgshapiro__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 190168 2009-03-20 18:29:52Z delphij $");
4738032Speter
4838032Speter#define _KERNEL
4938032Speterextern int errno;
5038032Speter#include <sys/errno.h>
5138032Speter#undef _KERNEL
5238032Speter#include <sys/param.h>
5364562Sgshapiro#include <sys/errno.h>
5464562Sgshapiro#define _KERNEL
5564562Sgshapiro#include <sys/time.h>
5638032Speter#undef _KERNEL
5738032Speter#include <sys/uio.h>
5838032Speter#include <sys/ktrace.h>
5938032Speter#include <sys/ioctl.h>
6038032Speter#include <sys/socket.h>
6138032Speter#include <sys/stat.h>
6238032Speter#include <sys/un.h>
6338032Speter#ifdef IPX
6438032Speter#include <sys/types.h>
6564562Sgshapiro#include <netipx/ipx.h>
6638032Speter#endif
6738032Speter#ifdef NETATALK
6838032Speter#include <netatalk/at.h>
6964562Sgshapiro#endif
7038032Speter#include <arpa/inet.h>
7138032Speter#include <netinet/in.h>
7294334Sgshapiro#include <ctype.h>
7338032Speter#include <dlfcn.h>
7464562Sgshapiro#include <err.h>
7564562Sgshapiro#include <grp.h>
7638032Speter#include <inttypes.h>
7764562Sgshapiro#include <locale.h>
7838032Speter#include <pwd.h>
7938032Speter#include <stdio.h>
8090792Sgshapiro#include <stdlib.h>
81132943Sgshapiro#include <string.h>
8238032Speter#include <time.h>
8338032Speter#include <unistd.h>
8438032Speter#include <vis.h>
8538032Speter#include "ktrace.h"
8638032Speter#include "kdump_subr.h"
8738032Speter
8838032Speterint fread_tail(void *, int, int);
89141867Sgshapirovoid dumpheader(struct ktr_header *);
9038032Spetervoid ktrsyscall(struct ktr_syscall *);
9138032Spetervoid ktrsysret(struct ktr_sysret *);
9238032Spetervoid ktrnamei(char *, int);
9390792Sgshapirovoid hexdump(char *, int, int);
9494334Sgshapirovoid visdump(char *, int, int);
95285303Sgshapirovoid ktrgenio(struct ktr_genio *, int);
96285303Sgshapirovoid ktrpsig(struct ktr_psig *);
97285303Sgshapirovoid ktrcsw(struct ktr_csw *);
98285303Sgshapirovoid ktruser(int, unsigned char *);
99285303Sgshapirovoid ktrsockaddr(struct sockaddr *);
10098121Sgshapirovoid ktrstat(struct stat *);
10138032Spetervoid ktrstruct(char *, size_t);
10290792Sgshapirovoid usage(void);
10390792Sgshapirovoid sockfamilyname(int);
10490792Sgshapiroconst char *ioctlname(u_long);
10538032Speter
10638032Speterint timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
10764562Sgshapiro    resolv = 0;
10838032Speterconst char *tracefile = DEF_TRACEFILE;
10938032Speterstruct ktr_header ktr_header;
11064562Sgshapiro
11164562Sgshapiro#define TIME_FORMAT	"%b %e %T %Y"
11264562Sgshapiro#define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
11338032Speter
11438032Speterint
11564562Sgshapiromain(int argc, char *argv[])
11638032Speter{
11738032Speter	int ch, ktrlen, size;
11838032Speter	void *m;
11964562Sgshapiro	int trpoints = ALL_POINTS;
12038032Speter	int drop_logged;
12138032Speter	pid_t pid = 0;
12294334Sgshapiro
12338032Speter	(void) setlocale(LC_CTYPE, "");
12438032Speter
12538032Speter	while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
12638032Speter		switch((char)ch) {
12738032Speter		case 'f':
12864562Sgshapiro			tracefile = optarg;
12964562Sgshapiro			break;
13038032Speter		case 'd':
13138032Speter			decimal = 1;
132110560Sgshapiro			break;
13338032Speter		case 'l':
13438032Speter			tail = 1;
13538032Speter			break;
13638032Speter		case 'm':
13738032Speter			maxdata = atoi(optarg);
13838032Speter			break;
13938032Speter		case 'n':
14038032Speter			fancy = 0;
14190792Sgshapiro			break;
14264562Sgshapiro		case 'p':
143223067Sgshapiro			pid = atoi(optarg);
14438032Speter			break;
14538032Speter		case 'r':
14638032Speter			resolv = 1;
14738032Speter			break;
14838032Speter		case 's':
14938032Speter			suppressdata = 1;
15038032Speter			break;
15138032Speter		case 'E':
15238032Speter			timestamp = 3;	/* elapsed timestamp */
15338032Speter			break;
15438032Speter		case 'H':
15538032Speter			threads = 1;
15664562Sgshapiro			break;
15738032Speter		case 'R':
15838032Speter			timestamp = 2;	/* relative timestamp */
15964562Sgshapiro			break;
16038032Speter		case 'T':
16138032Speter			timestamp = 1;
16290792Sgshapiro			break;
16390792Sgshapiro		case 't':
16490792Sgshapiro			trpoints = getpoints(optarg);
16538032Speter			if (trpoints < 0)
16638032Speter				errx(1, "unknown trace point in %s", optarg);
16764562Sgshapiro			break;
16838032Speter		default:
16938032Speter			usage();
17090792Sgshapiro		}
17190792Sgshapiro
17238032Speter	if (argc > optind)
17364562Sgshapiro		usage();
17438032Speter
17538032Speter	m = (void *)malloc(size = 1025);
17638032Speter	if (m == NULL)
17738032Speter		errx(1, "%s", strerror(ENOMEM));
17864562Sgshapiro	if (!freopen(tracefile, "r", stdin))
17938032Speter		err(1, "%s", tracefile);
18090792Sgshapiro	drop_logged = 0;
18190792Sgshapiro	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
18290792Sgshapiro		if (ktr_header.ktr_type & KTR_DROP) {
18338032Speter			ktr_header.ktr_type &= ~KTR_DROP;
18490792Sgshapiro			if (!drop_logged && threads) {
18564562Sgshapiro				(void)printf("%6d %6d %-8.*s Events dropped.\n",
18690792Sgshapiro				    ktr_header.ktr_pid, ktr_header.ktr_tid >
18790792Sgshapiro				    0 ? ktr_header.ktr_tid : 0, MAXCOMLEN,
18890792Sgshapiro				    ktr_header.ktr_comm);
189223067Sgshapiro				drop_logged = 1;
19038032Speter			} else if (!drop_logged) {
19138032Speter				(void)printf("%6d %-8.*s Events dropped.\n",
19238032Speter				    ktr_header.ktr_pid, MAXCOMLEN,
19338032Speter				    ktr_header.ktr_comm);
19438032Speter				drop_logged = 1;
19538032Speter			}
19638032Speter		}
19738032Speter		if (trpoints & (1<<ktr_header.ktr_type))
19838032Speter			if (pid == 0 || ktr_header.ktr_pid == pid)
19938032Speter				dumpheader(&ktr_header);
20038032Speter		if ((ktrlen = ktr_header.ktr_len) < 0)
20138032Speter			errx(1, "bogus length 0x%x", ktrlen);
20238032Speter		if (ktrlen > size) {
20338032Speter			m = (void *)realloc(m, ktrlen+1);
20438032Speter			if (m == NULL)
20538032Speter				errx(1, "%s", strerror(ENOMEM));
20638032Speter			size = ktrlen;
20738032Speter		}
20838032Speter		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
20938032Speter			errx(1, "data too short");
21038032Speter		if (pid && ktr_header.ktr_pid != pid)
21138032Speter			continue;
21238032Speter		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
21338032Speter			continue;
21438032Speter		drop_logged = 0;
21538032Speter		switch (ktr_header.ktr_type) {
21638032Speter		case KTR_SYSCALL:
21790792Sgshapiro			ktrsyscall((struct ktr_syscall *)m);
21838032Speter			break;
21964562Sgshapiro		case KTR_SYSRET:
22038032Speter			ktrsysret((struct ktr_sysret *)m);
22177349Sgshapiro			break;
22277349Sgshapiro		case KTR_NAMEI:
22338032Speter		case KTR_SYSCTL:
22438032Speter			ktrnamei(m, ktrlen);
22538032Speter			break;
22638032Speter		case KTR_GENIO:
22738032Speter			ktrgenio((struct ktr_genio *)m, ktrlen);
22838032Speter			break;
22938032Speter		case KTR_PSIG:
23038032Speter			ktrpsig((struct ktr_psig *)m);
231132943Sgshapiro			break;
23238032Speter		case KTR_CSW:
23338032Speter			ktrcsw((struct ktr_csw *)m);
234132943Sgshapiro			break;
235285303Sgshapiro		case KTR_USER:
23638032Speter			ktruser(ktrlen, m);
23738032Speter			break;
23838032Speter		case KTR_STRUCT:
239132943Sgshapiro			ktrstruct(m, ktrlen);
240132943Sgshapiro			break;
24138032Speter		default:
24238032Speter			printf("\n");
24338032Speter			break;
24438032Speter		}
24538032Speter		if (tail)
24638032Speter			(void)fflush(stdout);
24738032Speter	}
24838032Speter	return 0;
24938032Speter}
25038032Speter
25138032Speterint
25238032Speterfread_tail(void *buf, int size, int num)
25338032Speter{
25464562Sgshapiro	int i;
25538032Speter
25638032Speter	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
25738032Speter		(void)sleep(1);
25838032Speter		clearerr(stdin);
25938032Speter	}
26038032Speter	return (i);
26164562Sgshapiro}
26264562Sgshapiro
26338032Spetervoid
26438032Speterdumpheader(struct ktr_header *kth)
26538032Speter{
26638032Speter	static char unknown[64];
26738032Speter	static struct timeval prevtime, temp;
26838032Speter	const char *type;
26938032Speter
27038032Speter	switch (kth->ktr_type) {
27138032Speter	case KTR_SYSCALL:
27290792Sgshapiro		type = "CALL";
27338032Speter		break;
27438032Speter	case KTR_SYSRET:
27538032Speter		type = "RET ";
27638032Speter		break;
27738032Speter	case KTR_NAMEI:
27838032Speter		type = "NAMI";
27938032Speter		break;
28038032Speter	case KTR_GENIO:
28138032Speter		type = "GIO ";
28238032Speter		break;
28338032Speter	case KTR_PSIG:
28438032Speter		type = "PSIG";
28538032Speter		break;
28664562Sgshapiro	case KTR_CSW:
28738032Speter		type = "CSW ";
28838032Speter		break;
28938032Speter	case KTR_USER:
29038032Speter		type = "USER";
29138032Speter		break;
29238032Speter	case KTR_STRUCT:
29338032Speter		type = "STRU";
29438032Speter		break;
29538032Speter	case KTR_SYSCTL:
29690792Sgshapiro		type = "SCTL";
29790792Sgshapiro		break;
29890792Sgshapiro	default:
29990792Sgshapiro		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
30090792Sgshapiro		type = unknown;
30190792Sgshapiro	}
30290792Sgshapiro
30390792Sgshapiro	/*
30490792Sgshapiro	 * The ktr_tid field was previously the ktr_buffer field, which held
30538032Speter	 * the kernel pointer value for the buffer associated with data
30638032Speter	 * following the record header.  It now holds a threadid, but only
30738032Speter	 * for trace files after the change.  Older trace files still contain
30890792Sgshapiro	 * kernel pointers.  Detect this and suppress the results by printing
30990792Sgshapiro	 * negative tid's as 0.
31090792Sgshapiro	 */
31190792Sgshapiro	if (threads)
31290792Sgshapiro		(void)printf("%6d %6d %-8.*s ", kth->ktr_pid, kth->ktr_tid >
31390792Sgshapiro		    0 ? kth->ktr_tid : 0, MAXCOMLEN, kth->ktr_comm);
31464562Sgshapiro	else
31564562Sgshapiro		(void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN,
31664562Sgshapiro		    kth->ktr_comm);
31764562Sgshapiro	if (timestamp) {
31890792Sgshapiro		if (timestamp == 3) {
31964562Sgshapiro			if (prevtime.tv_sec == 0)
32064562Sgshapiro				prevtime = kth->ktr_time;
32164562Sgshapiro			timevalsub(&kth->ktr_time, &prevtime);
32264562Sgshapiro		}
32364562Sgshapiro		if (timestamp == 2) {
32464562Sgshapiro			temp = kth->ktr_time;
32590792Sgshapiro			timevalsub(&kth->ktr_time, &prevtime);
32664562Sgshapiro			prevtime = temp;
32790792Sgshapiro		}
32864562Sgshapiro		(void)printf("%ld.%06ld ",
32964562Sgshapiro		    kth->ktr_time.tv_sec, kth->ktr_time.tv_usec);
33064562Sgshapiro	}
33164562Sgshapiro	(void)printf("%s  ", type);
33264562Sgshapiro}
33364562Sgshapiro
33464562Sgshapiro#include <sys/syscall.h>
33564562Sgshapiro#define KTRACE
33664562Sgshapiro#include <sys/kern/syscalls.c>
33764562Sgshapiro#undef KTRACE
33864562Sgshapiroint nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
339223067Sgshapiro
340223067Sgshapirovoid
341223067Sgshapiroktrsyscall(struct ktr_syscall *ktr)
342223067Sgshapiro{
343223067Sgshapiro	int narg = ktr->ktr_narg;
344223067Sgshapiro	register_t *ip;
345223067Sgshapiro
346223067Sgshapiro	if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)
347223067Sgshapiro		(void)printf("[%d]", ktr->ktr_code);
34890792Sgshapiro	else
34990792Sgshapiro		(void)printf("%s", syscallnames[ktr->ktr_code]);
35090792Sgshapiro	ip = &ktr->ktr_args[0];
35190792Sgshapiro	if (narg) {
35290792Sgshapiro		char c = '(';
35390792Sgshapiro		if (fancy) {
35490792Sgshapiro
35577349Sgshapiro#define print_number(i,n,c) do {                      \
35664562Sgshapiro	if (decimal)                                  \
35764562Sgshapiro		(void)printf("%c%ld", c, (long)*i);   \
35864562Sgshapiro	else                                          \
35964562Sgshapiro		(void)printf("%c%#lx", c, (long)*i);  \
36064562Sgshapiro	i++;                                          \
36164562Sgshapiro	n--;                                          \
36264562Sgshapiro	c = ',';                                      \
36364562Sgshapiro	} while (0);
36464562Sgshapiro
36564562Sgshapiro			if (ktr->ktr_code == SYS_ioctl) {
36664562Sgshapiro				const char *cp;
36764562Sgshapiro				print_number(ip,narg,c);
36864562Sgshapiro				if ((cp = ioctlname(*ip)) != NULL)
36964562Sgshapiro					(void)printf(",%s", cp);
37064562Sgshapiro				else {
37164562Sgshapiro					if (decimal)
37264562Sgshapiro						(void)printf(",%ld", (long)*ip);
37364562Sgshapiro					else
37464562Sgshapiro						(void)printf(",%#lx ", (long)*ip);
37564562Sgshapiro				}
37664562Sgshapiro				c = ',';
37764562Sgshapiro				ip++;
37864562Sgshapiro				narg--;
37964562Sgshapiro			} else if (ktr->ktr_code == SYS_ptrace) {
38064562Sgshapiro				(void)putchar('(');
38164562Sgshapiro				ptraceopname ((int)*ip);
38264562Sgshapiro				c = ',';
38364562Sgshapiro				ip++;
38464562Sgshapiro				narg--;
38564562Sgshapiro			} else if (ktr->ktr_code == SYS_access ||
38664562Sgshapiro				   ktr->ktr_code == SYS_eaccess) {
38764562Sgshapiro				print_number(ip,narg,c);
38864562Sgshapiro				(void)putchar(',');
38990792Sgshapiro				accessmodename ((int)*ip);
39090792Sgshapiro				ip++;
39190792Sgshapiro				narg--;
39238032Speter			} else if (ktr->ktr_code == SYS_open) {
39338032Speter				int	flags;
39438032Speter				int	mode;
39538032Speter				print_number(ip,narg,c);
39638032Speter				flags = *ip;
39738032Speter				mode = *++ip;
39838032Speter				(void)putchar(',');
39990792Sgshapiro				flagsandmodename (flags, mode, decimal);
40038032Speter				ip++;
40138032Speter				narg-=2;
40238032Speter			} else if (ktr->ktr_code == SYS_wait4) {
40338032Speter				print_number(ip,narg,c);
40438032Speter				print_number(ip,narg,c);
40564562Sgshapiro				(void)putchar(',');
40638032Speter				wait4optname ((int)*ip);
40738032Speter				ip++;
40838032Speter				narg--;
40938032Speter			} else if (ktr->ktr_code == SYS_chmod ||
41038032Speter				   ktr->ktr_code == SYS_fchmod ||
41138032Speter				   ktr->ktr_code == SYS_lchmod) {
41238032Speter				print_number(ip,narg,c);
41338032Speter				(void)putchar(',');
41490792Sgshapiro				modename ((int)*ip);
41590792Sgshapiro				ip++;
41690792Sgshapiro				narg--;
41738032Speter			} else if (ktr->ktr_code == SYS_mknod) {
41838032Speter				print_number(ip,narg,c);
41964562Sgshapiro				(void)putchar(',');
420223067Sgshapiro				modename ((int)*ip);
42190792Sgshapiro				ip++;
42290792Sgshapiro				narg--;
42390792Sgshapiro			} else if (ktr->ktr_code == SYS_getfsstat) {
42438032Speter				print_number(ip,narg,c);
42564562Sgshapiro				print_number(ip,narg,c);
42690792Sgshapiro				(void)putchar(',');
42790792Sgshapiro				getfsstatflagsname ((int)*ip);
42890792Sgshapiro				ip++;
42990792Sgshapiro				narg--;
43090792Sgshapiro			} else if (ktr->ktr_code == SYS_mount) {
43190792Sgshapiro				print_number(ip,narg,c);
43290792Sgshapiro				print_number(ip,narg,c);
43390792Sgshapiro				(void)putchar(',');
43490792Sgshapiro				mountflagsname ((int)*ip);
43590792Sgshapiro				ip++;
43690792Sgshapiro				narg--;
43790792Sgshapiro			} else if (ktr->ktr_code == SYS_unmount) {
43890792Sgshapiro				print_number(ip,narg,c);
43990792Sgshapiro				(void)putchar(',');
44038032Speter				mountflagsname ((int)*ip);
44190792Sgshapiro				ip++;
44238032Speter				narg--;
44338032Speter			} else if (ktr->ktr_code == SYS_recvmsg ||
44464562Sgshapiro				   ktr->ktr_code == SYS_sendmsg) {
44538032Speter				print_number(ip,narg,c);
44638032Speter				print_number(ip,narg,c);
44790792Sgshapiro				(void)putchar(',');
44838032Speter				sendrecvflagsname ((int)*ip);
44938032Speter				ip++;
45038032Speter				narg--;
45138032Speter			} else if (ktr->ktr_code == SYS_recvfrom ||
45238032Speter				   ktr->ktr_code == SYS_sendto) {
45390792Sgshapiro				print_number(ip,narg,c);
45438032Speter				print_number(ip,narg,c);
45538032Speter				print_number(ip,narg,c);
45638032Speter				(void)putchar(',');
45738032Speter				sendrecvflagsname ((int)*ip);
45890792Sgshapiro				ip++;
45938032Speter				narg--;
46090792Sgshapiro			} else if (ktr->ktr_code == SYS_chflags ||
46138032Speter				   ktr->ktr_code == SYS_fchflags ||
46290792Sgshapiro				   ktr->ktr_code == SYS_lchflags) {
46364562Sgshapiro				print_number(ip,narg,c);
46490792Sgshapiro				(void)putchar(',');
46590792Sgshapiro				modename((int)*ip);
466110560Sgshapiro				ip++;
467110560Sgshapiro				narg--;
46890792Sgshapiro			} else if (ktr->ktr_code == SYS_kill) {
46990792Sgshapiro				print_number(ip,narg,c);
47064562Sgshapiro				(void)putchar(',');
47190792Sgshapiro				signame((int)*ip);
47290792Sgshapiro				ip++;
47364562Sgshapiro				narg--;
47490792Sgshapiro			} else if (ktr->ktr_code == SYS_reboot) {
47590792Sgshapiro				(void)putchar('(');
47690792Sgshapiro				rebootoptname((int)*ip);
47790792Sgshapiro				ip++;
47890792Sgshapiro				narg--;
47990792Sgshapiro			} else if (ktr->ktr_code == SYS_umask) {
48090792Sgshapiro				(void)putchar('(');
481223067Sgshapiro				modename((int)*ip);
482223067Sgshapiro				ip++;
48364562Sgshapiro				narg--;
48464562Sgshapiro			} else if (ktr->ktr_code == SYS_msync) {
48564562Sgshapiro				print_number(ip,narg,c);
48664562Sgshapiro				print_number(ip,narg,c);
48790792Sgshapiro				(void)putchar(',');
48864562Sgshapiro				msyncflagsname((int)*ip);
48964562Sgshapiro				ip++;
49064562Sgshapiro				narg--;
49190792Sgshapiro#ifdef SYS_freebsd6_mmap
49290792Sgshapiro			} else if (ktr->ktr_code == SYS_freebsd6_mmap) {
49390792Sgshapiro				print_number(ip,narg,c);
494223067Sgshapiro				print_number(ip,narg,c);
49564562Sgshapiro				(void)putchar(',');
49664562Sgshapiro				mmapprotname ((int)*ip);
49764562Sgshapiro				(void)putchar(',');
49864562Sgshapiro				ip++;
49964562Sgshapiro				narg--;
50064562Sgshapiro				mmapflagsname ((int)*ip);
50190792Sgshapiro				ip++;
50290792Sgshapiro				narg--;
50390792Sgshapiro#endif
50490792Sgshapiro			} else if (ktr->ktr_code == SYS_mmap) {
50590792Sgshapiro				print_number(ip,narg,c);
50690792Sgshapiro				print_number(ip,narg,c);
50790792Sgshapiro				(void)putchar(',');
50890792Sgshapiro				mmapprotname ((int)*ip);
50964562Sgshapiro				(void)putchar(',');
51064562Sgshapiro				ip++;
511223067Sgshapiro				narg--;
512223067Sgshapiro				mmapflagsname ((int)*ip);
513223067Sgshapiro				ip++;
51464562Sgshapiro				narg--;
51590792Sgshapiro			} else if (ktr->ktr_code == SYS_mprotect) {
51638032Speter				print_number(ip,narg,c);
51790792Sgshapiro				print_number(ip,narg,c);
51864562Sgshapiro				(void)putchar(',');
51990792Sgshapiro				mmapprotname ((int)*ip);
52090792Sgshapiro				ip++;
52190792Sgshapiro				narg--;
52290792Sgshapiro			} else if (ktr->ktr_code == SYS_madvise) {
52390792Sgshapiro				print_number(ip,narg,c);
52490792Sgshapiro				print_number(ip,narg,c);
52590792Sgshapiro				(void)putchar(',');
52690792Sgshapiro				madvisebehavname((int)*ip);
52790792Sgshapiro				ip++;
52890792Sgshapiro				narg--;
529225906Sume			} else if (ktr->ktr_code == SYS_setpriority) {
53090792Sgshapiro				print_number(ip,narg,c);
531225906Sume				print_number(ip,narg,c);
53290792Sgshapiro				(void)putchar(',');
533225906Sume				prioname((int)*ip);
53490792Sgshapiro				ip++;
535225906Sume				narg--;
53690792Sgshapiro			} else if (ktr->ktr_code == SYS_fcntl) {
537225906Sume				int cmd;
53890792Sgshapiro				int arg;
53990792Sgshapiro				print_number(ip,narg,c);
54090792Sgshapiro				cmd = *ip;
54190792Sgshapiro				arg = *++ip;
54290792Sgshapiro				(void)putchar(',');
54390792Sgshapiro				fcntlcmdname(cmd, arg, decimal);
54490792Sgshapiro				ip++;
54590792Sgshapiro				narg-=2;
54690792Sgshapiro			} else if (ktr->ktr_code == SYS_socket) {
54790792Sgshapiro				int sockdomain;
54890792Sgshapiro				(void)putchar('(');
54990792Sgshapiro				sockdomain=(int)*ip;
55090792Sgshapiro				sockdomainname(sockdomain);
55190792Sgshapiro				ip++;
55290792Sgshapiro				narg--;
55390792Sgshapiro				(void)putchar(',');
554168515Sgshapiro				socktypename((int)*ip);
555168515Sgshapiro				ip++;
556168515Sgshapiro				narg--;
557168515Sgshapiro				if (sockdomain == PF_INET ||
55890792Sgshapiro				    sockdomain == PF_INET6) {
55990792Sgshapiro					(void)putchar(',');
56090792Sgshapiro					sockipprotoname((int)*ip);
56190792Sgshapiro					ip++;
56290792Sgshapiro					narg--;
56390792Sgshapiro				}
56490792Sgshapiro				c = ',';
56590792Sgshapiro			} else if (ktr->ktr_code == SYS_setsockopt ||
56690792Sgshapiro				   ktr->ktr_code == SYS_getsockopt) {
56790792Sgshapiro				print_number(ip,narg,c);
56890792Sgshapiro				(void)putchar(',');
56990792Sgshapiro				sockoptlevelname((int)*ip, decimal);
57090792Sgshapiro				if ((int)*ip == SOL_SOCKET) {
57190792Sgshapiro					ip++;
57290792Sgshapiro					narg--;
57390792Sgshapiro					(void)putchar(',');
57490792Sgshapiro					sockoptname((int)*ip);
57590792Sgshapiro				}
57690792Sgshapiro				ip++;
57790792Sgshapiro				narg--;
57890792Sgshapiro#ifdef SYS_freebsd6_lseek
57990792Sgshapiro			} else if (ktr->ktr_code == SYS_freebsd6_lseek) {
58090792Sgshapiro				print_number(ip,narg,c);
58190792Sgshapiro				/* Hidden 'pad' argument, not in lseek(2) */
58290792Sgshapiro				print_number(ip,narg,c);
58390792Sgshapiro				print_number(ip,narg,c);
58490792Sgshapiro				(void)putchar(',');
58590792Sgshapiro				whencename ((int)*ip);
58690792Sgshapiro				ip++;
58790792Sgshapiro				narg--;
58890792Sgshapiro#endif
58990792Sgshapiro			} else if (ktr->ktr_code == SYS_lseek) {
59090792Sgshapiro				print_number(ip,narg,c);
59190792Sgshapiro				/* Hidden 'pad' argument, not in lseek(2) */
59290792Sgshapiro				print_number(ip,narg,c);
59390792Sgshapiro				(void)putchar(',');
59490792Sgshapiro				whencename ((int)*ip);
59590792Sgshapiro				ip++;
59690792Sgshapiro				narg--;
59790792Sgshapiro
59864562Sgshapiro			} else if (ktr->ktr_code == SYS_flock) {
59964562Sgshapiro				print_number(ip,narg,c);
60064562Sgshapiro				(void)putchar(',');
60190792Sgshapiro				flockname((int)*ip);
60264562Sgshapiro				ip++;
60364562Sgshapiro				narg--;
60464562Sgshapiro			} else if (ktr->ktr_code == SYS_mkfifo ||
60564562Sgshapiro				   ktr->ktr_code == SYS_mkdir) {
60664562Sgshapiro				print_number(ip,narg,c);
60764562Sgshapiro				(void)putchar(',');
60890792Sgshapiro				modename((int)*ip);
60964562Sgshapiro				ip++;
61064562Sgshapiro				narg--;
61164562Sgshapiro			} else if (ktr->ktr_code == SYS_shutdown) {
61264562Sgshapiro				print_number(ip,narg,c);
61364562Sgshapiro				(void)putchar(',');
61490792Sgshapiro				shutdownhowname((int)*ip);
61590792Sgshapiro				ip++;
61690792Sgshapiro				narg--;
61764562Sgshapiro			} else if (ktr->ktr_code == SYS_socketpair) {
61864562Sgshapiro				(void)putchar('(');
61964562Sgshapiro				sockdomainname((int)*ip);
62064562Sgshapiro				ip++;
62164562Sgshapiro				narg--;
62264562Sgshapiro				(void)putchar(',');
62364562Sgshapiro				socktypename((int)*ip);
62464562Sgshapiro				ip++;
62590792Sgshapiro				narg--;
62698121Sgshapiro				c = ',';
62764562Sgshapiro			} else if (ktr->ktr_code == SYS_getrlimit ||
62898121Sgshapiro				   ktr->ktr_code == SYS_setrlimit) {
62964562Sgshapiro				(void)putchar('(');
63064562Sgshapiro				rlimitname((int)*ip);
63190792Sgshapiro				ip++;
63290792Sgshapiro				narg--;
63364562Sgshapiro				c = ',';
63490792Sgshapiro			} else if (ktr->ktr_code == SYS_quotactl) {
63590792Sgshapiro				print_number(ip,narg,c);
63664562Sgshapiro				(void)putchar(',');
63790792Sgshapiro				quotactlname((int)*ip);
63864562Sgshapiro				ip++;
63964562Sgshapiro				narg--;
64064562Sgshapiro				c = ',';
64164562Sgshapiro			} else if (ktr->ktr_code == SYS_nfssvc) {
64264562Sgshapiro				(void)putchar('(');
64390792Sgshapiro				nfssvcname((int)*ip);
64498121Sgshapiro				ip++;
64598121Sgshapiro				narg--;
64698121Sgshapiro				c = ',';
64798121Sgshapiro			} else if (ktr->ktr_code == SYS_rtprio) {
64898121Sgshapiro				(void)putchar('(');
64998121Sgshapiro				rtprioname((int)*ip);
65098121Sgshapiro				ip++;
65198121Sgshapiro				narg--;
65298121Sgshapiro				c = ',';
65398121Sgshapiro			} else if (ktr->ktr_code == SYS___semctl) {
65498121Sgshapiro				print_number(ip,narg,c);
65598121Sgshapiro				print_number(ip,narg,c);
65664562Sgshapiro				(void)putchar(',');
65798121Sgshapiro				semctlname((int)*ip);
65898121Sgshapiro				ip++;
65998121Sgshapiro				narg--;
66098121Sgshapiro			} else if (ktr->ktr_code == SYS_semget) {
66198121Sgshapiro				print_number(ip,narg,c);
66298121Sgshapiro				print_number(ip,narg,c);
66398121Sgshapiro				(void)putchar(',');
66498121Sgshapiro				semgetname((int)*ip);
66590792Sgshapiro				ip++;
66698121Sgshapiro				narg--;
66764562Sgshapiro			} else if (ktr->ktr_code == SYS_msgctl) {
66864562Sgshapiro				print_number(ip,narg,c);
66964562Sgshapiro				(void)putchar(',');
67064562Sgshapiro				shmctlname((int)*ip);
67164562Sgshapiro				ip++;
67290792Sgshapiro				narg--;
67390792Sgshapiro			} else if (ktr->ktr_code == SYS_shmat) {
67490792Sgshapiro				print_number(ip,narg,c);
67590792Sgshapiro				print_number(ip,narg,c);
67690792Sgshapiro				(void)putchar(',');
67790792Sgshapiro				shmatname((int)*ip);
67890792Sgshapiro				ip++;
67964562Sgshapiro				narg--;
68064562Sgshapiro			} else if (ktr->ktr_code == SYS_shmctl) {
68164562Sgshapiro				print_number(ip,narg,c);
68264562Sgshapiro				(void)putchar(',');
68390792Sgshapiro				shmctlname((int)*ip);
68464562Sgshapiro				ip++;
68564562Sgshapiro				narg--;
68664562Sgshapiro			} else if (ktr->ktr_code == SYS_minherit) {
68764562Sgshapiro				print_number(ip,narg,c);
68864562Sgshapiro				print_number(ip,narg,c);
68990792Sgshapiro				(void)putchar(',');
69064562Sgshapiro				minheritname((int)*ip);
69164562Sgshapiro				ip++;
69264562Sgshapiro				narg--;
69398121Sgshapiro			} else if (ktr->ktr_code == SYS_rfork) {
69464562Sgshapiro				(void)putchar('(');
69564562Sgshapiro				rforkname((int)*ip);
69690792Sgshapiro				ip++;
69790792Sgshapiro				narg--;
69864562Sgshapiro				c = ',';
69964562Sgshapiro			} else if (ktr->ktr_code == SYS_lio_listio) {
70064562Sgshapiro				(void)putchar('(');
70164562Sgshapiro				lio_listioname((int)*ip);
70290792Sgshapiro				ip++;
70390792Sgshapiro				narg--;
70464562Sgshapiro				c = ',';
70564562Sgshapiro			} else if (ktr->ktr_code == SYS_mlockall) {
70690792Sgshapiro				(void)putchar('(');
70790792Sgshapiro				mlockallname((int)*ip);
70890792Sgshapiro				ip++;
70964562Sgshapiro				narg--;
71064562Sgshapiro			} else if (ktr->ktr_code == SYS_sched_setscheduler) {
71164562Sgshapiro				print_number(ip,narg,c);
71264562Sgshapiro				(void)putchar(',');
71364562Sgshapiro				schedpolicyname((int)*ip);
71490792Sgshapiro				ip++;
71564562Sgshapiro				narg--;
71664562Sgshapiro			} else if (ktr->ktr_code == SYS_sched_get_priority_max ||
71790792Sgshapiro				   ktr->ktr_code == SYS_sched_get_priority_min) {
71864562Sgshapiro				(void)putchar('(');
71990792Sgshapiro				schedpolicyname((int)*ip);
72090792Sgshapiro				ip++;
72164562Sgshapiro				narg--;
72264562Sgshapiro			} else if (ktr->ktr_code == SYS_sendfile) {
72390792Sgshapiro				print_number(ip,narg,c);
72490792Sgshapiro				print_number(ip,narg,c);
72564562Sgshapiro				print_number(ip,narg,c);
72690792Sgshapiro				print_number(ip,narg,c);
72764562Sgshapiro				print_number(ip,narg,c);
72864562Sgshapiro				print_number(ip,narg,c);
72964562Sgshapiro				(void)putchar(',');
73090792Sgshapiro				sendfileflagsname((int)*ip);
73190792Sgshapiro				ip++;
73264562Sgshapiro				narg--;
73364562Sgshapiro			} else if (ktr->ktr_code == SYS_kldsym) {
73490792Sgshapiro				print_number(ip,narg,c);
73590792Sgshapiro				(void)putchar(',');
73664562Sgshapiro				kldsymcmdname((int)*ip);
73764562Sgshapiro				ip++;
73864562Sgshapiro				narg--;
73964562Sgshapiro			} else if (ktr->ktr_code == SYS_sigprocmask) {
74064562Sgshapiro				(void)putchar('(');
74164562Sgshapiro				sigprocmaskhowname((int)*ip);
74264562Sgshapiro				ip++;
74390792Sgshapiro				narg--;
74464562Sgshapiro				c = ',';
74564562Sgshapiro			} else if (ktr->ktr_code == SYS___acl_get_file ||
74664562Sgshapiro				   ktr->ktr_code == SYS___acl_set_file ||
74764562Sgshapiro				   ktr->ktr_code == SYS___acl_get_fd ||
74864562Sgshapiro				   ktr->ktr_code == SYS___acl_set_fd ||
74964562Sgshapiro				   ktr->ktr_code == SYS___acl_delete_file ||
75064562Sgshapiro				   ktr->ktr_code == SYS___acl_delete_fd ||
75164562Sgshapiro				   ktr->ktr_code == SYS___acl_aclcheck_file ||
75264562Sgshapiro				   ktr->ktr_code == SYS___acl_aclcheck_fd ||
75364562Sgshapiro				   ktr->ktr_code == SYS___acl_get_link ||
75464562Sgshapiro				   ktr->ktr_code == SYS___acl_set_link ||
75564562Sgshapiro				   ktr->ktr_code == SYS___acl_delete_link ||
75664562Sgshapiro				   ktr->ktr_code == SYS___acl_aclcheck_link) {
75764562Sgshapiro				print_number(ip,narg,c);
75864562Sgshapiro				(void)putchar(',');
75964562Sgshapiro				acltypename((int)*ip);
76064562Sgshapiro				ip++;
76164562Sgshapiro				narg--;
76264562Sgshapiro			} else if (ktr->ktr_code == SYS_sigaction) {
76364562Sgshapiro				(void)putchar('(');
76490792Sgshapiro				signame((int)*ip);
76590792Sgshapiro				ip++;
76664562Sgshapiro				narg--;
76764562Sgshapiro				c = ',';
76864562Sgshapiro			} else if (ktr->ktr_code == SYS_extattrctl) {
76964562Sgshapiro				print_number(ip,narg,c);
77064562Sgshapiro				(void)putchar(',');
77190792Sgshapiro				extattrctlname((int)*ip);
77290792Sgshapiro				ip++;
77390792Sgshapiro				narg--;
77490792Sgshapiro			} else if (ktr->ktr_code == SYS_nmount) {
77564562Sgshapiro				print_number(ip,narg,c);
77664562Sgshapiro				print_number(ip,narg,c);
77790792Sgshapiro				(void)putchar(',');
77864562Sgshapiro				mountflagsname ((int)*ip);
77964562Sgshapiro				ip++;
78064562Sgshapiro				narg--;
78164562Sgshapiro			} else if (ktr->ktr_code == SYS_thr_create) {
78264562Sgshapiro				print_number(ip,narg,c);
78364562Sgshapiro				print_number(ip,narg,c);
78490792Sgshapiro				(void)putchar(',');
78564562Sgshapiro				thrcreateflagsname ((int)*ip);
78664562Sgshapiro				ip++;
78764562Sgshapiro				narg--;
78864562Sgshapiro			} else if (ktr->ktr_code == SYS_thr_kill) {
78964562Sgshapiro				print_number(ip,narg,c);
79064562Sgshapiro				(void)putchar(',');
79164562Sgshapiro				signame ((int)*ip);
79264562Sgshapiro				ip++;
79364562Sgshapiro				narg--;
79464562Sgshapiro			} else if (ktr->ktr_code == SYS_kldunloadf) {
79590792Sgshapiro				print_number(ip,narg,c);
79690792Sgshapiro				(void)putchar(',');
79790792Sgshapiro				kldunloadfflagsname ((int)*ip);
79890792Sgshapiro				ip++;
79990792Sgshapiro				narg--;
80064562Sgshapiro			}
80164562Sgshapiro		}
80264562Sgshapiro		while (narg) {
80390792Sgshapiro			print_number(ip,narg,c);
804249729Sgshapiro		}
80564562Sgshapiro		(void)putchar(')');
80664562Sgshapiro	}
80790792Sgshapiro	(void)putchar('\n');
80890792Sgshapiro}
80990792Sgshapiro
81090792Sgshapirovoid
81164562Sgshapiroktrsysret(struct ktr_sysret *ktr)
81290792Sgshapiro{
81364562Sgshapiro	register_t ret = ktr->ktr_retval;
81464562Sgshapiro	int error = ktr->ktr_error;
81590792Sgshapiro	int code = ktr->ktr_code;
81664562Sgshapiro
81764562Sgshapiro	if (code >= nsyscalls || code < 0)
81890792Sgshapiro		(void)printf("[%d] ", code);
81964562Sgshapiro	else
82090792Sgshapiro		(void)printf("%s ", syscallnames[code]);
82190792Sgshapiro
82290792Sgshapiro	if (error == 0) {
82390792Sgshapiro		if (fancy) {
82490792Sgshapiro			(void)printf("%d", ret);
82564562Sgshapiro			if (ret < 0 || ret > 9)
82690792Sgshapiro				(void)printf("/%#lx", (long)ret);
82764562Sgshapiro		} else {
82864562Sgshapiro			if (decimal)
82990792Sgshapiro				(void)printf("%ld", (long)ret);
83090792Sgshapiro			else
83190792Sgshapiro				(void)printf("%#lx", (long)ret);
83290792Sgshapiro		}
83390792Sgshapiro	} else if (error == ERESTART)
83490792Sgshapiro		(void)printf("RESTART");
83590792Sgshapiro	else if (error == EJUSTRETURN)
83690792Sgshapiro		(void)printf("JUSTRETURN");
83790792Sgshapiro	else {
83890792Sgshapiro		(void)printf("-1 errno %d", ktr->ktr_error);
83990792Sgshapiro		if (fancy)
84090792Sgshapiro			(void)printf(" %s", strerror(ktr->ktr_error));
84190792Sgshapiro	}
84290792Sgshapiro	(void)putchar('\n');
84390792Sgshapiro}
84490792Sgshapiro
84590792Sgshapirovoid
84690792Sgshapiroktrnamei(char *cp, int len)
84790792Sgshapiro{
84864562Sgshapiro	(void)printf("\"%.*s\"\n", len, cp);
84990792Sgshapiro}
85090792Sgshapiro
85190792Sgshapirovoid
85290792Sgshapirohexdump(char *p, int len, int screenwidth)
85390792Sgshapiro{
85464562Sgshapiro	int n, i;
85590792Sgshapiro	int width;
85690792Sgshapiro
85790792Sgshapiro	width = 0;
85864562Sgshapiro	do {
85990792Sgshapiro		width += 2;
86090792Sgshapiro		i = 13;			/* base offset */
86190792Sgshapiro		i += (width / 2) + 1;	/* spaces every second byte */
86290792Sgshapiro		i += (width * 2);	/* width of bytes */
86390792Sgshapiro		i += 3;			/* "  |" */
86490792Sgshapiro		i += width;		/* each byte */
86590792Sgshapiro		i += 1;			/* "|" */
86690792Sgshapiro	} while (i < screenwidth);
86790792Sgshapiro	width -= 2;
86890792Sgshapiro
86990792Sgshapiro	for (n = 0; n < len; n += width) {
87090792Sgshapiro		for (i = n; i < n + width; i++) {
87190792Sgshapiro			if ((i % width) == 0) {	/* beginning of line */
87290792Sgshapiro				printf("       0x%04x", i);
87390792Sgshapiro			}
87490792Sgshapiro			if ((i % 2) == 0) {
87590792Sgshapiro				printf(" ");
87690792Sgshapiro			}
87790792Sgshapiro			if (i < len)
87890792Sgshapiro				printf("%02x", p[i] & 0xff);
87990792Sgshapiro			else
88090792Sgshapiro				printf("  ");
88190792Sgshapiro		}
88290792Sgshapiro		printf("  |");
88390792Sgshapiro		for (i = n; i < n + width; i++) {
88490792Sgshapiro			if (i >= len)
88590792Sgshapiro				break;
88690792Sgshapiro			if (p[i] >= ' ' && p[i] <= '~')
88790792Sgshapiro				printf("%c", p[i]);
88890792Sgshapiro			else
88990792Sgshapiro				printf(".");
89090792Sgshapiro		}
89190792Sgshapiro		printf("|\n");
89290792Sgshapiro	}
89390792Sgshapiro	if ((i % width) != 0)
89490792Sgshapiro		printf("\n");
89590792Sgshapiro}
89690792Sgshapiro
89790792Sgshapirovoid
89890792Sgshapirovisdump(char *dp, int datalen, int screenwidth)
89990792Sgshapiro{
90090792Sgshapiro	int col = 0;
90190792Sgshapiro	char *cp;
90290792Sgshapiro	int width;
90390792Sgshapiro	char visbuf[5];
90490792Sgshapiro
90590792Sgshapiro	(void)printf("       \"");
90690792Sgshapiro	col = 8;
90790792Sgshapiro	for (;datalen > 0; datalen--, dp++) {
90890792Sgshapiro		(void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
90990792Sgshapiro		cp = visbuf;
91090792Sgshapiro		/*
91190792Sgshapiro		 * Keep track of printables and
91290792Sgshapiro		 * space chars (like fold(1)).
91390792Sgshapiro		 */
91490792Sgshapiro		if (col == 0) {
91590792Sgshapiro			(void)putchar('\t');
91690792Sgshapiro			col = 8;
91790792Sgshapiro		}
91890792Sgshapiro		switch(*cp) {
91990792Sgshapiro		case '\n':
92090792Sgshapiro			col = 0;
92190792Sgshapiro			(void)putchar('\n');
92290792Sgshapiro			continue;
92390792Sgshapiro		case '\t':
92490792Sgshapiro			width = 8 - (col&07);
92590792Sgshapiro			break;
92690792Sgshapiro		default:
92790792Sgshapiro			width = strlen(cp);
92890792Sgshapiro		}
92990792Sgshapiro		if (col + width > (screenwidth-2)) {
93090792Sgshapiro			(void)printf("\\\n\t");
93190792Sgshapiro			col = 8;
93290792Sgshapiro		}
93390792Sgshapiro		col += width;
93490792Sgshapiro		do {
93590792Sgshapiro			(void)putchar(*cp++);
93690792Sgshapiro		} while (*cp);
93790792Sgshapiro	}
93898121Sgshapiro	if (col == 0)
939102528Sgshapiro		(void)printf("       ");
94098121Sgshapiro	(void)printf("\"\n");
94198121Sgshapiro}
94298121Sgshapiro
943102528Sgshapirovoid
94490792Sgshapiroktrgenio(struct ktr_genio *ktr, int len)
94598121Sgshapiro{
946102528Sgshapiro	int datalen = len - sizeof (struct ktr_genio);
94790792Sgshapiro	char *dp = (char *)ktr + sizeof (struct ktr_genio);
94890792Sgshapiro	static int screenwidth = 0;
94990792Sgshapiro	int i, binary;
95090792Sgshapiro
95190792Sgshapiro	if (screenwidth == 0) {
95290792Sgshapiro		struct winsize ws;
95398121Sgshapiro
95490792Sgshapiro		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
95590792Sgshapiro		    ws.ws_col > 8)
95690792Sgshapiro			screenwidth = ws.ws_col;
95790792Sgshapiro		else
95890792Sgshapiro			screenwidth = 80;
959102528Sgshapiro	}
96090792Sgshapiro	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
96190792Sgshapiro		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
96290792Sgshapiro		datalen == 1 ? "" : "s");
96390792Sgshapiro	if (suppressdata)
96490792Sgshapiro		return;
96590792Sgshapiro	if (maxdata && datalen > maxdata)
96690792Sgshapiro		datalen = maxdata;
96790792Sgshapiro
96890792Sgshapiro	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
96990792Sgshapiro		if (dp[i] >= 32 && dp[i] < 127)
97090792Sgshapiro			continue;
97190792Sgshapiro		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
97290792Sgshapiro			continue;
97390792Sgshapiro		binary = 1;
97490792Sgshapiro	}
97590792Sgshapiro	if (binary)
97690792Sgshapiro		hexdump(dp, datalen, screenwidth);
97790792Sgshapiro	else
97890792Sgshapiro		visdump(dp, datalen, screenwidth);
97990792Sgshapiro}
98090792Sgshapiro
98190792Sgshapiroconst char *signames[] = {
98290792Sgshapiro	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
98390792Sgshapiro	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
98490792Sgshapiro	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
98590792Sgshapiro	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
98690792Sgshapiro	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
98790792Sgshapiro	"USR2", NULL,						/* 31 - 32 */
98890792Sgshapiro};
98990792Sgshapiro
99090792Sgshapirovoid
99190792Sgshapiroktrpsig(struct ktr_psig *psig)
99290792Sgshapiro{
99390792Sgshapiro	if (psig->signo > 0 && psig->signo < NSIG)
99490792Sgshapiro		(void)printf("SIG%s ", signames[psig->signo]);
99590792Sgshapiro	else
99690792Sgshapiro		(void)printf("SIG %d ", psig->signo);
99790792Sgshapiro	if (psig->action == SIG_DFL)
99890792Sgshapiro		(void)printf("SIG_DFL\n");
99990792Sgshapiro	else {
100098121Sgshapiro		(void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
100198121Sgshapiro		    (u_long)psig->action, psig->mask.__bits[0], psig->code);
100290792Sgshapiro	}
100364562Sgshapiro}
100464562Sgshapiro
100564562Sgshapirovoid
100690792Sgshapiroktrcsw(struct ktr_csw *cs)
100764562Sgshapiro{
100864562Sgshapiro	(void)printf("%s %s\n", cs->out ? "stop" : "resume",
100964562Sgshapiro		cs->user ? "user" : "kernel");
101064562Sgshapiro}
101164562Sgshapiro
101264562Sgshapiro#define	UTRACE_DLOPEN_START		1
101364562Sgshapiro#define	UTRACE_DLOPEN_STOP		2
101464562Sgshapiro#define	UTRACE_DLCLOSE_START		3
101564562Sgshapiro#define	UTRACE_DLCLOSE_STOP		4
101664562Sgshapiro#define	UTRACE_LOAD_OBJECT		5
101790792Sgshapiro#define	UTRACE_UNLOAD_OBJECT		6
101864562Sgshapiro#define	UTRACE_ADD_RUNDEP		7
101964562Sgshapiro#define	UTRACE_PRELOAD_FINISHED		8
102064562Sgshapiro#define	UTRACE_INIT_CALL		9
102164562Sgshapiro#define	UTRACE_FINI_CALL		10
102298121Sgshapiro
102398121Sgshapirostruct utrace_rtld {
102498121Sgshapiro	char sig[4];				/* 'RTLD' */
102598121Sgshapiro	int event;
102698121Sgshapiro	void *handle;
102798121Sgshapiro	void *mapbase;
102898121Sgshapiro	size_t mapsize;
102998121Sgshapiro	int refcnt;
103098121Sgshapiro	char name[MAXPATHLEN];
103198121Sgshapiro};
103298121Sgshapiro
103398121Sgshapirovoid
103498121Sgshapiroktruser_rtld(int len, unsigned char *p)
103598121Sgshapiro{
103698121Sgshapiro	struct utrace_rtld *ut = (struct utrace_rtld *)p;
103798121Sgshapiro	void *parent;
103898121Sgshapiro	int mode;
103998121Sgshapiro
104098121Sgshapiro	switch (ut->event) {
104198121Sgshapiro	case UTRACE_DLOPEN_START:
104298121Sgshapiro		mode = ut->refcnt;
104398121Sgshapiro		printf("dlopen(%s, ", ut->name);
104498121Sgshapiro		switch (mode & RTLD_MODEMASK) {
104598121Sgshapiro		case RTLD_NOW:
104698121Sgshapiro			printf("RTLD_NOW");
104798121Sgshapiro			break;
104898121Sgshapiro		case RTLD_LAZY:
104998121Sgshapiro			printf("RTLD_LAZY");
105098121Sgshapiro			break;
105198121Sgshapiro		default:
105298121Sgshapiro			printf("%#x", mode & RTLD_MODEMASK);
105398121Sgshapiro		}
105498121Sgshapiro		if (mode & RTLD_GLOBAL)
105598121Sgshapiro			printf(" | RTLD_GLOBAL");
105698121Sgshapiro		if (mode & RTLD_TRACE)
105798121Sgshapiro			printf(" | RTLD_TRACE");
105898121Sgshapiro		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
105998121Sgshapiro			printf(" | %#x", mode &
106098121Sgshapiro			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
106198121Sgshapiro		printf(")\n");
106298121Sgshapiro		break;
106398121Sgshapiro	case UTRACE_DLOPEN_STOP:
106498121Sgshapiro		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
106598121Sgshapiro		    ut->refcnt);
106698121Sgshapiro		break;
106798121Sgshapiro	case UTRACE_DLCLOSE_START:
106898121Sgshapiro		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
106998121Sgshapiro		    ut->refcnt);
107098121Sgshapiro		break;
107198121Sgshapiro	case UTRACE_DLCLOSE_STOP:
107298121Sgshapiro		printf("dlclose(%p) finished\n", ut->handle);
107398121Sgshapiro		break;
107498121Sgshapiro	case UTRACE_LOAD_OBJECT:
107598121Sgshapiro		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
107698121Sgshapiro		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
107798121Sgshapiro		    ut->name);
107898121Sgshapiro		break;
107998121Sgshapiro	case UTRACE_UNLOAD_OBJECT:
108098121Sgshapiro		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
108198121Sgshapiro		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
108298121Sgshapiro		    ut->name);
108398121Sgshapiro		break;
108498121Sgshapiro	case UTRACE_ADD_RUNDEP:
108598121Sgshapiro		parent = ut->mapbase;
108698121Sgshapiro		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
108798121Sgshapiro		    ut->handle, ut->name, ut->refcnt);
108898121Sgshapiro		break;
108998121Sgshapiro	case UTRACE_PRELOAD_FINISHED:
109098121Sgshapiro		printf("RTLD: LD_PRELOAD finished\n");
109198121Sgshapiro		break;
109298121Sgshapiro	case UTRACE_INIT_CALL:
109398121Sgshapiro		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
109498121Sgshapiro		    ut->name);
109598121Sgshapiro		break;
109698121Sgshapiro	case UTRACE_FINI_CALL:
109798121Sgshapiro		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
109898121Sgshapiro		    ut->name);
109998121Sgshapiro		break;
1100120256Sgshapiro	default:
110198121Sgshapiro		p += 4;
110298121Sgshapiro		len -= 4;
110398121Sgshapiro		printf("RTLD: %d ", len);
110498121Sgshapiro		while (len--)
110598121Sgshapiro			if (decimal)
110698121Sgshapiro				printf(" %d", *p++);
110798121Sgshapiro			else
110898121Sgshapiro				printf(" %02x", *p++);
110998121Sgshapiro		printf("\n");
111098121Sgshapiro	}
111198121Sgshapiro}
111298121Sgshapiro
111398121Sgshapirostruct utrace_malloc {
111498121Sgshapiro	void *p;
111598121Sgshapiro	size_t s;
111698121Sgshapiro	void *r;
111798121Sgshapiro};
111898121Sgshapiro
111998121Sgshapirovoid
112098121Sgshapiroktruser_malloc(int len, unsigned char *p)
112198121Sgshapiro{
112298121Sgshapiro	struct utrace_malloc *ut = (struct utrace_malloc *)p;
112398121Sgshapiro
112498121Sgshapiro	if (ut->p == NULL) {
112590792Sgshapiro		if (ut->s == 0 && ut->r == NULL)
112690792Sgshapiro			printf("malloc_init()\n");
112790792Sgshapiro		else
112890792Sgshapiro			printf("%p = malloc(%zu)\n", ut->r, ut->s);
112990792Sgshapiro	} else {
113090792Sgshapiro		if (ut->s == 0)
113190792Sgshapiro			printf("free(%p)\n", ut->p);
113264562Sgshapiro		else
113390792Sgshapiro			printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
113464562Sgshapiro	}
113590792Sgshapiro}
113664562Sgshapiro
113790792Sgshapirovoid
113890792Sgshapiroktruser(int len, unsigned char *p)
113990792Sgshapiro{
114090792Sgshapiro
114190792Sgshapiro	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
114290792Sgshapiro		ktruser_rtld(len, p);
114390792Sgshapiro		return;
114490792Sgshapiro	}
114590792Sgshapiro
114690792Sgshapiro	if (len == sizeof(struct utrace_malloc)) {
114790792Sgshapiro		ktruser_malloc(len, p);
114890792Sgshapiro		return;
114990792Sgshapiro	}
115090792Sgshapiro
115190792Sgshapiro	(void)printf("%d ", len);
115290792Sgshapiro	while (len--)
115390792Sgshapiro		if (decimal)
115464562Sgshapiro			(void)printf(" %d", *p++);
115564562Sgshapiro		else
115664562Sgshapiro			(void)printf(" %02x", *p++);
115790792Sgshapiro	(void)printf("\n");
115890792Sgshapiro}
115990792Sgshapiro
116064562Sgshapirovoid
116190792Sgshapiroktrsockaddr(struct sockaddr *sa)
116290792Sgshapiro{
116390792Sgshapiro/*
116490792Sgshapiro TODO: Support additional address families
116564562Sgshapiro	#include <netnatm/natm.h>
116690792Sgshapiro	struct sockaddr_natm	*natm;
116790792Sgshapiro	#include <netsmb/netbios.h>
116864562Sgshapiro	struct sockaddr_nb	*nb;
116998121Sgshapiro*/
117090792Sgshapiro	char addr[64];
117164562Sgshapiro
117290792Sgshapiro	/*
117364562Sgshapiro	 * note: ktrstruct() has already verified that sa points to a
117464562Sgshapiro	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
117564562Sgshapiro	 * sa->sa_len bytes long.
117690792Sgshapiro	 */
117790792Sgshapiro	printf("struct sockaddr { ");
117864562Sgshapiro	sockfamilyname(sa->sa_family);
117990792Sgshapiro	printf(", ");
118090792Sgshapiro
118177349Sgshapiro#define check_sockaddr_len(n)					\
118290792Sgshapiro	if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) {	\
118390792Sgshapiro		printf("invalid");				\
118490792Sgshapiro		break;						\
118590792Sgshapiro	}
118690792Sgshapiro
118790792Sgshapiro	switch(sa->sa_family) {
118864562Sgshapiro	case AF_INET: {
118990792Sgshapiro		struct sockaddr_in	*sa_in;
119090792Sgshapiro
119164562Sgshapiro		sa_in = (struct sockaddr_in *)sa;
119264562Sgshapiro		check_sockaddr_len(in);
119364562Sgshapiro		inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr);
119490792Sgshapiro		printf("%s:%u", addr, ntohs(sa_in->sin_port));
119590792Sgshapiro		break;
119690792Sgshapiro	}
119790792Sgshapiro#ifdef NETATALK
119890792Sgshapiro	case AF_APPLETALK: {
119990792Sgshapiro		struct sockaddr_at	*sa_at;
120090792Sgshapiro		struct netrange		*nr;
120190792Sgshapiro
120290792Sgshapiro		sa_at = (struct sockaddr_at *)sa;
120390792Sgshapiro		check_sockaddr_len(at);
120490792Sgshapiro		nr = &sa_at->sat_range.r_netrange;
120590792Sgshapiro		printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net),
120690792Sgshapiro			sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet),
120790792Sgshapiro			ntohs(nr->nr_lastnet), nr->nr_phase);
120890792Sgshapiro		break;
120990792Sgshapiro	}
121090792Sgshapiro#endif
121190792Sgshapiro	case AF_INET6: {
121290792Sgshapiro		struct sockaddr_in6	*sa_in6;
121390792Sgshapiro
121490792Sgshapiro		sa_in6 = (struct sockaddr_in6 *)sa;
121590792Sgshapiro		check_sockaddr_len(in6);
121690792Sgshapiro		inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr);
121790792Sgshapiro		printf("[%s]:%u", addr, htons(sa_in6->sin6_port));
121890792Sgshapiro		break;
121990792Sgshapiro	}
122090792Sgshapiro#ifdef IPX
122164562Sgshapiro	case AF_IPX: {
122264562Sgshapiro		struct sockaddr_ipx	*sa_ipx;
122390792Sgshapiro
122464562Sgshapiro		sa_ipx = (struct sockaddr_ipx *)sa;
122590792Sgshapiro		check_sockaddr_len(ipx);
122690792Sgshapiro		/* XXX wish we had ipx_ntop */
122790792Sgshapiro		printf("%s", ipx_ntoa(sa_ipx->sipx_addr));
122890792Sgshapiro		break;
122990792Sgshapiro	}
123090792Sgshapiro#endif
123190792Sgshapiro	case AF_UNIX: {
123290792Sgshapiro		struct sockaddr_un *sa_un;
123390792Sgshapiro
123490792Sgshapiro		sa_un = (struct sockaddr_un *)sa;
123590792Sgshapiro		check_sockaddr_len(un);
123690792Sgshapiro		printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path);
123790792Sgshapiro		break;
123890792Sgshapiro	}
123964562Sgshapiro	default:
124098121Sgshapiro		printf("unknown address family");
124190792Sgshapiro	}
124264562Sgshapiro	printf(" }\n");
124364562Sgshapiro}
124464562Sgshapiro
124564562Sgshapirovoid
124664562Sgshapiroktrstat(struct stat *statp)
124764562Sgshapiro{
124864562Sgshapiro	char mode[12], timestr[PATH_MAX + 4];
124964562Sgshapiro	struct passwd *pwd;
125064562Sgshapiro	struct group  *grp;
125164562Sgshapiro	struct tm *tm;
125264562Sgshapiro
125364562Sgshapiro	/*
125464562Sgshapiro	 * note: ktrstruct() has already verified that statp points to a
125564562Sgshapiro	 * buffer exactly sizeof(struct stat) bytes long.
125664562Sgshapiro	 */
125790792Sgshapiro	printf("struct stat {");
125864562Sgshapiro	strmode(statp->st_mode, mode);
125964562Sgshapiro	printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
126064562Sgshapiro		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
126164562Sgshapiro		(uintmax_t)statp->st_nlink);
126290792Sgshapiro	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
126364562Sgshapiro		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
126464562Sgshapiro	else
126564562Sgshapiro		printf("uid=\"%s\", ", pwd->pw_name);
126664562Sgshapiro	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
126764562Sgshapiro		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
126864562Sgshapiro	else
126964562Sgshapiro		printf("gid=\"%s\", ", grp->gr_name);
127064562Sgshapiro	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
127164562Sgshapiro	printf("atime=");
127264562Sgshapiro	if (resolv == 0)
127390792Sgshapiro		printf("%ld", statp->st_atimespec.tv_sec);
127464562Sgshapiro	else {
127564562Sgshapiro		tm = localtime(&statp->st_atimespec.tv_sec);
127664562Sgshapiro		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
127764562Sgshapiro		printf("\"%s\"", timestr);
127890792Sgshapiro	}
127990792Sgshapiro	if (statp->st_atimespec.tv_nsec != 0)
128064562Sgshapiro		printf(".%09ld, ", statp->st_atimespec.tv_nsec);
128164562Sgshapiro	else
128264562Sgshapiro		printf(", ");
128364562Sgshapiro	printf("stime=");
128490792Sgshapiro	if (resolv == 0)
128590792Sgshapiro		printf("%ld", statp->st_mtimespec.tv_sec);
128664562Sgshapiro	else {
128790792Sgshapiro		tm = localtime(&statp->st_mtimespec.tv_sec);
128890792Sgshapiro		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
128990792Sgshapiro		printf("\"%s\"", timestr);
129090792Sgshapiro	}
129190792Sgshapiro	if (statp->st_mtimespec.tv_nsec != 0)
129290792Sgshapiro		printf(".%09ld, ", statp->st_mtimespec.tv_nsec);
129364562Sgshapiro	else
129464562Sgshapiro		printf(", ");
129598121Sgshapiro	printf("ctime=");
129698121Sgshapiro	if (resolv == 0)
129790792Sgshapiro		printf("%ld", statp->st_ctimespec.tv_sec);
129864562Sgshapiro	else {
129964562Sgshapiro		tm = localtime(&statp->st_ctimespec.tv_sec);
130064562Sgshapiro		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
130164562Sgshapiro		printf("\"%s\"", timestr);
130264562Sgshapiro	}
130364562Sgshapiro	if (statp->st_ctimespec.tv_nsec != 0)
130464562Sgshapiro		printf(".%09ld, ", statp->st_ctimespec.tv_nsec);
130564562Sgshapiro	else
130690792Sgshapiro		printf(", ");
130790792Sgshapiro	printf("birthtime=");
130890792Sgshapiro	if (resolv == 0)
130964562Sgshapiro		printf("%ld", statp->st_birthtimespec.tv_sec);
131064562Sgshapiro	else {
131190792Sgshapiro		tm = localtime(&statp->st_birthtimespec.tv_sec);
131264562Sgshapiro		(void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
131390792Sgshapiro		printf("\"%s\"", timestr);
131464562Sgshapiro	}
131590792Sgshapiro	if (statp->st_birthtimespec.tv_nsec != 0)
131664562Sgshapiro		printf(".%09ld, ", statp->st_birthtimespec.tv_nsec);
131790792Sgshapiro	else
131864562Sgshapiro		printf(", ");
131998121Sgshapiro	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
132098121Sgshapiro		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
132198121Sgshapiro		(intmax_t)statp->st_blocks, statp->st_flags);
132264562Sgshapiro	printf(" }\n");
132398121Sgshapiro}
132490792Sgshapiro
132598121Sgshapirovoid
132698121Sgshapiroktrstruct(char *buf, size_t buflen)
132798121Sgshapiro{
132864562Sgshapiro	char *name, *data;
132998121Sgshapiro	size_t namelen, datalen;
133090792Sgshapiro	int i;
133164562Sgshapiro
133264562Sgshapiro	for (name = buf, namelen = 0;
133364562Sgshapiro	     namelen < buflen && name[namelen] != '\0';
133490792Sgshapiro	     ++namelen)
133590792Sgshapiro		/* nothing */;
133690792Sgshapiro	if (namelen == buflen)
133764562Sgshapiro		goto invalid;
133864562Sgshapiro	if (name[namelen] != '\0')
133964562Sgshapiro		goto invalid;
134064562Sgshapiro	data = buf + namelen + 1;
134190792Sgshapiro	datalen = buflen - namelen - 1;
134290792Sgshapiro	if (datalen == 0)
134364562Sgshapiro		goto invalid;
134464562Sgshapiro	/* sanity check */
134564562Sgshapiro	for (i = 0; i < namelen; ++i)
134664562Sgshapiro		if (!isalpha((unsigned char)name[i]))
134764562Sgshapiro			goto invalid;
134864562Sgshapiro	if (strcmp(name, "stat") == 0) {
134990792Sgshapiro		if (datalen != sizeof(struct stat))
135090792Sgshapiro			goto invalid;
135190792Sgshapiro		ktrstat((struct stat *)data);
135290792Sgshapiro	} else if (strcmp(name, "sockaddr") == 0) {
135390792Sgshapiro		if (datalen < sizeof(struct sockaddr) ||
135490792Sgshapiro		    datalen != ((struct sockaddr *)(data))->sa_len)
135590792Sgshapiro			goto invalid;
135690792Sgshapiro		ktrsockaddr((struct sockaddr *)data);
135790792Sgshapiro	} else {
135890792Sgshapiro		printf("unknown structure\n");
135964562Sgshapiro	}
136064562Sgshapiro	return;
136164562Sgshapiroinvalid:
136290792Sgshapiro	printf("invalid record\n");
136364562Sgshapiro}
136464562Sgshapiro
136564562Sgshapirovoid
136690792Sgshapirousage(void)
136790792Sgshapiro{
136864562Sgshapiro	fprintf(stderr, "usage: kdump [-dEnlHRrsT] [-f trfile] "
136990792Sgshapiro	    "[-m maxdata] [-p pid] [-t trstr]\n");
137064562Sgshapiro	exit(1);
137198121Sgshapiro}
137273188Sgshapiro