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(<ime); 203e14da991SPawel Jakub Dawidek (void)localtime(<ime); 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