xref: /freebsd/usr.bin/kdump/kdump.c (revision 661522f5)
19b50d902SRodney W. Grimes /*-
29b50d902SRodney W. Grimes  * Copyright (c) 1988, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
69b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
79b50d902SRodney W. Grimes  * are met:
89b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
99b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
109b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
129b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
139b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
149b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
159b50d902SRodney W. Grimes  *    without specific prior written permission.
169b50d902SRodney W. Grimes  *
179b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
189b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
219b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279b50d902SRodney W. Grimes  * SUCH DAMAGE.
289b50d902SRodney W. Grimes  */
299b50d902SRodney W. Grimes 
309b50d902SRodney W. Grimes #ifndef lint
3115fc002bSPhilippe Charnier static const char copyright[] =
329b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\
339b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
349b50d902SRodney W. Grimes #endif /* not lint */
359b50d902SRodney W. Grimes 
369b50d902SRodney W. Grimes #ifndef lint
3715fc002bSPhilippe Charnier #if 0
389b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
3915fc002bSPhilippe Charnier #endif
409b50d902SRodney W. Grimes #endif /* not lint */
41e026a48cSDavid E. O'Brien #include <sys/cdefs.h>
42e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$");
439b50d902SRodney W. Grimes 
44c4473420SPeter Wemm #define _KERNEL
45c1b99fe6SGeoff Rehmet extern int errno;
46c1b99fe6SGeoff Rehmet #include <sys/errno.h>
47c4473420SPeter Wemm #undef _KERNEL
489b50d902SRodney W. Grimes #include <sys/param.h>
499b50d902SRodney W. Grimes #include <sys/errno.h>
5091fbb9c1SDavid Malone #define _KERNEL
519b50d902SRodney W. Grimes #include <sys/time.h>
5291fbb9c1SDavid Malone #undef _KERNEL
539b50d902SRodney W. Grimes #include <sys/uio.h>
549b50d902SRodney W. Grimes #include <sys/ktrace.h>
559b50d902SRodney W. Grimes #include <sys/ioctl.h>
568bc31d83SCraig Rodrigues #include <sys/socket.h>
5760e15db9SDag-Erling Smørgrav #include <sys/stat.h>
587144d36fSDmitry Chagin #include <sys/sysent.h>
5960e15db9SDag-Erling Smørgrav #include <sys/un.h>
607144d36fSDmitry Chagin #include <sys/queue.h>
6160e15db9SDag-Erling Smørgrav #ifdef IPX
6260e15db9SDag-Erling Smørgrav #include <sys/types.h>
6360e15db9SDag-Erling Smørgrav #include <netipx/ipx.h>
6460e15db9SDag-Erling Smørgrav #endif
6560e15db9SDag-Erling Smørgrav #ifdef NETATALK
6660e15db9SDag-Erling Smørgrav #include <netatalk/at.h>
6760e15db9SDag-Erling Smørgrav #endif
681a604cfaSXin LI #include <arpa/inet.h>
6960e15db9SDag-Erling Smørgrav #include <netinet/in.h>
701a604cfaSXin LI #include <ctype.h>
711f4b63f8SJohn Baldwin #include <dlfcn.h>
7215fc002bSPhilippe Charnier #include <err.h>
7360e15db9SDag-Erling Smørgrav #include <grp.h>
7460e15db9SDag-Erling Smørgrav #include <inttypes.h>
7515fc002bSPhilippe Charnier #include <locale.h>
7660e15db9SDag-Erling Smørgrav #include <pwd.h>
779b50d902SRodney W. Grimes #include <stdio.h>
789b50d902SRodney W. Grimes #include <stdlib.h>
799b50d902SRodney W. Grimes #include <string.h>
8060e15db9SDag-Erling Smørgrav #include <time.h>
8115fc002bSPhilippe Charnier #include <unistd.h>
8215fc002bSPhilippe Charnier #include <vis.h>
839b50d902SRodney W. Grimes #include "ktrace.h"
8498a68a58SAlexander Leidinger #include "kdump_subr.h"
859b50d902SRodney W. Grimes 
867144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
877144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
8891fbb9c1SDavid Malone int fread_tail(void *, int, int);
8991fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
907144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
917144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9291fbb9c1SDavid Malone void ktrnamei(char *, int);
93ec4beb5dSPeter Wemm void hexdump(char *, int, int);
94ec4beb5dSPeter Wemm void visdump(char *, int, int);
9591fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
96dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
9791fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
9891fbb9c1SDavid Malone void ktruser(int, unsigned char *);
9960e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10060e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
10160e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
10291fbb9c1SDavid Malone void usage(void);
103d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int);
10491fbb9c1SDavid Malone 
10560e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
1067144d36fSDmitry Chagin     resolv = 0, abiflag = 0;
10791fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE;
1089b50d902SRodney W. Grimes struct ktr_header ktr_header;
1099b50d902SRodney W. Grimes 
11060e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1119b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1129b50d902SRodney W. Grimes 
11395bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
114dde5f9b9SDmitry Chagin 	if (decimal)							\
115e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
116dde5f9b9SDmitry Chagin 	else								\
117661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
118dde5f9b9SDmitry Chagin 	i++;								\
119dde5f9b9SDmitry Chagin 	n--;								\
120dde5f9b9SDmitry Chagin 	c = ',';							\
121e4bb45b1SDag-Erling Smørgrav } while (0)
122dde5f9b9SDmitry Chagin 
123dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
124dde5f9b9SDmitry Chagin 
125dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *);
126dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *);
127dde5f9b9SDmitry Chagin extern char *linux_syscallnames[];
128dde5f9b9SDmitry Chagin extern int nlinux_syscalls;
129dde5f9b9SDmitry Chagin 
130dde5f9b9SDmitry Chagin /*
131dde5f9b9SDmitry Chagin  * from linux.h
132dde5f9b9SDmitry Chagin  * Linux syscalls return negative errno's, we do positive and map them
133dde5f9b9SDmitry Chagin  */
134dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = {
135dde5f9b9SDmitry Chagin 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
136dde5f9b9SDmitry Chagin 	-10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
137dde5f9b9SDmitry Chagin 	-20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
138dde5f9b9SDmitry Chagin 	-30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
139dde5f9b9SDmitry Chagin 	-90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
140dde5f9b9SDmitry Chagin 	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
141dde5f9b9SDmitry Chagin 	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
142dde5f9b9SDmitry Chagin 	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
143dde5f9b9SDmitry Chagin 	-6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
144dde5f9b9SDmitry Chagin 	-72, -67, -71
145dde5f9b9SDmitry Chagin };
146dde5f9b9SDmitry Chagin #endif
147dde5f9b9SDmitry Chagin 
1487144d36fSDmitry Chagin struct proc_info
1497144d36fSDmitry Chagin {
1507144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1517144d36fSDmitry Chagin 	u_int			sv_flags;
1527144d36fSDmitry Chagin 	pid_t			pid;
1537144d36fSDmitry Chagin };
1547144d36fSDmitry Chagin 
1557144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1567144d36fSDmitry Chagin 
15791fbb9c1SDavid Malone int
15891fbb9c1SDavid Malone main(int argc, char *argv[])
1599b50d902SRodney W. Grimes {
1609b50d902SRodney W. Grimes 	int ch, ktrlen, size;
16191fbb9c1SDavid Malone 	void *m;
1629b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
163db53f66bSJohn Baldwin 	int drop_logged;
164ec4beb5dSPeter Wemm 	pid_t pid = 0;
1657144d36fSDmitry Chagin 	u_int sv_flags;
1669b50d902SRodney W. Grimes 
16709307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
1685ccbfb26SAndrey A. Chernov 
1697144d36fSDmitry Chagin 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1)
17009307b25SDag-Erling Smørgrav 		switch (ch) {
1717144d36fSDmitry Chagin 		case 'A':
1727144d36fSDmitry Chagin 			abiflag = 1;
1737144d36fSDmitry Chagin 			break;
1749b50d902SRodney W. Grimes 		case 'f':
1759b50d902SRodney W. Grimes 			tracefile = optarg;
1769b50d902SRodney W. Grimes 			break;
1779b50d902SRodney W. Grimes 		case 'd':
1789b50d902SRodney W. Grimes 			decimal = 1;
1799b50d902SRodney W. Grimes 			break;
1809b50d902SRodney W. Grimes 		case 'l':
1819b50d902SRodney W. Grimes 			tail = 1;
1829b50d902SRodney W. Grimes 			break;
1839b50d902SRodney W. Grimes 		case 'm':
1849b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
1859b50d902SRodney W. Grimes 			break;
1869b50d902SRodney W. Grimes 		case 'n':
1879b50d902SRodney W. Grimes 			fancy = 0;
1889b50d902SRodney W. Grimes 			break;
189ec4beb5dSPeter Wemm 		case 'p':
190ec4beb5dSPeter Wemm 			pid = atoi(optarg);
191ec4beb5dSPeter Wemm 			break;
19260e15db9SDag-Erling Smørgrav 		case 'r':
19360e15db9SDag-Erling Smørgrav 			resolv = 1;
19460e15db9SDag-Erling Smørgrav 			break;
195df0c8868SRobert Watson 		case 's':
196df0c8868SRobert Watson 			suppressdata = 1;
197df0c8868SRobert Watson 			break;
198ec131914SPeter Wemm 		case 'E':
199ec131914SPeter Wemm 			timestamp = 3;	/* elapsed timestamp */
200ec131914SPeter Wemm 			break;
201a9ac598bSRobert Watson 		case 'H':
202a9ac598bSRobert Watson 			threads = 1;
203a9ac598bSRobert Watson 			break;
2049b50d902SRodney W. Grimes 		case 'R':
2059b50d902SRodney W. Grimes 			timestamp = 2;	/* relative timestamp */
2069b50d902SRodney W. Grimes 			break;
2079b50d902SRodney W. Grimes 		case 'T':
2089b50d902SRodney W. Grimes 			timestamp = 1;
2099b50d902SRodney W. Grimes 			break;
2109b50d902SRodney W. Grimes 		case 't':
2119b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
21215fc002bSPhilippe Charnier 			if (trpoints < 0)
21315fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
2149b50d902SRodney W. Grimes 			break;
2159b50d902SRodney W. Grimes 		default:
2169b50d902SRodney W. Grimes 			usage();
2179b50d902SRodney W. Grimes 		}
2189b50d902SRodney W. Grimes 
21980844fd1SBill Fenner 	if (argc > optind)
2209b50d902SRodney W. Grimes 		usage();
2219b50d902SRodney W. Grimes 
22209307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
22315fc002bSPhilippe Charnier 	if (m == NULL)
22415fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
22515fc002bSPhilippe Charnier 	if (!freopen(tracefile, "r", stdin))
22615fc002bSPhilippe Charnier 		err(1, "%s", tracefile);
2277144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
228db53f66bSJohn Baldwin 	drop_logged = 0;
2299b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
230db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
231db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
232a9ac598bSRobert Watson 			if (!drop_logged && threads) {
23309307b25SDag-Erling Smørgrav 				printf(
234c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
235c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
236c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
237c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
238c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
239a9ac598bSRobert Watson 				drop_logged = 1;
240a9ac598bSRobert Watson 			} else if (!drop_logged) {
24109307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
242c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
243db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
244db53f66bSJohn Baldwin 				drop_logged = 1;
245db53f66bSJohn Baldwin 			}
246db53f66bSJohn Baldwin 		}
2479b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
248ec4beb5dSPeter Wemm 			if (pid == 0 || ktr_header.ktr_pid == pid)
2499b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
25015fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
25115fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
2529b50d902SRodney W. Grimes 		if (ktrlen > size) {
25309307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
25415fc002bSPhilippe Charnier 			if (m == NULL)
25515fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
2569b50d902SRodney W. Grimes 			size = ktrlen;
2579b50d902SRodney W. Grimes 		}
25815fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
25915fc002bSPhilippe Charnier 			errx(1, "data too short");
2607144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
2617144d36fSDmitry Chagin 			continue;
2627144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
263ec4beb5dSPeter Wemm 		if (pid && ktr_header.ktr_pid != pid)
264ec4beb5dSPeter Wemm 			continue;
2659b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
2669b50d902SRodney W. Grimes 			continue;
267db53f66bSJohn Baldwin 		drop_logged = 0;
2689b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
2699b50d902SRodney W. Grimes 		case KTR_SYSCALL:
270dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
271dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
272dde5f9b9SDmitry Chagin 				linux_ktrsyscall((struct ktr_syscall *)m);
273dde5f9b9SDmitry Chagin 			else
274dde5f9b9SDmitry Chagin #endif
2757144d36fSDmitry Chagin 				ktrsyscall((struct ktr_syscall *)m, sv_flags);
2769b50d902SRodney W. Grimes 			break;
2779b50d902SRodney W. Grimes 		case KTR_SYSRET:
278dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
279dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
280dde5f9b9SDmitry Chagin 				linux_ktrsysret((struct ktr_sysret *)m);
281dde5f9b9SDmitry Chagin 			else
282dde5f9b9SDmitry Chagin #endif
2837144d36fSDmitry Chagin 				ktrsysret((struct ktr_sysret *)m, sv_flags);
2849b50d902SRodney W. Grimes 			break;
2859b50d902SRodney W. Grimes 		case KTR_NAMEI:
286a56be37eSJohn Baldwin 		case KTR_SYSCTL:
2879b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
2889b50d902SRodney W. Grimes 			break;
2899b50d902SRodney W. Grimes 		case KTR_GENIO:
2909b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
2919b50d902SRodney W. Grimes 			break;
2929b50d902SRodney W. Grimes 		case KTR_PSIG:
293dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
2949b50d902SRodney W. Grimes 			break;
2959b50d902SRodney W. Grimes 		case KTR_CSW:
2969b50d902SRodney W. Grimes 			ktrcsw((struct ktr_csw *)m);
2979b50d902SRodney W. Grimes 			break;
29882e2dd32SPoul-Henning Kamp 		case KTR_USER:
2993f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
30082e2dd32SPoul-Henning Kamp 			break;
30160e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
30260e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
30360e15db9SDag-Erling Smørgrav 			break;
304b9609ab1SJohn Baldwin 		default:
305b9609ab1SJohn Baldwin 			printf("\n");
306b9609ab1SJohn Baldwin 			break;
3079b50d902SRodney W. Grimes 		}
3089b50d902SRodney W. Grimes 		if (tail)
30909307b25SDag-Erling Smørgrav 			fflush(stdout);
3109b50d902SRodney W. Grimes 	}
31191fbb9c1SDavid Malone 	return 0;
3129b50d902SRodney W. Grimes }
3139b50d902SRodney W. Grimes 
31491fbb9c1SDavid Malone int
31591fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
3169b50d902SRodney W. Grimes {
3179b50d902SRodney W. Grimes 	int i;
3189b50d902SRodney W. Grimes 
3199b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
32009307b25SDag-Erling Smørgrav 		sleep(1);
3219b50d902SRodney W. Grimes 		clearerr(stdin);
3229b50d902SRodney W. Grimes 	}
3239b50d902SRodney W. Grimes 	return (i);
3249b50d902SRodney W. Grimes }
3259b50d902SRodney W. Grimes 
3267144d36fSDmitry Chagin int
3277144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
3287144d36fSDmitry Chagin {
3297144d36fSDmitry Chagin 	struct proc_info *pi;
3307144d36fSDmitry Chagin 
3317144d36fSDmitry Chagin 	switch (kth->ktr_type) {
3327144d36fSDmitry Chagin 	case KTR_PROCCTOR:
3337144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
3347144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
3357144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
3367144d36fSDmitry Chagin 				break;
3377144d36fSDmitry Chagin 			}
3387144d36fSDmitry Chagin 		}
3397144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
3407144d36fSDmitry Chagin 		if (pi == NULL)
3417144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
3427144d36fSDmitry Chagin 		pi->sv_flags = *flags;
3437144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
3447144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
3457144d36fSDmitry Chagin 		return (1);
3467144d36fSDmitry Chagin 
3477144d36fSDmitry Chagin 	case KTR_PROCDTOR:
3487144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
3497144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
3507144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
3517144d36fSDmitry Chagin 				free(pi);
3527144d36fSDmitry Chagin 				break;
3537144d36fSDmitry Chagin 			}
3547144d36fSDmitry Chagin 		}
3557144d36fSDmitry Chagin 		return (1);
3567144d36fSDmitry Chagin 	}
3577144d36fSDmitry Chagin 
3587144d36fSDmitry Chagin 	return (0);
3597144d36fSDmitry Chagin }
3607144d36fSDmitry Chagin 
3617144d36fSDmitry Chagin u_int
3627144d36fSDmitry Chagin abidump(struct ktr_header *kth)
3637144d36fSDmitry Chagin {
3647144d36fSDmitry Chagin 	struct proc_info *pi;
3657144d36fSDmitry Chagin 	const char *abi;
3667144d36fSDmitry Chagin 	const char *arch;
3677144d36fSDmitry Chagin 	u_int flags = 0;
3687144d36fSDmitry Chagin 
3697144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
3707144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
3717144d36fSDmitry Chagin 			flags = pi->sv_flags;
3727144d36fSDmitry Chagin 			break;
3737144d36fSDmitry Chagin 		}
3747144d36fSDmitry Chagin 	}
3757144d36fSDmitry Chagin 
3767144d36fSDmitry Chagin 	if (abiflag == 0)
3777144d36fSDmitry Chagin 		return (flags);
3787144d36fSDmitry Chagin 
3797144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
3807144d36fSDmitry Chagin 	case SV_ABI_LINUX:
3817144d36fSDmitry Chagin 		abi = "L";
3827144d36fSDmitry Chagin 		break;
3837144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
3847144d36fSDmitry Chagin 		abi = "F";
3857144d36fSDmitry Chagin 		break;
3867144d36fSDmitry Chagin 	default:
3877144d36fSDmitry Chagin 		abi = "U";
3887144d36fSDmitry Chagin 		break;
3897144d36fSDmitry Chagin 	}
3907144d36fSDmitry Chagin 
3917144d36fSDmitry Chagin 	if (flags != 0) {
3927144d36fSDmitry Chagin 		if (flags & SV_LP64)
3937144d36fSDmitry Chagin 			arch = "64";
3947144d36fSDmitry Chagin 		else
3957144d36fSDmitry Chagin 			arch = "32";
3967144d36fSDmitry Chagin 	} else
3977144d36fSDmitry Chagin 		arch = "00";
3987144d36fSDmitry Chagin 
3997144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
4007144d36fSDmitry Chagin 
4017144d36fSDmitry Chagin 	return (flags);
4027144d36fSDmitry Chagin }
4037144d36fSDmitry Chagin 
40491fbb9c1SDavid Malone void
40591fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
4069b50d902SRodney W. Grimes {
4079b50d902SRodney W. Grimes 	static char unknown[64];
4089b50d902SRodney W. Grimes 	static struct timeval prevtime, temp;
40991fbb9c1SDavid Malone 	const char *type;
4109b50d902SRodney W. Grimes 
4119b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
4129b50d902SRodney W. Grimes 	case KTR_SYSCALL:
4139b50d902SRodney W. Grimes 		type = "CALL";
4149b50d902SRodney W. Grimes 		break;
4159b50d902SRodney W. Grimes 	case KTR_SYSRET:
4169b50d902SRodney W. Grimes 		type = "RET ";
4179b50d902SRodney W. Grimes 		break;
4189b50d902SRodney W. Grimes 	case KTR_NAMEI:
4199b50d902SRodney W. Grimes 		type = "NAMI";
4209b50d902SRodney W. Grimes 		break;
4219b50d902SRodney W. Grimes 	case KTR_GENIO:
4229b50d902SRodney W. Grimes 		type = "GIO ";
4239b50d902SRodney W. Grimes 		break;
4249b50d902SRodney W. Grimes 	case KTR_PSIG:
4259b50d902SRodney W. Grimes 		type = "PSIG";
4269b50d902SRodney W. Grimes 		break;
4279b50d902SRodney W. Grimes 	case KTR_CSW:
4289b50d902SRodney W. Grimes 		type = "CSW ";
4299b50d902SRodney W. Grimes 		break;
43082e2dd32SPoul-Henning Kamp 	case KTR_USER:
43182e2dd32SPoul-Henning Kamp 		type = "USER";
43282e2dd32SPoul-Henning Kamp 		break;
43360e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
43460e15db9SDag-Erling Smørgrav 		type = "STRU";
43560e15db9SDag-Erling Smørgrav 		break;
436a56be37eSJohn Baldwin 	case KTR_SYSCTL:
437a56be37eSJohn Baldwin 		type = "SCTL";
438a56be37eSJohn Baldwin 		break;
4397144d36fSDmitry Chagin 	case KTR_PROCCTOR:
4407144d36fSDmitry Chagin 		/* FALLTHROUGH */
4417144d36fSDmitry Chagin 	case KTR_PROCDTOR:
4427144d36fSDmitry Chagin 		return;
4439b50d902SRodney W. Grimes 	default:
44409307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
4459b50d902SRodney W. Grimes 		type = unknown;
4469b50d902SRodney W. Grimes 	}
4479b50d902SRodney W. Grimes 
448a9ac598bSRobert Watson 	/*
449a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
450a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
451a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
452a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
453a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
454a9ac598bSRobert Watson 	 * negative tid's as 0.
455a9ac598bSRobert Watson 	 */
456a9ac598bSRobert Watson 	if (threads)
45709307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
458c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
459c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
460a9ac598bSRobert Watson 	else
46109307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
462a9ac598bSRobert Watson 		    kth->ktr_comm);
4639b50d902SRodney W. Grimes 	if (timestamp) {
464ec131914SPeter Wemm 		if (timestamp == 3) {
465ec131914SPeter Wemm 			if (prevtime.tv_sec == 0)
466ec131914SPeter Wemm 				prevtime = kth->ktr_time;
467ec131914SPeter Wemm 			timevalsub(&kth->ktr_time, &prevtime);
468ec131914SPeter Wemm 		}
4699b50d902SRodney W. Grimes 		if (timestamp == 2) {
4709b50d902SRodney W. Grimes 			temp = kth->ktr_time;
4719b50d902SRodney W. Grimes 			timevalsub(&kth->ktr_time, &prevtime);
4729b50d902SRodney W. Grimes 			prevtime = temp;
4739b50d902SRodney W. Grimes 		}
47409307b25SDag-Erling Smørgrav 		printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
475c065c0b8SJaakko Heinonen 		    kth->ktr_time.tv_usec);
4769b50d902SRodney W. Grimes 	}
47709307b25SDag-Erling Smørgrav 	printf("%s  ", type);
4789b50d902SRodney W. Grimes }
4799b50d902SRodney W. Grimes 
4809b50d902SRodney W. Grimes #include <sys/syscall.h>
4819b50d902SRodney W. Grimes #define KTRACE
48255229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c>
4839b50d902SRodney W. Grimes #undef KTRACE
4849b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
4859b50d902SRodney W. Grimes 
48691fbb9c1SDavid Malone void
4877144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags)
4889b50d902SRodney W. Grimes {
48991fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
49091fbb9c1SDavid Malone 	register_t *ip;
4919b50d902SRodney W. Grimes 
4927144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
4937144d36fSDmitry Chagin 	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
49409307b25SDag-Erling Smørgrav 		printf("[%d]", ktr->ktr_code);
4959b50d902SRodney W. Grimes 	else
49609307b25SDag-Erling Smørgrav 		printf("%s", syscallnames[ktr->ktr_code]);
4977a6ec4cfSDmitrij Tejblum 	ip = &ktr->ktr_args[0];
4989b50d902SRodney W. Grimes 	if (narg) {
4999b50d902SRodney W. Grimes 		char c = '(';
5007144d36fSDmitry Chagin 		if (fancy &&
5017144d36fSDmitry Chagin 		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
50273430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
50373430055SDag-Erling Smørgrav 			case SYS_ioctl: {
50491fbb9c1SDavid Malone 				const char *cp;
50598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
506d09e66beSDag-Erling Smørgrav 				putchar(c);
507d09e66beSDag-Erling Smørgrav 				ioctlname(*ip, decimal);
5089b50d902SRodney W. Grimes 				c = ',';
5099b50d902SRodney W. Grimes 				ip++;
5109b50d902SRodney W. Grimes 				narg--;
51173430055SDag-Erling Smørgrav 				break;
51273430055SDag-Erling Smørgrav 			}
51373430055SDag-Erling Smørgrav 			case SYS_ptrace:
51409307b25SDag-Erling Smørgrav 				putchar('(');
51595bb676aSDag-Erling Smørgrav 				ptraceopname(*ip);
5169b50d902SRodney W. Grimes 				c = ',';
5179b50d902SRodney W. Grimes 				ip++;
5189b50d902SRodney W. Grimes 				narg--;
51973430055SDag-Erling Smørgrav 				break;
52073430055SDag-Erling Smørgrav 			case SYS_access:
52173430055SDag-Erling Smørgrav 			case SYS_eaccess:
52298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
52309307b25SDag-Erling Smørgrav 				putchar(',');
52495bb676aSDag-Erling Smørgrav 				accessmodename(*ip);
52598a68a58SAlexander Leidinger 				ip++;
52698a68a58SAlexander Leidinger 				narg--;
52773430055SDag-Erling Smørgrav 				break;
52873430055SDag-Erling Smørgrav 			case SYS_open:
52998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
53009307b25SDag-Erling Smørgrav 				putchar(',');
53195bb676aSDag-Erling Smørgrav 				flagsandmodename(ip[0], ip[1], decimal);
53273430055SDag-Erling Smørgrav 				ip += 2;
53398a68a58SAlexander Leidinger 				narg -= 2;
53473430055SDag-Erling Smørgrav 				break;
53573430055SDag-Erling Smørgrav 			case SYS_wait4:
53698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
53798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
53809307b25SDag-Erling Smørgrav 				putchar(',');
53995bb676aSDag-Erling Smørgrav 				wait4optname(*ip);
54098a68a58SAlexander Leidinger 				ip++;
54198a68a58SAlexander Leidinger 				narg--;
54273430055SDag-Erling Smørgrav 				break;
54373430055SDag-Erling Smørgrav 			case SYS_chmod:
54473430055SDag-Erling Smørgrav 			case SYS_fchmod:
54573430055SDag-Erling Smørgrav 			case SYS_lchmod:
54698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
54709307b25SDag-Erling Smørgrav 				putchar(',');
54895bb676aSDag-Erling Smørgrav 				modename(*ip);
54998a68a58SAlexander Leidinger 				ip++;
55098a68a58SAlexander Leidinger 				narg--;
55173430055SDag-Erling Smørgrav 				break;
55273430055SDag-Erling Smørgrav 			case SYS_mknod:
55398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
55409307b25SDag-Erling Smørgrav 				putchar(',');
55595bb676aSDag-Erling Smørgrav 				modename(*ip);
55698a68a58SAlexander Leidinger 				ip++;
55798a68a58SAlexander Leidinger 				narg--;
55873430055SDag-Erling Smørgrav 				break;
55973430055SDag-Erling Smørgrav 			case SYS_getfsstat:
56098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
56198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
56209307b25SDag-Erling Smørgrav 				putchar(',');
56395bb676aSDag-Erling Smørgrav 				getfsstatflagsname(*ip);
56498a68a58SAlexander Leidinger 				ip++;
56598a68a58SAlexander Leidinger 				narg--;
56673430055SDag-Erling Smørgrav 				break;
56773430055SDag-Erling Smørgrav 			case SYS_mount:
56898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
56998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
57009307b25SDag-Erling Smørgrav 				putchar(',');
57195bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
57298a68a58SAlexander Leidinger 				ip++;
57398a68a58SAlexander Leidinger 				narg--;
57473430055SDag-Erling Smørgrav 				break;
57573430055SDag-Erling Smørgrav 			case SYS_unmount:
57698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
57709307b25SDag-Erling Smørgrav 				putchar(',');
57895bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
57998a68a58SAlexander Leidinger 				ip++;
58098a68a58SAlexander Leidinger 				narg--;
58173430055SDag-Erling Smørgrav 				break;
58273430055SDag-Erling Smørgrav 			case SYS_recvmsg:
58373430055SDag-Erling Smørgrav 			case SYS_sendmsg:
58498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
58598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
58609307b25SDag-Erling Smørgrav 				putchar(',');
58795bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
58898a68a58SAlexander Leidinger 				ip++;
58998a68a58SAlexander Leidinger 				narg--;
59073430055SDag-Erling Smørgrav 				break;
59173430055SDag-Erling Smørgrav 			case SYS_recvfrom:
59273430055SDag-Erling Smørgrav 			case SYS_sendto:
59398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
59498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
59598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
59609307b25SDag-Erling Smørgrav 				putchar(',');
59795bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
59898a68a58SAlexander Leidinger 				ip++;
59998a68a58SAlexander Leidinger 				narg--;
60073430055SDag-Erling Smørgrav 				break;
60173430055SDag-Erling Smørgrav 			case SYS_chflags:
60273430055SDag-Erling Smørgrav 			case SYS_fchflags:
60373430055SDag-Erling Smørgrav 			case SYS_lchflags:
60498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
60509307b25SDag-Erling Smørgrav 				putchar(',');
60695bb676aSDag-Erling Smørgrav 				modename(*ip);
60798a68a58SAlexander Leidinger 				ip++;
60898a68a58SAlexander Leidinger 				narg--;
60973430055SDag-Erling Smørgrav 				break;
61073430055SDag-Erling Smørgrav 			case SYS_kill:
61198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
61209307b25SDag-Erling Smørgrav 				putchar(',');
61395bb676aSDag-Erling Smørgrav 				signame(*ip);
61498a68a58SAlexander Leidinger 				ip++;
61598a68a58SAlexander Leidinger 				narg--;
61673430055SDag-Erling Smørgrav 				break;
61773430055SDag-Erling Smørgrav 			case SYS_reboot:
61809307b25SDag-Erling Smørgrav 				putchar('(');
61995bb676aSDag-Erling Smørgrav 				rebootoptname(*ip);
62098a68a58SAlexander Leidinger 				ip++;
62198a68a58SAlexander Leidinger 				narg--;
62273430055SDag-Erling Smørgrav 				break;
62373430055SDag-Erling Smørgrav 			case SYS_umask:
62409307b25SDag-Erling Smørgrav 				putchar('(');
62595bb676aSDag-Erling Smørgrav 				modename(*ip);
62698a68a58SAlexander Leidinger 				ip++;
62798a68a58SAlexander Leidinger 				narg--;
62873430055SDag-Erling Smørgrav 				break;
62973430055SDag-Erling Smørgrav 			case SYS_msync:
63098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
63198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
63209307b25SDag-Erling Smørgrav 				putchar(',');
63395bb676aSDag-Erling Smørgrav 				msyncflagsname(*ip);
63498a68a58SAlexander Leidinger 				ip++;
63598a68a58SAlexander Leidinger 				narg--;
63673430055SDag-Erling Smørgrav 				break;
637cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
63873430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
639cae1120aSPeter Wemm 				print_number(ip, narg, c);
640cae1120aSPeter Wemm 				print_number(ip, narg, c);
64109307b25SDag-Erling Smørgrav 				putchar(',');
64295bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
64309307b25SDag-Erling Smørgrav 				putchar(',');
644cae1120aSPeter Wemm 				ip++;
645cae1120aSPeter Wemm 				narg--;
64695bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
647cae1120aSPeter Wemm 				ip++;
648cae1120aSPeter Wemm 				narg--;
64973430055SDag-Erling Smørgrav 				break;
650cae1120aSPeter Wemm #endif
65173430055SDag-Erling Smørgrav 			case SYS_mmap:
65298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65409307b25SDag-Erling Smørgrav 				putchar(',');
65595bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
65609307b25SDag-Erling Smørgrav 				putchar(',');
65798a68a58SAlexander Leidinger 				ip++;
65898a68a58SAlexander Leidinger 				narg--;
65995bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
66098a68a58SAlexander Leidinger 				ip++;
66198a68a58SAlexander Leidinger 				narg--;
66273430055SDag-Erling Smørgrav 				break;
66373430055SDag-Erling Smørgrav 			case SYS_mprotect:
66498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66609307b25SDag-Erling Smørgrav 				putchar(',');
66795bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
66898a68a58SAlexander Leidinger 				ip++;
66998a68a58SAlexander Leidinger 				narg--;
67073430055SDag-Erling Smørgrav 				break;
67173430055SDag-Erling Smørgrav 			case SYS_madvise:
67298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67409307b25SDag-Erling Smørgrav 				putchar(',');
67595bb676aSDag-Erling Smørgrav 				madvisebehavname(*ip);
67698a68a58SAlexander Leidinger 				ip++;
67798a68a58SAlexander Leidinger 				narg--;
67873430055SDag-Erling Smørgrav 				break;
67973430055SDag-Erling Smørgrav 			case SYS_setpriority:
68098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
68198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
68209307b25SDag-Erling Smørgrav 				putchar(',');
68395bb676aSDag-Erling Smørgrav 				prioname(*ip);
68498a68a58SAlexander Leidinger 				ip++;
68598a68a58SAlexander Leidinger 				narg--;
68673430055SDag-Erling Smørgrav 				break;
68773430055SDag-Erling Smørgrav 			case SYS_fcntl:
68898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
68909307b25SDag-Erling Smørgrav 				putchar(',');
69095bb676aSDag-Erling Smørgrav 				fcntlcmdname(ip[0], ip[1], decimal);
69173430055SDag-Erling Smørgrav 				ip += 2;
69298a68a58SAlexander Leidinger 				narg -= 2;
69373430055SDag-Erling Smørgrav 				break;
69473430055SDag-Erling Smørgrav 			case SYS_socket: {
6958bc31d83SCraig Rodrigues 				int sockdomain;
69609307b25SDag-Erling Smørgrav 				putchar('(');
69795bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
6988bc31d83SCraig Rodrigues 				sockdomainname(sockdomain);
69998a68a58SAlexander Leidinger 				ip++;
70098a68a58SAlexander Leidinger 				narg--;
70109307b25SDag-Erling Smørgrav 				putchar(',');
70295bb676aSDag-Erling Smørgrav 				socktypename(*ip);
70398a68a58SAlexander Leidinger 				ip++;
70498a68a58SAlexander Leidinger 				narg--;
7058bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
7068bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
70709307b25SDag-Erling Smørgrav 					putchar(',');
70895bb676aSDag-Erling Smørgrav 					sockipprotoname(*ip);
7098bc31d83SCraig Rodrigues 					ip++;
7108bc31d83SCraig Rodrigues 					narg--;
7118bc31d83SCraig Rodrigues 				}
71298a68a58SAlexander Leidinger 				c = ',';
71373430055SDag-Erling Smørgrav 				break;
71473430055SDag-Erling Smørgrav 			}
71573430055SDag-Erling Smørgrav 			case SYS_setsockopt:
71673430055SDag-Erling Smørgrav 			case SYS_getsockopt:
71798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
71809307b25SDag-Erling Smørgrav 				putchar(',');
71995bb676aSDag-Erling Smørgrav 				sockoptlevelname(*ip, decimal);
720e4bb45b1SDag-Erling Smørgrav 				if (*ip == SOL_SOCKET) {
72198a68a58SAlexander Leidinger 					ip++;
72298a68a58SAlexander Leidinger 					narg--;
72309307b25SDag-Erling Smørgrav 					putchar(',');
72495bb676aSDag-Erling Smørgrav 					sockoptname(*ip);
7250460d351SJohn Baldwin 				}
72698a68a58SAlexander Leidinger 				ip++;
72798a68a58SAlexander Leidinger 				narg--;
72873430055SDag-Erling Smørgrav 				break;
729cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
73073430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
73198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73298a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
73398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73509307b25SDag-Erling Smørgrav 				putchar(',');
73695bb676aSDag-Erling Smørgrav 				whencename(*ip);
73798a68a58SAlexander Leidinger 				ip++;
73898a68a58SAlexander Leidinger 				narg--;
73973430055SDag-Erling Smørgrav 				break;
740cae1120aSPeter Wemm #endif
74173430055SDag-Erling Smørgrav 			case SYS_lseek:
742cae1120aSPeter Wemm 				print_number(ip, narg, c);
743cae1120aSPeter Wemm 				/* Hidden 'pad' argument, not in lseek(2) */
744cae1120aSPeter Wemm 				print_number(ip, narg, c);
74509307b25SDag-Erling Smørgrav 				putchar(',');
74695bb676aSDag-Erling Smørgrav 				whencename(*ip);
747cae1120aSPeter Wemm 				ip++;
748cae1120aSPeter Wemm 				narg--;
74973430055SDag-Erling Smørgrav 				break;
75073430055SDag-Erling Smørgrav 			case SYS_flock:
75198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75209307b25SDag-Erling Smørgrav 				putchar(',');
75395bb676aSDag-Erling Smørgrav 				flockname(*ip);
75498a68a58SAlexander Leidinger 				ip++;
75598a68a58SAlexander Leidinger 				narg--;
75673430055SDag-Erling Smørgrav 				break;
75773430055SDag-Erling Smørgrav 			case SYS_mkfifo:
75873430055SDag-Erling Smørgrav 			case SYS_mkdir:
75998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
76009307b25SDag-Erling Smørgrav 				putchar(',');
76195bb676aSDag-Erling Smørgrav 				modename(*ip);
76298a68a58SAlexander Leidinger 				ip++;
76398a68a58SAlexander Leidinger 				narg--;
76473430055SDag-Erling Smørgrav 				break;
76573430055SDag-Erling Smørgrav 			case SYS_shutdown:
76698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
76709307b25SDag-Erling Smørgrav 				putchar(',');
76895bb676aSDag-Erling Smørgrav 				shutdownhowname(*ip);
76998a68a58SAlexander Leidinger 				ip++;
77098a68a58SAlexander Leidinger 				narg--;
77173430055SDag-Erling Smørgrav 				break;
77273430055SDag-Erling Smørgrav 			case SYS_socketpair:
77309307b25SDag-Erling Smørgrav 				putchar('(');
77495bb676aSDag-Erling Smørgrav 				sockdomainname(*ip);
77598a68a58SAlexander Leidinger 				ip++;
77698a68a58SAlexander Leidinger 				narg--;
77709307b25SDag-Erling Smørgrav 				putchar(',');
77895bb676aSDag-Erling Smørgrav 				socktypename(*ip);
77998a68a58SAlexander Leidinger 				ip++;
78098a68a58SAlexander Leidinger 				narg--;
78198a68a58SAlexander Leidinger 				c = ',';
78273430055SDag-Erling Smørgrav 				break;
78373430055SDag-Erling Smørgrav 			case SYS_getrlimit:
78473430055SDag-Erling Smørgrav 			case SYS_setrlimit:
78509307b25SDag-Erling Smørgrav 				putchar('(');
78695bb676aSDag-Erling Smørgrav 				rlimitname(*ip);
78798a68a58SAlexander Leidinger 				ip++;
78898a68a58SAlexander Leidinger 				narg--;
78998a68a58SAlexander Leidinger 				c = ',';
79073430055SDag-Erling Smørgrav 				break;
79173430055SDag-Erling Smørgrav 			case SYS_quotactl:
79298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
79309307b25SDag-Erling Smørgrav 				putchar(',');
79495bb676aSDag-Erling Smørgrav 				quotactlname(*ip);
79598a68a58SAlexander Leidinger 				ip++;
79698a68a58SAlexander Leidinger 				narg--;
79798a68a58SAlexander Leidinger 				c = ',';
79873430055SDag-Erling Smørgrav 				break;
79973430055SDag-Erling Smørgrav 			case SYS_nfssvc:
80009307b25SDag-Erling Smørgrav 				putchar('(');
80195bb676aSDag-Erling Smørgrav 				nfssvcname(*ip);
80298a68a58SAlexander Leidinger 				ip++;
80398a68a58SAlexander Leidinger 				narg--;
80498a68a58SAlexander Leidinger 				c = ',';
80573430055SDag-Erling Smørgrav 				break;
80673430055SDag-Erling Smørgrav 			case SYS_rtprio:
80709307b25SDag-Erling Smørgrav 				putchar('(');
80895bb676aSDag-Erling Smørgrav 				rtprioname(*ip);
80998a68a58SAlexander Leidinger 				ip++;
81098a68a58SAlexander Leidinger 				narg--;
81198a68a58SAlexander Leidinger 				c = ',';
81273430055SDag-Erling Smørgrav 				break;
81373430055SDag-Erling Smørgrav 			case SYS___semctl:
81498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81609307b25SDag-Erling Smørgrav 				putchar(',');
81795bb676aSDag-Erling Smørgrav 				semctlname(*ip);
81898a68a58SAlexander Leidinger 				ip++;
81998a68a58SAlexander Leidinger 				narg--;
82073430055SDag-Erling Smørgrav 				break;
82173430055SDag-Erling Smørgrav 			case SYS_semget:
82298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82409307b25SDag-Erling Smørgrav 				putchar(',');
82595bb676aSDag-Erling Smørgrav 				semgetname(*ip);
82698a68a58SAlexander Leidinger 				ip++;
82798a68a58SAlexander Leidinger 				narg--;
82873430055SDag-Erling Smørgrav 				break;
82973430055SDag-Erling Smørgrav 			case SYS_msgctl:
83098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83109307b25SDag-Erling Smørgrav 				putchar(',');
83295bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
83398a68a58SAlexander Leidinger 				ip++;
83498a68a58SAlexander Leidinger 				narg--;
83573430055SDag-Erling Smørgrav 				break;
83673430055SDag-Erling Smørgrav 			case SYS_shmat:
83798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83909307b25SDag-Erling Smørgrav 				putchar(',');
84095bb676aSDag-Erling Smørgrav 				shmatname(*ip);
84198a68a58SAlexander Leidinger 				ip++;
84298a68a58SAlexander Leidinger 				narg--;
84373430055SDag-Erling Smørgrav 				break;
84473430055SDag-Erling Smørgrav 			case SYS_shmctl:
84598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
84609307b25SDag-Erling Smørgrav 				putchar(',');
84795bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
84898a68a58SAlexander Leidinger 				ip++;
84998a68a58SAlexander Leidinger 				narg--;
85073430055SDag-Erling Smørgrav 				break;
85173430055SDag-Erling Smørgrav 			case SYS_minherit:
85298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
85398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
85409307b25SDag-Erling Smørgrav 				putchar(',');
85595bb676aSDag-Erling Smørgrav 				minheritname(*ip);
85698a68a58SAlexander Leidinger 				ip++;
85798a68a58SAlexander Leidinger 				narg--;
85873430055SDag-Erling Smørgrav 				break;
85973430055SDag-Erling Smørgrav 			case SYS_rfork:
86009307b25SDag-Erling Smørgrav 				putchar('(');
86195bb676aSDag-Erling Smørgrav 				rforkname(*ip);
86298a68a58SAlexander Leidinger 				ip++;
86398a68a58SAlexander Leidinger 				narg--;
86498a68a58SAlexander Leidinger 				c = ',';
86573430055SDag-Erling Smørgrav 				break;
86673430055SDag-Erling Smørgrav 			case SYS_lio_listio:
86709307b25SDag-Erling Smørgrav 				putchar('(');
86895bb676aSDag-Erling Smørgrav 				lio_listioname(*ip);
86998a68a58SAlexander Leidinger 				ip++;
87098a68a58SAlexander Leidinger 				narg--;
87198a68a58SAlexander Leidinger 				c = ',';
87273430055SDag-Erling Smørgrav 				break;
87373430055SDag-Erling Smørgrav 			case SYS_mlockall:
87409307b25SDag-Erling Smørgrav 				putchar('(');
87595bb676aSDag-Erling Smørgrav 				mlockallname(*ip);
87698a68a58SAlexander Leidinger 				ip++;
87798a68a58SAlexander Leidinger 				narg--;
87873430055SDag-Erling Smørgrav 				break;
87973430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
88098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
88109307b25SDag-Erling Smørgrav 				putchar(',');
88295bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
88398a68a58SAlexander Leidinger 				ip++;
88498a68a58SAlexander Leidinger 				narg--;
88573430055SDag-Erling Smørgrav 				break;
88673430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
88773430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
88809307b25SDag-Erling Smørgrav 				putchar('(');
88995bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
89098a68a58SAlexander Leidinger 				ip++;
89198a68a58SAlexander Leidinger 				narg--;
89273430055SDag-Erling Smørgrav 				break;
89373430055SDag-Erling Smørgrav 			case SYS_sendfile:
89498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90009307b25SDag-Erling Smørgrav 				putchar(',');
90195bb676aSDag-Erling Smørgrav 				sendfileflagsname(*ip);
90298a68a58SAlexander Leidinger 				ip++;
90398a68a58SAlexander Leidinger 				narg--;
90473430055SDag-Erling Smørgrav 				break;
90573430055SDag-Erling Smørgrav 			case SYS_kldsym:
90698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90709307b25SDag-Erling Smørgrav 				putchar(',');
90895bb676aSDag-Erling Smørgrav 				kldsymcmdname(*ip);
90998a68a58SAlexander Leidinger 				ip++;
91098a68a58SAlexander Leidinger 				narg--;
91173430055SDag-Erling Smørgrav 				break;
91273430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
91309307b25SDag-Erling Smørgrav 				putchar('(');
91495bb676aSDag-Erling Smørgrav 				sigprocmaskhowname(*ip);
91598a68a58SAlexander Leidinger 				ip++;
91698a68a58SAlexander Leidinger 				narg--;
91798a68a58SAlexander Leidinger 				c = ',';
91873430055SDag-Erling Smørgrav 				break;
91973430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
92073430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
92173430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
92273430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
92373430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
92473430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
92573430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
92673430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
92773430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
92873430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
92973430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
93073430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
93198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93209307b25SDag-Erling Smørgrav 				putchar(',');
93395bb676aSDag-Erling Smørgrav 				acltypename(*ip);
93498a68a58SAlexander Leidinger 				ip++;
93598a68a58SAlexander Leidinger 				narg--;
93673430055SDag-Erling Smørgrav 				break;
93773430055SDag-Erling Smørgrav 			case SYS_sigaction:
93809307b25SDag-Erling Smørgrav 				putchar('(');
93995bb676aSDag-Erling Smørgrav 				signame(*ip);
94098a68a58SAlexander Leidinger 				ip++;
94198a68a58SAlexander Leidinger 				narg--;
94298a68a58SAlexander Leidinger 				c = ',';
94373430055SDag-Erling Smørgrav 				break;
94473430055SDag-Erling Smørgrav 			case SYS_extattrctl:
94598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94609307b25SDag-Erling Smørgrav 				putchar(',');
94795bb676aSDag-Erling Smørgrav 				extattrctlname(*ip);
94898a68a58SAlexander Leidinger 				ip++;
94998a68a58SAlexander Leidinger 				narg--;
95073430055SDag-Erling Smørgrav 				break;
95173430055SDag-Erling Smørgrav 			case SYS_nmount:
95298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95409307b25SDag-Erling Smørgrav 				putchar(',');
95595bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
95698a68a58SAlexander Leidinger 				ip++;
95798a68a58SAlexander Leidinger 				narg--;
95873430055SDag-Erling Smørgrav 				break;
95973430055SDag-Erling Smørgrav 			case SYS_thr_create:
96098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96209307b25SDag-Erling Smørgrav 				putchar(',');
96395bb676aSDag-Erling Smørgrav 				thrcreateflagsname(*ip);
96498a68a58SAlexander Leidinger 				ip++;
96598a68a58SAlexander Leidinger 				narg--;
96673430055SDag-Erling Smørgrav 				break;
96773430055SDag-Erling Smørgrav 			case SYS_thr_kill:
96898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96909307b25SDag-Erling Smørgrav 				putchar(',');
97095bb676aSDag-Erling Smørgrav 				signame(*ip);
97198a68a58SAlexander Leidinger 				ip++;
97298a68a58SAlexander Leidinger 				narg--;
97373430055SDag-Erling Smørgrav 				break;
97473430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
97598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97609307b25SDag-Erling Smørgrav 				putchar(',');
97795bb676aSDag-Erling Smørgrav 				kldunloadfflagsname(*ip);
97898a68a58SAlexander Leidinger 				ip++;
97998a68a58SAlexander Leidinger 				narg--;
98073430055SDag-Erling Smørgrav 				break;
981515dfc23SDag-Erling Smørgrav                         case SYS_cap_new:
982515dfc23SDag-Erling Smørgrav                                 print_number(ip, narg, c);
983515dfc23SDag-Erling Smørgrav                                 putchar(',');
98495bb676aSDag-Erling Smørgrav                                 capname(*ip);
985515dfc23SDag-Erling Smørgrav                                 ip++;
986515dfc23SDag-Erling Smørgrav                                 narg--;
987515dfc23SDag-Erling Smørgrav 				break;
9889b50d902SRodney W. Grimes 			}
9899b50d902SRodney W. Grimes 		}
99048f6dd8aSAttilio Rao 		while (narg > 0) {
99198a68a58SAlexander Leidinger 			print_number(ip, narg, c);
9929b50d902SRodney W. Grimes 		}
99309307b25SDag-Erling Smørgrav 		putchar(')');
9949b50d902SRodney W. Grimes 	}
99509307b25SDag-Erling Smørgrav 	putchar('\n');
9969b50d902SRodney W. Grimes }
9979b50d902SRodney W. Grimes 
99891fbb9c1SDavid Malone void
9997144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags)
10009b50d902SRodney W. Grimes {
100191fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
100291fbb9c1SDavid Malone 	int error = ktr->ktr_error;
100391fbb9c1SDavid Malone 	int code = ktr->ktr_code;
10049b50d902SRodney W. Grimes 
10057144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
10067144d36fSDmitry Chagin 	    (code >= nsyscalls || code < 0))
100709307b25SDag-Erling Smørgrav 		printf("[%d] ", code);
10089b50d902SRodney W. Grimes 	else
100909307b25SDag-Erling Smørgrav 		printf("%s ", syscallnames[code]);
10109b50d902SRodney W. Grimes 
10119b50d902SRodney W. Grimes 	if (error == 0) {
10129b50d902SRodney W. Grimes 		if (fancy) {
101309307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
10149b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
101509307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
10169b50d902SRodney W. Grimes 		} else {
10179b50d902SRodney W. Grimes 			if (decimal)
101809307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
10199b50d902SRodney W. Grimes 			else
102009307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
10219b50d902SRodney W. Grimes 		}
10229b50d902SRodney W. Grimes 	} else if (error == ERESTART)
102309307b25SDag-Erling Smørgrav 		printf("RESTART");
10249b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
102509307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
10269b50d902SRodney W. Grimes 	else {
102709307b25SDag-Erling Smørgrav 		printf("-1 errno %d", ktr->ktr_error);
10289b50d902SRodney W. Grimes 		if (fancy)
102909307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
10309b50d902SRodney W. Grimes 	}
103109307b25SDag-Erling Smørgrav 	putchar('\n');
10329b50d902SRodney W. Grimes }
10339b50d902SRodney W. Grimes 
103491fbb9c1SDavid Malone void
103591fbb9c1SDavid Malone ktrnamei(char *cp, int len)
10369b50d902SRodney W. Grimes {
103709307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
10389b50d902SRodney W. Grimes }
10399b50d902SRodney W. Grimes 
104091fbb9c1SDavid Malone void
1041ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
10429b50d902SRodney W. Grimes {
1043ec4beb5dSPeter Wemm 	int n, i;
1044ec4beb5dSPeter Wemm 	int width;
1045ec4beb5dSPeter Wemm 
1046ec4beb5dSPeter Wemm 	width = 0;
1047ec4beb5dSPeter Wemm 	do {
1048ec4beb5dSPeter Wemm 		width += 2;
1049ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1050ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1051ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1052ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1053ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1054ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1055ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1056ec4beb5dSPeter Wemm 	width -= 2;
1057ec4beb5dSPeter Wemm 
1058ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1059ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1060ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1061ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1062ec4beb5dSPeter Wemm 			}
1063ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1064ec4beb5dSPeter Wemm 				printf(" ");
1065ec4beb5dSPeter Wemm 			}
1066ec4beb5dSPeter Wemm 			if (i < len)
1067ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1068ec4beb5dSPeter Wemm 			else
1069ec4beb5dSPeter Wemm 				printf("  ");
1070ec4beb5dSPeter Wemm 		}
1071ec4beb5dSPeter Wemm 		printf("  |");
1072ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1073ec4beb5dSPeter Wemm 			if (i >= len)
1074ec4beb5dSPeter Wemm 				break;
1075ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1076ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1077ec4beb5dSPeter Wemm 			else
1078ec4beb5dSPeter Wemm 				printf(".");
1079ec4beb5dSPeter Wemm 		}
1080ec4beb5dSPeter Wemm 		printf("|\n");
1081ec4beb5dSPeter Wemm 	}
1082ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1083ec4beb5dSPeter Wemm 		printf("\n");
1084ec4beb5dSPeter Wemm }
1085ec4beb5dSPeter Wemm 
1086ec4beb5dSPeter Wemm void
1087ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1088ec4beb5dSPeter Wemm {
108991fbb9c1SDavid Malone 	int col = 0;
1090ec4beb5dSPeter Wemm 	char *cp;
109191fbb9c1SDavid Malone 	int width;
10929b50d902SRodney W. Grimes 	char visbuf[5];
10939b50d902SRodney W. Grimes 
109409307b25SDag-Erling Smørgrav 	printf("       \"");
10959b50d902SRodney W. Grimes 	col = 8;
10969b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
109709307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
10989b50d902SRodney W. Grimes 		cp = visbuf;
10999b50d902SRodney W. Grimes 		/*
11009b50d902SRodney W. Grimes 		 * Keep track of printables and
11019b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
11029b50d902SRodney W. Grimes 		 */
11039b50d902SRodney W. Grimes 		if (col == 0) {
110409307b25SDag-Erling Smørgrav 			putchar('\t');
11059b50d902SRodney W. Grimes 			col = 8;
11069b50d902SRodney W. Grimes 		}
11079b50d902SRodney W. Grimes 		switch(*cp) {
11089b50d902SRodney W. Grimes 		case '\n':
11099b50d902SRodney W. Grimes 			col = 0;
111009307b25SDag-Erling Smørgrav 			putchar('\n');
11119b50d902SRodney W. Grimes 			continue;
11129b50d902SRodney W. Grimes 		case '\t':
11139b50d902SRodney W. Grimes 			width = 8 - (col&07);
11149b50d902SRodney W. Grimes 			break;
11159b50d902SRodney W. Grimes 		default:
11169b50d902SRodney W. Grimes 			width = strlen(cp);
11179b50d902SRodney W. Grimes 		}
11189b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
111909307b25SDag-Erling Smørgrav 			printf("\\\n\t");
11209b50d902SRodney W. Grimes 			col = 8;
11219b50d902SRodney W. Grimes 		}
11229b50d902SRodney W. Grimes 		col += width;
11239b50d902SRodney W. Grimes 		do {
112409307b25SDag-Erling Smørgrav 			putchar(*cp++);
11259b50d902SRodney W. Grimes 		} while (*cp);
11269b50d902SRodney W. Grimes 	}
11279b50d902SRodney W. Grimes 	if (col == 0)
112809307b25SDag-Erling Smørgrav 		printf("       ");
112909307b25SDag-Erling Smørgrav 	printf("\"\n");
11309b50d902SRodney W. Grimes }
11319b50d902SRodney W. Grimes 
1132ec4beb5dSPeter Wemm void
1133ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1134ec4beb5dSPeter Wemm {
1135ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1136ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1137ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1138ec4beb5dSPeter Wemm 	int i, binary;
1139ec4beb5dSPeter Wemm 
1140ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1141ec4beb5dSPeter Wemm 		struct winsize ws;
1142ec4beb5dSPeter Wemm 
1143ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1144ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1145ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1146ec4beb5dSPeter Wemm 		else
1147ec4beb5dSPeter Wemm 			screenwidth = 80;
1148ec4beb5dSPeter Wemm 	}
1149ec4beb5dSPeter Wemm 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
1150ec4beb5dSPeter Wemm 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
1151ec4beb5dSPeter Wemm 		datalen == 1 ? "" : "s");
1152df0c8868SRobert Watson 	if (suppressdata)
1153df0c8868SRobert Watson 		return;
1154ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1155ec4beb5dSPeter Wemm 		datalen = maxdata;
1156ec4beb5dSPeter Wemm 
1157ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1158ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1159ec4beb5dSPeter Wemm 			continue;
1160ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1161ec4beb5dSPeter Wemm 			continue;
1162ec4beb5dSPeter Wemm 		binary = 1;
1163ec4beb5dSPeter Wemm 	}
1164ec4beb5dSPeter Wemm 	if (binary)
1165ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1166ec4beb5dSPeter Wemm 	else
1167ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1168ec4beb5dSPeter Wemm }
1169ec4beb5dSPeter Wemm 
117091fbb9c1SDavid Malone const char *signames[] = {
11719b50d902SRodney W. Grimes 	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
11729b50d902SRodney W. Grimes 	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
11739b50d902SRodney W. Grimes 	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
11749b50d902SRodney W. Grimes 	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
11759b50d902SRodney W. Grimes 	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
11769b50d902SRodney W. Grimes 	"USR2", NULL,						/* 31 - 32 */
11779b50d902SRodney W. Grimes };
11789b50d902SRodney W. Grimes 
117991fbb9c1SDavid Malone void
1180dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
11819b50d902SRodney W. Grimes {
1182dde5f9b9SDmitry Chagin 	if (psig->signo > 0 && psig->signo < NSIG)
118309307b25SDag-Erling Smørgrav 		printf("SIG%s ", signames[psig->signo]);
1184fd6afe79SKonstantin Belousov 	else
118509307b25SDag-Erling Smørgrav 		printf("SIG %d ", psig->signo);
11869b50d902SRodney W. Grimes 	if (psig->action == SIG_DFL)
118709307b25SDag-Erling Smørgrav 		printf("SIG_DFL code=0x%x\n", psig->code);
118891fbb9c1SDavid Malone 	else {
118909307b25SDag-Erling Smørgrav 		printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
119091fbb9c1SDavid Malone 		    (u_long)psig->action, psig->mask.__bits[0], psig->code);
119191fbb9c1SDavid Malone 	}
11929b50d902SRodney W. Grimes }
11939b50d902SRodney W. Grimes 
119491fbb9c1SDavid Malone void
119591fbb9c1SDavid Malone ktrcsw(struct ktr_csw *cs)
11969b50d902SRodney W. Grimes {
119709307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
11989b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
11999b50d902SRodney W. Grimes }
12009b50d902SRodney W. Grimes 
12011f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_START		1
12021f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_STOP		2
12031f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_START		3
12041f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_STOP		4
12051f4b63f8SJohn Baldwin #define	UTRACE_LOAD_OBJECT		5
12061f4b63f8SJohn Baldwin #define	UTRACE_UNLOAD_OBJECT		6
12071f4b63f8SJohn Baldwin #define	UTRACE_ADD_RUNDEP		7
12081f4b63f8SJohn Baldwin #define	UTRACE_PRELOAD_FINISHED		8
12091f4b63f8SJohn Baldwin #define	UTRACE_INIT_CALL		9
12101f4b63f8SJohn Baldwin #define	UTRACE_FINI_CALL		10
12111f4b63f8SJohn Baldwin 
12121f4b63f8SJohn Baldwin struct utrace_rtld {
12131f4b63f8SJohn Baldwin 	char sig[4];				/* 'RTLD' */
12141f4b63f8SJohn Baldwin 	int event;
12151f4b63f8SJohn Baldwin 	void *handle;
12161f4b63f8SJohn Baldwin 	void *mapbase;
12171f4b63f8SJohn Baldwin 	size_t mapsize;
12181f4b63f8SJohn Baldwin 	int refcnt;
12191f4b63f8SJohn Baldwin 	char name[MAXPATHLEN];
12201f4b63f8SJohn Baldwin };
12211f4b63f8SJohn Baldwin 
12221f4b63f8SJohn Baldwin void
12231f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p)
12241f4b63f8SJohn Baldwin {
12251f4b63f8SJohn Baldwin 	struct utrace_rtld *ut = (struct utrace_rtld *)p;
12261f4b63f8SJohn Baldwin 	void *parent;
12271f4b63f8SJohn Baldwin 	int mode;
12281f4b63f8SJohn Baldwin 
12291f4b63f8SJohn Baldwin 	switch (ut->event) {
12301f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_START:
12311f4b63f8SJohn Baldwin 		mode = ut->refcnt;
12321f4b63f8SJohn Baldwin 		printf("dlopen(%s, ", ut->name);
12331f4b63f8SJohn Baldwin 		switch (mode & RTLD_MODEMASK) {
12341f4b63f8SJohn Baldwin 		case RTLD_NOW:
12351f4b63f8SJohn Baldwin 			printf("RTLD_NOW");
12361f4b63f8SJohn Baldwin 			break;
12371f4b63f8SJohn Baldwin 		case RTLD_LAZY:
12381f4b63f8SJohn Baldwin 			printf("RTLD_LAZY");
12391f4b63f8SJohn Baldwin 			break;
12401f4b63f8SJohn Baldwin 		default:
12411f4b63f8SJohn Baldwin 			printf("%#x", mode & RTLD_MODEMASK);
12421f4b63f8SJohn Baldwin 		}
12431f4b63f8SJohn Baldwin 		if (mode & RTLD_GLOBAL)
12441f4b63f8SJohn Baldwin 			printf(" | RTLD_GLOBAL");
12451f4b63f8SJohn Baldwin 		if (mode & RTLD_TRACE)
12461f4b63f8SJohn Baldwin 			printf(" | RTLD_TRACE");
12471f4b63f8SJohn Baldwin 		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
12481f4b63f8SJohn Baldwin 			printf(" | %#x", mode &
12491f4b63f8SJohn Baldwin 			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
12501f4b63f8SJohn Baldwin 		printf(")\n");
12511f4b63f8SJohn Baldwin 		break;
12521f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_STOP:
12531f4b63f8SJohn Baldwin 		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
12541f4b63f8SJohn Baldwin 		    ut->refcnt);
12551f4b63f8SJohn Baldwin 		break;
12561f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_START:
12571f4b63f8SJohn Baldwin 		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
12581f4b63f8SJohn Baldwin 		    ut->refcnt);
12591f4b63f8SJohn Baldwin 		break;
12601f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_STOP:
12611f4b63f8SJohn Baldwin 		printf("dlclose(%p) finished\n", ut->handle);
12621f4b63f8SJohn Baldwin 		break;
12631f4b63f8SJohn Baldwin 	case UTRACE_LOAD_OBJECT:
12641f4b63f8SJohn Baldwin 		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
12651f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
12661f4b63f8SJohn Baldwin 		    ut->name);
12671f4b63f8SJohn Baldwin 		break;
12681f4b63f8SJohn Baldwin 	case UTRACE_UNLOAD_OBJECT:
12691f4b63f8SJohn Baldwin 		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
12701f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
12711f4b63f8SJohn Baldwin 		    ut->name);
12721f4b63f8SJohn Baldwin 		break;
12731f4b63f8SJohn Baldwin 	case UTRACE_ADD_RUNDEP:
12741f4b63f8SJohn Baldwin 		parent = ut->mapbase;
12751f4b63f8SJohn Baldwin 		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
12761f4b63f8SJohn Baldwin 		    ut->handle, ut->name, ut->refcnt);
12771f4b63f8SJohn Baldwin 		break;
12781f4b63f8SJohn Baldwin 	case UTRACE_PRELOAD_FINISHED:
12791f4b63f8SJohn Baldwin 		printf("RTLD: LD_PRELOAD finished\n");
12801f4b63f8SJohn Baldwin 		break;
12811f4b63f8SJohn Baldwin 	case UTRACE_INIT_CALL:
12821f4b63f8SJohn Baldwin 		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
12831f4b63f8SJohn Baldwin 		    ut->name);
12841f4b63f8SJohn Baldwin 		break;
12851f4b63f8SJohn Baldwin 	case UTRACE_FINI_CALL:
12861f4b63f8SJohn Baldwin 		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
12871f4b63f8SJohn Baldwin 		    ut->name);
12881f4b63f8SJohn Baldwin 		break;
12891f4b63f8SJohn Baldwin 	default:
12901f4b63f8SJohn Baldwin 		p += 4;
12911f4b63f8SJohn Baldwin 		len -= 4;
12921f4b63f8SJohn Baldwin 		printf("RTLD: %d ", len);
12931f4b63f8SJohn Baldwin 		while (len--)
12941f4b63f8SJohn Baldwin 			if (decimal)
12951f4b63f8SJohn Baldwin 				printf(" %d", *p++);
12961f4b63f8SJohn Baldwin 			else
12971f4b63f8SJohn Baldwin 				printf(" %02x", *p++);
12981f4b63f8SJohn Baldwin 		printf("\n");
12991f4b63f8SJohn Baldwin 	}
13001f4b63f8SJohn Baldwin }
13011f4b63f8SJohn Baldwin 
1302670b9e9fSJohn Baldwin struct utrace_malloc {
1303670b9e9fSJohn Baldwin 	void *p;
1304670b9e9fSJohn Baldwin 	size_t s;
1305670b9e9fSJohn Baldwin 	void *r;
1306670b9e9fSJohn Baldwin };
1307670b9e9fSJohn Baldwin 
1308670b9e9fSJohn Baldwin void
1309670b9e9fSJohn Baldwin ktruser_malloc(int len, unsigned char *p)
1310670b9e9fSJohn Baldwin {
1311670b9e9fSJohn Baldwin 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
1312670b9e9fSJohn Baldwin 
131322ce05c9SColin Percival 	if (ut->p == (void *)(intptr_t)(-1))
1314670b9e9fSJohn Baldwin 		printf("malloc_init()\n");
131522ce05c9SColin Percival 	else if (ut->s == 0)
1316670b9e9fSJohn Baldwin 		printf("free(%p)\n", ut->p);
131722ce05c9SColin Percival 	else if (ut->p == NULL)
131822ce05c9SColin Percival 		printf("%p = malloc(%zu)\n", ut->r, ut->s);
1319670b9e9fSJohn Baldwin 	else
1320670b9e9fSJohn Baldwin 		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1321670b9e9fSJohn Baldwin }
1322670b9e9fSJohn Baldwin 
132391fbb9c1SDavid Malone void
132491fbb9c1SDavid Malone ktruser(int len, unsigned char *p)
132582e2dd32SPoul-Henning Kamp {
1326670b9e9fSJohn Baldwin 
13271f4b63f8SJohn Baldwin 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
13281f4b63f8SJohn Baldwin 		ktruser_rtld(len, p);
13291f4b63f8SJohn Baldwin 		return;
13301f4b63f8SJohn Baldwin 	}
13311f4b63f8SJohn Baldwin 
1332670b9e9fSJohn Baldwin 	if (len == sizeof(struct utrace_malloc)) {
1333670b9e9fSJohn Baldwin 		ktruser_malloc(len, p);
1334670b9e9fSJohn Baldwin 		return;
1335670b9e9fSJohn Baldwin 	}
1336670b9e9fSJohn Baldwin 
133709307b25SDag-Erling Smørgrav 	printf("%d ", len);
13383f8ba9aeSPoul-Henning Kamp 	while (len--)
1339743f9174SPoul-Henning Kamp 		if (decimal)
134009307b25SDag-Erling Smørgrav 			printf(" %d", *p++);
1341743f9174SPoul-Henning Kamp 		else
134209307b25SDag-Erling Smørgrav 			printf(" %02x", *p++);
134309307b25SDag-Erling Smørgrav 	printf("\n");
134482e2dd32SPoul-Henning Kamp }
134582e2dd32SPoul-Henning Kamp 
134691fbb9c1SDavid Malone void
134760e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
134860e15db9SDag-Erling Smørgrav {
134960e15db9SDag-Erling Smørgrav /*
135060e15db9SDag-Erling Smørgrav  TODO: Support additional address families
135160e15db9SDag-Erling Smørgrav 	#include <netnatm/natm.h>
135260e15db9SDag-Erling Smørgrav 	struct sockaddr_natm	*natm;
135360e15db9SDag-Erling Smørgrav 	#include <netsmb/netbios.h>
135460e15db9SDag-Erling Smørgrav 	struct sockaddr_nb	*nb;
135560e15db9SDag-Erling Smørgrav */
135660e15db9SDag-Erling Smørgrav 	char addr[64];
135760e15db9SDag-Erling Smørgrav 
135860e15db9SDag-Erling Smørgrav 	/*
135960e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
136060e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
136160e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
136260e15db9SDag-Erling Smørgrav 	 */
136360e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
136460e15db9SDag-Erling Smørgrav 	sockfamilyname(sa->sa_family);
136560e15db9SDag-Erling Smørgrav 	printf(", ");
136660e15db9SDag-Erling Smørgrav 
136760e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
136860e15db9SDag-Erling Smørgrav 	if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) {	\
136960e15db9SDag-Erling Smørgrav 		printf("invalid");				\
137060e15db9SDag-Erling Smørgrav 		break;						\
137160e15db9SDag-Erling Smørgrav 	}
137260e15db9SDag-Erling Smørgrav 
137360e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
137460e15db9SDag-Erling Smørgrav 	case AF_INET: {
137560e15db9SDag-Erling Smørgrav 		struct sockaddr_in	*sa_in;
137660e15db9SDag-Erling Smørgrav 
137760e15db9SDag-Erling Smørgrav 		sa_in = (struct sockaddr_in *)sa;
137860e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
137960e15db9SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr);
138060e15db9SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in->sin_port));
138160e15db9SDag-Erling Smørgrav 		break;
138260e15db9SDag-Erling Smørgrav 	}
138360e15db9SDag-Erling Smørgrav #ifdef NETATALK
138460e15db9SDag-Erling Smørgrav 	case AF_APPLETALK: {
138560e15db9SDag-Erling Smørgrav 		struct sockaddr_at	*sa_at;
138660e15db9SDag-Erling Smørgrav 		struct netrange		*nr;
138760e15db9SDag-Erling Smørgrav 
138860e15db9SDag-Erling Smørgrav 		sa_at = (struct sockaddr_at *)sa;
138960e15db9SDag-Erling Smørgrav 		check_sockaddr_len(at);
139060e15db9SDag-Erling Smørgrav 		nr = &sa_at->sat_range.r_netrange;
139160e15db9SDag-Erling Smørgrav 		printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net),
139260e15db9SDag-Erling Smørgrav 			sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet),
139360e15db9SDag-Erling Smørgrav 			ntohs(nr->nr_lastnet), nr->nr_phase);
139460e15db9SDag-Erling Smørgrav 		break;
139560e15db9SDag-Erling Smørgrav 	}
139660e15db9SDag-Erling Smørgrav #endif
139760e15db9SDag-Erling Smørgrav 	case AF_INET6: {
139860e15db9SDag-Erling Smørgrav 		struct sockaddr_in6	*sa_in6;
139960e15db9SDag-Erling Smørgrav 
140060e15db9SDag-Erling Smørgrav 		sa_in6 = (struct sockaddr_in6 *)sa;
140160e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
140260e15db9SDag-Erling Smørgrav 		inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr);
140360e15db9SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6->sin6_port));
140460e15db9SDag-Erling Smørgrav 		break;
140560e15db9SDag-Erling Smørgrav 	}
140660e15db9SDag-Erling Smørgrav #ifdef IPX
140760e15db9SDag-Erling Smørgrav 	case AF_IPX: {
140860e15db9SDag-Erling Smørgrav 		struct sockaddr_ipx	*sa_ipx;
140960e15db9SDag-Erling Smørgrav 
141060e15db9SDag-Erling Smørgrav 		sa_ipx = (struct sockaddr_ipx *)sa;
141160e15db9SDag-Erling Smørgrav 		check_sockaddr_len(ipx);
141260e15db9SDag-Erling Smørgrav 		/* XXX wish we had ipx_ntop */
141360e15db9SDag-Erling Smørgrav 		printf("%s", ipx_ntoa(sa_ipx->sipx_addr));
141460e15db9SDag-Erling Smørgrav 		break;
141560e15db9SDag-Erling Smørgrav 	}
141660e15db9SDag-Erling Smørgrav #endif
141760e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
141860e15db9SDag-Erling Smørgrav 		struct sockaddr_un *sa_un;
141960e15db9SDag-Erling Smørgrav 
142060e15db9SDag-Erling Smørgrav 		sa_un = (struct sockaddr_un *)sa;
142160e15db9SDag-Erling Smørgrav 		check_sockaddr_len(un);
142260e15db9SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path);
142360e15db9SDag-Erling Smørgrav 		break;
142460e15db9SDag-Erling Smørgrav 	}
142560e15db9SDag-Erling Smørgrav 	default:
142660e15db9SDag-Erling Smørgrav 		printf("unknown address family");
142760e15db9SDag-Erling Smørgrav 	}
142860e15db9SDag-Erling Smørgrav 	printf(" }\n");
142960e15db9SDag-Erling Smørgrav }
143060e15db9SDag-Erling Smørgrav 
143160e15db9SDag-Erling Smørgrav void
143260e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
143360e15db9SDag-Erling Smørgrav {
143460e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
143560e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
143660e15db9SDag-Erling Smørgrav 	struct group  *grp;
143760e15db9SDag-Erling Smørgrav 	struct tm *tm;
143860e15db9SDag-Erling Smørgrav 
143960e15db9SDag-Erling Smørgrav 	/*
144060e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
144160e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
144260e15db9SDag-Erling Smørgrav 	 */
144360e15db9SDag-Erling Smørgrav 	printf("struct stat {");
144460e15db9SDag-Erling Smørgrav 	strmode(statp->st_mode, mode);
144560e15db9SDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
144660e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
144760e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_nlink);
144860e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
144960e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
145060e15db9SDag-Erling Smørgrav 	else
145160e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
145260e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
145360e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
145460e15db9SDag-Erling Smørgrav 	else
145560e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
145660e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
145760e15db9SDag-Erling Smørgrav 	printf("atime=");
145860e15db9SDag-Erling Smørgrav 	if (resolv == 0)
145999742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
146060e15db9SDag-Erling Smørgrav 	else {
146199742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
146209307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
146360e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
146460e15db9SDag-Erling Smørgrav 	}
146599742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
146699742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
146760e15db9SDag-Erling Smørgrav 	else
146860e15db9SDag-Erling Smørgrav 		printf(", ");
146960e15db9SDag-Erling Smørgrav 	printf("stime=");
147060e15db9SDag-Erling Smørgrav 	if (resolv == 0)
147199742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
147260e15db9SDag-Erling Smørgrav 	else {
147399742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
147409307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
147560e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
147660e15db9SDag-Erling Smørgrav 	}
147799742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
147899742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
147960e15db9SDag-Erling Smørgrav 	else
148060e15db9SDag-Erling Smørgrav 		printf(", ");
148160e15db9SDag-Erling Smørgrav 	printf("ctime=");
148260e15db9SDag-Erling Smørgrav 	if (resolv == 0)
148399742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
148460e15db9SDag-Erling Smørgrav 	else {
148599742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
148609307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
148760e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
148860e15db9SDag-Erling Smørgrav 	}
148999742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
149099742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
149160e15db9SDag-Erling Smørgrav 	else
149260e15db9SDag-Erling Smørgrav 		printf(", ");
149360e15db9SDag-Erling Smørgrav 	printf("birthtime=");
149460e15db9SDag-Erling Smørgrav 	if (resolv == 0)
149599742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
149660e15db9SDag-Erling Smørgrav 	else {
149799742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
149809307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
149960e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
150060e15db9SDag-Erling Smørgrav 	}
150199742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
150299742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
150360e15db9SDag-Erling Smørgrav 	else
150460e15db9SDag-Erling Smørgrav 		printf(", ");
150560e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
150660e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
150760e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
150860e15db9SDag-Erling Smørgrav 	printf(" }\n");
150960e15db9SDag-Erling Smørgrav }
151060e15db9SDag-Erling Smørgrav 
151160e15db9SDag-Erling Smørgrav void
151260e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
151360e15db9SDag-Erling Smørgrav {
151460e15db9SDag-Erling Smørgrav 	char *name, *data;
151560e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
151660e15db9SDag-Erling Smørgrav 	int i;
151730c1278fSWarner Losh 	struct stat sb;
151830c1278fSWarner Losh 	struct sockaddr_storage ss;
151960e15db9SDag-Erling Smørgrav 
152060e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
152160e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
152260e15db9SDag-Erling Smørgrav 	     ++namelen)
152360e15db9SDag-Erling Smørgrav 		/* nothing */;
152460e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
152560e15db9SDag-Erling Smørgrav 		goto invalid;
152660e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
152760e15db9SDag-Erling Smørgrav 		goto invalid;
152860e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
152960e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
153060e15db9SDag-Erling Smørgrav 	if (datalen == 0)
153160e15db9SDag-Erling Smørgrav 		goto invalid;
153260e15db9SDag-Erling Smørgrav 	/* sanity check */
153360e15db9SDag-Erling Smørgrav 	for (i = 0; i < namelen; ++i)
153460e15db9SDag-Erling Smørgrav 		if (!isalpha((unsigned char)name[i]))
153560e15db9SDag-Erling Smørgrav 			goto invalid;
153660e15db9SDag-Erling Smørgrav 	if (strcmp(name, "stat") == 0) {
153760e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
153860e15db9SDag-Erling Smørgrav 			goto invalid;
153930c1278fSWarner Losh 		memcpy(&sb, data, datalen);
154030c1278fSWarner Losh 		ktrstat(&sb);
154160e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
154230c1278fSWarner Losh 		if (datalen > sizeof(ss))
154360e15db9SDag-Erling Smørgrav 			goto invalid;
154430c1278fSWarner Losh 		memcpy(&ss, data, datalen);
154530c1278fSWarner Losh 		if (datalen < sizeof(struct sockaddr) ||
154630c1278fSWarner Losh 		    datalen != ss.ss_len)
154730c1278fSWarner Losh 			goto invalid;
154830c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
154960e15db9SDag-Erling Smørgrav 	} else {
155060e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
155160e15db9SDag-Erling Smørgrav 	}
155260e15db9SDag-Erling Smørgrav 	return;
155360e15db9SDag-Erling Smørgrav invalid:
155460e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
155560e15db9SDag-Erling Smørgrav }
155660e15db9SDag-Erling Smørgrav 
1557dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
1558dde5f9b9SDmitry Chagin void
1559dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr)
1560dde5f9b9SDmitry Chagin {
1561dde5f9b9SDmitry Chagin 	int narg = ktr->ktr_narg;
1562dde5f9b9SDmitry Chagin 	register_t *ip;
1563dde5f9b9SDmitry Chagin 
1564dde5f9b9SDmitry Chagin 	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
1565dde5f9b9SDmitry Chagin 		printf("[%d]", ktr->ktr_code);
1566dde5f9b9SDmitry Chagin 	else
1567dde5f9b9SDmitry Chagin 		printf("%s", linux_syscallnames[ktr->ktr_code]);
1568dde5f9b9SDmitry Chagin 	ip = &ktr->ktr_args[0];
1569dde5f9b9SDmitry Chagin 	if (narg) {
1570dde5f9b9SDmitry Chagin 		char c = '(';
1571dde5f9b9SDmitry Chagin 		while (narg > 0)
1572dde5f9b9SDmitry Chagin 			print_number(ip, narg, c);
1573dde5f9b9SDmitry Chagin 		putchar(')');
1574dde5f9b9SDmitry Chagin 	}
1575dde5f9b9SDmitry Chagin 	putchar('\n');
1576dde5f9b9SDmitry Chagin }
1577dde5f9b9SDmitry Chagin 
1578dde5f9b9SDmitry Chagin void
1579dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr)
1580dde5f9b9SDmitry Chagin {
1581dde5f9b9SDmitry Chagin 	register_t ret = ktr->ktr_retval;
1582dde5f9b9SDmitry Chagin 	int error = ktr->ktr_error;
1583dde5f9b9SDmitry Chagin 	int code = ktr->ktr_code;
1584dde5f9b9SDmitry Chagin 
1585dde5f9b9SDmitry Chagin 	if (code >= nlinux_syscalls || code < 0)
1586dde5f9b9SDmitry Chagin 		printf("[%d] ", code);
1587dde5f9b9SDmitry Chagin 	else
1588dde5f9b9SDmitry Chagin 		printf("%s ", linux_syscallnames[code]);
1589dde5f9b9SDmitry Chagin 
1590dde5f9b9SDmitry Chagin 	if (error == 0) {
1591dde5f9b9SDmitry Chagin 		if (fancy) {
1592dde5f9b9SDmitry Chagin 			printf("%ld", (long)ret);
1593dde5f9b9SDmitry Chagin 			if (ret < 0 || ret > 9)
159409307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
1595dde5f9b9SDmitry Chagin 		} else {
1596dde5f9b9SDmitry Chagin 			if (decimal)
1597dde5f9b9SDmitry Chagin 				printf("%ld", (long)ret);
1598dde5f9b9SDmitry Chagin 			else
159909307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
1600dde5f9b9SDmitry Chagin 		}
1601dde5f9b9SDmitry Chagin 	} else if (error == ERESTART)
1602dde5f9b9SDmitry Chagin 		printf("RESTART");
1603dde5f9b9SDmitry Chagin 	else if (error == EJUSTRETURN)
1604dde5f9b9SDmitry Chagin 		printf("JUSTRETURN");
1605dde5f9b9SDmitry Chagin 	else {
1606dde5f9b9SDmitry Chagin 		if (ktr->ktr_error <= ELAST + 1)
1607dde5f9b9SDmitry Chagin 			error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1608dde5f9b9SDmitry Chagin 		else
1609dde5f9b9SDmitry Chagin 			error = 999;
1610dde5f9b9SDmitry Chagin 		printf("-1 errno %d", error);
1611dde5f9b9SDmitry Chagin 		if (fancy)
1612dde5f9b9SDmitry Chagin 			printf(" %s", strerror(ktr->ktr_error));
1613dde5f9b9SDmitry Chagin 	}
1614dde5f9b9SDmitry Chagin 	putchar('\n');
1615dde5f9b9SDmitry Chagin }
1616dde5f9b9SDmitry Chagin #endif
1617dde5f9b9SDmitry Chagin 
161860e15db9SDag-Erling Smørgrav void
161991fbb9c1SDavid Malone usage(void)
16209b50d902SRodney W. Grimes {
16217144d36fSDmitry Chagin 	fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] "
1622da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
16239b50d902SRodney W. Grimes 	exit(1);
16249b50d902SRodney W. Grimes }
1625