xref: /freebsd/usr.bin/kdump/kdump.c (revision 55648840)
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>
49f9b20fc8SPawel Jakub Dawidek #include <sys/capability.h>
509b50d902SRodney W. Grimes #include <sys/errno.h>
5191fbb9c1SDavid Malone #define _KERNEL
529b50d902SRodney W. Grimes #include <sys/time.h>
5391fbb9c1SDavid Malone #undef _KERNEL
549b50d902SRodney W. Grimes #include <sys/uio.h>
559b50d902SRodney W. Grimes #include <sys/ktrace.h>
569b50d902SRodney W. Grimes #include <sys/ioctl.h>
578bc31d83SCraig Rodrigues #include <sys/socket.h>
5860e15db9SDag-Erling Smørgrav #include <sys/stat.h>
597144d36fSDmitry Chagin #include <sys/sysent.h>
6060e15db9SDag-Erling Smørgrav #include <sys/un.h>
617144d36fSDmitry Chagin #include <sys/queue.h>
6234763d1cSJohn Baldwin #include <sys/wait.h>
6360e15db9SDag-Erling Smørgrav #ifdef IPX
6460e15db9SDag-Erling Smørgrav #include <sys/types.h>
6560e15db9SDag-Erling Smørgrav #include <netipx/ipx.h>
6660e15db9SDag-Erling Smørgrav #endif
6760e15db9SDag-Erling Smørgrav #ifdef NETATALK
6860e15db9SDag-Erling Smørgrav #include <netatalk/at.h>
6960e15db9SDag-Erling Smørgrav #endif
701a604cfaSXin LI #include <arpa/inet.h>
7160e15db9SDag-Erling Smørgrav #include <netinet/in.h>
721a604cfaSXin LI #include <ctype.h>
731f4b63f8SJohn Baldwin #include <dlfcn.h>
7415fc002bSPhilippe Charnier #include <err.h>
7560e15db9SDag-Erling Smørgrav #include <grp.h>
7660e15db9SDag-Erling Smørgrav #include <inttypes.h>
7715fc002bSPhilippe Charnier #include <locale.h>
78b9ef8051SAndrey V. Elsukov #include <netdb.h>
79f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
8060e15db9SDag-Erling Smørgrav #include <pwd.h>
819b50d902SRodney W. Grimes #include <stdio.h>
829b50d902SRodney W. Grimes #include <stdlib.h>
839b50d902SRodney W. Grimes #include <string.h>
84f9b20fc8SPawel Jakub Dawidek #include <termios.h>
8560e15db9SDag-Erling Smørgrav #include <time.h>
8615fc002bSPhilippe Charnier #include <unistd.h>
8715fc002bSPhilippe Charnier #include <vis.h>
889b50d902SRodney W. Grimes #include "ktrace.h"
8998a68a58SAlexander Leidinger #include "kdump_subr.h"
909b50d902SRodney W. Grimes 
917144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
927144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
9391fbb9c1SDavid Malone int fread_tail(void *, int, int);
9491fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
957144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
967144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9791fbb9c1SDavid Malone void ktrnamei(char *, int);
98ec4beb5dSPeter Wemm void hexdump(char *, int, int);
99ec4beb5dSPeter Wemm void visdump(char *, int, int);
10091fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
101dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10291fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10388bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
10481a31394SDag-Erling Smørgrav void ktruser_malloc(unsigned char *);
10581a31394SDag-Erling Smørgrav void ktruser_rtld(int, unsigned char *);
10691fbb9c1SDavid Malone void ktruser(int, unsigned char *);
1077008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
10860e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10960e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
11060e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
111c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11235818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11335818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
114f9b20fc8SPawel Jakub Dawidek void limitfd(int fd);
11591fbb9c1SDavid Malone void usage(void);
116d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int);
11791fbb9c1SDavid Malone 
11860e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
1197144d36fSDmitry Chagin     resolv = 0, abiflag = 0;
12091fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE;
1219b50d902SRodney W. Grimes struct ktr_header ktr_header;
1229b50d902SRodney W. Grimes 
12360e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1249b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1259b50d902SRodney W. Grimes 
12695bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
127dde5f9b9SDmitry Chagin 	if (decimal)							\
128e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
129dde5f9b9SDmitry Chagin 	else								\
130661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
131dde5f9b9SDmitry Chagin 	i++;								\
132dde5f9b9SDmitry Chagin 	n--;								\
133dde5f9b9SDmitry Chagin 	c = ',';							\
134e4bb45b1SDag-Erling Smørgrav } while (0)
135dde5f9b9SDmitry Chagin 
136dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
137dde5f9b9SDmitry Chagin 
138dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *);
139dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *);
140dde5f9b9SDmitry Chagin extern char *linux_syscallnames[];
141dde5f9b9SDmitry Chagin extern int nlinux_syscalls;
142dde5f9b9SDmitry Chagin 
143dde5f9b9SDmitry Chagin /*
144dde5f9b9SDmitry Chagin  * from linux.h
145dde5f9b9SDmitry Chagin  * Linux syscalls return negative errno's, we do positive and map them
146dde5f9b9SDmitry Chagin  */
147dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = {
148dde5f9b9SDmitry Chagin 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
149dde5f9b9SDmitry Chagin 	-10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
150dde5f9b9SDmitry Chagin 	-20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
151dde5f9b9SDmitry Chagin 	-30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
152dde5f9b9SDmitry Chagin 	-90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
153dde5f9b9SDmitry Chagin 	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
154dde5f9b9SDmitry Chagin 	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
155dde5f9b9SDmitry Chagin 	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
156dde5f9b9SDmitry Chagin 	-6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
157dde5f9b9SDmitry Chagin 	-72, -67, -71
158dde5f9b9SDmitry Chagin };
159dde5f9b9SDmitry Chagin #endif
160dde5f9b9SDmitry Chagin 
1617144d36fSDmitry Chagin struct proc_info
1627144d36fSDmitry Chagin {
1637144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1647144d36fSDmitry Chagin 	u_int			sv_flags;
1657144d36fSDmitry Chagin 	pid_t			pid;
1667144d36fSDmitry Chagin };
1677144d36fSDmitry Chagin 
1687144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1697144d36fSDmitry Chagin 
170e14da991SPawel Jakub Dawidek static void
171e14da991SPawel Jakub Dawidek strerror_init(void)
172e14da991SPawel Jakub Dawidek {
173e14da991SPawel Jakub Dawidek 
174e14da991SPawel Jakub Dawidek 	/*
175e14da991SPawel Jakub Dawidek 	 * Cache NLS data before entering capability mode.
176e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
177e14da991SPawel Jakub Dawidek 	 */
178e14da991SPawel Jakub Dawidek 	(void)catopen("libc", NL_CAT_LOCALE);
179e14da991SPawel Jakub Dawidek }
180e14da991SPawel Jakub Dawidek 
181e14da991SPawel Jakub Dawidek static void
182e14da991SPawel Jakub Dawidek localtime_init(void)
183e14da991SPawel Jakub Dawidek {
184e14da991SPawel Jakub Dawidek 	time_t ltime;
185e14da991SPawel Jakub Dawidek 
186e14da991SPawel Jakub Dawidek 	/*
187e14da991SPawel Jakub Dawidek 	 * Allow localtime(3) to cache /etc/localtime content before entering
188e14da991SPawel Jakub Dawidek 	 * capability mode.
189e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be localtime_init() in libc.
190e14da991SPawel Jakub Dawidek 	 */
191e14da991SPawel Jakub Dawidek 	(void)time(&ltime);
192e14da991SPawel Jakub Dawidek 	(void)localtime(&ltime);
193e14da991SPawel Jakub Dawidek }
194e14da991SPawel Jakub Dawidek 
19591fbb9c1SDavid Malone int
19691fbb9c1SDavid Malone main(int argc, char *argv[])
1979b50d902SRodney W. Grimes {
1989b50d902SRodney W. Grimes 	int ch, ktrlen, size;
19991fbb9c1SDavid Malone 	void *m;
2009b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
201db53f66bSJohn Baldwin 	int drop_logged;
202ec4beb5dSPeter Wemm 	pid_t pid = 0;
2037144d36fSDmitry Chagin 	u_int sv_flags;
2049b50d902SRodney W. Grimes 
20509307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
2065ccbfb26SAndrey A. Chernov 
2077144d36fSDmitry Chagin 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1)
20809307b25SDag-Erling Smørgrav 		switch (ch) {
2097144d36fSDmitry Chagin 		case 'A':
2107144d36fSDmitry Chagin 			abiflag = 1;
2117144d36fSDmitry Chagin 			break;
2129b50d902SRodney W. Grimes 		case 'f':
2139b50d902SRodney W. Grimes 			tracefile = optarg;
2149b50d902SRodney W. Grimes 			break;
2159b50d902SRodney W. Grimes 		case 'd':
2169b50d902SRodney W. Grimes 			decimal = 1;
2179b50d902SRodney W. Grimes 			break;
2189b50d902SRodney W. Grimes 		case 'l':
2199b50d902SRodney W. Grimes 			tail = 1;
2209b50d902SRodney W. Grimes 			break;
2219b50d902SRodney W. Grimes 		case 'm':
2229b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
2239b50d902SRodney W. Grimes 			break;
2249b50d902SRodney W. Grimes 		case 'n':
2259b50d902SRodney W. Grimes 			fancy = 0;
2269b50d902SRodney W. Grimes 			break;
227ec4beb5dSPeter Wemm 		case 'p':
228ec4beb5dSPeter Wemm 			pid = atoi(optarg);
229ec4beb5dSPeter Wemm 			break;
23060e15db9SDag-Erling Smørgrav 		case 'r':
23160e15db9SDag-Erling Smørgrav 			resolv = 1;
23260e15db9SDag-Erling Smørgrav 			break;
233df0c8868SRobert Watson 		case 's':
234df0c8868SRobert Watson 			suppressdata = 1;
235df0c8868SRobert Watson 			break;
236ec131914SPeter Wemm 		case 'E':
237ec131914SPeter Wemm 			timestamp = 3;	/* elapsed timestamp */
238ec131914SPeter Wemm 			break;
239a9ac598bSRobert Watson 		case 'H':
240a9ac598bSRobert Watson 			threads = 1;
241a9ac598bSRobert Watson 			break;
2429b50d902SRodney W. Grimes 		case 'R':
2439b50d902SRodney W. Grimes 			timestamp = 2;	/* relative timestamp */
2449b50d902SRodney W. Grimes 			break;
2459b50d902SRodney W. Grimes 		case 'T':
2469b50d902SRodney W. Grimes 			timestamp = 1;
2479b50d902SRodney W. Grimes 			break;
2489b50d902SRodney W. Grimes 		case 't':
2499b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
25015fc002bSPhilippe Charnier 			if (trpoints < 0)
25115fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
2529b50d902SRodney W. Grimes 			break;
2539b50d902SRodney W. Grimes 		default:
2549b50d902SRodney W. Grimes 			usage();
2559b50d902SRodney W. Grimes 		}
2569b50d902SRodney W. Grimes 
25780844fd1SBill Fenner 	if (argc > optind)
2589b50d902SRodney W. Grimes 		usage();
2599b50d902SRodney W. Grimes 
26009307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
26115fc002bSPhilippe Charnier 	if (m == NULL)
26215fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
26315fc002bSPhilippe Charnier 	if (!freopen(tracefile, "r", stdin))
26415fc002bSPhilippe Charnier 		err(1, "%s", tracefile);
265f9b20fc8SPawel Jakub Dawidek 
266e14da991SPawel Jakub Dawidek 	strerror_init();
267e14da991SPawel Jakub Dawidek 	localtime_init();
268e14da991SPawel Jakub Dawidek 
269d2c9ca44SPawel Jakub Dawidek 	if (resolv == 0) {
270f9b20fc8SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
271f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
272d2c9ca44SPawel Jakub Dawidek 	}
273f9b20fc8SPawel Jakub Dawidek 	limitfd(STDIN_FILENO);
274f9b20fc8SPawel Jakub Dawidek 	limitfd(STDOUT_FILENO);
275f9b20fc8SPawel Jakub Dawidek 	limitfd(STDERR_FILENO);
276f9b20fc8SPawel Jakub Dawidek 
2777144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
278db53f66bSJohn Baldwin 	drop_logged = 0;
2799b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
280db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
281db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
282a9ac598bSRobert Watson 			if (!drop_logged && threads) {
28309307b25SDag-Erling Smørgrav 				printf(
284c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
285c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
286c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
287c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
288c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
289a9ac598bSRobert Watson 				drop_logged = 1;
290a9ac598bSRobert Watson 			} else if (!drop_logged) {
29109307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
292c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
293db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
294db53f66bSJohn Baldwin 				drop_logged = 1;
295db53f66bSJohn Baldwin 			}
296db53f66bSJohn Baldwin 		}
2979b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
29801a36e29SJohn Baldwin 			if (pid == 0 || ktr_header.ktr_pid == pid ||
29901a36e29SJohn Baldwin 			    ktr_header.ktr_tid == pid)
3009b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
30115fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
30215fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
3039b50d902SRodney W. Grimes 		if (ktrlen > size) {
30409307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
30515fc002bSPhilippe Charnier 			if (m == NULL)
30615fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
3079b50d902SRodney W. Grimes 			size = ktrlen;
3089b50d902SRodney W. Grimes 		}
30915fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
31015fc002bSPhilippe Charnier 			errx(1, "data too short");
3117144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
3127144d36fSDmitry Chagin 			continue;
3137144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
31401a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
31501a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
316ec4beb5dSPeter Wemm 			continue;
3179b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
3189b50d902SRodney W. Grimes 			continue;
319db53f66bSJohn Baldwin 		drop_logged = 0;
3209b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
3219b50d902SRodney W. Grimes 		case KTR_SYSCALL:
322dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
323dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
324dde5f9b9SDmitry Chagin 				linux_ktrsyscall((struct ktr_syscall *)m);
325dde5f9b9SDmitry Chagin 			else
326dde5f9b9SDmitry Chagin #endif
3277144d36fSDmitry Chagin 				ktrsyscall((struct ktr_syscall *)m, sv_flags);
3289b50d902SRodney W. Grimes 			break;
3299b50d902SRodney W. Grimes 		case KTR_SYSRET:
330dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
331dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
332dde5f9b9SDmitry Chagin 				linux_ktrsysret((struct ktr_sysret *)m);
333dde5f9b9SDmitry Chagin 			else
334dde5f9b9SDmitry Chagin #endif
3357144d36fSDmitry Chagin 				ktrsysret((struct ktr_sysret *)m, sv_flags);
3369b50d902SRodney W. Grimes 			break;
3379b50d902SRodney W. Grimes 		case KTR_NAMEI:
338a56be37eSJohn Baldwin 		case KTR_SYSCTL:
3399b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
3409b50d902SRodney W. Grimes 			break;
3419b50d902SRodney W. Grimes 		case KTR_GENIO:
3429b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
3439b50d902SRodney W. Grimes 			break;
3449b50d902SRodney W. Grimes 		case KTR_PSIG:
345dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
3469b50d902SRodney W. Grimes 			break;
3479b50d902SRodney W. Grimes 		case KTR_CSW:
34888bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
34988bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
35088bf5036SJohn Baldwin 			else
3519b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
3529b50d902SRodney W. Grimes 			break;
35382e2dd32SPoul-Henning Kamp 		case KTR_USER:
3543f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
35582e2dd32SPoul-Henning Kamp 			break;
35660e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
35760e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
35860e15db9SDag-Erling Smørgrav 			break;
359c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
360c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
36135818d2eSJohn Baldwin 			break;
36235818d2eSJohn Baldwin 		case KTR_FAULT:
36335818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
36435818d2eSJohn Baldwin 			break;
36535818d2eSJohn Baldwin 		case KTR_FAULTEND:
36635818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
36735818d2eSJohn Baldwin 			break;
368b9609ab1SJohn Baldwin 		default:
369b9609ab1SJohn Baldwin 			printf("\n");
370b9609ab1SJohn Baldwin 			break;
3719b50d902SRodney W. Grimes 		}
3729b50d902SRodney W. Grimes 		if (tail)
37309307b25SDag-Erling Smørgrav 			fflush(stdout);
3749b50d902SRodney W. Grimes 	}
37591fbb9c1SDavid Malone 	return 0;
3769b50d902SRodney W. Grimes }
3779b50d902SRodney W. Grimes 
378f9b20fc8SPawel Jakub Dawidek void
379f9b20fc8SPawel Jakub Dawidek limitfd(int fd)
380f9b20fc8SPawel Jakub Dawidek {
381f9b20fc8SPawel Jakub Dawidek 	cap_rights_t rights;
382f9b20fc8SPawel Jakub Dawidek 	unsigned long cmd;
383f9b20fc8SPawel Jakub Dawidek 
3847008be5bSPawel Jakub Dawidek 	cap_rights_init(&rights, CAP_FSTAT);
385f9b20fc8SPawel Jakub Dawidek 	cmd = -1;
386f9b20fc8SPawel Jakub Dawidek 
387f9b20fc8SPawel Jakub Dawidek 	switch (fd) {
388f9b20fc8SPawel Jakub Dawidek 	case STDIN_FILENO:
3897008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_READ);
390f9b20fc8SPawel Jakub Dawidek 		break;
391f9b20fc8SPawel Jakub Dawidek 	case STDOUT_FILENO:
3927008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
393f9b20fc8SPawel Jakub Dawidek 		cmd = TIOCGETA;	/* required by isatty(3) in printf(3) */
394f9b20fc8SPawel Jakub Dawidek 		break;
395f9b20fc8SPawel Jakub Dawidek 	case STDERR_FILENO:
3967008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_WRITE);
397f9b20fc8SPawel Jakub Dawidek 		if (!suppressdata) {
3987008be5bSPawel Jakub Dawidek 			cap_rights_set(&rights, CAP_IOCTL);
399f9b20fc8SPawel Jakub Dawidek 			cmd = TIOCGWINSZ;
400f9b20fc8SPawel Jakub Dawidek 		}
401f9b20fc8SPawel Jakub Dawidek 		break;
402f9b20fc8SPawel Jakub Dawidek 	default:
403f9b20fc8SPawel Jakub Dawidek 		abort();
404f9b20fc8SPawel Jakub Dawidek 	}
405f9b20fc8SPawel Jakub Dawidek 
4067008be5bSPawel Jakub Dawidek 	if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
407f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit rights for descriptor %d", fd);
408f9b20fc8SPawel Jakub Dawidek 	if (cmd != -1 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
409f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit ioctls for descriptor %d", fd);
410f9b20fc8SPawel Jakub Dawidek }
411f9b20fc8SPawel Jakub Dawidek 
41291fbb9c1SDavid Malone int
41391fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
4149b50d902SRodney W. Grimes {
4159b50d902SRodney W. Grimes 	int i;
4169b50d902SRodney W. Grimes 
4179b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
41809307b25SDag-Erling Smørgrav 		sleep(1);
4199b50d902SRodney W. Grimes 		clearerr(stdin);
4209b50d902SRodney W. Grimes 	}
4219b50d902SRodney W. Grimes 	return (i);
4229b50d902SRodney W. Grimes }
4239b50d902SRodney W. Grimes 
4247144d36fSDmitry Chagin int
4257144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
4267144d36fSDmitry Chagin {
4277144d36fSDmitry Chagin 	struct proc_info *pi;
4287144d36fSDmitry Chagin 
4297144d36fSDmitry Chagin 	switch (kth->ktr_type) {
4307144d36fSDmitry Chagin 	case KTR_PROCCTOR:
4317144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
4327144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
4337144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
4347144d36fSDmitry Chagin 				break;
4357144d36fSDmitry Chagin 			}
4367144d36fSDmitry Chagin 		}
4377144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
4387144d36fSDmitry Chagin 		if (pi == NULL)
4397144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
4407144d36fSDmitry Chagin 		pi->sv_flags = *flags;
4417144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
4427144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
4437144d36fSDmitry Chagin 		return (1);
4447144d36fSDmitry Chagin 
4457144d36fSDmitry Chagin 	case KTR_PROCDTOR:
4467144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
4477144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
4487144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
4497144d36fSDmitry Chagin 				free(pi);
4507144d36fSDmitry Chagin 				break;
4517144d36fSDmitry Chagin 			}
4527144d36fSDmitry Chagin 		}
4537144d36fSDmitry Chagin 		return (1);
4547144d36fSDmitry Chagin 	}
4557144d36fSDmitry Chagin 
4567144d36fSDmitry Chagin 	return (0);
4577144d36fSDmitry Chagin }
4587144d36fSDmitry Chagin 
4597144d36fSDmitry Chagin u_int
4607144d36fSDmitry Chagin abidump(struct ktr_header *kth)
4617144d36fSDmitry Chagin {
4627144d36fSDmitry Chagin 	struct proc_info *pi;
4637144d36fSDmitry Chagin 	const char *abi;
4647144d36fSDmitry Chagin 	const char *arch;
4657144d36fSDmitry Chagin 	u_int flags = 0;
4667144d36fSDmitry Chagin 
4677144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
4687144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
4697144d36fSDmitry Chagin 			flags = pi->sv_flags;
4707144d36fSDmitry Chagin 			break;
4717144d36fSDmitry Chagin 		}
4727144d36fSDmitry Chagin 	}
4737144d36fSDmitry Chagin 
4747144d36fSDmitry Chagin 	if (abiflag == 0)
4757144d36fSDmitry Chagin 		return (flags);
4767144d36fSDmitry Chagin 
4777144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
4787144d36fSDmitry Chagin 	case SV_ABI_LINUX:
4797144d36fSDmitry Chagin 		abi = "L";
4807144d36fSDmitry Chagin 		break;
4817144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
4827144d36fSDmitry Chagin 		abi = "F";
4837144d36fSDmitry Chagin 		break;
4847144d36fSDmitry Chagin 	default:
4857144d36fSDmitry Chagin 		abi = "U";
4867144d36fSDmitry Chagin 		break;
4877144d36fSDmitry Chagin 	}
4887144d36fSDmitry Chagin 
4897144d36fSDmitry Chagin 	if (flags != 0) {
4907144d36fSDmitry Chagin 		if (flags & SV_LP64)
4917144d36fSDmitry Chagin 			arch = "64";
4927144d36fSDmitry Chagin 		else
4937144d36fSDmitry Chagin 			arch = "32";
4947144d36fSDmitry Chagin 	} else
4957144d36fSDmitry Chagin 		arch = "00";
4967144d36fSDmitry Chagin 
4977144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
4987144d36fSDmitry Chagin 
4997144d36fSDmitry Chagin 	return (flags);
5007144d36fSDmitry Chagin }
5017144d36fSDmitry Chagin 
50291fbb9c1SDavid Malone void
50391fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
5049b50d902SRodney W. Grimes {
5059b50d902SRodney W. Grimes 	static char unknown[64];
5069b50d902SRodney W. Grimes 	static struct timeval prevtime, temp;
50791fbb9c1SDavid Malone 	const char *type;
5089b50d902SRodney W. Grimes 
5099b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
5109b50d902SRodney W. Grimes 	case KTR_SYSCALL:
5119b50d902SRodney W. Grimes 		type = "CALL";
5129b50d902SRodney W. Grimes 		break;
5139b50d902SRodney W. Grimes 	case KTR_SYSRET:
5149b50d902SRodney W. Grimes 		type = "RET ";
5159b50d902SRodney W. Grimes 		break;
5169b50d902SRodney W. Grimes 	case KTR_NAMEI:
5179b50d902SRodney W. Grimes 		type = "NAMI";
5189b50d902SRodney W. Grimes 		break;
5199b50d902SRodney W. Grimes 	case KTR_GENIO:
5209b50d902SRodney W. Grimes 		type = "GIO ";
5219b50d902SRodney W. Grimes 		break;
5229b50d902SRodney W. Grimes 	case KTR_PSIG:
5239b50d902SRodney W. Grimes 		type = "PSIG";
5249b50d902SRodney W. Grimes 		break;
5259b50d902SRodney W. Grimes 	case KTR_CSW:
5269b50d902SRodney W. Grimes 		type = "CSW ";
5279b50d902SRodney W. Grimes 		break;
52882e2dd32SPoul-Henning Kamp 	case KTR_USER:
52982e2dd32SPoul-Henning Kamp 		type = "USER";
53082e2dd32SPoul-Henning Kamp 		break;
53160e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
53260e15db9SDag-Erling Smørgrav 		type = "STRU";
53360e15db9SDag-Erling Smørgrav 		break;
534a56be37eSJohn Baldwin 	case KTR_SYSCTL:
535a56be37eSJohn Baldwin 		type = "SCTL";
536a56be37eSJohn Baldwin 		break;
5377144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5387144d36fSDmitry Chagin 		/* FALLTHROUGH */
5397144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5407144d36fSDmitry Chagin 		return;
541c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
542c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
543c601ad8eSDag-Erling Smørgrav 		break;
54435818d2eSJohn Baldwin 	case KTR_FAULT:
54535818d2eSJohn Baldwin 		type = "PFLT";
54635818d2eSJohn Baldwin 		break;
54735818d2eSJohn Baldwin 	case KTR_FAULTEND:
54835818d2eSJohn Baldwin 		type = "PRET";
54935818d2eSJohn Baldwin 		break;
5509b50d902SRodney W. Grimes 	default:
55109307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
5529b50d902SRodney W. Grimes 		type = unknown;
5539b50d902SRodney W. Grimes 	}
5549b50d902SRodney W. Grimes 
555a9ac598bSRobert Watson 	/*
556a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
557a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
558a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
559a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
560a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
561a9ac598bSRobert Watson 	 * negative tid's as 0.
562a9ac598bSRobert Watson 	 */
563a9ac598bSRobert Watson 	if (threads)
56409307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
565c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
566c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
567a9ac598bSRobert Watson 	else
56809307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
569a9ac598bSRobert Watson 		    kth->ktr_comm);
5709b50d902SRodney W. Grimes 	if (timestamp) {
571ec131914SPeter Wemm 		if (timestamp == 3) {
572ec131914SPeter Wemm 			if (prevtime.tv_sec == 0)
573ec131914SPeter Wemm 				prevtime = kth->ktr_time;
574ec131914SPeter Wemm 			timevalsub(&kth->ktr_time, &prevtime);
575ec131914SPeter Wemm 		}
5769b50d902SRodney W. Grimes 		if (timestamp == 2) {
5779b50d902SRodney W. Grimes 			temp = kth->ktr_time;
5789b50d902SRodney W. Grimes 			timevalsub(&kth->ktr_time, &prevtime);
5799b50d902SRodney W. Grimes 			prevtime = temp;
5809b50d902SRodney W. Grimes 		}
58109307b25SDag-Erling Smørgrav 		printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
582c065c0b8SJaakko Heinonen 		    kth->ktr_time.tv_usec);
5839b50d902SRodney W. Grimes 	}
58409307b25SDag-Erling Smørgrav 	printf("%s  ", type);
5859b50d902SRodney W. Grimes }
5869b50d902SRodney W. Grimes 
5879b50d902SRodney W. Grimes #include <sys/syscall.h>
5889b50d902SRodney W. Grimes #define KTRACE
58955229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c>
5909b50d902SRodney W. Grimes #undef KTRACE
5919b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
5929b50d902SRodney W. Grimes 
59391fbb9c1SDavid Malone void
5947144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags)
5959b50d902SRodney W. Grimes {
59691fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
59791fbb9c1SDavid Malone 	register_t *ip;
598c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
5999b50d902SRodney W. Grimes 
6007144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
6017144d36fSDmitry Chagin 	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
60209307b25SDag-Erling Smørgrav 		printf("[%d]", ktr->ktr_code);
6039b50d902SRodney W. Grimes 	else
60409307b25SDag-Erling Smørgrav 		printf("%s", syscallnames[ktr->ktr_code]);
6057a6ec4cfSDmitrij Tejblum 	ip = &ktr->ktr_args[0];
6069b50d902SRodney W. Grimes 	if (narg) {
6079b50d902SRodney W. Grimes 		char c = '(';
6087144d36fSDmitry Chagin 		if (fancy &&
6097144d36fSDmitry Chagin 		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
61073430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
6111ca6c7fcSJilles Tjoelker 			case SYS_bindat:
6121ca6c7fcSJilles Tjoelker 			case SYS_connectat:
6138447b7cdSJilles Tjoelker 			case SYS_faccessat:
6148447b7cdSJilles Tjoelker 			case SYS_fchmodat:
6158447b7cdSJilles Tjoelker 			case SYS_fchownat:
6168447b7cdSJilles Tjoelker 			case SYS_fstatat:
6178447b7cdSJilles Tjoelker 			case SYS_futimesat:
6188447b7cdSJilles Tjoelker 			case SYS_linkat:
6198447b7cdSJilles Tjoelker 			case SYS_mkdirat:
6208447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
6218447b7cdSJilles Tjoelker 			case SYS_mknodat:
6228447b7cdSJilles Tjoelker 			case SYS_openat:
6238447b7cdSJilles Tjoelker 			case SYS_readlinkat:
6248447b7cdSJilles Tjoelker 			case SYS_renameat:
6258447b7cdSJilles Tjoelker 			case SYS_unlinkat:
6268447b7cdSJilles Tjoelker 				putchar('(');
6278447b7cdSJilles Tjoelker 				atfdname(*ip, decimal);
6288447b7cdSJilles Tjoelker 				c = ',';
6298447b7cdSJilles Tjoelker 				ip++;
6308447b7cdSJilles Tjoelker 				narg--;
6318447b7cdSJilles Tjoelker 				break;
6328447b7cdSJilles Tjoelker 			}
6338447b7cdSJilles Tjoelker 			switch (ktr->ktr_code) {
63473430055SDag-Erling Smørgrav 			case SYS_ioctl: {
63598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
636d09e66beSDag-Erling Smørgrav 				putchar(c);
637d09e66beSDag-Erling Smørgrav 				ioctlname(*ip, decimal);
6389b50d902SRodney W. Grimes 				c = ',';
6399b50d902SRodney W. Grimes 				ip++;
6409b50d902SRodney W. Grimes 				narg--;
64173430055SDag-Erling Smørgrav 				break;
64273430055SDag-Erling Smørgrav 			}
64373430055SDag-Erling Smørgrav 			case SYS_ptrace:
64409307b25SDag-Erling Smørgrav 				putchar('(');
64595bb676aSDag-Erling Smørgrav 				ptraceopname(*ip);
6469b50d902SRodney W. Grimes 				c = ',';
6479b50d902SRodney W. Grimes 				ip++;
6489b50d902SRodney W. Grimes 				narg--;
64973430055SDag-Erling Smørgrav 				break;
65073430055SDag-Erling Smørgrav 			case SYS_access:
65173430055SDag-Erling Smørgrav 			case SYS_eaccess:
6528447b7cdSJilles Tjoelker 			case SYS_faccessat:
65398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65409307b25SDag-Erling Smørgrav 				putchar(',');
65595bb676aSDag-Erling Smørgrav 				accessmodename(*ip);
65698a68a58SAlexander Leidinger 				ip++;
65798a68a58SAlexander Leidinger 				narg--;
65873430055SDag-Erling Smørgrav 				break;
65973430055SDag-Erling Smørgrav 			case SYS_open:
6608447b7cdSJilles Tjoelker 			case SYS_openat:
66198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66209307b25SDag-Erling Smørgrav 				putchar(',');
66395bb676aSDag-Erling Smørgrav 				flagsandmodename(ip[0], ip[1], decimal);
66473430055SDag-Erling Smørgrav 				ip += 2;
66598a68a58SAlexander Leidinger 				narg -= 2;
66673430055SDag-Erling Smørgrav 				break;
66773430055SDag-Erling Smørgrav 			case SYS_wait4:
66898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67034763d1cSJohn Baldwin 				/*
67134763d1cSJohn Baldwin 				 * A flags value of zero is valid for
67234763d1cSJohn Baldwin 				 * wait4() but not for wait6(), so
67334763d1cSJohn Baldwin 				 * handle zero special here.
67434763d1cSJohn Baldwin 				 */
67534763d1cSJohn Baldwin 				if (*ip == 0) {
67634763d1cSJohn Baldwin 					print_number(ip, narg, c);
67734763d1cSJohn Baldwin 				} else {
67809307b25SDag-Erling Smørgrav 					putchar(',');
67934763d1cSJohn Baldwin 					wait6optname(*ip);
68034763d1cSJohn Baldwin 					ip++;
68134763d1cSJohn Baldwin 					narg--;
68234763d1cSJohn Baldwin 				}
68334763d1cSJohn Baldwin 				break;
68434763d1cSJohn Baldwin 			case SYS_wait6:
68534763d1cSJohn Baldwin 				putchar('(');
68634763d1cSJohn Baldwin 				idtypename(*ip, decimal);
68734763d1cSJohn Baldwin 				c = ',';
68834763d1cSJohn Baldwin 				ip++;
68934763d1cSJohn Baldwin 				narg--;
69034763d1cSJohn Baldwin 				print_number(ip, narg, c);
69134763d1cSJohn Baldwin 				print_number(ip, narg, c);
69234763d1cSJohn Baldwin 				putchar(',');
69334763d1cSJohn Baldwin 				wait6optname(*ip);
69498a68a58SAlexander Leidinger 				ip++;
69598a68a58SAlexander Leidinger 				narg--;
69673430055SDag-Erling Smørgrav 				break;
69773430055SDag-Erling Smørgrav 			case SYS_chmod:
69873430055SDag-Erling Smørgrav 			case SYS_fchmod:
69973430055SDag-Erling Smørgrav 			case SYS_lchmod:
70098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
70109307b25SDag-Erling Smørgrav 				putchar(',');
70295bb676aSDag-Erling Smørgrav 				modename(*ip);
70398a68a58SAlexander Leidinger 				ip++;
70498a68a58SAlexander Leidinger 				narg--;
70573430055SDag-Erling Smørgrav 				break;
70673430055SDag-Erling Smørgrav 			case SYS_mknod:
7078447b7cdSJilles Tjoelker 			case SYS_mknodat:
70898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
70909307b25SDag-Erling Smørgrav 				putchar(',');
71095bb676aSDag-Erling Smørgrav 				modename(*ip);
71198a68a58SAlexander Leidinger 				ip++;
71298a68a58SAlexander Leidinger 				narg--;
71373430055SDag-Erling Smørgrav 				break;
71473430055SDag-Erling Smørgrav 			case SYS_getfsstat:
71598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
71698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
71709307b25SDag-Erling Smørgrav 				putchar(',');
71895bb676aSDag-Erling Smørgrav 				getfsstatflagsname(*ip);
71998a68a58SAlexander Leidinger 				ip++;
72098a68a58SAlexander Leidinger 				narg--;
72173430055SDag-Erling Smørgrav 				break;
72273430055SDag-Erling Smørgrav 			case SYS_mount:
72398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
72498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
72509307b25SDag-Erling Smørgrav 				putchar(',');
72695bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
72798a68a58SAlexander Leidinger 				ip++;
72898a68a58SAlexander Leidinger 				narg--;
72973430055SDag-Erling Smørgrav 				break;
73073430055SDag-Erling Smørgrav 			case SYS_unmount:
73198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73209307b25SDag-Erling Smørgrav 				putchar(',');
73395bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
73498a68a58SAlexander Leidinger 				ip++;
73598a68a58SAlexander Leidinger 				narg--;
73673430055SDag-Erling Smørgrav 				break;
73773430055SDag-Erling Smørgrav 			case SYS_recvmsg:
73873430055SDag-Erling Smørgrav 			case SYS_sendmsg:
73998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74109307b25SDag-Erling Smørgrav 				putchar(',');
74295bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
74398a68a58SAlexander Leidinger 				ip++;
74498a68a58SAlexander Leidinger 				narg--;
74573430055SDag-Erling Smørgrav 				break;
74673430055SDag-Erling Smørgrav 			case SYS_recvfrom:
74773430055SDag-Erling Smørgrav 			case SYS_sendto:
74898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75109307b25SDag-Erling Smørgrav 				putchar(',');
75295bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
75398a68a58SAlexander Leidinger 				ip++;
75498a68a58SAlexander Leidinger 				narg--;
75573430055SDag-Erling Smørgrav 				break;
75673430055SDag-Erling Smørgrav 			case SYS_chflags:
75773430055SDag-Erling Smørgrav 			case SYS_fchflags:
75873430055SDag-Erling Smørgrav 			case SYS_lchflags:
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_kill:
76698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
76709307b25SDag-Erling Smørgrav 				putchar(',');
76895bb676aSDag-Erling Smørgrav 				signame(*ip);
76998a68a58SAlexander Leidinger 				ip++;
77098a68a58SAlexander Leidinger 				narg--;
77173430055SDag-Erling Smørgrav 				break;
77273430055SDag-Erling Smørgrav 			case SYS_reboot:
77309307b25SDag-Erling Smørgrav 				putchar('(');
77495bb676aSDag-Erling Smørgrav 				rebootoptname(*ip);
77598a68a58SAlexander Leidinger 				ip++;
77698a68a58SAlexander Leidinger 				narg--;
77773430055SDag-Erling Smørgrav 				break;
77873430055SDag-Erling Smørgrav 			case SYS_umask:
77909307b25SDag-Erling Smørgrav 				putchar('(');
78095bb676aSDag-Erling Smørgrav 				modename(*ip);
78198a68a58SAlexander Leidinger 				ip++;
78298a68a58SAlexander Leidinger 				narg--;
78373430055SDag-Erling Smørgrav 				break;
78473430055SDag-Erling Smørgrav 			case SYS_msync:
78598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
78698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
78709307b25SDag-Erling Smørgrav 				putchar(',');
78895bb676aSDag-Erling Smørgrav 				msyncflagsname(*ip);
78998a68a58SAlexander Leidinger 				ip++;
79098a68a58SAlexander Leidinger 				narg--;
79173430055SDag-Erling Smørgrav 				break;
792cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
79373430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
794cae1120aSPeter Wemm 				print_number(ip, narg, c);
795cae1120aSPeter Wemm 				print_number(ip, narg, c);
79609307b25SDag-Erling Smørgrav 				putchar(',');
79795bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
79809307b25SDag-Erling Smørgrav 				putchar(',');
799cae1120aSPeter Wemm 				ip++;
800cae1120aSPeter Wemm 				narg--;
80195bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
802cae1120aSPeter Wemm 				ip++;
803cae1120aSPeter Wemm 				narg--;
80473430055SDag-Erling Smørgrav 				break;
805cae1120aSPeter Wemm #endif
80673430055SDag-Erling Smørgrav 			case SYS_mmap:
80798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80909307b25SDag-Erling Smørgrav 				putchar(',');
81095bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
81109307b25SDag-Erling Smørgrav 				putchar(',');
81298a68a58SAlexander Leidinger 				ip++;
81398a68a58SAlexander Leidinger 				narg--;
81495bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
81598a68a58SAlexander Leidinger 				ip++;
81698a68a58SAlexander Leidinger 				narg--;
81773430055SDag-Erling Smørgrav 				break;
81873430055SDag-Erling Smørgrav 			case SYS_mprotect:
81998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82109307b25SDag-Erling Smørgrav 				putchar(',');
82295bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
82398a68a58SAlexander Leidinger 				ip++;
82498a68a58SAlexander Leidinger 				narg--;
82573430055SDag-Erling Smørgrav 				break;
82673430055SDag-Erling Smørgrav 			case SYS_madvise:
82798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82909307b25SDag-Erling Smørgrav 				putchar(',');
83095bb676aSDag-Erling Smørgrav 				madvisebehavname(*ip);
83198a68a58SAlexander Leidinger 				ip++;
83298a68a58SAlexander Leidinger 				narg--;
83373430055SDag-Erling Smørgrav 				break;
83473430055SDag-Erling Smørgrav 			case SYS_setpriority:
83598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83709307b25SDag-Erling Smørgrav 				putchar(',');
83895bb676aSDag-Erling Smørgrav 				prioname(*ip);
83998a68a58SAlexander Leidinger 				ip++;
84098a68a58SAlexander Leidinger 				narg--;
84173430055SDag-Erling Smørgrav 				break;
84273430055SDag-Erling Smørgrav 			case SYS_fcntl:
84398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
84409307b25SDag-Erling Smørgrav 				putchar(',');
84595bb676aSDag-Erling Smørgrav 				fcntlcmdname(ip[0], ip[1], decimal);
84673430055SDag-Erling Smørgrav 				ip += 2;
84798a68a58SAlexander Leidinger 				narg -= 2;
84873430055SDag-Erling Smørgrav 				break;
84973430055SDag-Erling Smørgrav 			case SYS_socket: {
8508bc31d83SCraig Rodrigues 				int sockdomain;
85109307b25SDag-Erling Smørgrav 				putchar('(');
85295bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
8538bc31d83SCraig Rodrigues 				sockdomainname(sockdomain);
85498a68a58SAlexander Leidinger 				ip++;
85598a68a58SAlexander Leidinger 				narg--;
85609307b25SDag-Erling Smørgrav 				putchar(',');
857f92f062eSJilles Tjoelker 				socktypenamewithflags(*ip);
85898a68a58SAlexander Leidinger 				ip++;
85998a68a58SAlexander Leidinger 				narg--;
8608bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
8618bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
86209307b25SDag-Erling Smørgrav 					putchar(',');
86395bb676aSDag-Erling Smørgrav 					sockipprotoname(*ip);
8648bc31d83SCraig Rodrigues 					ip++;
8658bc31d83SCraig Rodrigues 					narg--;
8668bc31d83SCraig Rodrigues 				}
86798a68a58SAlexander Leidinger 				c = ',';
86873430055SDag-Erling Smørgrav 				break;
86973430055SDag-Erling Smørgrav 			}
87073430055SDag-Erling Smørgrav 			case SYS_setsockopt:
87173430055SDag-Erling Smørgrav 			case SYS_getsockopt:
87298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87309307b25SDag-Erling Smørgrav 				putchar(',');
87495bb676aSDag-Erling Smørgrav 				sockoptlevelname(*ip, decimal);
875e4bb45b1SDag-Erling Smørgrav 				if (*ip == SOL_SOCKET) {
87698a68a58SAlexander Leidinger 					ip++;
87798a68a58SAlexander Leidinger 					narg--;
87809307b25SDag-Erling Smørgrav 					putchar(',');
87995bb676aSDag-Erling Smørgrav 					sockoptname(*ip);
8800460d351SJohn Baldwin 				}
88198a68a58SAlexander Leidinger 				ip++;
88298a68a58SAlexander Leidinger 				narg--;
88373430055SDag-Erling Smørgrav 				break;
884cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
88573430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
88698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
88798a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
88898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
88998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89009307b25SDag-Erling Smørgrav 				putchar(',');
89195bb676aSDag-Erling Smørgrav 				whencename(*ip);
89298a68a58SAlexander Leidinger 				ip++;
89398a68a58SAlexander Leidinger 				narg--;
89473430055SDag-Erling Smørgrav 				break;
895cae1120aSPeter Wemm #endif
89673430055SDag-Erling Smørgrav 			case SYS_lseek:
897cae1120aSPeter Wemm 				print_number(ip, narg, c);
898cae1120aSPeter Wemm 				/* Hidden 'pad' argument, not in lseek(2) */
899cae1120aSPeter Wemm 				print_number(ip, narg, c);
90009307b25SDag-Erling Smørgrav 				putchar(',');
90195bb676aSDag-Erling Smørgrav 				whencename(*ip);
902cae1120aSPeter Wemm 				ip++;
903cae1120aSPeter Wemm 				narg--;
90473430055SDag-Erling Smørgrav 				break;
90573430055SDag-Erling Smørgrav 			case SYS_flock:
90698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90709307b25SDag-Erling Smørgrav 				putchar(',');
90895bb676aSDag-Erling Smørgrav 				flockname(*ip);
90998a68a58SAlexander Leidinger 				ip++;
91098a68a58SAlexander Leidinger 				narg--;
91173430055SDag-Erling Smørgrav 				break;
91273430055SDag-Erling Smørgrav 			case SYS_mkfifo:
9138447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
91473430055SDag-Erling Smørgrav 			case SYS_mkdir:
9158447b7cdSJilles Tjoelker 			case SYS_mkdirat:
91698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91709307b25SDag-Erling Smørgrav 				putchar(',');
91895bb676aSDag-Erling Smørgrav 				modename(*ip);
91998a68a58SAlexander Leidinger 				ip++;
92098a68a58SAlexander Leidinger 				narg--;
92173430055SDag-Erling Smørgrav 				break;
92273430055SDag-Erling Smørgrav 			case SYS_shutdown:
92398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92409307b25SDag-Erling Smørgrav 				putchar(',');
92595bb676aSDag-Erling Smørgrav 				shutdownhowname(*ip);
92698a68a58SAlexander Leidinger 				ip++;
92798a68a58SAlexander Leidinger 				narg--;
92873430055SDag-Erling Smørgrav 				break;
92973430055SDag-Erling Smørgrav 			case SYS_socketpair:
93009307b25SDag-Erling Smørgrav 				putchar('(');
93195bb676aSDag-Erling Smørgrav 				sockdomainname(*ip);
93298a68a58SAlexander Leidinger 				ip++;
93398a68a58SAlexander Leidinger 				narg--;
93409307b25SDag-Erling Smørgrav 				putchar(',');
935f92f062eSJilles Tjoelker 				socktypenamewithflags(*ip);
93698a68a58SAlexander Leidinger 				ip++;
93798a68a58SAlexander Leidinger 				narg--;
93898a68a58SAlexander Leidinger 				c = ',';
93973430055SDag-Erling Smørgrav 				break;
94073430055SDag-Erling Smørgrav 			case SYS_getrlimit:
94173430055SDag-Erling Smørgrav 			case SYS_setrlimit:
94209307b25SDag-Erling Smørgrav 				putchar('(');
94395bb676aSDag-Erling Smørgrav 				rlimitname(*ip);
94498a68a58SAlexander Leidinger 				ip++;
94598a68a58SAlexander Leidinger 				narg--;
94698a68a58SAlexander Leidinger 				c = ',';
94773430055SDag-Erling Smørgrav 				break;
94873430055SDag-Erling Smørgrav 			case SYS_quotactl:
94998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95009307b25SDag-Erling Smørgrav 				putchar(',');
95195bb676aSDag-Erling Smørgrav 				quotactlname(*ip);
95298a68a58SAlexander Leidinger 				ip++;
95398a68a58SAlexander Leidinger 				narg--;
95498a68a58SAlexander Leidinger 				c = ',';
95573430055SDag-Erling Smørgrav 				break;
95673430055SDag-Erling Smørgrav 			case SYS_nfssvc:
95709307b25SDag-Erling Smørgrav 				putchar('(');
95895bb676aSDag-Erling Smørgrav 				nfssvcname(*ip);
95998a68a58SAlexander Leidinger 				ip++;
96098a68a58SAlexander Leidinger 				narg--;
96198a68a58SAlexander Leidinger 				c = ',';
96273430055SDag-Erling Smørgrav 				break;
96373430055SDag-Erling Smørgrav 			case SYS_rtprio:
96409307b25SDag-Erling Smørgrav 				putchar('(');
96595bb676aSDag-Erling Smørgrav 				rtprioname(*ip);
96698a68a58SAlexander Leidinger 				ip++;
96798a68a58SAlexander Leidinger 				narg--;
96898a68a58SAlexander Leidinger 				c = ',';
96973430055SDag-Erling Smørgrav 				break;
97073430055SDag-Erling Smørgrav 			case SYS___semctl:
97198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97309307b25SDag-Erling Smørgrav 				putchar(',');
97495bb676aSDag-Erling Smørgrav 				semctlname(*ip);
97598a68a58SAlexander Leidinger 				ip++;
97698a68a58SAlexander Leidinger 				narg--;
97773430055SDag-Erling Smørgrav 				break;
97873430055SDag-Erling Smørgrav 			case SYS_semget:
97998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98109307b25SDag-Erling Smørgrav 				putchar(',');
98295bb676aSDag-Erling Smørgrav 				semgetname(*ip);
98398a68a58SAlexander Leidinger 				ip++;
98498a68a58SAlexander Leidinger 				narg--;
98573430055SDag-Erling Smørgrav 				break;
98673430055SDag-Erling Smørgrav 			case SYS_msgctl:
98798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98809307b25SDag-Erling Smørgrav 				putchar(',');
98995bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
99098a68a58SAlexander Leidinger 				ip++;
99198a68a58SAlexander Leidinger 				narg--;
99273430055SDag-Erling Smørgrav 				break;
99373430055SDag-Erling Smørgrav 			case SYS_shmat:
99498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99609307b25SDag-Erling Smørgrav 				putchar(',');
99795bb676aSDag-Erling Smørgrav 				shmatname(*ip);
99898a68a58SAlexander Leidinger 				ip++;
99998a68a58SAlexander Leidinger 				narg--;
100073430055SDag-Erling Smørgrav 				break;
100173430055SDag-Erling Smørgrav 			case SYS_shmctl:
100298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100309307b25SDag-Erling Smørgrav 				putchar(',');
100495bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
100598a68a58SAlexander Leidinger 				ip++;
100698a68a58SAlexander Leidinger 				narg--;
100773430055SDag-Erling Smørgrav 				break;
100873430055SDag-Erling Smørgrav 			case SYS_minherit:
100998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101109307b25SDag-Erling Smørgrav 				putchar(',');
101295bb676aSDag-Erling Smørgrav 				minheritname(*ip);
101398a68a58SAlexander Leidinger 				ip++;
101498a68a58SAlexander Leidinger 				narg--;
101573430055SDag-Erling Smørgrav 				break;
101673430055SDag-Erling Smørgrav 			case SYS_rfork:
101709307b25SDag-Erling Smørgrav 				putchar('(');
101895bb676aSDag-Erling Smørgrav 				rforkname(*ip);
101998a68a58SAlexander Leidinger 				ip++;
102098a68a58SAlexander Leidinger 				narg--;
102198a68a58SAlexander Leidinger 				c = ',';
102273430055SDag-Erling Smørgrav 				break;
102373430055SDag-Erling Smørgrav 			case SYS_lio_listio:
102409307b25SDag-Erling Smørgrav 				putchar('(');
102595bb676aSDag-Erling Smørgrav 				lio_listioname(*ip);
102698a68a58SAlexander Leidinger 				ip++;
102798a68a58SAlexander Leidinger 				narg--;
102898a68a58SAlexander Leidinger 				c = ',';
102973430055SDag-Erling Smørgrav 				break;
103073430055SDag-Erling Smørgrav 			case SYS_mlockall:
103109307b25SDag-Erling Smørgrav 				putchar('(');
103295bb676aSDag-Erling Smørgrav 				mlockallname(*ip);
103398a68a58SAlexander Leidinger 				ip++;
103498a68a58SAlexander Leidinger 				narg--;
103573430055SDag-Erling Smørgrav 				break;
103673430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
103798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103809307b25SDag-Erling Smørgrav 				putchar(',');
103995bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
104098a68a58SAlexander Leidinger 				ip++;
104198a68a58SAlexander Leidinger 				narg--;
104273430055SDag-Erling Smørgrav 				break;
104373430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
104473430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
104509307b25SDag-Erling Smørgrav 				putchar('(');
104695bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
104798a68a58SAlexander Leidinger 				ip++;
104898a68a58SAlexander Leidinger 				narg--;
104973430055SDag-Erling Smørgrav 				break;
105073430055SDag-Erling Smørgrav 			case SYS_sendfile:
105198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105709307b25SDag-Erling Smørgrav 				putchar(',');
105895bb676aSDag-Erling Smørgrav 				sendfileflagsname(*ip);
105998a68a58SAlexander Leidinger 				ip++;
106098a68a58SAlexander Leidinger 				narg--;
106173430055SDag-Erling Smørgrav 				break;
106273430055SDag-Erling Smørgrav 			case SYS_kldsym:
106398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106409307b25SDag-Erling Smørgrav 				putchar(',');
106595bb676aSDag-Erling Smørgrav 				kldsymcmdname(*ip);
106698a68a58SAlexander Leidinger 				ip++;
106798a68a58SAlexander Leidinger 				narg--;
106873430055SDag-Erling Smørgrav 				break;
106973430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
107009307b25SDag-Erling Smørgrav 				putchar('(');
107195bb676aSDag-Erling Smørgrav 				sigprocmaskhowname(*ip);
107298a68a58SAlexander Leidinger 				ip++;
107398a68a58SAlexander Leidinger 				narg--;
107498a68a58SAlexander Leidinger 				c = ',';
107573430055SDag-Erling Smørgrav 				break;
107673430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
107773430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
107873430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
107973430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
108073430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
108173430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
108273430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
108373430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
108473430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
108573430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
108673430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
108773430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
108898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
108909307b25SDag-Erling Smørgrav 				putchar(',');
109095bb676aSDag-Erling Smørgrav 				acltypename(*ip);
109198a68a58SAlexander Leidinger 				ip++;
109298a68a58SAlexander Leidinger 				narg--;
109373430055SDag-Erling Smørgrav 				break;
109473430055SDag-Erling Smørgrav 			case SYS_sigaction:
109509307b25SDag-Erling Smørgrav 				putchar('(');
109695bb676aSDag-Erling Smørgrav 				signame(*ip);
109798a68a58SAlexander Leidinger 				ip++;
109898a68a58SAlexander Leidinger 				narg--;
109998a68a58SAlexander Leidinger 				c = ',';
110073430055SDag-Erling Smørgrav 				break;
110173430055SDag-Erling Smørgrav 			case SYS_extattrctl:
110298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
110309307b25SDag-Erling Smørgrav 				putchar(',');
110495bb676aSDag-Erling Smørgrav 				extattrctlname(*ip);
110598a68a58SAlexander Leidinger 				ip++;
110698a68a58SAlexander Leidinger 				narg--;
110773430055SDag-Erling Smørgrav 				break;
110873430055SDag-Erling Smørgrav 			case SYS_nmount:
110998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
111098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
111109307b25SDag-Erling Smørgrav 				putchar(',');
111295bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
111398a68a58SAlexander Leidinger 				ip++;
111498a68a58SAlexander Leidinger 				narg--;
111573430055SDag-Erling Smørgrav 				break;
111673430055SDag-Erling Smørgrav 			case SYS_thr_create:
111798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
111898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
111909307b25SDag-Erling Smørgrav 				putchar(',');
112095bb676aSDag-Erling Smørgrav 				thrcreateflagsname(*ip);
112198a68a58SAlexander Leidinger 				ip++;
112298a68a58SAlexander Leidinger 				narg--;
112373430055SDag-Erling Smørgrav 				break;
112473430055SDag-Erling Smørgrav 			case SYS_thr_kill:
112598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
112609307b25SDag-Erling Smørgrav 				putchar(',');
112795bb676aSDag-Erling Smørgrav 				signame(*ip);
112898a68a58SAlexander Leidinger 				ip++;
112998a68a58SAlexander Leidinger 				narg--;
113073430055SDag-Erling Smørgrav 				break;
113173430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
113298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113309307b25SDag-Erling Smørgrav 				putchar(',');
113495bb676aSDag-Erling Smørgrav 				kldunloadfflagsname(*ip);
113598a68a58SAlexander Leidinger 				ip++;
113698a68a58SAlexander Leidinger 				narg--;
113773430055SDag-Erling Smørgrav 				break;
11388447b7cdSJilles Tjoelker 			case SYS_linkat:
11398447b7cdSJilles Tjoelker 			case SYS_renameat:
11408447b7cdSJilles Tjoelker 			case SYS_symlinkat:
11418447b7cdSJilles Tjoelker 				print_number(ip, narg, c);
11428447b7cdSJilles Tjoelker 				putchar(',');
11438447b7cdSJilles Tjoelker 				atfdname(*ip, decimal);
11448447b7cdSJilles Tjoelker 				ip++;
11458447b7cdSJilles Tjoelker 				narg--;
11468447b7cdSJilles Tjoelker 				break;
11472609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
11482609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
11492609222aSPawel Jakub Dawidek 				putchar(',');
11502609222aSPawel Jakub Dawidek 				arg = *ip;
11512609222aSPawel Jakub Dawidek 				ip++;
11522609222aSPawel Jakub Dawidek 				narg--;
11532609222aSPawel Jakub Dawidek 				capfcntlname(arg);
11542609222aSPawel Jakub Dawidek 				break;
1155145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1156145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1157145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1158145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1159145e6aa9SJohn Baldwin 				(void)putchar(',');
1160145e6aa9SJohn Baldwin 				fadvisebehavname((int)*ip);
1161145e6aa9SJohn Baldwin 				ip++;
1162145e6aa9SJohn Baldwin 				narg--;
1163145e6aa9SJohn Baldwin 				break;
116455648840SJohn Baldwin 			case SYS_procctl:
116555648840SJohn Baldwin 				putchar('(');
116655648840SJohn Baldwin 				idtypename(*ip, decimal);
116755648840SJohn Baldwin 				c = ',';
116855648840SJohn Baldwin 				ip++;
116955648840SJohn Baldwin 				narg--;
117055648840SJohn Baldwin 				print_number(ip, narg, c);
117155648840SJohn Baldwin 				putchar(',');
117255648840SJohn Baldwin 				procctlcmdname(*ip);
117355648840SJohn Baldwin 				ip++;
117455648840SJohn Baldwin 				narg--;
117555648840SJohn Baldwin 				break;
11769b50d902SRodney W. Grimes 			}
11779b50d902SRodney W. Grimes 		}
117848f6dd8aSAttilio Rao 		while (narg > 0) {
117998a68a58SAlexander Leidinger 			print_number(ip, narg, c);
11809b50d902SRodney W. Grimes 		}
118109307b25SDag-Erling Smørgrav 		putchar(')');
11829b50d902SRodney W. Grimes 	}
118309307b25SDag-Erling Smørgrav 	putchar('\n');
11849b50d902SRodney W. Grimes }
11859b50d902SRodney W. Grimes 
118691fbb9c1SDavid Malone void
11877144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags)
11889b50d902SRodney W. Grimes {
118991fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
119091fbb9c1SDavid Malone 	int error = ktr->ktr_error;
119191fbb9c1SDavid Malone 	int code = ktr->ktr_code;
11929b50d902SRodney W. Grimes 
11937144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
11947144d36fSDmitry Chagin 	    (code >= nsyscalls || code < 0))
119509307b25SDag-Erling Smørgrav 		printf("[%d] ", code);
11969b50d902SRodney W. Grimes 	else
119709307b25SDag-Erling Smørgrav 		printf("%s ", syscallnames[code]);
11989b50d902SRodney W. Grimes 
11999b50d902SRodney W. Grimes 	if (error == 0) {
12009b50d902SRodney W. Grimes 		if (fancy) {
120109307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
12029b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
120309307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
12049b50d902SRodney W. Grimes 		} else {
12059b50d902SRodney W. Grimes 			if (decimal)
120609307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
12079b50d902SRodney W. Grimes 			else
120809307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
12099b50d902SRodney W. Grimes 		}
12109b50d902SRodney W. Grimes 	} else if (error == ERESTART)
121109307b25SDag-Erling Smørgrav 		printf("RESTART");
12129b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
121309307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
12149b50d902SRodney W. Grimes 	else {
121509307b25SDag-Erling Smørgrav 		printf("-1 errno %d", ktr->ktr_error);
12169b50d902SRodney W. Grimes 		if (fancy)
121709307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
12189b50d902SRodney W. Grimes 	}
121909307b25SDag-Erling Smørgrav 	putchar('\n');
12209b50d902SRodney W. Grimes }
12219b50d902SRodney W. Grimes 
122291fbb9c1SDavid Malone void
122391fbb9c1SDavid Malone ktrnamei(char *cp, int len)
12249b50d902SRodney W. Grimes {
122509307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
12269b50d902SRodney W. Grimes }
12279b50d902SRodney W. Grimes 
122891fbb9c1SDavid Malone void
1229ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
12309b50d902SRodney W. Grimes {
1231ec4beb5dSPeter Wemm 	int n, i;
1232ec4beb5dSPeter Wemm 	int width;
1233ec4beb5dSPeter Wemm 
1234ec4beb5dSPeter Wemm 	width = 0;
1235ec4beb5dSPeter Wemm 	do {
1236ec4beb5dSPeter Wemm 		width += 2;
1237ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1238ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1239ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1240ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1241ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1242ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1243ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1244ec4beb5dSPeter Wemm 	width -= 2;
1245ec4beb5dSPeter Wemm 
1246ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1247ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1248ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1249ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1250ec4beb5dSPeter Wemm 			}
1251ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1252ec4beb5dSPeter Wemm 				printf(" ");
1253ec4beb5dSPeter Wemm 			}
1254ec4beb5dSPeter Wemm 			if (i < len)
1255ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1256ec4beb5dSPeter Wemm 			else
1257ec4beb5dSPeter Wemm 				printf("  ");
1258ec4beb5dSPeter Wemm 		}
1259ec4beb5dSPeter Wemm 		printf("  |");
1260ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1261ec4beb5dSPeter Wemm 			if (i >= len)
1262ec4beb5dSPeter Wemm 				break;
1263ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1264ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1265ec4beb5dSPeter Wemm 			else
1266ec4beb5dSPeter Wemm 				printf(".");
1267ec4beb5dSPeter Wemm 		}
1268ec4beb5dSPeter Wemm 		printf("|\n");
1269ec4beb5dSPeter Wemm 	}
1270ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1271ec4beb5dSPeter Wemm 		printf("\n");
1272ec4beb5dSPeter Wemm }
1273ec4beb5dSPeter Wemm 
1274ec4beb5dSPeter Wemm void
1275ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1276ec4beb5dSPeter Wemm {
127791fbb9c1SDavid Malone 	int col = 0;
1278ec4beb5dSPeter Wemm 	char *cp;
127991fbb9c1SDavid Malone 	int width;
12809b50d902SRodney W. Grimes 	char visbuf[5];
12819b50d902SRodney W. Grimes 
128209307b25SDag-Erling Smørgrav 	printf("       \"");
12839b50d902SRodney W. Grimes 	col = 8;
12849b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
128509307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
12869b50d902SRodney W. Grimes 		cp = visbuf;
12879b50d902SRodney W. Grimes 		/*
12889b50d902SRodney W. Grimes 		 * Keep track of printables and
12899b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
12909b50d902SRodney W. Grimes 		 */
12919b50d902SRodney W. Grimes 		if (col == 0) {
129209307b25SDag-Erling Smørgrav 			putchar('\t');
12939b50d902SRodney W. Grimes 			col = 8;
12949b50d902SRodney W. Grimes 		}
12959b50d902SRodney W. Grimes 		switch(*cp) {
12969b50d902SRodney W. Grimes 		case '\n':
12979b50d902SRodney W. Grimes 			col = 0;
129809307b25SDag-Erling Smørgrav 			putchar('\n');
12999b50d902SRodney W. Grimes 			continue;
13009b50d902SRodney W. Grimes 		case '\t':
13019b50d902SRodney W. Grimes 			width = 8 - (col&07);
13029b50d902SRodney W. Grimes 			break;
13039b50d902SRodney W. Grimes 		default:
13049b50d902SRodney W. Grimes 			width = strlen(cp);
13059b50d902SRodney W. Grimes 		}
13069b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
130709307b25SDag-Erling Smørgrav 			printf("\\\n\t");
13089b50d902SRodney W. Grimes 			col = 8;
13099b50d902SRodney W. Grimes 		}
13109b50d902SRodney W. Grimes 		col += width;
13119b50d902SRodney W. Grimes 		do {
131209307b25SDag-Erling Smørgrav 			putchar(*cp++);
13139b50d902SRodney W. Grimes 		} while (*cp);
13149b50d902SRodney W. Grimes 	}
13159b50d902SRodney W. Grimes 	if (col == 0)
131609307b25SDag-Erling Smørgrav 		printf("       ");
131709307b25SDag-Erling Smørgrav 	printf("\"\n");
13189b50d902SRodney W. Grimes }
13199b50d902SRodney W. Grimes 
1320ec4beb5dSPeter Wemm void
1321ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1322ec4beb5dSPeter Wemm {
1323ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1324ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1325ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1326ec4beb5dSPeter Wemm 	int i, binary;
1327ec4beb5dSPeter Wemm 
13284b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
13294b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
13304b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
13314b0ae512SPawel Jakub Dawidek 	if (suppressdata)
13324b0ae512SPawel Jakub Dawidek 		return;
1333ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1334ec4beb5dSPeter Wemm 		struct winsize ws;
1335ec4beb5dSPeter Wemm 
1336ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1337ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1338ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1339ec4beb5dSPeter Wemm 		else
1340ec4beb5dSPeter Wemm 			screenwidth = 80;
1341ec4beb5dSPeter Wemm 	}
1342ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1343ec4beb5dSPeter Wemm 		datalen = maxdata;
1344ec4beb5dSPeter Wemm 
1345ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1346ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1347ec4beb5dSPeter Wemm 			continue;
1348ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1349ec4beb5dSPeter Wemm 			continue;
1350ec4beb5dSPeter Wemm 		binary = 1;
1351ec4beb5dSPeter Wemm 	}
1352ec4beb5dSPeter Wemm 	if (binary)
1353ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1354ec4beb5dSPeter Wemm 	else
1355ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1356ec4beb5dSPeter Wemm }
1357ec4beb5dSPeter Wemm 
135891fbb9c1SDavid Malone const char *signames[] = {
13599b50d902SRodney W. Grimes 	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
13609b50d902SRodney W. Grimes 	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
13619b50d902SRodney W. Grimes 	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
13629b50d902SRodney W. Grimes 	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
13639b50d902SRodney W. Grimes 	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
13649b50d902SRodney W. Grimes 	"USR2", NULL,						/* 31 - 32 */
13659b50d902SRodney W. Grimes };
13669b50d902SRodney W. Grimes 
136791fbb9c1SDavid Malone void
1368dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
13699b50d902SRodney W. Grimes {
1370dde5f9b9SDmitry Chagin 	if (psig->signo > 0 && psig->signo < NSIG)
137109307b25SDag-Erling Smørgrav 		printf("SIG%s ", signames[psig->signo]);
1372fd6afe79SKonstantin Belousov 	else
137309307b25SDag-Erling Smørgrav 		printf("SIG %d ", psig->signo);
13745677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
13755677eef9SJilles Tjoelker 		printf("SIG_DFL code=");
13765677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
13775677eef9SJilles Tjoelker 		putchar('\n');
13785677eef9SJilles Tjoelker 	} else {
13795677eef9SJilles Tjoelker 		printf("caught handler=0x%lx mask=0x%x code=",
13805677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
13815677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
13825677eef9SJilles Tjoelker 		putchar('\n');
138391fbb9c1SDavid Malone 	}
13849b50d902SRodney W. Grimes }
13859b50d902SRodney W. Grimes 
138691fbb9c1SDavid Malone void
138788bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
13889b50d902SRodney W. Grimes {
138909307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
13909b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
13919b50d902SRodney W. Grimes }
13929b50d902SRodney W. Grimes 
139388bf5036SJohn Baldwin void
139488bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
139588bf5036SJohn Baldwin {
139688bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
139788bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
139888bf5036SJohn Baldwin }
139988bf5036SJohn Baldwin 
14001f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_START		1
14011f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_STOP		2
14021f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_START		3
14031f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_STOP		4
14041f4b63f8SJohn Baldwin #define	UTRACE_LOAD_OBJECT		5
14051f4b63f8SJohn Baldwin #define	UTRACE_UNLOAD_OBJECT		6
14061f4b63f8SJohn Baldwin #define	UTRACE_ADD_RUNDEP		7
14071f4b63f8SJohn Baldwin #define	UTRACE_PRELOAD_FINISHED		8
14081f4b63f8SJohn Baldwin #define	UTRACE_INIT_CALL		9
14091f4b63f8SJohn Baldwin #define	UTRACE_FINI_CALL		10
14101f4b63f8SJohn Baldwin 
14111f4b63f8SJohn Baldwin struct utrace_rtld {
14121f4b63f8SJohn Baldwin 	char sig[4];				/* 'RTLD' */
14131f4b63f8SJohn Baldwin 	int event;
14141f4b63f8SJohn Baldwin 	void *handle;
14151f4b63f8SJohn Baldwin 	void *mapbase;
14161f4b63f8SJohn Baldwin 	size_t mapsize;
14171f4b63f8SJohn Baldwin 	int refcnt;
14181f4b63f8SJohn Baldwin 	char name[MAXPATHLEN];
14191f4b63f8SJohn Baldwin };
14201f4b63f8SJohn Baldwin 
14211f4b63f8SJohn Baldwin void
14221f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p)
14231f4b63f8SJohn Baldwin {
14241f4b63f8SJohn Baldwin 	struct utrace_rtld *ut = (struct utrace_rtld *)p;
14251f4b63f8SJohn Baldwin 	void *parent;
14261f4b63f8SJohn Baldwin 	int mode;
14271f4b63f8SJohn Baldwin 
14281f4b63f8SJohn Baldwin 	switch (ut->event) {
14291f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_START:
14301f4b63f8SJohn Baldwin 		mode = ut->refcnt;
14311f4b63f8SJohn Baldwin 		printf("dlopen(%s, ", ut->name);
14321f4b63f8SJohn Baldwin 		switch (mode & RTLD_MODEMASK) {
14331f4b63f8SJohn Baldwin 		case RTLD_NOW:
14341f4b63f8SJohn Baldwin 			printf("RTLD_NOW");
14351f4b63f8SJohn Baldwin 			break;
14361f4b63f8SJohn Baldwin 		case RTLD_LAZY:
14371f4b63f8SJohn Baldwin 			printf("RTLD_LAZY");
14381f4b63f8SJohn Baldwin 			break;
14391f4b63f8SJohn Baldwin 		default:
14401f4b63f8SJohn Baldwin 			printf("%#x", mode & RTLD_MODEMASK);
14411f4b63f8SJohn Baldwin 		}
14421f4b63f8SJohn Baldwin 		if (mode & RTLD_GLOBAL)
14431f4b63f8SJohn Baldwin 			printf(" | RTLD_GLOBAL");
14441f4b63f8SJohn Baldwin 		if (mode & RTLD_TRACE)
14451f4b63f8SJohn Baldwin 			printf(" | RTLD_TRACE");
14461f4b63f8SJohn Baldwin 		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
14471f4b63f8SJohn Baldwin 			printf(" | %#x", mode &
14481f4b63f8SJohn Baldwin 			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
14491f4b63f8SJohn Baldwin 		printf(")\n");
14501f4b63f8SJohn Baldwin 		break;
14511f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_STOP:
14521f4b63f8SJohn Baldwin 		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
14531f4b63f8SJohn Baldwin 		    ut->refcnt);
14541f4b63f8SJohn Baldwin 		break;
14551f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_START:
14561f4b63f8SJohn Baldwin 		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
14571f4b63f8SJohn Baldwin 		    ut->refcnt);
14581f4b63f8SJohn Baldwin 		break;
14591f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_STOP:
14601f4b63f8SJohn Baldwin 		printf("dlclose(%p) finished\n", ut->handle);
14611f4b63f8SJohn Baldwin 		break;
14621f4b63f8SJohn Baldwin 	case UTRACE_LOAD_OBJECT:
14631f4b63f8SJohn Baldwin 		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
14641f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
14651f4b63f8SJohn Baldwin 		    ut->name);
14661f4b63f8SJohn Baldwin 		break;
14671f4b63f8SJohn Baldwin 	case UTRACE_UNLOAD_OBJECT:
14681f4b63f8SJohn Baldwin 		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
14691f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
14701f4b63f8SJohn Baldwin 		    ut->name);
14711f4b63f8SJohn Baldwin 		break;
14721f4b63f8SJohn Baldwin 	case UTRACE_ADD_RUNDEP:
14731f4b63f8SJohn Baldwin 		parent = ut->mapbase;
14741f4b63f8SJohn Baldwin 		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
14751f4b63f8SJohn Baldwin 		    ut->handle, ut->name, ut->refcnt);
14761f4b63f8SJohn Baldwin 		break;
14771f4b63f8SJohn Baldwin 	case UTRACE_PRELOAD_FINISHED:
14781f4b63f8SJohn Baldwin 		printf("RTLD: LD_PRELOAD finished\n");
14791f4b63f8SJohn Baldwin 		break;
14801f4b63f8SJohn Baldwin 	case UTRACE_INIT_CALL:
14811f4b63f8SJohn Baldwin 		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
14821f4b63f8SJohn Baldwin 		    ut->name);
14831f4b63f8SJohn Baldwin 		break;
14841f4b63f8SJohn Baldwin 	case UTRACE_FINI_CALL:
14851f4b63f8SJohn Baldwin 		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
14861f4b63f8SJohn Baldwin 		    ut->name);
14871f4b63f8SJohn Baldwin 		break;
14881f4b63f8SJohn Baldwin 	default:
14891f4b63f8SJohn Baldwin 		p += 4;
14901f4b63f8SJohn Baldwin 		len -= 4;
14911f4b63f8SJohn Baldwin 		printf("RTLD: %d ", len);
14921f4b63f8SJohn Baldwin 		while (len--)
14931f4b63f8SJohn Baldwin 			if (decimal)
14941f4b63f8SJohn Baldwin 				printf(" %d", *p++);
14951f4b63f8SJohn Baldwin 			else
14961f4b63f8SJohn Baldwin 				printf(" %02x", *p++);
14971f4b63f8SJohn Baldwin 		printf("\n");
14981f4b63f8SJohn Baldwin 	}
14991f4b63f8SJohn Baldwin }
15001f4b63f8SJohn Baldwin 
1501670b9e9fSJohn Baldwin struct utrace_malloc {
1502670b9e9fSJohn Baldwin 	void *p;
1503670b9e9fSJohn Baldwin 	size_t s;
1504670b9e9fSJohn Baldwin 	void *r;
1505670b9e9fSJohn Baldwin };
1506670b9e9fSJohn Baldwin 
1507670b9e9fSJohn Baldwin void
150881a31394SDag-Erling Smørgrav ktruser_malloc(unsigned char *p)
1509670b9e9fSJohn Baldwin {
1510670b9e9fSJohn Baldwin 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
1511670b9e9fSJohn Baldwin 
151222ce05c9SColin Percival 	if (ut->p == (void *)(intptr_t)(-1))
1513670b9e9fSJohn Baldwin 		printf("malloc_init()\n");
151422ce05c9SColin Percival 	else if (ut->s == 0)
1515670b9e9fSJohn Baldwin 		printf("free(%p)\n", ut->p);
151622ce05c9SColin Percival 	else if (ut->p == NULL)
151722ce05c9SColin Percival 		printf("%p = malloc(%zu)\n", ut->r, ut->s);
1518670b9e9fSJohn Baldwin 	else
1519670b9e9fSJohn Baldwin 		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1520670b9e9fSJohn Baldwin }
1521670b9e9fSJohn Baldwin 
152291fbb9c1SDavid Malone void
152391fbb9c1SDavid Malone ktruser(int len, unsigned char *p)
152482e2dd32SPoul-Henning Kamp {
1525670b9e9fSJohn Baldwin 
15261f4b63f8SJohn Baldwin 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
15271f4b63f8SJohn Baldwin 		ktruser_rtld(len, p);
15281f4b63f8SJohn Baldwin 		return;
15291f4b63f8SJohn Baldwin 	}
15301f4b63f8SJohn Baldwin 
1531670b9e9fSJohn Baldwin 	if (len == sizeof(struct utrace_malloc)) {
153281a31394SDag-Erling Smørgrav 		ktruser_malloc(p);
1533670b9e9fSJohn Baldwin 		return;
1534670b9e9fSJohn Baldwin 	}
1535670b9e9fSJohn Baldwin 
153609307b25SDag-Erling Smørgrav 	printf("%d ", len);
15373f8ba9aeSPoul-Henning Kamp 	while (len--)
1538743f9174SPoul-Henning Kamp 		if (decimal)
153909307b25SDag-Erling Smørgrav 			printf(" %d", *p++);
1540743f9174SPoul-Henning Kamp 		else
154109307b25SDag-Erling Smørgrav 			printf(" %02x", *p++);
154209307b25SDag-Erling Smørgrav 	printf("\n");
154382e2dd32SPoul-Henning Kamp }
154482e2dd32SPoul-Henning Kamp 
154591fbb9c1SDavid Malone void
15467008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
15477008be5bSPawel Jakub Dawidek {
15487008be5bSPawel Jakub Dawidek 
15497008be5bSPawel Jakub Dawidek 	printf("cap_rights_t ");
15507008be5bSPawel Jakub Dawidek 	capname(rightsp);
15517008be5bSPawel Jakub Dawidek 	printf("\n");
15527008be5bSPawel Jakub Dawidek }
15537008be5bSPawel Jakub Dawidek 
15547008be5bSPawel Jakub Dawidek void
155560e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
155660e15db9SDag-Erling Smørgrav {
155760e15db9SDag-Erling Smørgrav /*
155860e15db9SDag-Erling Smørgrav  TODO: Support additional address families
155960e15db9SDag-Erling Smørgrav 	#include <netnatm/natm.h>
156060e15db9SDag-Erling Smørgrav 	struct sockaddr_natm	*natm;
1561237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1562237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
156360e15db9SDag-Erling Smørgrav */
156460e15db9SDag-Erling Smørgrav 	char addr[64];
156560e15db9SDag-Erling Smørgrav 
156660e15db9SDag-Erling Smørgrav 	/*
156760e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
156860e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
156960e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
157060e15db9SDag-Erling Smørgrav 	 */
157160e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
157260e15db9SDag-Erling Smørgrav 	sockfamilyname(sa->sa_family);
157360e15db9SDag-Erling Smørgrav 	printf(", ");
157460e15db9SDag-Erling Smørgrav 
157560e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
157681a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
157760e15db9SDag-Erling Smørgrav 		printf("invalid");				\
157860e15db9SDag-Erling Smørgrav 		break;						\
157960e15db9SDag-Erling Smørgrav 	}
158060e15db9SDag-Erling Smørgrav 
158160e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
158260e15db9SDag-Erling Smørgrav 	case AF_INET: {
158381a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
158460e15db9SDag-Erling Smørgrav 
158581a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1586449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
158760e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
158881a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
158981a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
159060e15db9SDag-Erling Smørgrav 		break;
159160e15db9SDag-Erling Smørgrav 	}
159260e15db9SDag-Erling Smørgrav #ifdef NETATALK
159360e15db9SDag-Erling Smørgrav 	case AF_APPLETALK: {
159481a31394SDag-Erling Smørgrav 		struct sockaddr_at	sa_at;
159560e15db9SDag-Erling Smørgrav 		struct netrange		*nr;
159660e15db9SDag-Erling Smørgrav 
159781a31394SDag-Erling Smørgrav 		memset(&sa_at, 0, sizeof(sa_at));
1598449df4ecSAndrey Zonov 		memcpy(&sa_at, sa, sa->sa_len);
159960e15db9SDag-Erling Smørgrav 		check_sockaddr_len(at);
160081a31394SDag-Erling Smørgrav 		nr = &sa_at.sat_range.r_netrange;
160181a31394SDag-Erling Smørgrav 		printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
160281a31394SDag-Erling Smørgrav 			sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
160360e15db9SDag-Erling Smørgrav 			ntohs(nr->nr_lastnet), nr->nr_phase);
160460e15db9SDag-Erling Smørgrav 		break;
160560e15db9SDag-Erling Smørgrav 	}
160660e15db9SDag-Erling Smørgrav #endif
160760e15db9SDag-Erling Smørgrav 	case AF_INET6: {
160881a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
160960e15db9SDag-Erling Smørgrav 
161081a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1611449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
161260e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1613b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1614b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
161581a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
161660e15db9SDag-Erling Smørgrav 		break;
161760e15db9SDag-Erling Smørgrav 	}
161860e15db9SDag-Erling Smørgrav #ifdef IPX
161960e15db9SDag-Erling Smørgrav 	case AF_IPX: {
162081a31394SDag-Erling Smørgrav 		struct sockaddr_ipx sa_ipx;
162160e15db9SDag-Erling Smørgrav 
162281a31394SDag-Erling Smørgrav 		memset(&sa_ipx, 0, sizeof(sa_ipx));
1623449df4ecSAndrey Zonov 		memcpy(&sa_ipx, sa, sa->sa_len);
162460e15db9SDag-Erling Smørgrav 		check_sockaddr_len(ipx);
162560e15db9SDag-Erling Smørgrav 		/* XXX wish we had ipx_ntop */
162681a31394SDag-Erling Smørgrav 		printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
162781a31394SDag-Erling Smørgrav 		free(sa_ipx);
162860e15db9SDag-Erling Smørgrav 		break;
162960e15db9SDag-Erling Smørgrav 	}
163060e15db9SDag-Erling Smørgrav #endif
163160e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
163281a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
163360e15db9SDag-Erling Smørgrav 
163481a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1635449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
163681a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
163760e15db9SDag-Erling Smørgrav 		break;
163860e15db9SDag-Erling Smørgrav 	}
163960e15db9SDag-Erling Smørgrav 	default:
164060e15db9SDag-Erling Smørgrav 		printf("unknown address family");
164160e15db9SDag-Erling Smørgrav 	}
164260e15db9SDag-Erling Smørgrav 	printf(" }\n");
164360e15db9SDag-Erling Smørgrav }
164460e15db9SDag-Erling Smørgrav 
164560e15db9SDag-Erling Smørgrav void
164660e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
164760e15db9SDag-Erling Smørgrav {
164860e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
164960e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
165060e15db9SDag-Erling Smørgrav 	struct group  *grp;
165160e15db9SDag-Erling Smørgrav 	struct tm *tm;
165260e15db9SDag-Erling Smørgrav 
165360e15db9SDag-Erling Smørgrav 	/*
165460e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
165560e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
165660e15db9SDag-Erling Smørgrav 	 */
165760e15db9SDag-Erling Smørgrav 	printf("struct stat {");
165860e15db9SDag-Erling Smørgrav 	strmode(statp->st_mode, mode);
165960e15db9SDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
166060e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
166160e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_nlink);
166260e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
166360e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
166460e15db9SDag-Erling Smørgrav 	else
166560e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
166660e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
166760e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
166860e15db9SDag-Erling Smørgrav 	else
166960e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
167060e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
167160e15db9SDag-Erling Smørgrav 	printf("atime=");
167260e15db9SDag-Erling Smørgrav 	if (resolv == 0)
167399742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
167460e15db9SDag-Erling Smørgrav 	else {
167599742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
167609307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
167760e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
167860e15db9SDag-Erling Smørgrav 	}
167999742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
168099742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
168160e15db9SDag-Erling Smørgrav 	else
168260e15db9SDag-Erling Smørgrav 		printf(", ");
168360e15db9SDag-Erling Smørgrav 	printf("stime=");
168460e15db9SDag-Erling Smørgrav 	if (resolv == 0)
168599742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
168660e15db9SDag-Erling Smørgrav 	else {
168799742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
168809307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
168960e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
169060e15db9SDag-Erling Smørgrav 	}
169199742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
169299742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
169360e15db9SDag-Erling Smørgrav 	else
169460e15db9SDag-Erling Smørgrav 		printf(", ");
169560e15db9SDag-Erling Smørgrav 	printf("ctime=");
169660e15db9SDag-Erling Smørgrav 	if (resolv == 0)
169799742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
169860e15db9SDag-Erling Smørgrav 	else {
169999742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
170009307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
170160e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
170260e15db9SDag-Erling Smørgrav 	}
170399742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
170499742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
170560e15db9SDag-Erling Smørgrav 	else
170660e15db9SDag-Erling Smørgrav 		printf(", ");
170760e15db9SDag-Erling Smørgrav 	printf("birthtime=");
170860e15db9SDag-Erling Smørgrav 	if (resolv == 0)
170999742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
171060e15db9SDag-Erling Smørgrav 	else {
171199742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
171209307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
171360e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
171460e15db9SDag-Erling Smørgrav 	}
171599742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
171699742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
171760e15db9SDag-Erling Smørgrav 	else
171860e15db9SDag-Erling Smørgrav 		printf(", ");
171960e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
172060e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
172160e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
172260e15db9SDag-Erling Smørgrav 	printf(" }\n");
172360e15db9SDag-Erling Smørgrav }
172460e15db9SDag-Erling Smørgrav 
172560e15db9SDag-Erling Smørgrav void
172660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
172760e15db9SDag-Erling Smørgrav {
172860e15db9SDag-Erling Smørgrav 	char *name, *data;
172960e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
173060e15db9SDag-Erling Smørgrav 	int i;
17317008be5bSPawel Jakub Dawidek 	cap_rights_t rights;
173230c1278fSWarner Losh 	struct stat sb;
173330c1278fSWarner Losh 	struct sockaddr_storage ss;
173460e15db9SDag-Erling Smørgrav 
173560e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
173660e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
173760e15db9SDag-Erling Smørgrav 	     ++namelen)
173860e15db9SDag-Erling Smørgrav 		/* nothing */;
173960e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
174060e15db9SDag-Erling Smørgrav 		goto invalid;
174160e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
174260e15db9SDag-Erling Smørgrav 		goto invalid;
174360e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
174460e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
174560e15db9SDag-Erling Smørgrav 	if (datalen == 0)
174660e15db9SDag-Erling Smørgrav 		goto invalid;
174760e15db9SDag-Erling Smørgrav 	/* sanity check */
174881a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
174981a31394SDag-Erling Smørgrav 		if (!isalpha(name[i]))
175060e15db9SDag-Erling Smørgrav 			goto invalid;
17517008be5bSPawel Jakub Dawidek 	if (strcmp(name, "caprights") == 0) {
17527008be5bSPawel Jakub Dawidek 		if (datalen != sizeof(cap_rights_t))
17537008be5bSPawel Jakub Dawidek 			goto invalid;
17547008be5bSPawel Jakub Dawidek 		memcpy(&rights, data, datalen);
17557008be5bSPawel Jakub Dawidek 		ktrcaprights(&rights);
17567008be5bSPawel Jakub Dawidek 	} else if (strcmp(name, "stat") == 0) {
175760e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
175860e15db9SDag-Erling Smørgrav 			goto invalid;
175930c1278fSWarner Losh 		memcpy(&sb, data, datalen);
176030c1278fSWarner Losh 		ktrstat(&sb);
176160e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
176230c1278fSWarner Losh 		if (datalen > sizeof(ss))
176360e15db9SDag-Erling Smørgrav 			goto invalid;
176430c1278fSWarner Losh 		memcpy(&ss, data, datalen);
17654b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
176630c1278fSWarner Losh 			goto invalid;
176730c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
176860e15db9SDag-Erling Smørgrav 	} else {
176960e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
177060e15db9SDag-Erling Smørgrav 	}
177160e15db9SDag-Erling Smørgrav 	return;
177260e15db9SDag-Erling Smørgrav invalid:
177360e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
177460e15db9SDag-Erling Smørgrav }
177560e15db9SDag-Erling Smørgrav 
1776c601ad8eSDag-Erling Smørgrav void
1777c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
1778c601ad8eSDag-Erling Smørgrav {
1779e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
1780e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
1781e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
1782e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
17837008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
1784e141be6fSDag-Erling Smørgrav 		printf(", process holds ");
17857008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
1786e141be6fSDag-Erling Smørgrav 		break;
1787e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
1788e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
1789e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
17907008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
179160e45df8SDag-Erling Smørgrav 		printf(" to ");
17927008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
1793e141be6fSDag-Erling Smørgrav 		break;
1794e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
1795e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
1796e141be6fSDag-Erling Smørgrav 		printf("disallowed system call");
1797e141be6fSDag-Erling Smørgrav 		break;
1798e141be6fSDag-Erling Smørgrav 	case CAPFAIL_LOOKUP:
1799e141be6fSDag-Erling Smørgrav 		/* used ".." in strict-relative mode */
1800e141be6fSDag-Erling Smørgrav 		printf("restricted VFS lookup");
1801e141be6fSDag-Erling Smørgrav 		break;
1802e141be6fSDag-Erling Smørgrav 	default:
1803e141be6fSDag-Erling Smørgrav 		printf("unknown capability failure: ");
18047008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
1805e141be6fSDag-Erling Smørgrav 		printf(" ");
18067008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
1807e141be6fSDag-Erling Smørgrav 		break;
1808e141be6fSDag-Erling Smørgrav 	}
180935818d2eSJohn Baldwin 	printf("\n");
181035818d2eSJohn Baldwin }
181135818d2eSJohn Baldwin 
181235818d2eSJohn Baldwin void
181335818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
181435818d2eSJohn Baldwin {
181535818d2eSJohn Baldwin 
181635818d2eSJohn Baldwin 	printf("0x%jx ", ktr->vaddr);
181735818d2eSJohn Baldwin 	vmprotname(ktr->type);
181835818d2eSJohn Baldwin 	printf("\n");
181935818d2eSJohn Baldwin }
182035818d2eSJohn Baldwin 
182135818d2eSJohn Baldwin void
182235818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
182335818d2eSJohn Baldwin {
182435818d2eSJohn Baldwin 
182535818d2eSJohn Baldwin 	vmresultname(ktr->result);
182635818d2eSJohn Baldwin 	printf("\n");
1827c601ad8eSDag-Erling Smørgrav }
1828c601ad8eSDag-Erling Smørgrav 
1829dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
1830dde5f9b9SDmitry Chagin void
1831dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr)
1832dde5f9b9SDmitry Chagin {
1833dde5f9b9SDmitry Chagin 	int narg = ktr->ktr_narg;
1834dde5f9b9SDmitry Chagin 	register_t *ip;
1835dde5f9b9SDmitry Chagin 
1836dde5f9b9SDmitry Chagin 	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
1837dde5f9b9SDmitry Chagin 		printf("[%d]", ktr->ktr_code);
1838dde5f9b9SDmitry Chagin 	else
1839dde5f9b9SDmitry Chagin 		printf("%s", linux_syscallnames[ktr->ktr_code]);
1840dde5f9b9SDmitry Chagin 	ip = &ktr->ktr_args[0];
1841dde5f9b9SDmitry Chagin 	if (narg) {
1842dde5f9b9SDmitry Chagin 		char c = '(';
1843dde5f9b9SDmitry Chagin 		while (narg > 0)
1844dde5f9b9SDmitry Chagin 			print_number(ip, narg, c);
1845dde5f9b9SDmitry Chagin 		putchar(')');
1846dde5f9b9SDmitry Chagin 	}
1847dde5f9b9SDmitry Chagin 	putchar('\n');
1848dde5f9b9SDmitry Chagin }
1849dde5f9b9SDmitry Chagin 
1850dde5f9b9SDmitry Chagin void
1851dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr)
1852dde5f9b9SDmitry Chagin {
1853dde5f9b9SDmitry Chagin 	register_t ret = ktr->ktr_retval;
1854dde5f9b9SDmitry Chagin 	int error = ktr->ktr_error;
1855dde5f9b9SDmitry Chagin 	int code = ktr->ktr_code;
1856dde5f9b9SDmitry Chagin 
1857dde5f9b9SDmitry Chagin 	if (code >= nlinux_syscalls || code < 0)
1858dde5f9b9SDmitry Chagin 		printf("[%d] ", code);
1859dde5f9b9SDmitry Chagin 	else
1860dde5f9b9SDmitry Chagin 		printf("%s ", linux_syscallnames[code]);
1861dde5f9b9SDmitry Chagin 
1862dde5f9b9SDmitry Chagin 	if (error == 0) {
1863dde5f9b9SDmitry Chagin 		if (fancy) {
1864dde5f9b9SDmitry Chagin 			printf("%ld", (long)ret);
1865dde5f9b9SDmitry Chagin 			if (ret < 0 || ret > 9)
186609307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
1867dde5f9b9SDmitry Chagin 		} else {
1868dde5f9b9SDmitry Chagin 			if (decimal)
1869dde5f9b9SDmitry Chagin 				printf("%ld", (long)ret);
1870dde5f9b9SDmitry Chagin 			else
187109307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
1872dde5f9b9SDmitry Chagin 		}
1873dde5f9b9SDmitry Chagin 	} else if (error == ERESTART)
1874dde5f9b9SDmitry Chagin 		printf("RESTART");
1875dde5f9b9SDmitry Chagin 	else if (error == EJUSTRETURN)
1876dde5f9b9SDmitry Chagin 		printf("JUSTRETURN");
1877dde5f9b9SDmitry Chagin 	else {
1878dde5f9b9SDmitry Chagin 		if (ktr->ktr_error <= ELAST + 1)
1879dde5f9b9SDmitry Chagin 			error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1880dde5f9b9SDmitry Chagin 		else
1881dde5f9b9SDmitry Chagin 			error = 999;
1882dde5f9b9SDmitry Chagin 		printf("-1 errno %d", error);
1883dde5f9b9SDmitry Chagin 		if (fancy)
1884dde5f9b9SDmitry Chagin 			printf(" %s", strerror(ktr->ktr_error));
1885dde5f9b9SDmitry Chagin 	}
1886dde5f9b9SDmitry Chagin 	putchar('\n');
1887dde5f9b9SDmitry Chagin }
1888dde5f9b9SDmitry Chagin #endif
1889dde5f9b9SDmitry Chagin 
189060e15db9SDag-Erling Smørgrav void
189191fbb9c1SDavid Malone usage(void)
18929b50d902SRodney W. Grimes {
18937144d36fSDmitry Chagin 	fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] "
1894da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
18959b50d902SRodney W. Grimes 	exit(1);
18969b50d902SRodney W. Grimes }
1897