xref: /freebsd/usr.bin/kdump/kdump.c (revision b9034ce2)
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>
49b881b8beSRobert Watson #include <sys/capsicum.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>
631a604cfaSXin LI #include <arpa/inet.h>
6460e15db9SDag-Erling Smørgrav #include <netinet/in.h>
651a604cfaSXin LI #include <ctype.h>
661f4b63f8SJohn Baldwin #include <dlfcn.h>
6715fc002bSPhilippe Charnier #include <err.h>
6860e15db9SDag-Erling Smørgrav #include <grp.h>
6960e15db9SDag-Erling Smørgrav #include <inttypes.h>
704622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
714622f0e1SPawel Jakub Dawidek #include <libcapsicum.h>
724622f0e1SPawel Jakub Dawidek #include <libcapsicum_grp.h>
734622f0e1SPawel Jakub Dawidek #include <libcapsicum_pwd.h>
744622f0e1SPawel Jakub Dawidek #include <libcapsicum_service.h>
754622f0e1SPawel Jakub Dawidek #endif
7615fc002bSPhilippe Charnier #include <locale.h>
77b9ef8051SAndrey V. Elsukov #include <netdb.h>
78f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
794622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
804622f0e1SPawel Jakub Dawidek #include <nv.h>
814622f0e1SPawel Jakub Dawidek #endif
8260e15db9SDag-Erling Smørgrav #include <pwd.h>
839b50d902SRodney W. Grimes #include <stdio.h>
849b50d902SRodney W. Grimes #include <stdlib.h>
859b50d902SRodney W. Grimes #include <string.h>
86f9b20fc8SPawel Jakub Dawidek #include <termios.h>
8760e15db9SDag-Erling Smørgrav #include <time.h>
8815fc002bSPhilippe Charnier #include <unistd.h>
8915fc002bSPhilippe Charnier #include <vis.h>
909b50d902SRodney W. Grimes #include "ktrace.h"
9198a68a58SAlexander Leidinger #include "kdump_subr.h"
929b50d902SRodney W. Grimes 
937144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
947144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
9591fbb9c1SDavid Malone int fread_tail(void *, int, int);
9691fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
977144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
987144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9991fbb9c1SDavid Malone void ktrnamei(char *, int);
100ec4beb5dSPeter Wemm void hexdump(char *, int, int);
101ec4beb5dSPeter Wemm void visdump(char *, int, int);
10291fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
103dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10491fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10588bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
10681a31394SDag-Erling Smørgrav void ktruser_malloc(unsigned char *);
10781a31394SDag-Erling Smørgrav void ktruser_rtld(int, unsigned char *);
10891fbb9c1SDavid Malone void ktruser(int, unsigned char *);
1097008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
11060e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
11160e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
11260e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
113c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11435818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11535818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
116f9b20fc8SPawel Jakub Dawidek void limitfd(int fd);
11791fbb9c1SDavid Malone void usage(void);
118d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int);
11991fbb9c1SDavid Malone 
120c1269d20SMaxim Sobolev #define	TIMESTAMP_NONE		0x0
121c1269d20SMaxim Sobolev #define	TIMESTAMP_ABSOLUTE	0x1
122c1269d20SMaxim Sobolev #define	TIMESTAMP_ELAPSED	0x2
123c1269d20SMaxim Sobolev #define	TIMESTAMP_RELATIVE	0x4
124c1269d20SMaxim Sobolev 
12560e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
126b9034ce2SBryan Drewery     resolv = 0, abiflag = 0, syscallno = 0;
12791fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE;
1289b50d902SRodney W. Grimes struct ktr_header ktr_header;
1299b50d902SRodney W. Grimes 
13060e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1319b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1329b50d902SRodney W. Grimes 
13395bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
134dde5f9b9SDmitry Chagin 	if (decimal)							\
135e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
136dde5f9b9SDmitry Chagin 	else								\
137661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
138dde5f9b9SDmitry Chagin 	i++;								\
139dde5f9b9SDmitry Chagin 	n--;								\
140dde5f9b9SDmitry Chagin 	c = ',';							\
141e4bb45b1SDag-Erling Smørgrav } while (0)
142dde5f9b9SDmitry Chagin 
143dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
144dde5f9b9SDmitry Chagin 
145dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *);
146dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *);
147dde5f9b9SDmitry Chagin extern char *linux_syscallnames[];
148dde5f9b9SDmitry Chagin extern int nlinux_syscalls;
149dde5f9b9SDmitry Chagin 
150dde5f9b9SDmitry Chagin /*
151dde5f9b9SDmitry Chagin  * from linux.h
152dde5f9b9SDmitry Chagin  * Linux syscalls return negative errno's, we do positive and map them
153dde5f9b9SDmitry Chagin  */
154dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = {
155dde5f9b9SDmitry Chagin 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
156dde5f9b9SDmitry Chagin 	-10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
157dde5f9b9SDmitry Chagin 	-20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
158dde5f9b9SDmitry Chagin 	-30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
159dde5f9b9SDmitry Chagin 	-90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
160dde5f9b9SDmitry Chagin 	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
161dde5f9b9SDmitry Chagin 	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
162dde5f9b9SDmitry Chagin 	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
163dde5f9b9SDmitry Chagin 	-6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
164dde5f9b9SDmitry Chagin 	-72, -67, -71
165dde5f9b9SDmitry Chagin };
166dde5f9b9SDmitry Chagin #endif
167dde5f9b9SDmitry Chagin 
1687144d36fSDmitry Chagin struct proc_info
1697144d36fSDmitry Chagin {
1707144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1717144d36fSDmitry Chagin 	u_int			sv_flags;
1727144d36fSDmitry Chagin 	pid_t			pid;
1737144d36fSDmitry Chagin };
1747144d36fSDmitry Chagin 
1757144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1767144d36fSDmitry Chagin 
1774622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
1784622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp;
1794622f0e1SPawel Jakub Dawidek #endif
1804622f0e1SPawel Jakub Dawidek 
181e14da991SPawel Jakub Dawidek static void
182e14da991SPawel Jakub Dawidek strerror_init(void)
183e14da991SPawel Jakub Dawidek {
184e14da991SPawel Jakub Dawidek 
185e14da991SPawel Jakub Dawidek 	/*
186e14da991SPawel Jakub Dawidek 	 * Cache NLS data before entering capability mode.
187e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
188e14da991SPawel Jakub Dawidek 	 */
189e14da991SPawel Jakub Dawidek 	(void)catopen("libc", NL_CAT_LOCALE);
190e14da991SPawel Jakub Dawidek }
191e14da991SPawel Jakub Dawidek 
192e14da991SPawel Jakub Dawidek static void
193e14da991SPawel Jakub Dawidek localtime_init(void)
194e14da991SPawel Jakub Dawidek {
195e14da991SPawel Jakub Dawidek 	time_t ltime;
196e14da991SPawel Jakub Dawidek 
197e14da991SPawel Jakub Dawidek 	/*
198e14da991SPawel Jakub Dawidek 	 * Allow localtime(3) to cache /etc/localtime content before entering
199e14da991SPawel Jakub Dawidek 	 * capability mode.
200e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be localtime_init() in libc.
201e14da991SPawel Jakub Dawidek 	 */
202e14da991SPawel Jakub Dawidek 	(void)time(&ltime);
203e14da991SPawel Jakub Dawidek 	(void)localtime(&ltime);
204e14da991SPawel Jakub Dawidek }
205e14da991SPawel Jakub Dawidek 
2064622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
2074622f0e1SPawel Jakub Dawidek static int
2084622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
2094622f0e1SPawel Jakub Dawidek {
2104622f0e1SPawel Jakub Dawidek 	cap_channel_t *capcas, *cappwdloc, *capgrploc;
2114622f0e1SPawel Jakub Dawidek 	const char *cmds[1], *fields[1];
2124622f0e1SPawel Jakub Dawidek 
2134622f0e1SPawel Jakub Dawidek 	capcas = cap_init();
2144622f0e1SPawel Jakub Dawidek 	if (capcas == NULL) {
2154622f0e1SPawel Jakub Dawidek 		warn("unable to contact casperd");
2168ff3952bSPawel Jakub Dawidek 		return (-1);
2174622f0e1SPawel Jakub Dawidek 	}
2184622f0e1SPawel Jakub Dawidek 	cappwdloc = cap_service_open(capcas, "system.pwd");
2194622f0e1SPawel Jakub Dawidek 	capgrploc = cap_service_open(capcas, "system.grp");
2204622f0e1SPawel Jakub Dawidek 	/* Casper capability no longer needed. */
2214622f0e1SPawel Jakub Dawidek 	cap_close(capcas);
2224622f0e1SPawel Jakub Dawidek 	if (cappwdloc == NULL || capgrploc == NULL) {
2234622f0e1SPawel Jakub Dawidek 		if (cappwdloc == NULL)
2244622f0e1SPawel Jakub Dawidek 			warn("unable to open system.pwd service");
2254622f0e1SPawel Jakub Dawidek 		if (capgrploc == NULL)
2264622f0e1SPawel Jakub Dawidek 			warn("unable to open system.grp service");
2278ff3952bSPawel Jakub Dawidek 		exit(1);
2284622f0e1SPawel Jakub Dawidek 	}
2294622f0e1SPawel Jakub Dawidek 	/* Limit system.pwd to only getpwuid() function and pw_name field. */
2304622f0e1SPawel Jakub Dawidek 	cmds[0] = "getpwuid";
2318ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
2328ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2334622f0e1SPawel Jakub Dawidek 	fields[0] = "pw_name";
2348ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
2358ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2364622f0e1SPawel Jakub Dawidek 	/* Limit system.grp to only getgrgid() function and gr_name field. */
2374622f0e1SPawel Jakub Dawidek 	cmds[0] = "getgrgid";
2388ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
2398ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2404622f0e1SPawel Jakub Dawidek 	fields[0] = "gr_name";
2418ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
2428ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2434622f0e1SPawel Jakub Dawidek 
2444622f0e1SPawel Jakub Dawidek 	*cappwdp = cappwdloc;
2454622f0e1SPawel Jakub Dawidek 	*capgrpp = capgrploc;
2464622f0e1SPawel Jakub Dawidek 	return (0);
2474622f0e1SPawel Jakub Dawidek }
2484622f0e1SPawel Jakub Dawidek #endif	/* HAVE_LIBCAPSICUM */
2494622f0e1SPawel Jakub Dawidek 
25091fbb9c1SDavid Malone int
25191fbb9c1SDavid Malone main(int argc, char *argv[])
2529b50d902SRodney W. Grimes {
2539b50d902SRodney W. Grimes 	int ch, ktrlen, size;
25491fbb9c1SDavid Malone 	void *m;
2559b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
256db53f66bSJohn Baldwin 	int drop_logged;
257ec4beb5dSPeter Wemm 	pid_t pid = 0;
2587144d36fSDmitry Chagin 	u_int sv_flags;
2599b50d902SRodney W. Grimes 
26009307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
2615ccbfb26SAndrey A. Chernov 
262c1269d20SMaxim Sobolev 	timestamp = TIMESTAMP_NONE;
263c1269d20SMaxim Sobolev 
264b9034ce2SBryan Drewery 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
26509307b25SDag-Erling Smørgrav 		switch (ch) {
2667144d36fSDmitry Chagin 		case 'A':
2677144d36fSDmitry Chagin 			abiflag = 1;
2687144d36fSDmitry Chagin 			break;
2699b50d902SRodney W. Grimes 		case 'f':
2709b50d902SRodney W. Grimes 			tracefile = optarg;
2719b50d902SRodney W. Grimes 			break;
2729b50d902SRodney W. Grimes 		case 'd':
2739b50d902SRodney W. Grimes 			decimal = 1;
2749b50d902SRodney W. Grimes 			break;
2759b50d902SRodney W. Grimes 		case 'l':
2769b50d902SRodney W. Grimes 			tail = 1;
2779b50d902SRodney W. Grimes 			break;
2789b50d902SRodney W. Grimes 		case 'm':
2799b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
2809b50d902SRodney W. Grimes 			break;
2819b50d902SRodney W. Grimes 		case 'n':
2829b50d902SRodney W. Grimes 			fancy = 0;
2839b50d902SRodney W. Grimes 			break;
284ec4beb5dSPeter Wemm 		case 'p':
285ec4beb5dSPeter Wemm 			pid = atoi(optarg);
286ec4beb5dSPeter Wemm 			break;
28760e15db9SDag-Erling Smørgrav 		case 'r':
28860e15db9SDag-Erling Smørgrav 			resolv = 1;
28960e15db9SDag-Erling Smørgrav 			break;
290b9034ce2SBryan Drewery 		case 'S':
291b9034ce2SBryan Drewery 			syscallno = 1;
292b9034ce2SBryan Drewery 			break;
293df0c8868SRobert Watson 		case 's':
294df0c8868SRobert Watson 			suppressdata = 1;
295df0c8868SRobert Watson 			break;
296ec131914SPeter Wemm 		case 'E':
297c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ELAPSED;
298ec131914SPeter Wemm 			break;
299a9ac598bSRobert Watson 		case 'H':
300a9ac598bSRobert Watson 			threads = 1;
301a9ac598bSRobert Watson 			break;
3029b50d902SRodney W. Grimes 		case 'R':
303c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_RELATIVE;
3049b50d902SRodney W. Grimes 			break;
3059b50d902SRodney W. Grimes 		case 'T':
306c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ABSOLUTE;
3079b50d902SRodney W. Grimes 			break;
3089b50d902SRodney W. Grimes 		case 't':
3099b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
31015fc002bSPhilippe Charnier 			if (trpoints < 0)
31115fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
3129b50d902SRodney W. Grimes 			break;
3139b50d902SRodney W. Grimes 		default:
3149b50d902SRodney W. Grimes 			usage();
3159b50d902SRodney W. Grimes 		}
3169b50d902SRodney W. Grimes 
31780844fd1SBill Fenner 	if (argc > optind)
3189b50d902SRodney W. Grimes 		usage();
3199b50d902SRodney W. Grimes 
32009307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
32115fc002bSPhilippe Charnier 	if (m == NULL)
32215fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
32315fc002bSPhilippe Charnier 	if (!freopen(tracefile, "r", stdin))
32415fc002bSPhilippe Charnier 		err(1, "%s", tracefile);
325f9b20fc8SPawel Jakub Dawidek 
326e14da991SPawel Jakub Dawidek 	strerror_init();
327e14da991SPawel Jakub Dawidek 	localtime_init();
3284622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
3294622f0e1SPawel Jakub Dawidek 	if (resolv != 0) {
3304622f0e1SPawel Jakub Dawidek 		if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
3314622f0e1SPawel Jakub Dawidek 			cappwd = NULL;
3324622f0e1SPawel Jakub Dawidek 			capgrp = NULL;
3334622f0e1SPawel Jakub Dawidek 		}
3344622f0e1SPawel Jakub Dawidek 	}
3354622f0e1SPawel Jakub Dawidek 	if (resolv == 0 || (cappwd != NULL && capgrp != NULL)) {
3364622f0e1SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
3374622f0e1SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
3384622f0e1SPawel Jakub Dawidek 	}
3394622f0e1SPawel Jakub Dawidek #else
340d2c9ca44SPawel Jakub Dawidek 	if (resolv == 0) {
341f9b20fc8SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
342f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
343d2c9ca44SPawel Jakub Dawidek 	}
3444622f0e1SPawel Jakub Dawidek #endif
345f9b20fc8SPawel Jakub Dawidek 	limitfd(STDIN_FILENO);
346f9b20fc8SPawel Jakub Dawidek 	limitfd(STDOUT_FILENO);
347f9b20fc8SPawel Jakub Dawidek 	limitfd(STDERR_FILENO);
3484622f0e1SPawel Jakub Dawidek 	if (cap_sandboxed())
3494622f0e1SPawel Jakub Dawidek 		fprintf(stderr, "capability mode sandbox enabled\n");
350f9b20fc8SPawel Jakub Dawidek 
3517144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
352db53f66bSJohn Baldwin 	drop_logged = 0;
3539b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
354db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
355db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
356a9ac598bSRobert Watson 			if (!drop_logged && threads) {
35709307b25SDag-Erling Smørgrav 				printf(
358c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
359c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
360c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
361c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
362c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
363a9ac598bSRobert Watson 				drop_logged = 1;
364a9ac598bSRobert Watson 			} else if (!drop_logged) {
36509307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
366c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
367db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
368db53f66bSJohn Baldwin 				drop_logged = 1;
369db53f66bSJohn Baldwin 			}
370db53f66bSJohn Baldwin 		}
3719b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
37201a36e29SJohn Baldwin 			if (pid == 0 || ktr_header.ktr_pid == pid ||
37301a36e29SJohn Baldwin 			    ktr_header.ktr_tid == pid)
3749b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
37515fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
37615fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
3779b50d902SRodney W. Grimes 		if (ktrlen > size) {
37809307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
37915fc002bSPhilippe Charnier 			if (m == NULL)
38015fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
3819b50d902SRodney W. Grimes 			size = ktrlen;
3829b50d902SRodney W. Grimes 		}
38315fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
38415fc002bSPhilippe Charnier 			errx(1, "data too short");
3857144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
3867144d36fSDmitry Chagin 			continue;
3877144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
38801a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
38901a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
390ec4beb5dSPeter Wemm 			continue;
3919b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
3929b50d902SRodney W. Grimes 			continue;
393db53f66bSJohn Baldwin 		drop_logged = 0;
3949b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
3959b50d902SRodney W. Grimes 		case KTR_SYSCALL:
396dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
397dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
398dde5f9b9SDmitry Chagin 				linux_ktrsyscall((struct ktr_syscall *)m);
399dde5f9b9SDmitry Chagin 			else
400dde5f9b9SDmitry Chagin #endif
4017144d36fSDmitry Chagin 				ktrsyscall((struct ktr_syscall *)m, sv_flags);
4029b50d902SRodney W. Grimes 			break;
4039b50d902SRodney W. Grimes 		case KTR_SYSRET:
404dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
405dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
406dde5f9b9SDmitry Chagin 				linux_ktrsysret((struct ktr_sysret *)m);
407dde5f9b9SDmitry Chagin 			else
408dde5f9b9SDmitry Chagin #endif
4097144d36fSDmitry Chagin 				ktrsysret((struct ktr_sysret *)m, sv_flags);
4109b50d902SRodney W. Grimes 			break;
4119b50d902SRodney W. Grimes 		case KTR_NAMEI:
412a56be37eSJohn Baldwin 		case KTR_SYSCTL:
4139b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
4149b50d902SRodney W. Grimes 			break;
4159b50d902SRodney W. Grimes 		case KTR_GENIO:
4169b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
4179b50d902SRodney W. Grimes 			break;
4189b50d902SRodney W. Grimes 		case KTR_PSIG:
419dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
4209b50d902SRodney W. Grimes 			break;
4219b50d902SRodney W. Grimes 		case KTR_CSW:
42288bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
42388bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
42488bf5036SJohn Baldwin 			else
4259b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
4269b50d902SRodney W. Grimes 			break;
42782e2dd32SPoul-Henning Kamp 		case KTR_USER:
4283f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
42982e2dd32SPoul-Henning Kamp 			break;
43060e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
43160e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
43260e15db9SDag-Erling Smørgrav 			break;
433c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
434c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
43535818d2eSJohn Baldwin 			break;
43635818d2eSJohn Baldwin 		case KTR_FAULT:
43735818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
43835818d2eSJohn Baldwin 			break;
43935818d2eSJohn Baldwin 		case KTR_FAULTEND:
44035818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
44135818d2eSJohn Baldwin 			break;
442b9609ab1SJohn Baldwin 		default:
443b9609ab1SJohn Baldwin 			printf("\n");
444b9609ab1SJohn Baldwin 			break;
4459b50d902SRodney W. Grimes 		}
4469b50d902SRodney W. Grimes 		if (tail)
44709307b25SDag-Erling Smørgrav 			fflush(stdout);
4489b50d902SRodney W. Grimes 	}
44991fbb9c1SDavid Malone 	return 0;
4509b50d902SRodney W. Grimes }
4519b50d902SRodney W. Grimes 
452f9b20fc8SPawel Jakub Dawidek void
453f9b20fc8SPawel Jakub Dawidek limitfd(int fd)
454f9b20fc8SPawel Jakub Dawidek {
455f9b20fc8SPawel Jakub Dawidek 	cap_rights_t rights;
456f9b20fc8SPawel Jakub Dawidek 	unsigned long cmd;
457f9b20fc8SPawel Jakub Dawidek 
4587008be5bSPawel Jakub Dawidek 	cap_rights_init(&rights, CAP_FSTAT);
459f9b20fc8SPawel Jakub Dawidek 	cmd = -1;
460f9b20fc8SPawel Jakub Dawidek 
461f9b20fc8SPawel Jakub Dawidek 	switch (fd) {
462f9b20fc8SPawel Jakub Dawidek 	case STDIN_FILENO:
4637008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_READ);
464f9b20fc8SPawel Jakub Dawidek 		break;
465f9b20fc8SPawel Jakub Dawidek 	case STDOUT_FILENO:
4667008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
467f9b20fc8SPawel Jakub Dawidek 		cmd = TIOCGETA;	/* required by isatty(3) in printf(3) */
468f9b20fc8SPawel Jakub Dawidek 		break;
469f9b20fc8SPawel Jakub Dawidek 	case STDERR_FILENO:
4707008be5bSPawel Jakub Dawidek 		cap_rights_set(&rights, CAP_WRITE);
471f9b20fc8SPawel Jakub Dawidek 		if (!suppressdata) {
4727008be5bSPawel Jakub Dawidek 			cap_rights_set(&rights, CAP_IOCTL);
473f9b20fc8SPawel Jakub Dawidek 			cmd = TIOCGWINSZ;
474f9b20fc8SPawel Jakub Dawidek 		}
475f9b20fc8SPawel Jakub Dawidek 		break;
476f9b20fc8SPawel Jakub Dawidek 	default:
477f9b20fc8SPawel Jakub Dawidek 		abort();
478f9b20fc8SPawel Jakub Dawidek 	}
479f9b20fc8SPawel Jakub Dawidek 
4807008be5bSPawel Jakub Dawidek 	if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
481f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit rights for descriptor %d", fd);
482f9b20fc8SPawel Jakub Dawidek 	if (cmd != -1 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
483f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit ioctls for descriptor %d", fd);
484f9b20fc8SPawel Jakub Dawidek }
485f9b20fc8SPawel Jakub Dawidek 
48691fbb9c1SDavid Malone int
48791fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
4889b50d902SRodney W. Grimes {
4899b50d902SRodney W. Grimes 	int i;
4909b50d902SRodney W. Grimes 
4919b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
49209307b25SDag-Erling Smørgrav 		sleep(1);
4939b50d902SRodney W. Grimes 		clearerr(stdin);
4949b50d902SRodney W. Grimes 	}
4959b50d902SRodney W. Grimes 	return (i);
4969b50d902SRodney W. Grimes }
4979b50d902SRodney W. Grimes 
4987144d36fSDmitry Chagin int
4997144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
5007144d36fSDmitry Chagin {
5017144d36fSDmitry Chagin 	struct proc_info *pi;
5027144d36fSDmitry Chagin 
5037144d36fSDmitry Chagin 	switch (kth->ktr_type) {
5047144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5057144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5067144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5077144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5087144d36fSDmitry Chagin 				break;
5097144d36fSDmitry Chagin 			}
5107144d36fSDmitry Chagin 		}
5117144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
5127144d36fSDmitry Chagin 		if (pi == NULL)
5137144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
5147144d36fSDmitry Chagin 		pi->sv_flags = *flags;
5157144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
5167144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
5177144d36fSDmitry Chagin 		return (1);
5187144d36fSDmitry Chagin 
5197144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5207144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5217144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5227144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5237144d36fSDmitry Chagin 				free(pi);
5247144d36fSDmitry Chagin 				break;
5257144d36fSDmitry Chagin 			}
5267144d36fSDmitry Chagin 		}
5277144d36fSDmitry Chagin 		return (1);
5287144d36fSDmitry Chagin 	}
5297144d36fSDmitry Chagin 
5307144d36fSDmitry Chagin 	return (0);
5317144d36fSDmitry Chagin }
5327144d36fSDmitry Chagin 
5337144d36fSDmitry Chagin u_int
5347144d36fSDmitry Chagin abidump(struct ktr_header *kth)
5357144d36fSDmitry Chagin {
5367144d36fSDmitry Chagin 	struct proc_info *pi;
5377144d36fSDmitry Chagin 	const char *abi;
5387144d36fSDmitry Chagin 	const char *arch;
5397144d36fSDmitry Chagin 	u_int flags = 0;
5407144d36fSDmitry Chagin 
5417144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
5427144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
5437144d36fSDmitry Chagin 			flags = pi->sv_flags;
5447144d36fSDmitry Chagin 			break;
5457144d36fSDmitry Chagin 		}
5467144d36fSDmitry Chagin 	}
5477144d36fSDmitry Chagin 
5487144d36fSDmitry Chagin 	if (abiflag == 0)
5497144d36fSDmitry Chagin 		return (flags);
5507144d36fSDmitry Chagin 
5517144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
5527144d36fSDmitry Chagin 	case SV_ABI_LINUX:
5537144d36fSDmitry Chagin 		abi = "L";
5547144d36fSDmitry Chagin 		break;
5557144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
5567144d36fSDmitry Chagin 		abi = "F";
5577144d36fSDmitry Chagin 		break;
5587144d36fSDmitry Chagin 	default:
5597144d36fSDmitry Chagin 		abi = "U";
5607144d36fSDmitry Chagin 		break;
5617144d36fSDmitry Chagin 	}
5627144d36fSDmitry Chagin 
5637144d36fSDmitry Chagin 	if (flags != 0) {
5647144d36fSDmitry Chagin 		if (flags & SV_LP64)
5657144d36fSDmitry Chagin 			arch = "64";
5667144d36fSDmitry Chagin 		else
5677144d36fSDmitry Chagin 			arch = "32";
5687144d36fSDmitry Chagin 	} else
5697144d36fSDmitry Chagin 		arch = "00";
5707144d36fSDmitry Chagin 
5717144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
5727144d36fSDmitry Chagin 
5737144d36fSDmitry Chagin 	return (flags);
5747144d36fSDmitry Chagin }
5757144d36fSDmitry Chagin 
57691fbb9c1SDavid Malone void
57791fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
5789b50d902SRodney W. Grimes {
5799b50d902SRodney W. Grimes 	static char unknown[64];
580c1269d20SMaxim Sobolev 	static struct timeval prevtime, prevtime_e, temp;
58191fbb9c1SDavid Malone 	const char *type;
5829b50d902SRodney W. Grimes 
5839b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
5849b50d902SRodney W. Grimes 	case KTR_SYSCALL:
5859b50d902SRodney W. Grimes 		type = "CALL";
5869b50d902SRodney W. Grimes 		break;
5879b50d902SRodney W. Grimes 	case KTR_SYSRET:
5889b50d902SRodney W. Grimes 		type = "RET ";
5899b50d902SRodney W. Grimes 		break;
5909b50d902SRodney W. Grimes 	case KTR_NAMEI:
5919b50d902SRodney W. Grimes 		type = "NAMI";
5929b50d902SRodney W. Grimes 		break;
5939b50d902SRodney W. Grimes 	case KTR_GENIO:
5949b50d902SRodney W. Grimes 		type = "GIO ";
5959b50d902SRodney W. Grimes 		break;
5969b50d902SRodney W. Grimes 	case KTR_PSIG:
5979b50d902SRodney W. Grimes 		type = "PSIG";
5989b50d902SRodney W. Grimes 		break;
5999b50d902SRodney W. Grimes 	case KTR_CSW:
6009b50d902SRodney W. Grimes 		type = "CSW ";
6019b50d902SRodney W. Grimes 		break;
60282e2dd32SPoul-Henning Kamp 	case KTR_USER:
60382e2dd32SPoul-Henning Kamp 		type = "USER";
60482e2dd32SPoul-Henning Kamp 		break;
60560e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
60660e15db9SDag-Erling Smørgrav 		type = "STRU";
60760e15db9SDag-Erling Smørgrav 		break;
608a56be37eSJohn Baldwin 	case KTR_SYSCTL:
609a56be37eSJohn Baldwin 		type = "SCTL";
610a56be37eSJohn Baldwin 		break;
6117144d36fSDmitry Chagin 	case KTR_PROCCTOR:
6127144d36fSDmitry Chagin 		/* FALLTHROUGH */
6137144d36fSDmitry Chagin 	case KTR_PROCDTOR:
6147144d36fSDmitry Chagin 		return;
615c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
616c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
617c601ad8eSDag-Erling Smørgrav 		break;
61835818d2eSJohn Baldwin 	case KTR_FAULT:
61935818d2eSJohn Baldwin 		type = "PFLT";
62035818d2eSJohn Baldwin 		break;
62135818d2eSJohn Baldwin 	case KTR_FAULTEND:
62235818d2eSJohn Baldwin 		type = "PRET";
62335818d2eSJohn Baldwin 		break;
6249b50d902SRodney W. Grimes 	default:
62509307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
6269b50d902SRodney W. Grimes 		type = unknown;
6279b50d902SRodney W. Grimes 	}
6289b50d902SRodney W. Grimes 
629a9ac598bSRobert Watson 	/*
630a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
631a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
632a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
633a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
634a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
635a9ac598bSRobert Watson 	 * negative tid's as 0.
636a9ac598bSRobert Watson 	 */
637a9ac598bSRobert Watson 	if (threads)
63809307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
639c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
640c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
641a9ac598bSRobert Watson 	else
64209307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
643a9ac598bSRobert Watson 		    kth->ktr_comm);
6449b50d902SRodney W. Grimes         if (timestamp) {
645c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ABSOLUTE) {
646c1269d20SMaxim Sobolev 			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
647c1269d20SMaxim Sobolev 			    kth->ktr_time.tv_usec);
648ec131914SPeter Wemm 		}
649c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ELAPSED) {
650c1269d20SMaxim Sobolev 			if (prevtime_e.tv_sec == 0)
651c1269d20SMaxim Sobolev 				prevtime_e = kth->ktr_time;
652c1269d20SMaxim Sobolev 			timevalsub(&kth->ktr_time, &prevtime_e);
653c1269d20SMaxim Sobolev 			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
654c1269d20SMaxim Sobolev 			    kth->ktr_time.tv_usec);
655c1269d20SMaxim Sobolev 			timevaladd(&kth->ktr_time, &prevtime_e);
656c1269d20SMaxim Sobolev 		}
657c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_RELATIVE) {
6589b50d902SRodney W. Grimes 			temp = kth->ktr_time;
6599b50d902SRodney W. Grimes 			timevalsub(&kth->ktr_time, &prevtime);
6609b50d902SRodney W. Grimes 			prevtime = temp;
66109307b25SDag-Erling Smørgrav 			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
662c065c0b8SJaakko Heinonen 			    kth->ktr_time.tv_usec);
6639b50d902SRodney W. Grimes 		}
664c1269d20SMaxim Sobolev 	}
66509307b25SDag-Erling Smørgrav 	printf("%s  ", type);
6669b50d902SRodney W. Grimes }
6679b50d902SRodney W. Grimes 
6689b50d902SRodney W. Grimes #include <sys/syscall.h>
6699b50d902SRodney W. Grimes #define KTRACE
67055229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c>
6719b50d902SRodney W. Grimes #undef KTRACE
6729b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
6739b50d902SRodney W. Grimes 
67491fbb9c1SDavid Malone void
6757144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags)
6769b50d902SRodney W. Grimes {
67791fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
67891fbb9c1SDavid Malone 	register_t *ip;
679c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
6809b50d902SRodney W. Grimes 
6817144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
6827144d36fSDmitry Chagin 	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
68309307b25SDag-Erling Smørgrav 		printf("[%d]", ktr->ktr_code);
684b9034ce2SBryan Drewery 	else {
68509307b25SDag-Erling Smørgrav 		printf("%s", syscallnames[ktr->ktr_code]);
686b9034ce2SBryan Drewery 		if (syscallno)
687b9034ce2SBryan Drewery 			printf("[%d]", ktr->ktr_code);
688b9034ce2SBryan Drewery 	}
6897a6ec4cfSDmitrij Tejblum 	ip = &ktr->ktr_args[0];
6909b50d902SRodney W. Grimes 	if (narg) {
6919b50d902SRodney W. Grimes 		char c = '(';
6927144d36fSDmitry Chagin 		if (fancy &&
6937144d36fSDmitry Chagin 		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
69473430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
6951ca6c7fcSJilles Tjoelker 			case SYS_bindat:
6961ca6c7fcSJilles Tjoelker 			case SYS_connectat:
6978447b7cdSJilles Tjoelker 			case SYS_faccessat:
6988447b7cdSJilles Tjoelker 			case SYS_fchmodat:
6998447b7cdSJilles Tjoelker 			case SYS_fchownat:
7008447b7cdSJilles Tjoelker 			case SYS_fstatat:
7018447b7cdSJilles Tjoelker 			case SYS_futimesat:
7028447b7cdSJilles Tjoelker 			case SYS_linkat:
7038447b7cdSJilles Tjoelker 			case SYS_mkdirat:
7048447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
7058447b7cdSJilles Tjoelker 			case SYS_mknodat:
7068447b7cdSJilles Tjoelker 			case SYS_openat:
7078447b7cdSJilles Tjoelker 			case SYS_readlinkat:
7088447b7cdSJilles Tjoelker 			case SYS_renameat:
7098447b7cdSJilles Tjoelker 			case SYS_unlinkat:
7108447b7cdSJilles Tjoelker 				putchar('(');
7118447b7cdSJilles Tjoelker 				atfdname(*ip, decimal);
7128447b7cdSJilles Tjoelker 				c = ',';
7138447b7cdSJilles Tjoelker 				ip++;
7148447b7cdSJilles Tjoelker 				narg--;
7158447b7cdSJilles Tjoelker 				break;
7168447b7cdSJilles Tjoelker 			}
7178447b7cdSJilles Tjoelker 			switch (ktr->ktr_code) {
71873430055SDag-Erling Smørgrav 			case SYS_ioctl: {
71998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
720d09e66beSDag-Erling Smørgrav 				putchar(c);
721d09e66beSDag-Erling Smørgrav 				ioctlname(*ip, decimal);
7229b50d902SRodney W. Grimes 				c = ',';
7239b50d902SRodney W. Grimes 				ip++;
7249b50d902SRodney W. Grimes 				narg--;
72573430055SDag-Erling Smørgrav 				break;
72673430055SDag-Erling Smørgrav 			}
72773430055SDag-Erling Smørgrav 			case SYS_ptrace:
72809307b25SDag-Erling Smørgrav 				putchar('(');
72995bb676aSDag-Erling Smørgrav 				ptraceopname(*ip);
7309b50d902SRodney W. Grimes 				c = ',';
7319b50d902SRodney W. Grimes 				ip++;
7329b50d902SRodney W. Grimes 				narg--;
73373430055SDag-Erling Smørgrav 				break;
73473430055SDag-Erling Smørgrav 			case SYS_access:
73573430055SDag-Erling Smørgrav 			case SYS_eaccess:
7368447b7cdSJilles Tjoelker 			case SYS_faccessat:
73798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73809307b25SDag-Erling Smørgrav 				putchar(',');
73995bb676aSDag-Erling Smørgrav 				accessmodename(*ip);
74098a68a58SAlexander Leidinger 				ip++;
74198a68a58SAlexander Leidinger 				narg--;
74273430055SDag-Erling Smørgrav 				break;
74373430055SDag-Erling Smørgrav 			case SYS_open:
7448447b7cdSJilles Tjoelker 			case SYS_openat:
74598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74609307b25SDag-Erling Smørgrav 				putchar(',');
74795bb676aSDag-Erling Smørgrav 				flagsandmodename(ip[0], ip[1], decimal);
74873430055SDag-Erling Smørgrav 				ip += 2;
74998a68a58SAlexander Leidinger 				narg -= 2;
75073430055SDag-Erling Smørgrav 				break;
75173430055SDag-Erling Smørgrav 			case SYS_wait4:
75298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75434763d1cSJohn Baldwin 				/*
75534763d1cSJohn Baldwin 				 * A flags value of zero is valid for
75634763d1cSJohn Baldwin 				 * wait4() but not for wait6(), so
75734763d1cSJohn Baldwin 				 * handle zero special here.
75834763d1cSJohn Baldwin 				 */
75934763d1cSJohn Baldwin 				if (*ip == 0) {
76034763d1cSJohn Baldwin 					print_number(ip, narg, c);
76134763d1cSJohn Baldwin 				} else {
76209307b25SDag-Erling Smørgrav 					putchar(',');
76334763d1cSJohn Baldwin 					wait6optname(*ip);
76434763d1cSJohn Baldwin 					ip++;
76534763d1cSJohn Baldwin 					narg--;
76634763d1cSJohn Baldwin 				}
76734763d1cSJohn Baldwin 				break;
76834763d1cSJohn Baldwin 			case SYS_wait6:
76934763d1cSJohn Baldwin 				putchar('(');
77034763d1cSJohn Baldwin 				idtypename(*ip, decimal);
77134763d1cSJohn Baldwin 				c = ',';
77234763d1cSJohn Baldwin 				ip++;
77334763d1cSJohn Baldwin 				narg--;
77434763d1cSJohn Baldwin 				print_number(ip, narg, c);
77534763d1cSJohn Baldwin 				print_number(ip, narg, c);
77634763d1cSJohn Baldwin 				putchar(',');
77734763d1cSJohn Baldwin 				wait6optname(*ip);
77898a68a58SAlexander Leidinger 				ip++;
77998a68a58SAlexander Leidinger 				narg--;
78073430055SDag-Erling Smørgrav 				break;
78173430055SDag-Erling Smørgrav 			case SYS_chmod:
78273430055SDag-Erling Smørgrav 			case SYS_fchmod:
78373430055SDag-Erling Smørgrav 			case SYS_lchmod:
78498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
78509307b25SDag-Erling Smørgrav 				putchar(',');
78695bb676aSDag-Erling Smørgrav 				modename(*ip);
78798a68a58SAlexander Leidinger 				ip++;
78898a68a58SAlexander Leidinger 				narg--;
78973430055SDag-Erling Smørgrav 				break;
79073430055SDag-Erling Smørgrav 			case SYS_mknod:
7918447b7cdSJilles Tjoelker 			case SYS_mknodat:
79298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
79309307b25SDag-Erling Smørgrav 				putchar(',');
79495bb676aSDag-Erling Smørgrav 				modename(*ip);
79598a68a58SAlexander Leidinger 				ip++;
79698a68a58SAlexander Leidinger 				narg--;
79773430055SDag-Erling Smørgrav 				break;
79873430055SDag-Erling Smørgrav 			case SYS_getfsstat:
79998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80109307b25SDag-Erling Smørgrav 				putchar(',');
80295bb676aSDag-Erling Smørgrav 				getfsstatflagsname(*ip);
80398a68a58SAlexander Leidinger 				ip++;
80498a68a58SAlexander Leidinger 				narg--;
80573430055SDag-Erling Smørgrav 				break;
80673430055SDag-Erling Smørgrav 			case SYS_mount:
80798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80909307b25SDag-Erling Smørgrav 				putchar(',');
81095bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
81198a68a58SAlexander Leidinger 				ip++;
81298a68a58SAlexander Leidinger 				narg--;
81373430055SDag-Erling Smørgrav 				break;
81473430055SDag-Erling Smørgrav 			case SYS_unmount:
81598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81609307b25SDag-Erling Smørgrav 				putchar(',');
81795bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
81898a68a58SAlexander Leidinger 				ip++;
81998a68a58SAlexander Leidinger 				narg--;
82073430055SDag-Erling Smørgrav 				break;
82173430055SDag-Erling Smørgrav 			case SYS_recvmsg:
82273430055SDag-Erling Smørgrav 			case SYS_sendmsg:
82398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
82509307b25SDag-Erling Smørgrav 				putchar(',');
82695bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
82798a68a58SAlexander Leidinger 				ip++;
82898a68a58SAlexander Leidinger 				narg--;
82973430055SDag-Erling Smørgrav 				break;
83073430055SDag-Erling Smørgrav 			case SYS_recvfrom:
83173430055SDag-Erling Smørgrav 			case SYS_sendto:
83298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83509307b25SDag-Erling Smørgrav 				putchar(',');
83695bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
83798a68a58SAlexander Leidinger 				ip++;
83898a68a58SAlexander Leidinger 				narg--;
83973430055SDag-Erling Smørgrav 				break;
84073430055SDag-Erling Smørgrav 			case SYS_chflags:
84173430055SDag-Erling Smørgrav 			case SYS_fchflags:
84273430055SDag-Erling Smørgrav 			case SYS_lchflags:
84398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
84409307b25SDag-Erling Smørgrav 				putchar(',');
84595bb676aSDag-Erling Smørgrav 				modename(*ip);
84698a68a58SAlexander Leidinger 				ip++;
84798a68a58SAlexander Leidinger 				narg--;
84873430055SDag-Erling Smørgrav 				break;
84973430055SDag-Erling Smørgrav 			case SYS_kill:
85098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
85109307b25SDag-Erling Smørgrav 				putchar(',');
85295bb676aSDag-Erling Smørgrav 				signame(*ip);
85398a68a58SAlexander Leidinger 				ip++;
85498a68a58SAlexander Leidinger 				narg--;
85573430055SDag-Erling Smørgrav 				break;
85673430055SDag-Erling Smørgrav 			case SYS_reboot:
85709307b25SDag-Erling Smørgrav 				putchar('(');
85895bb676aSDag-Erling Smørgrav 				rebootoptname(*ip);
85998a68a58SAlexander Leidinger 				ip++;
86098a68a58SAlexander Leidinger 				narg--;
86173430055SDag-Erling Smørgrav 				break;
86273430055SDag-Erling Smørgrav 			case SYS_umask:
86309307b25SDag-Erling Smørgrav 				putchar('(');
86495bb676aSDag-Erling Smørgrav 				modename(*ip);
86598a68a58SAlexander Leidinger 				ip++;
86698a68a58SAlexander Leidinger 				narg--;
86773430055SDag-Erling Smørgrav 				break;
86873430055SDag-Erling Smørgrav 			case SYS_msync:
86998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87109307b25SDag-Erling Smørgrav 				putchar(',');
87295bb676aSDag-Erling Smørgrav 				msyncflagsname(*ip);
87398a68a58SAlexander Leidinger 				ip++;
87498a68a58SAlexander Leidinger 				narg--;
87573430055SDag-Erling Smørgrav 				break;
876cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
87773430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
878cae1120aSPeter Wemm 				print_number(ip, narg, c);
879cae1120aSPeter Wemm 				print_number(ip, narg, c);
88009307b25SDag-Erling Smørgrav 				putchar(',');
88195bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
88209307b25SDag-Erling Smørgrav 				putchar(',');
883cae1120aSPeter Wemm 				ip++;
884cae1120aSPeter Wemm 				narg--;
88595bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
886cae1120aSPeter Wemm 				ip++;
887cae1120aSPeter Wemm 				narg--;
88873430055SDag-Erling Smørgrav 				break;
889cae1120aSPeter Wemm #endif
89073430055SDag-Erling Smørgrav 			case SYS_mmap:
89198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89309307b25SDag-Erling Smørgrav 				putchar(',');
89495bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
89509307b25SDag-Erling Smørgrav 				putchar(',');
89698a68a58SAlexander Leidinger 				ip++;
89798a68a58SAlexander Leidinger 				narg--;
89895bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
89998a68a58SAlexander Leidinger 				ip++;
90098a68a58SAlexander Leidinger 				narg--;
90173430055SDag-Erling Smørgrav 				break;
90273430055SDag-Erling Smørgrav 			case SYS_mprotect:
90398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90509307b25SDag-Erling Smørgrav 				putchar(',');
90695bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
90798a68a58SAlexander Leidinger 				ip++;
90898a68a58SAlexander Leidinger 				narg--;
90973430055SDag-Erling Smørgrav 				break;
91073430055SDag-Erling Smørgrav 			case SYS_madvise:
91198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91309307b25SDag-Erling Smørgrav 				putchar(',');
91495bb676aSDag-Erling Smørgrav 				madvisebehavname(*ip);
91598a68a58SAlexander Leidinger 				ip++;
91698a68a58SAlexander Leidinger 				narg--;
91773430055SDag-Erling Smørgrav 				break;
91873430055SDag-Erling Smørgrav 			case SYS_setpriority:
91998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92109307b25SDag-Erling Smørgrav 				putchar(',');
92295bb676aSDag-Erling Smørgrav 				prioname(*ip);
92398a68a58SAlexander Leidinger 				ip++;
92498a68a58SAlexander Leidinger 				narg--;
92573430055SDag-Erling Smørgrav 				break;
92673430055SDag-Erling Smørgrav 			case SYS_fcntl:
92798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92809307b25SDag-Erling Smørgrav 				putchar(',');
92995bb676aSDag-Erling Smørgrav 				fcntlcmdname(ip[0], ip[1], decimal);
93073430055SDag-Erling Smørgrav 				ip += 2;
93198a68a58SAlexander Leidinger 				narg -= 2;
93273430055SDag-Erling Smørgrav 				break;
93373430055SDag-Erling Smørgrav 			case SYS_socket: {
9348bc31d83SCraig Rodrigues 				int sockdomain;
93509307b25SDag-Erling Smørgrav 				putchar('(');
93695bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
9378bc31d83SCraig Rodrigues 				sockdomainname(sockdomain);
93898a68a58SAlexander Leidinger 				ip++;
93998a68a58SAlexander Leidinger 				narg--;
94009307b25SDag-Erling Smørgrav 				putchar(',');
941f92f062eSJilles Tjoelker 				socktypenamewithflags(*ip);
94298a68a58SAlexander Leidinger 				ip++;
94398a68a58SAlexander Leidinger 				narg--;
9448bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
9458bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
94609307b25SDag-Erling Smørgrav 					putchar(',');
94795bb676aSDag-Erling Smørgrav 					sockipprotoname(*ip);
9488bc31d83SCraig Rodrigues 					ip++;
9498bc31d83SCraig Rodrigues 					narg--;
9508bc31d83SCraig Rodrigues 				}
95198a68a58SAlexander Leidinger 				c = ',';
95273430055SDag-Erling Smørgrav 				break;
95373430055SDag-Erling Smørgrav 			}
95473430055SDag-Erling Smørgrav 			case SYS_setsockopt:
95573430055SDag-Erling Smørgrav 			case SYS_getsockopt:
95698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95709307b25SDag-Erling Smørgrav 				putchar(',');
95895bb676aSDag-Erling Smørgrav 				sockoptlevelname(*ip, decimal);
959e4bb45b1SDag-Erling Smørgrav 				if (*ip == SOL_SOCKET) {
96098a68a58SAlexander Leidinger 					ip++;
96198a68a58SAlexander Leidinger 					narg--;
96209307b25SDag-Erling Smørgrav 					putchar(',');
96395bb676aSDag-Erling Smørgrav 					sockoptname(*ip);
9640460d351SJohn Baldwin 				}
96598a68a58SAlexander Leidinger 				ip++;
96698a68a58SAlexander Leidinger 				narg--;
96773430055SDag-Erling Smørgrav 				break;
968cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
96973430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
97098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97198a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
97298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97409307b25SDag-Erling Smørgrav 				putchar(',');
97595bb676aSDag-Erling Smørgrav 				whencename(*ip);
97698a68a58SAlexander Leidinger 				ip++;
97798a68a58SAlexander Leidinger 				narg--;
97873430055SDag-Erling Smørgrav 				break;
979cae1120aSPeter Wemm #endif
98073430055SDag-Erling Smørgrav 			case SYS_lseek:
981cae1120aSPeter Wemm 				print_number(ip, narg, c);
982cae1120aSPeter Wemm 				/* Hidden 'pad' argument, not in lseek(2) */
983cae1120aSPeter Wemm 				print_number(ip, narg, c);
98409307b25SDag-Erling Smørgrav 				putchar(',');
98595bb676aSDag-Erling Smørgrav 				whencename(*ip);
986cae1120aSPeter Wemm 				ip++;
987cae1120aSPeter Wemm 				narg--;
98873430055SDag-Erling Smørgrav 				break;
98973430055SDag-Erling Smørgrav 			case SYS_flock:
99098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99109307b25SDag-Erling Smørgrav 				putchar(',');
99295bb676aSDag-Erling Smørgrav 				flockname(*ip);
99398a68a58SAlexander Leidinger 				ip++;
99498a68a58SAlexander Leidinger 				narg--;
99573430055SDag-Erling Smørgrav 				break;
99673430055SDag-Erling Smørgrav 			case SYS_mkfifo:
9978447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
99873430055SDag-Erling Smørgrav 			case SYS_mkdir:
9998447b7cdSJilles Tjoelker 			case SYS_mkdirat:
100098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100109307b25SDag-Erling Smørgrav 				putchar(',');
100295bb676aSDag-Erling Smørgrav 				modename(*ip);
100398a68a58SAlexander Leidinger 				ip++;
100498a68a58SAlexander Leidinger 				narg--;
100573430055SDag-Erling Smørgrav 				break;
100673430055SDag-Erling Smørgrav 			case SYS_shutdown:
100798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100809307b25SDag-Erling Smørgrav 				putchar(',');
100995bb676aSDag-Erling Smørgrav 				shutdownhowname(*ip);
101098a68a58SAlexander Leidinger 				ip++;
101198a68a58SAlexander Leidinger 				narg--;
101273430055SDag-Erling Smørgrav 				break;
101373430055SDag-Erling Smørgrav 			case SYS_socketpair:
101409307b25SDag-Erling Smørgrav 				putchar('(');
101595bb676aSDag-Erling Smørgrav 				sockdomainname(*ip);
101698a68a58SAlexander Leidinger 				ip++;
101798a68a58SAlexander Leidinger 				narg--;
101809307b25SDag-Erling Smørgrav 				putchar(',');
1019f92f062eSJilles Tjoelker 				socktypenamewithflags(*ip);
102098a68a58SAlexander Leidinger 				ip++;
102198a68a58SAlexander Leidinger 				narg--;
102298a68a58SAlexander Leidinger 				c = ',';
102373430055SDag-Erling Smørgrav 				break;
102473430055SDag-Erling Smørgrav 			case SYS_getrlimit:
102573430055SDag-Erling Smørgrav 			case SYS_setrlimit:
102609307b25SDag-Erling Smørgrav 				putchar('(');
102795bb676aSDag-Erling Smørgrav 				rlimitname(*ip);
102898a68a58SAlexander Leidinger 				ip++;
102998a68a58SAlexander Leidinger 				narg--;
103098a68a58SAlexander Leidinger 				c = ',';
103173430055SDag-Erling Smørgrav 				break;
103273430055SDag-Erling Smørgrav 			case SYS_quotactl:
103398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103409307b25SDag-Erling Smørgrav 				putchar(',');
103595bb676aSDag-Erling Smørgrav 				quotactlname(*ip);
103698a68a58SAlexander Leidinger 				ip++;
103798a68a58SAlexander Leidinger 				narg--;
103898a68a58SAlexander Leidinger 				c = ',';
103973430055SDag-Erling Smørgrav 				break;
104073430055SDag-Erling Smørgrav 			case SYS_nfssvc:
104109307b25SDag-Erling Smørgrav 				putchar('(');
104295bb676aSDag-Erling Smørgrav 				nfssvcname(*ip);
104398a68a58SAlexander Leidinger 				ip++;
104498a68a58SAlexander Leidinger 				narg--;
104598a68a58SAlexander Leidinger 				c = ',';
104673430055SDag-Erling Smørgrav 				break;
104773430055SDag-Erling Smørgrav 			case SYS_rtprio:
104809307b25SDag-Erling Smørgrav 				putchar('(');
104995bb676aSDag-Erling Smørgrav 				rtprioname(*ip);
105098a68a58SAlexander Leidinger 				ip++;
105198a68a58SAlexander Leidinger 				narg--;
105298a68a58SAlexander Leidinger 				c = ',';
105373430055SDag-Erling Smørgrav 				break;
105473430055SDag-Erling Smørgrav 			case SYS___semctl:
105598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105709307b25SDag-Erling Smørgrav 				putchar(',');
105895bb676aSDag-Erling Smørgrav 				semctlname(*ip);
105998a68a58SAlexander Leidinger 				ip++;
106098a68a58SAlexander Leidinger 				narg--;
106173430055SDag-Erling Smørgrav 				break;
106273430055SDag-Erling Smørgrav 			case SYS_semget:
106398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106509307b25SDag-Erling Smørgrav 				putchar(',');
106695bb676aSDag-Erling Smørgrav 				semgetname(*ip);
106798a68a58SAlexander Leidinger 				ip++;
106898a68a58SAlexander Leidinger 				narg--;
106973430055SDag-Erling Smørgrav 				break;
107073430055SDag-Erling Smørgrav 			case SYS_msgctl:
107198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
107209307b25SDag-Erling Smørgrav 				putchar(',');
107395bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
107498a68a58SAlexander Leidinger 				ip++;
107598a68a58SAlexander Leidinger 				narg--;
107673430055SDag-Erling Smørgrav 				break;
107773430055SDag-Erling Smørgrav 			case SYS_shmat:
107898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
107998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
108009307b25SDag-Erling Smørgrav 				putchar(',');
108195bb676aSDag-Erling Smørgrav 				shmatname(*ip);
108298a68a58SAlexander Leidinger 				ip++;
108398a68a58SAlexander Leidinger 				narg--;
108473430055SDag-Erling Smørgrav 				break;
108573430055SDag-Erling Smørgrav 			case SYS_shmctl:
108698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
108709307b25SDag-Erling Smørgrav 				putchar(',');
108895bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
108998a68a58SAlexander Leidinger 				ip++;
109098a68a58SAlexander Leidinger 				narg--;
109173430055SDag-Erling Smørgrav 				break;
109273430055SDag-Erling Smørgrav 			case SYS_minherit:
109398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
109498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
109509307b25SDag-Erling Smørgrav 				putchar(',');
109695bb676aSDag-Erling Smørgrav 				minheritname(*ip);
109798a68a58SAlexander Leidinger 				ip++;
109898a68a58SAlexander Leidinger 				narg--;
109973430055SDag-Erling Smørgrav 				break;
110073430055SDag-Erling Smørgrav 			case SYS_rfork:
110109307b25SDag-Erling Smørgrav 				putchar('(');
110295bb676aSDag-Erling Smørgrav 				rforkname(*ip);
110398a68a58SAlexander Leidinger 				ip++;
110498a68a58SAlexander Leidinger 				narg--;
110598a68a58SAlexander Leidinger 				c = ',';
110673430055SDag-Erling Smørgrav 				break;
110773430055SDag-Erling Smørgrav 			case SYS_lio_listio:
110809307b25SDag-Erling Smørgrav 				putchar('(');
110995bb676aSDag-Erling Smørgrav 				lio_listioname(*ip);
111098a68a58SAlexander Leidinger 				ip++;
111198a68a58SAlexander Leidinger 				narg--;
111298a68a58SAlexander Leidinger 				c = ',';
111373430055SDag-Erling Smørgrav 				break;
111473430055SDag-Erling Smørgrav 			case SYS_mlockall:
111509307b25SDag-Erling Smørgrav 				putchar('(');
111695bb676aSDag-Erling Smørgrav 				mlockallname(*ip);
111798a68a58SAlexander Leidinger 				ip++;
111898a68a58SAlexander Leidinger 				narg--;
111973430055SDag-Erling Smørgrav 				break;
112073430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
112198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
112209307b25SDag-Erling Smørgrav 				putchar(',');
112395bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
112498a68a58SAlexander Leidinger 				ip++;
112598a68a58SAlexander Leidinger 				narg--;
112673430055SDag-Erling Smørgrav 				break;
112773430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
112873430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
112909307b25SDag-Erling Smørgrav 				putchar('(');
113095bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
113198a68a58SAlexander Leidinger 				ip++;
113298a68a58SAlexander Leidinger 				narg--;
113373430055SDag-Erling Smørgrav 				break;
113473430055SDag-Erling Smørgrav 			case SYS_sendfile:
113598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
114098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
114109307b25SDag-Erling Smørgrav 				putchar(',');
114295bb676aSDag-Erling Smørgrav 				sendfileflagsname(*ip);
114398a68a58SAlexander Leidinger 				ip++;
114498a68a58SAlexander Leidinger 				narg--;
114573430055SDag-Erling Smørgrav 				break;
114673430055SDag-Erling Smørgrav 			case SYS_kldsym:
114798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
114809307b25SDag-Erling Smørgrav 				putchar(',');
114995bb676aSDag-Erling Smørgrav 				kldsymcmdname(*ip);
115098a68a58SAlexander Leidinger 				ip++;
115198a68a58SAlexander Leidinger 				narg--;
115273430055SDag-Erling Smørgrav 				break;
115373430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
115409307b25SDag-Erling Smørgrav 				putchar('(');
115595bb676aSDag-Erling Smørgrav 				sigprocmaskhowname(*ip);
115698a68a58SAlexander Leidinger 				ip++;
115798a68a58SAlexander Leidinger 				narg--;
115898a68a58SAlexander Leidinger 				c = ',';
115973430055SDag-Erling Smørgrav 				break;
116073430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
116173430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
116273430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
116373430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
116473430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
116573430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
116673430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
116773430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
116873430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
116973430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
117073430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
117173430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
117298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
117309307b25SDag-Erling Smørgrav 				putchar(',');
117495bb676aSDag-Erling Smørgrav 				acltypename(*ip);
117598a68a58SAlexander Leidinger 				ip++;
117698a68a58SAlexander Leidinger 				narg--;
117773430055SDag-Erling Smørgrav 				break;
117873430055SDag-Erling Smørgrav 			case SYS_sigaction:
117909307b25SDag-Erling Smørgrav 				putchar('(');
118095bb676aSDag-Erling Smørgrav 				signame(*ip);
118198a68a58SAlexander Leidinger 				ip++;
118298a68a58SAlexander Leidinger 				narg--;
118398a68a58SAlexander Leidinger 				c = ',';
118473430055SDag-Erling Smørgrav 				break;
118573430055SDag-Erling Smørgrav 			case SYS_extattrctl:
118698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
118709307b25SDag-Erling Smørgrav 				putchar(',');
118895bb676aSDag-Erling Smørgrav 				extattrctlname(*ip);
118998a68a58SAlexander Leidinger 				ip++;
119098a68a58SAlexander Leidinger 				narg--;
119173430055SDag-Erling Smørgrav 				break;
119273430055SDag-Erling Smørgrav 			case SYS_nmount:
119398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
119498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
119509307b25SDag-Erling Smørgrav 				putchar(',');
119695bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
119798a68a58SAlexander Leidinger 				ip++;
119898a68a58SAlexander Leidinger 				narg--;
119973430055SDag-Erling Smørgrav 				break;
120073430055SDag-Erling Smørgrav 			case SYS_thr_create:
120198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
120298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
120309307b25SDag-Erling Smørgrav 				putchar(',');
120495bb676aSDag-Erling Smørgrav 				thrcreateflagsname(*ip);
120598a68a58SAlexander Leidinger 				ip++;
120698a68a58SAlexander Leidinger 				narg--;
120773430055SDag-Erling Smørgrav 				break;
120873430055SDag-Erling Smørgrav 			case SYS_thr_kill:
120998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
121009307b25SDag-Erling Smørgrav 				putchar(',');
121195bb676aSDag-Erling Smørgrav 				signame(*ip);
121298a68a58SAlexander Leidinger 				ip++;
121398a68a58SAlexander Leidinger 				narg--;
121473430055SDag-Erling Smørgrav 				break;
121573430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
121698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
121709307b25SDag-Erling Smørgrav 				putchar(',');
121895bb676aSDag-Erling Smørgrav 				kldunloadfflagsname(*ip);
121998a68a58SAlexander Leidinger 				ip++;
122098a68a58SAlexander Leidinger 				narg--;
122173430055SDag-Erling Smørgrav 				break;
12228447b7cdSJilles Tjoelker 			case SYS_linkat:
12238447b7cdSJilles Tjoelker 			case SYS_renameat:
12248447b7cdSJilles Tjoelker 			case SYS_symlinkat:
12258447b7cdSJilles Tjoelker 				print_number(ip, narg, c);
12268447b7cdSJilles Tjoelker 				putchar(',');
12278447b7cdSJilles Tjoelker 				atfdname(*ip, decimal);
12288447b7cdSJilles Tjoelker 				ip++;
12298447b7cdSJilles Tjoelker 				narg--;
12308447b7cdSJilles Tjoelker 				break;
12312609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
12322609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
12332609222aSPawel Jakub Dawidek 				putchar(',');
12342609222aSPawel Jakub Dawidek 				arg = *ip;
12352609222aSPawel Jakub Dawidek 				ip++;
12362609222aSPawel Jakub Dawidek 				narg--;
12372609222aSPawel Jakub Dawidek 				capfcntlname(arg);
12382609222aSPawel Jakub Dawidek 				break;
1239145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1240145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1241145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1242145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1243145e6aa9SJohn Baldwin 				(void)putchar(',');
1244145e6aa9SJohn Baldwin 				fadvisebehavname((int)*ip);
1245145e6aa9SJohn Baldwin 				ip++;
1246145e6aa9SJohn Baldwin 				narg--;
1247145e6aa9SJohn Baldwin 				break;
124855648840SJohn Baldwin 			case SYS_procctl:
124955648840SJohn Baldwin 				putchar('(');
125055648840SJohn Baldwin 				idtypename(*ip, decimal);
125155648840SJohn Baldwin 				c = ',';
125255648840SJohn Baldwin 				ip++;
125355648840SJohn Baldwin 				narg--;
125455648840SJohn Baldwin 				print_number(ip, narg, c);
125555648840SJohn Baldwin 				putchar(',');
125655648840SJohn Baldwin 				procctlcmdname(*ip);
125755648840SJohn Baldwin 				ip++;
125855648840SJohn Baldwin 				narg--;
125955648840SJohn Baldwin 				break;
12609b50d902SRodney W. Grimes 			}
12619b50d902SRodney W. Grimes 		}
126248f6dd8aSAttilio Rao 		while (narg > 0) {
126398a68a58SAlexander Leidinger 			print_number(ip, narg, c);
12649b50d902SRodney W. Grimes 		}
126509307b25SDag-Erling Smørgrav 		putchar(')');
12669b50d902SRodney W. Grimes 	}
126709307b25SDag-Erling Smørgrav 	putchar('\n');
12689b50d902SRodney W. Grimes }
12699b50d902SRodney W. Grimes 
127091fbb9c1SDavid Malone void
12717144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags)
12729b50d902SRodney W. Grimes {
127391fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
127491fbb9c1SDavid Malone 	int error = ktr->ktr_error;
127591fbb9c1SDavid Malone 	int code = ktr->ktr_code;
12769b50d902SRodney W. Grimes 
12777144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
12787144d36fSDmitry Chagin 	    (code >= nsyscalls || code < 0))
127909307b25SDag-Erling Smørgrav 		printf("[%d] ", code);
1280b9034ce2SBryan Drewery 	else {
128109307b25SDag-Erling Smørgrav 		printf("%s", syscallnames[code]);
1282b9034ce2SBryan Drewery 		if (syscallno)
1283b9034ce2SBryan Drewery 			printf("[%d]", code);
1284b9034ce2SBryan Drewery 		printf(" ");
1285b9034ce2SBryan Drewery 	}
12869b50d902SRodney W. Grimes 
12879b50d902SRodney W. Grimes 	if (error == 0) {
12889b50d902SRodney W. Grimes 		if (fancy) {
128909307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
12909b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
129109307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
12929b50d902SRodney W. Grimes 		} else {
12939b50d902SRodney W. Grimes 			if (decimal)
129409307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
12959b50d902SRodney W. Grimes 			else
129609307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
12979b50d902SRodney W. Grimes 		}
12989b50d902SRodney W. Grimes 	} else if (error == ERESTART)
129909307b25SDag-Erling Smørgrav 		printf("RESTART");
13009b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
130109307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
13029b50d902SRodney W. Grimes 	else {
130309307b25SDag-Erling Smørgrav 		printf("-1 errno %d", ktr->ktr_error);
13049b50d902SRodney W. Grimes 		if (fancy)
130509307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
13069b50d902SRodney W. Grimes 	}
130709307b25SDag-Erling Smørgrav 	putchar('\n');
13089b50d902SRodney W. Grimes }
13099b50d902SRodney W. Grimes 
131091fbb9c1SDavid Malone void
131191fbb9c1SDavid Malone ktrnamei(char *cp, int len)
13129b50d902SRodney W. Grimes {
131309307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
13149b50d902SRodney W. Grimes }
13159b50d902SRodney W. Grimes 
131691fbb9c1SDavid Malone void
1317ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
13189b50d902SRodney W. Grimes {
1319ec4beb5dSPeter Wemm 	int n, i;
1320ec4beb5dSPeter Wemm 	int width;
1321ec4beb5dSPeter Wemm 
1322ec4beb5dSPeter Wemm 	width = 0;
1323ec4beb5dSPeter Wemm 	do {
1324ec4beb5dSPeter Wemm 		width += 2;
1325ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1326ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1327ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1328ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1329ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1330ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1331ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1332ec4beb5dSPeter Wemm 	width -= 2;
1333ec4beb5dSPeter Wemm 
1334ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1335ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1336ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1337ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1338ec4beb5dSPeter Wemm 			}
1339ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1340ec4beb5dSPeter Wemm 				printf(" ");
1341ec4beb5dSPeter Wemm 			}
1342ec4beb5dSPeter Wemm 			if (i < len)
1343ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1344ec4beb5dSPeter Wemm 			else
1345ec4beb5dSPeter Wemm 				printf("  ");
1346ec4beb5dSPeter Wemm 		}
1347ec4beb5dSPeter Wemm 		printf("  |");
1348ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1349ec4beb5dSPeter Wemm 			if (i >= len)
1350ec4beb5dSPeter Wemm 				break;
1351ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1352ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1353ec4beb5dSPeter Wemm 			else
1354ec4beb5dSPeter Wemm 				printf(".");
1355ec4beb5dSPeter Wemm 		}
1356ec4beb5dSPeter Wemm 		printf("|\n");
1357ec4beb5dSPeter Wemm 	}
1358ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1359ec4beb5dSPeter Wemm 		printf("\n");
1360ec4beb5dSPeter Wemm }
1361ec4beb5dSPeter Wemm 
1362ec4beb5dSPeter Wemm void
1363ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1364ec4beb5dSPeter Wemm {
136591fbb9c1SDavid Malone 	int col = 0;
1366ec4beb5dSPeter Wemm 	char *cp;
136791fbb9c1SDavid Malone 	int width;
13689b50d902SRodney W. Grimes 	char visbuf[5];
13699b50d902SRodney W. Grimes 
137009307b25SDag-Erling Smørgrav 	printf("       \"");
13719b50d902SRodney W. Grimes 	col = 8;
13729b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
137309307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
13749b50d902SRodney W. Grimes 		cp = visbuf;
13759b50d902SRodney W. Grimes 		/*
13769b50d902SRodney W. Grimes 		 * Keep track of printables and
13779b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
13789b50d902SRodney W. Grimes 		 */
13799b50d902SRodney W. Grimes 		if (col == 0) {
138009307b25SDag-Erling Smørgrav 			putchar('\t');
13819b50d902SRodney W. Grimes 			col = 8;
13829b50d902SRodney W. Grimes 		}
13839b50d902SRodney W. Grimes 		switch(*cp) {
13849b50d902SRodney W. Grimes 		case '\n':
13859b50d902SRodney W. Grimes 			col = 0;
138609307b25SDag-Erling Smørgrav 			putchar('\n');
13879b50d902SRodney W. Grimes 			continue;
13889b50d902SRodney W. Grimes 		case '\t':
13899b50d902SRodney W. Grimes 			width = 8 - (col&07);
13909b50d902SRodney W. Grimes 			break;
13919b50d902SRodney W. Grimes 		default:
13929b50d902SRodney W. Grimes 			width = strlen(cp);
13939b50d902SRodney W. Grimes 		}
13949b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
139509307b25SDag-Erling Smørgrav 			printf("\\\n\t");
13969b50d902SRodney W. Grimes 			col = 8;
13979b50d902SRodney W. Grimes 		}
13989b50d902SRodney W. Grimes 		col += width;
13999b50d902SRodney W. Grimes 		do {
140009307b25SDag-Erling Smørgrav 			putchar(*cp++);
14019b50d902SRodney W. Grimes 		} while (*cp);
14029b50d902SRodney W. Grimes 	}
14039b50d902SRodney W. Grimes 	if (col == 0)
140409307b25SDag-Erling Smørgrav 		printf("       ");
140509307b25SDag-Erling Smørgrav 	printf("\"\n");
14069b50d902SRodney W. Grimes }
14079b50d902SRodney W. Grimes 
1408ec4beb5dSPeter Wemm void
1409ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1410ec4beb5dSPeter Wemm {
1411ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1412ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1413ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1414ec4beb5dSPeter Wemm 	int i, binary;
1415ec4beb5dSPeter Wemm 
14164b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
14174b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
14184b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
14194b0ae512SPawel Jakub Dawidek 	if (suppressdata)
14204b0ae512SPawel Jakub Dawidek 		return;
1421ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1422ec4beb5dSPeter Wemm 		struct winsize ws;
1423ec4beb5dSPeter Wemm 
1424ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1425ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1426ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1427ec4beb5dSPeter Wemm 		else
1428ec4beb5dSPeter Wemm 			screenwidth = 80;
1429ec4beb5dSPeter Wemm 	}
1430ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1431ec4beb5dSPeter Wemm 		datalen = maxdata;
1432ec4beb5dSPeter Wemm 
1433ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1434ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1435ec4beb5dSPeter Wemm 			continue;
1436ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1437ec4beb5dSPeter Wemm 			continue;
1438ec4beb5dSPeter Wemm 		binary = 1;
1439ec4beb5dSPeter Wemm 	}
1440ec4beb5dSPeter Wemm 	if (binary)
1441ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1442ec4beb5dSPeter Wemm 	else
1443ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1444ec4beb5dSPeter Wemm }
1445ec4beb5dSPeter Wemm 
144691fbb9c1SDavid Malone const char *signames[] = {
14479b50d902SRodney W. Grimes 	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
14489b50d902SRodney W. Grimes 	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
14499b50d902SRodney W. Grimes 	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
14509b50d902SRodney W. Grimes 	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
14519b50d902SRodney W. Grimes 	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
14529b50d902SRodney W. Grimes 	"USR2", NULL,						/* 31 - 32 */
14539b50d902SRodney W. Grimes };
14549b50d902SRodney W. Grimes 
145591fbb9c1SDavid Malone void
1456dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
14579b50d902SRodney W. Grimes {
1458dde5f9b9SDmitry Chagin 	if (psig->signo > 0 && psig->signo < NSIG)
145909307b25SDag-Erling Smørgrav 		printf("SIG%s ", signames[psig->signo]);
1460fd6afe79SKonstantin Belousov 	else
146109307b25SDag-Erling Smørgrav 		printf("SIG %d ", psig->signo);
14625677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
14635677eef9SJilles Tjoelker 		printf("SIG_DFL code=");
14645677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
14655677eef9SJilles Tjoelker 		putchar('\n');
14665677eef9SJilles Tjoelker 	} else {
14675677eef9SJilles Tjoelker 		printf("caught handler=0x%lx mask=0x%x code=",
14685677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
14695677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
14705677eef9SJilles Tjoelker 		putchar('\n');
147191fbb9c1SDavid Malone 	}
14729b50d902SRodney W. Grimes }
14739b50d902SRodney W. Grimes 
147491fbb9c1SDavid Malone void
147588bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
14769b50d902SRodney W. Grimes {
147709307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
14789b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
14799b50d902SRodney W. Grimes }
14809b50d902SRodney W. Grimes 
148188bf5036SJohn Baldwin void
148288bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
148388bf5036SJohn Baldwin {
148488bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
148588bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
148688bf5036SJohn Baldwin }
148788bf5036SJohn Baldwin 
14881f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_START		1
14891f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_STOP		2
14901f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_START		3
14911f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_STOP		4
14921f4b63f8SJohn Baldwin #define	UTRACE_LOAD_OBJECT		5
14931f4b63f8SJohn Baldwin #define	UTRACE_UNLOAD_OBJECT		6
14941f4b63f8SJohn Baldwin #define	UTRACE_ADD_RUNDEP		7
14951f4b63f8SJohn Baldwin #define	UTRACE_PRELOAD_FINISHED		8
14961f4b63f8SJohn Baldwin #define	UTRACE_INIT_CALL		9
14971f4b63f8SJohn Baldwin #define	UTRACE_FINI_CALL		10
14981f4b63f8SJohn Baldwin 
14991f4b63f8SJohn Baldwin struct utrace_rtld {
15001f4b63f8SJohn Baldwin 	char sig[4];				/* 'RTLD' */
15011f4b63f8SJohn Baldwin 	int event;
15021f4b63f8SJohn Baldwin 	void *handle;
15031f4b63f8SJohn Baldwin 	void *mapbase;
15041f4b63f8SJohn Baldwin 	size_t mapsize;
15051f4b63f8SJohn Baldwin 	int refcnt;
15061f4b63f8SJohn Baldwin 	char name[MAXPATHLEN];
15071f4b63f8SJohn Baldwin };
15081f4b63f8SJohn Baldwin 
15091f4b63f8SJohn Baldwin void
15101f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p)
15111f4b63f8SJohn Baldwin {
15121f4b63f8SJohn Baldwin 	struct utrace_rtld *ut = (struct utrace_rtld *)p;
15131f4b63f8SJohn Baldwin 	void *parent;
15141f4b63f8SJohn Baldwin 	int mode;
15151f4b63f8SJohn Baldwin 
15161f4b63f8SJohn Baldwin 	switch (ut->event) {
15171f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_START:
15181f4b63f8SJohn Baldwin 		mode = ut->refcnt;
15191f4b63f8SJohn Baldwin 		printf("dlopen(%s, ", ut->name);
15201f4b63f8SJohn Baldwin 		switch (mode & RTLD_MODEMASK) {
15211f4b63f8SJohn Baldwin 		case RTLD_NOW:
15221f4b63f8SJohn Baldwin 			printf("RTLD_NOW");
15231f4b63f8SJohn Baldwin 			break;
15241f4b63f8SJohn Baldwin 		case RTLD_LAZY:
15251f4b63f8SJohn Baldwin 			printf("RTLD_LAZY");
15261f4b63f8SJohn Baldwin 			break;
15271f4b63f8SJohn Baldwin 		default:
15281f4b63f8SJohn Baldwin 			printf("%#x", mode & RTLD_MODEMASK);
15291f4b63f8SJohn Baldwin 		}
15301f4b63f8SJohn Baldwin 		if (mode & RTLD_GLOBAL)
15311f4b63f8SJohn Baldwin 			printf(" | RTLD_GLOBAL");
15321f4b63f8SJohn Baldwin 		if (mode & RTLD_TRACE)
15331f4b63f8SJohn Baldwin 			printf(" | RTLD_TRACE");
15341f4b63f8SJohn Baldwin 		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
15351f4b63f8SJohn Baldwin 			printf(" | %#x", mode &
15361f4b63f8SJohn Baldwin 			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
15371f4b63f8SJohn Baldwin 		printf(")\n");
15381f4b63f8SJohn Baldwin 		break;
15391f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_STOP:
15401f4b63f8SJohn Baldwin 		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
15411f4b63f8SJohn Baldwin 		    ut->refcnt);
15421f4b63f8SJohn Baldwin 		break;
15431f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_START:
15441f4b63f8SJohn Baldwin 		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
15451f4b63f8SJohn Baldwin 		    ut->refcnt);
15461f4b63f8SJohn Baldwin 		break;
15471f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_STOP:
15481f4b63f8SJohn Baldwin 		printf("dlclose(%p) finished\n", ut->handle);
15491f4b63f8SJohn Baldwin 		break;
15501f4b63f8SJohn Baldwin 	case UTRACE_LOAD_OBJECT:
15511f4b63f8SJohn Baldwin 		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
15521f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
15531f4b63f8SJohn Baldwin 		    ut->name);
15541f4b63f8SJohn Baldwin 		break;
15551f4b63f8SJohn Baldwin 	case UTRACE_UNLOAD_OBJECT:
15561f4b63f8SJohn Baldwin 		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
15571f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
15581f4b63f8SJohn Baldwin 		    ut->name);
15591f4b63f8SJohn Baldwin 		break;
15601f4b63f8SJohn Baldwin 	case UTRACE_ADD_RUNDEP:
15611f4b63f8SJohn Baldwin 		parent = ut->mapbase;
15621f4b63f8SJohn Baldwin 		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
15631f4b63f8SJohn Baldwin 		    ut->handle, ut->name, ut->refcnt);
15641f4b63f8SJohn Baldwin 		break;
15651f4b63f8SJohn Baldwin 	case UTRACE_PRELOAD_FINISHED:
15661f4b63f8SJohn Baldwin 		printf("RTLD: LD_PRELOAD finished\n");
15671f4b63f8SJohn Baldwin 		break;
15681f4b63f8SJohn Baldwin 	case UTRACE_INIT_CALL:
15691f4b63f8SJohn Baldwin 		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
15701f4b63f8SJohn Baldwin 		    ut->name);
15711f4b63f8SJohn Baldwin 		break;
15721f4b63f8SJohn Baldwin 	case UTRACE_FINI_CALL:
15731f4b63f8SJohn Baldwin 		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
15741f4b63f8SJohn Baldwin 		    ut->name);
15751f4b63f8SJohn Baldwin 		break;
15761f4b63f8SJohn Baldwin 	default:
15771f4b63f8SJohn Baldwin 		p += 4;
15781f4b63f8SJohn Baldwin 		len -= 4;
15791f4b63f8SJohn Baldwin 		printf("RTLD: %d ", len);
15801f4b63f8SJohn Baldwin 		while (len--)
15811f4b63f8SJohn Baldwin 			if (decimal)
15821f4b63f8SJohn Baldwin 				printf(" %d", *p++);
15831f4b63f8SJohn Baldwin 			else
15841f4b63f8SJohn Baldwin 				printf(" %02x", *p++);
15851f4b63f8SJohn Baldwin 		printf("\n");
15861f4b63f8SJohn Baldwin 	}
15871f4b63f8SJohn Baldwin }
15881f4b63f8SJohn Baldwin 
1589670b9e9fSJohn Baldwin struct utrace_malloc {
1590670b9e9fSJohn Baldwin 	void *p;
1591670b9e9fSJohn Baldwin 	size_t s;
1592670b9e9fSJohn Baldwin 	void *r;
1593670b9e9fSJohn Baldwin };
1594670b9e9fSJohn Baldwin 
1595670b9e9fSJohn Baldwin void
159681a31394SDag-Erling Smørgrav ktruser_malloc(unsigned char *p)
1597670b9e9fSJohn Baldwin {
1598670b9e9fSJohn Baldwin 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
1599670b9e9fSJohn Baldwin 
160022ce05c9SColin Percival 	if (ut->p == (void *)(intptr_t)(-1))
1601670b9e9fSJohn Baldwin 		printf("malloc_init()\n");
160222ce05c9SColin Percival 	else if (ut->s == 0)
1603670b9e9fSJohn Baldwin 		printf("free(%p)\n", ut->p);
160422ce05c9SColin Percival 	else if (ut->p == NULL)
160522ce05c9SColin Percival 		printf("%p = malloc(%zu)\n", ut->r, ut->s);
1606670b9e9fSJohn Baldwin 	else
1607670b9e9fSJohn Baldwin 		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1608670b9e9fSJohn Baldwin }
1609670b9e9fSJohn Baldwin 
161091fbb9c1SDavid Malone void
161191fbb9c1SDavid Malone ktruser(int len, unsigned char *p)
161282e2dd32SPoul-Henning Kamp {
1613670b9e9fSJohn Baldwin 
16141f4b63f8SJohn Baldwin 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
16151f4b63f8SJohn Baldwin 		ktruser_rtld(len, p);
16161f4b63f8SJohn Baldwin 		return;
16171f4b63f8SJohn Baldwin 	}
16181f4b63f8SJohn Baldwin 
1619670b9e9fSJohn Baldwin 	if (len == sizeof(struct utrace_malloc)) {
162081a31394SDag-Erling Smørgrav 		ktruser_malloc(p);
1621670b9e9fSJohn Baldwin 		return;
1622670b9e9fSJohn Baldwin 	}
1623670b9e9fSJohn Baldwin 
162409307b25SDag-Erling Smørgrav 	printf("%d ", len);
16253f8ba9aeSPoul-Henning Kamp 	while (len--)
1626743f9174SPoul-Henning Kamp 		if (decimal)
162709307b25SDag-Erling Smørgrav 			printf(" %d", *p++);
1628743f9174SPoul-Henning Kamp 		else
162909307b25SDag-Erling Smørgrav 			printf(" %02x", *p++);
163009307b25SDag-Erling Smørgrav 	printf("\n");
163182e2dd32SPoul-Henning Kamp }
163282e2dd32SPoul-Henning Kamp 
163391fbb9c1SDavid Malone void
16347008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
16357008be5bSPawel Jakub Dawidek {
16367008be5bSPawel Jakub Dawidek 
16377008be5bSPawel Jakub Dawidek 	printf("cap_rights_t ");
16387008be5bSPawel Jakub Dawidek 	capname(rightsp);
16397008be5bSPawel Jakub Dawidek 	printf("\n");
16407008be5bSPawel Jakub Dawidek }
16417008be5bSPawel Jakub Dawidek 
16427008be5bSPawel Jakub Dawidek void
164360e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
164460e15db9SDag-Erling Smørgrav {
164560e15db9SDag-Erling Smørgrav /*
164660e15db9SDag-Erling Smørgrav  TODO: Support additional address families
164760e15db9SDag-Erling Smørgrav 	#include <netnatm/natm.h>
164860e15db9SDag-Erling Smørgrav 	struct sockaddr_natm	*natm;
1649237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1650237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
165160e15db9SDag-Erling Smørgrav */
165260e15db9SDag-Erling Smørgrav 	char addr[64];
165360e15db9SDag-Erling Smørgrav 
165460e15db9SDag-Erling Smørgrav 	/*
165560e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
165660e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
165760e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
165860e15db9SDag-Erling Smørgrav 	 */
165960e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
166060e15db9SDag-Erling Smørgrav 	sockfamilyname(sa->sa_family);
166160e15db9SDag-Erling Smørgrav 	printf(", ");
166260e15db9SDag-Erling Smørgrav 
166360e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
166481a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
166560e15db9SDag-Erling Smørgrav 		printf("invalid");				\
166660e15db9SDag-Erling Smørgrav 		break;						\
166760e15db9SDag-Erling Smørgrav 	}
166860e15db9SDag-Erling Smørgrav 
166960e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
167060e15db9SDag-Erling Smørgrav 	case AF_INET: {
167181a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
167260e15db9SDag-Erling Smørgrav 
167381a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1674449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
167560e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
167681a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
167781a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
167860e15db9SDag-Erling Smørgrav 		break;
167960e15db9SDag-Erling Smørgrav 	}
168060e15db9SDag-Erling Smørgrav 	case AF_INET6: {
168181a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
168260e15db9SDag-Erling Smørgrav 
168381a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1684449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
168560e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1686b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1687b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
168881a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
168960e15db9SDag-Erling Smørgrav 		break;
169060e15db9SDag-Erling Smørgrav 	}
169160e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
169281a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
169360e15db9SDag-Erling Smørgrav 
169481a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1695449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
169681a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
169760e15db9SDag-Erling Smørgrav 		break;
169860e15db9SDag-Erling Smørgrav 	}
169960e15db9SDag-Erling Smørgrav 	default:
170060e15db9SDag-Erling Smørgrav 		printf("unknown address family");
170160e15db9SDag-Erling Smørgrav 	}
170260e15db9SDag-Erling Smørgrav 	printf(" }\n");
170360e15db9SDag-Erling Smørgrav }
170460e15db9SDag-Erling Smørgrav 
170560e15db9SDag-Erling Smørgrav void
170660e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
170760e15db9SDag-Erling Smørgrav {
170860e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
170960e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
171060e15db9SDag-Erling Smørgrav 	struct group  *grp;
171160e15db9SDag-Erling Smørgrav 	struct tm *tm;
171260e15db9SDag-Erling Smørgrav 
171360e15db9SDag-Erling Smørgrav 	/*
171460e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
171560e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
171660e15db9SDag-Erling Smørgrav 	 */
171760e15db9SDag-Erling Smørgrav 	printf("struct stat {");
171856f0ad0dSDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, ",
171956f0ad0dSDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
172056f0ad0dSDag-Erling Smørgrav 	if (resolv == 0)
172156f0ad0dSDag-Erling Smørgrav 		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
172256f0ad0dSDag-Erling Smørgrav 	else {
172360e15db9SDag-Erling Smørgrav 		strmode(statp->st_mode, mode);
172456f0ad0dSDag-Erling Smørgrav 		printf("mode=%s, ", mode);
172556f0ad0dSDag-Erling Smørgrav 	}
172656f0ad0dSDag-Erling Smørgrav 	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
17274622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
17284622f0e1SPawel Jakub Dawidek 		pwd = NULL;
17294622f0e1SPawel Jakub Dawidek 	} else {
17304622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
17314622f0e1SPawel Jakub Dawidek 		if (cappwd != NULL)
17324622f0e1SPawel Jakub Dawidek 			pwd = cap_getpwuid(cappwd, statp->st_uid);
17334622f0e1SPawel Jakub Dawidek 		else
17344622f0e1SPawel Jakub Dawidek #endif
17354622f0e1SPawel Jakub Dawidek 			pwd = getpwuid(statp->st_uid);
17364622f0e1SPawel Jakub Dawidek 	}
17374622f0e1SPawel Jakub Dawidek 	if (pwd == NULL)
173860e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
173960e15db9SDag-Erling Smørgrav 	else
174060e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
17414622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
17424622f0e1SPawel Jakub Dawidek 		grp = NULL;
17434622f0e1SPawel Jakub Dawidek 	} else {
17444622f0e1SPawel Jakub Dawidek #ifdef HAVE_LIBCAPSICUM
17454622f0e1SPawel Jakub Dawidek 		if (capgrp != NULL)
17464622f0e1SPawel Jakub Dawidek 			grp = cap_getgrgid(capgrp, statp->st_gid);
17474622f0e1SPawel Jakub Dawidek 		else
17484622f0e1SPawel Jakub Dawidek #endif
17494622f0e1SPawel Jakub Dawidek 			grp = getgrgid(statp->st_gid);
17504622f0e1SPawel Jakub Dawidek 	}
17514622f0e1SPawel Jakub Dawidek 	if (grp == NULL)
175260e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
175360e15db9SDag-Erling Smørgrav 	else
175460e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
175560e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
175660e15db9SDag-Erling Smørgrav 	printf("atime=");
175760e15db9SDag-Erling Smørgrav 	if (resolv == 0)
175899742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
175960e15db9SDag-Erling Smørgrav 	else {
176099742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
176109307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
176260e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
176360e15db9SDag-Erling Smørgrav 	}
176499742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
176599742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
176660e15db9SDag-Erling Smørgrav 	else
176760e15db9SDag-Erling Smørgrav 		printf(", ");
176860e15db9SDag-Erling Smørgrav 	printf("stime=");
176960e15db9SDag-Erling Smørgrav 	if (resolv == 0)
177099742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
177160e15db9SDag-Erling Smørgrav 	else {
177299742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
177309307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
177460e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
177560e15db9SDag-Erling Smørgrav 	}
177699742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
177799742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
177860e15db9SDag-Erling Smørgrav 	else
177960e15db9SDag-Erling Smørgrav 		printf(", ");
178060e15db9SDag-Erling Smørgrav 	printf("ctime=");
178160e15db9SDag-Erling Smørgrav 	if (resolv == 0)
178299742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
178360e15db9SDag-Erling Smørgrav 	else {
178499742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
178509307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
178660e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
178760e15db9SDag-Erling Smørgrav 	}
178899742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
178999742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
179060e15db9SDag-Erling Smørgrav 	else
179160e15db9SDag-Erling Smørgrav 		printf(", ");
179260e15db9SDag-Erling Smørgrav 	printf("birthtime=");
179360e15db9SDag-Erling Smørgrav 	if (resolv == 0)
179499742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
179560e15db9SDag-Erling Smørgrav 	else {
179699742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
179709307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
179860e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
179960e15db9SDag-Erling Smørgrav 	}
180099742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
180199742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
180260e15db9SDag-Erling Smørgrav 	else
180360e15db9SDag-Erling Smørgrav 		printf(", ");
180460e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
180560e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
180660e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
180760e15db9SDag-Erling Smørgrav 	printf(" }\n");
180860e15db9SDag-Erling Smørgrav }
180960e15db9SDag-Erling Smørgrav 
181060e15db9SDag-Erling Smørgrav void
181160e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
181260e15db9SDag-Erling Smørgrav {
181360e15db9SDag-Erling Smørgrav 	char *name, *data;
181460e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
181560e15db9SDag-Erling Smørgrav 	int i;
18167008be5bSPawel Jakub Dawidek 	cap_rights_t rights;
181730c1278fSWarner Losh 	struct stat sb;
181830c1278fSWarner Losh 	struct sockaddr_storage ss;
181960e15db9SDag-Erling Smørgrav 
182060e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
182160e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
182260e15db9SDag-Erling Smørgrav 	     ++namelen)
182360e15db9SDag-Erling Smørgrav 		/* nothing */;
182460e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
182560e15db9SDag-Erling Smørgrav 		goto invalid;
182660e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
182760e15db9SDag-Erling Smørgrav 		goto invalid;
182860e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
182960e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
183060e15db9SDag-Erling Smørgrav 	if (datalen == 0)
183160e15db9SDag-Erling Smørgrav 		goto invalid;
183260e15db9SDag-Erling Smørgrav 	/* sanity check */
183381a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
183481a31394SDag-Erling Smørgrav 		if (!isalpha(name[i]))
183560e15db9SDag-Erling Smørgrav 			goto invalid;
18367008be5bSPawel Jakub Dawidek 	if (strcmp(name, "caprights") == 0) {
18377008be5bSPawel Jakub Dawidek 		if (datalen != sizeof(cap_rights_t))
18387008be5bSPawel Jakub Dawidek 			goto invalid;
18397008be5bSPawel Jakub Dawidek 		memcpy(&rights, data, datalen);
18407008be5bSPawel Jakub Dawidek 		ktrcaprights(&rights);
18417008be5bSPawel Jakub Dawidek 	} else if (strcmp(name, "stat") == 0) {
184260e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
184360e15db9SDag-Erling Smørgrav 			goto invalid;
184430c1278fSWarner Losh 		memcpy(&sb, data, datalen);
184530c1278fSWarner Losh 		ktrstat(&sb);
184660e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
184730c1278fSWarner Losh 		if (datalen > sizeof(ss))
184860e15db9SDag-Erling Smørgrav 			goto invalid;
184930c1278fSWarner Losh 		memcpy(&ss, data, datalen);
18504b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
185130c1278fSWarner Losh 			goto invalid;
185230c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
185360e15db9SDag-Erling Smørgrav 	} else {
185460e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
185560e15db9SDag-Erling Smørgrav 	}
185660e15db9SDag-Erling Smørgrav 	return;
185760e15db9SDag-Erling Smørgrav invalid:
185860e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
185960e15db9SDag-Erling Smørgrav }
186060e15db9SDag-Erling Smørgrav 
1861c601ad8eSDag-Erling Smørgrav void
1862c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
1863c601ad8eSDag-Erling Smørgrav {
1864e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
1865e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
1866e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
1867e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
18687008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
18692c93e2a3SPawel Jakub Dawidek 		printf(", descriptor holds ");
18707008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
1871e141be6fSDag-Erling Smørgrav 		break;
1872e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
1873e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
1874e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
18757008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
187660e45df8SDag-Erling Smørgrav 		printf(" to ");
18777008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
1878e141be6fSDag-Erling Smørgrav 		break;
1879e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
1880e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
1881e141be6fSDag-Erling Smørgrav 		printf("disallowed system call");
1882e141be6fSDag-Erling Smørgrav 		break;
1883e141be6fSDag-Erling Smørgrav 	case CAPFAIL_LOOKUP:
1884e141be6fSDag-Erling Smørgrav 		/* used ".." in strict-relative mode */
1885e141be6fSDag-Erling Smørgrav 		printf("restricted VFS lookup");
1886e141be6fSDag-Erling Smørgrav 		break;
1887e141be6fSDag-Erling Smørgrav 	default:
1888e141be6fSDag-Erling Smørgrav 		printf("unknown capability failure: ");
18897008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_needed);
1890e141be6fSDag-Erling Smørgrav 		printf(" ");
18917008be5bSPawel Jakub Dawidek 		capname(&ktr->cap_held);
1892e141be6fSDag-Erling Smørgrav 		break;
1893e141be6fSDag-Erling Smørgrav 	}
189435818d2eSJohn Baldwin 	printf("\n");
189535818d2eSJohn Baldwin }
189635818d2eSJohn Baldwin 
189735818d2eSJohn Baldwin void
189835818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
189935818d2eSJohn Baldwin {
190035818d2eSJohn Baldwin 
190135818d2eSJohn Baldwin 	printf("0x%jx ", ktr->vaddr);
190235818d2eSJohn Baldwin 	vmprotname(ktr->type);
190335818d2eSJohn Baldwin 	printf("\n");
190435818d2eSJohn Baldwin }
190535818d2eSJohn Baldwin 
190635818d2eSJohn Baldwin void
190735818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
190835818d2eSJohn Baldwin {
190935818d2eSJohn Baldwin 
191035818d2eSJohn Baldwin 	vmresultname(ktr->result);
191135818d2eSJohn Baldwin 	printf("\n");
1912c601ad8eSDag-Erling Smørgrav }
1913c601ad8eSDag-Erling Smørgrav 
1914dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
1915dde5f9b9SDmitry Chagin void
1916dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr)
1917dde5f9b9SDmitry Chagin {
1918dde5f9b9SDmitry Chagin 	int narg = ktr->ktr_narg;
1919dde5f9b9SDmitry Chagin 	register_t *ip;
1920dde5f9b9SDmitry Chagin 
1921dde5f9b9SDmitry Chagin 	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
1922dde5f9b9SDmitry Chagin 		printf("[%d]", ktr->ktr_code);
1923b9034ce2SBryan Drewery 	else {
1924dde5f9b9SDmitry Chagin 		printf("%s", linux_syscallnames[ktr->ktr_code]);
1925b9034ce2SBryan Drewery 		if (syscallno)
1926b9034ce2SBryan Drewery 			printf("[%d]", ktr->ktr_code);
1927b9034ce2SBryan Drewery 	}
1928dde5f9b9SDmitry Chagin 	ip = &ktr->ktr_args[0];
1929dde5f9b9SDmitry Chagin 	if (narg) {
1930dde5f9b9SDmitry Chagin 		char c = '(';
1931dde5f9b9SDmitry Chagin 		while (narg > 0)
1932dde5f9b9SDmitry Chagin 			print_number(ip, narg, c);
1933dde5f9b9SDmitry Chagin 		putchar(')');
1934dde5f9b9SDmitry Chagin 	}
1935dde5f9b9SDmitry Chagin 	putchar('\n');
1936dde5f9b9SDmitry Chagin }
1937dde5f9b9SDmitry Chagin 
1938dde5f9b9SDmitry Chagin void
1939dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr)
1940dde5f9b9SDmitry Chagin {
1941dde5f9b9SDmitry Chagin 	register_t ret = ktr->ktr_retval;
1942dde5f9b9SDmitry Chagin 	int error = ktr->ktr_error;
1943dde5f9b9SDmitry Chagin 	int code = ktr->ktr_code;
1944dde5f9b9SDmitry Chagin 
1945dde5f9b9SDmitry Chagin 	if (code >= nlinux_syscalls || code < 0)
1946dde5f9b9SDmitry Chagin 		printf("[%d] ", code);
1947b9034ce2SBryan Drewery 	else {
1948dde5f9b9SDmitry Chagin 		printf("%s", linux_syscallnames[code]);
1949b9034ce2SBryan Drewery 		if (syscallno)
1950b9034ce2SBryan Drewery 			printf("[%d]", code);
1951b9034ce2SBryan Drewery 		printf(" ");
1952b9034ce2SBryan Drewery 	}
1953dde5f9b9SDmitry Chagin 
1954dde5f9b9SDmitry Chagin 	if (error == 0) {
1955dde5f9b9SDmitry Chagin 		if (fancy) {
1956dde5f9b9SDmitry Chagin 			printf("%ld", (long)ret);
1957dde5f9b9SDmitry Chagin 			if (ret < 0 || ret > 9)
195809307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
1959dde5f9b9SDmitry Chagin 		} else {
1960dde5f9b9SDmitry Chagin 			if (decimal)
1961dde5f9b9SDmitry Chagin 				printf("%ld", (long)ret);
1962dde5f9b9SDmitry Chagin 			else
196309307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
1964dde5f9b9SDmitry Chagin 		}
1965dde5f9b9SDmitry Chagin 	} else if (error == ERESTART)
1966dde5f9b9SDmitry Chagin 		printf("RESTART");
1967dde5f9b9SDmitry Chagin 	else if (error == EJUSTRETURN)
1968dde5f9b9SDmitry Chagin 		printf("JUSTRETURN");
1969dde5f9b9SDmitry Chagin 	else {
1970dde5f9b9SDmitry Chagin 		if (ktr->ktr_error <= ELAST + 1)
1971dde5f9b9SDmitry Chagin 			error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1972dde5f9b9SDmitry Chagin 		else
1973dde5f9b9SDmitry Chagin 			error = 999;
1974dde5f9b9SDmitry Chagin 		printf("-1 errno %d", error);
1975dde5f9b9SDmitry Chagin 		if (fancy)
1976dde5f9b9SDmitry Chagin 			printf(" %s", strerror(ktr->ktr_error));
1977dde5f9b9SDmitry Chagin 	}
1978dde5f9b9SDmitry Chagin 	putchar('\n');
1979dde5f9b9SDmitry Chagin }
1980dde5f9b9SDmitry Chagin #endif
1981dde5f9b9SDmitry Chagin 
198260e15db9SDag-Erling Smørgrav void
198391fbb9c1SDavid Malone usage(void)
19849b50d902SRodney W. Grimes {
1985b9034ce2SBryan Drewery 	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
1986da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
19879b50d902SRodney W. Grimes 	exit(1);
19889b50d902SRodney W. Grimes }
1989