19b50d902SRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni *
49b50d902SRodney W. Grimes * Copyright (c) 1988, 1993
59b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved.
69b50d902SRodney W. Grimes *
79b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without
89b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions
99b50d902SRodney W. Grimes * are met:
109b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright
119b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer.
129b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright
139b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the
149b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors
169b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software
179b50d902SRodney W. Grimes * without specific prior written permission.
189b50d902SRodney W. Grimes *
199b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
209b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
239b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299b50d902SRodney W. Grimes * SUCH DAMAGE.
309b50d902SRodney W. Grimes */
319b50d902SRodney W. Grimes
32406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO
33ffb66079SJohn Baldwin #ifdef __LP64__
34ffb66079SJohn Baldwin #define _WANT_KEVENT32
35ffb66079SJohn Baldwin #endif
36ffb66079SJohn Baldwin #define _WANT_FREEBSD11_KEVENT
37586ed321SDmitry Chagin #define _WANT_FREEBSD_BITSET
389b50d902SRodney W. Grimes #include <sys/param.h>
39b881b8beSRobert Watson #include <sys/capsicum.h>
40586ed321SDmitry Chagin #include <sys/_bitset.h>
41586ed321SDmitry Chagin #include <sys/bitset.h>
429b50d902SRodney W. Grimes #include <sys/errno.h>
439b50d902SRodney W. Grimes #include <sys/time.h>
449b50d902SRodney W. Grimes #include <sys/uio.h>
45ffb66079SJohn Baldwin #include <sys/event.h>
469b50d902SRodney W. Grimes #include <sys/ktrace.h>
47550bec4fSKyle Evans #include <sys/mman.h>
489b50d902SRodney W. Grimes #include <sys/ioctl.h>
4902c57f7bSKyle Evans #include <sys/poll.h>
508bc31d83SCraig Rodrigues #include <sys/socket.h>
5160e15db9SDag-Erling Smørgrav #include <sys/stat.h>
527144d36fSDmitry Chagin #include <sys/sysent.h>
53fdb5bf37SJohn Baldwin #include <sys/umtx.h>
5460e15db9SDag-Erling Smørgrav #include <sys/un.h>
557144d36fSDmitry Chagin #include <sys/queue.h>
5634763d1cSJohn Baldwin #include <sys/wait.h>
572560d181SMariusz Zaborski #ifdef WITH_CASPER
58c36e54bbSMariusz Zaborski #include <sys/nv.h>
59c36e54bbSMariusz Zaborski #endif
601a604cfaSXin LI #include <arpa/inet.h>
6160e15db9SDag-Erling Smørgrav #include <netinet/in.h>
621a604cfaSXin LI #include <ctype.h>
63a4e3fc54SMariusz Zaborski #include <capsicum_helpers.h>
6415fc002bSPhilippe Charnier #include <err.h>
6560e15db9SDag-Erling Smørgrav #include <grp.h>
6660e15db9SDag-Erling Smørgrav #include <inttypes.h>
6715fc002bSPhilippe Charnier #include <locale.h>
68b9ef8051SAndrey V. Elsukov #include <netdb.h>
69f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
7060e15db9SDag-Erling Smørgrav #include <pwd.h>
7171ed318eSJohn Baldwin #include <stddef.h>
729b50d902SRodney W. Grimes #include <stdio.h>
739b50d902SRodney W. Grimes #include <stdlib.h>
749b50d902SRodney W. Grimes #include <string.h>
75d6fb4894SJohn Baldwin #include <sysdecode.h>
7660e15db9SDag-Erling Smørgrav #include <time.h>
7715fc002bSPhilippe Charnier #include <unistd.h>
7815fc002bSPhilippe Charnier #include <vis.h>
799b50d902SRodney W. Grimes #include "ktrace.h"
808b8e2e8fSDmitry Chagin #include "kdump.h"
819b50d902SRodney W. Grimes
822560d181SMariusz Zaborski #ifdef WITH_CASPER
83c501d73cSMariusz Zaborski #include <libcasper.h>
84c501d73cSMariusz Zaborski
85c501d73cSMariusz Zaborski #include <casper/cap_grp.h>
86c501d73cSMariusz Zaborski #include <casper/cap_pwd.h>
87c501d73cSMariusz Zaborski #endif
88c501d73cSMariusz Zaborski
897144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
907cf2ca3bSJohn Baldwin u_int findabi(struct ktr_header *);
9191fbb9c1SDavid Malone int fread_tail(void *, int, int);
927cf2ca3bSJohn Baldwin void dumpheader(struct ktr_header *, u_int);
93fc90f3a2SDmitry Chagin void dumptimeval(struct ktr_header_v0 *kth);
94fc90f3a2SDmitry Chagin void dumptimespec(struct ktr_header *kth);
957144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
967144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9791fbb9c1SDavid Malone void ktrnamei(char *, int);
98ec4beb5dSPeter Wemm void hexdump(char *, int, int);
99ec4beb5dSPeter Wemm void visdump(char *, int, int);
10091fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
101dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10291fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10388bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
104bb1a2d4aSJohn Baldwin void ktruser(int, void *);
1057008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
106de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it);
10760e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10860e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
10960e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
110c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11135818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11235818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
113ffb66079SJohn Baldwin void ktrkevent(struct kevent *);
11402c57f7bSKyle Evans void ktrpollfd(struct pollfd *);
115ffb66079SJohn Baldwin void ktrstructarray(struct ktr_struct_array *, size_t);
116586ed321SDmitry Chagin void ktrbitset(char *, struct bitset *, size_t);
1178a0f6d8cSDmitry Chagin void ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip,
1188a0f6d8cSDmitry Chagin int *resnarg, char *resc, u_int sv_flags);
11991fbb9c1SDavid Malone void usage(void);
12091fbb9c1SDavid Malone
121c1269d20SMaxim Sobolev #define TIMESTAMP_NONE 0x0
122c1269d20SMaxim Sobolev #define TIMESTAMP_ABSOLUTE 0x1
123c1269d20SMaxim Sobolev #define TIMESTAMP_ELAPSED 0x2
124c1269d20SMaxim Sobolev #define TIMESTAMP_RELATIVE 0x4
125c1269d20SMaxim Sobolev
1268b8e2e8fSDmitry Chagin bool decimal, fancy = true, resolv;
127fc90f3a2SDmitry Chagin static bool abiflag, suppressdata, syscallno, tail, threads, cpuflag;
1285cb9940cSJohn Baldwin static int timestamp, maxdata;
129bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE;
130bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header;
131fc90f3a2SDmitry Chagin static short version;
1329b50d902SRodney W. Grimes
13360e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y"
1349b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0)
1359b50d902SRodney W. Grimes
1367144d36fSDmitry Chagin struct proc_info
1377144d36fSDmitry Chagin {
1387144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info;
1397144d36fSDmitry Chagin u_int sv_flags;
1407144d36fSDmitry Chagin pid_t pid;
1417144d36fSDmitry Chagin };
1427144d36fSDmitry Chagin
143bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1447144d36fSDmitry Chagin
1452560d181SMariusz Zaborski #ifdef WITH_CASPER
1464622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp;
1474622f0e1SPawel Jakub Dawidek
1484622f0e1SPawel Jakub Dawidek static int
cappwdgrp_setup(cap_channel_t ** cappwdp,cap_channel_t ** capgrpp)1494622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
1504622f0e1SPawel Jakub Dawidek {
1514622f0e1SPawel Jakub Dawidek cap_channel_t *capcas, *cappwdloc, *capgrploc;
1524622f0e1SPawel Jakub Dawidek const char *cmds[1], *fields[1];
1534622f0e1SPawel Jakub Dawidek
1544622f0e1SPawel Jakub Dawidek capcas = cap_init();
1554622f0e1SPawel Jakub Dawidek if (capcas == NULL) {
156c501d73cSMariusz Zaborski err(1, "unable to create casper process");
157c501d73cSMariusz Zaborski exit(1);
1584622f0e1SPawel Jakub Dawidek }
1594622f0e1SPawel Jakub Dawidek cappwdloc = cap_service_open(capcas, "system.pwd");
1604622f0e1SPawel Jakub Dawidek capgrploc = cap_service_open(capcas, "system.grp");
1614622f0e1SPawel Jakub Dawidek /* Casper capability no longer needed. */
1624622f0e1SPawel Jakub Dawidek cap_close(capcas);
1634622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL || capgrploc == NULL) {
1644622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL)
1654622f0e1SPawel Jakub Dawidek warn("unable to open system.pwd service");
1664622f0e1SPawel Jakub Dawidek if (capgrploc == NULL)
1674622f0e1SPawel Jakub Dawidek warn("unable to open system.grp service");
1688ff3952bSPawel Jakub Dawidek exit(1);
1694622f0e1SPawel Jakub Dawidek }
1704622f0e1SPawel Jakub Dawidek /* Limit system.pwd to only getpwuid() function and pw_name field. */
1714622f0e1SPawel Jakub Dawidek cmds[0] = "getpwuid";
1728ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
1738ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service");
1744622f0e1SPawel Jakub Dawidek fields[0] = "pw_name";
1758ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
1768ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service");
1774622f0e1SPawel Jakub Dawidek /* Limit system.grp to only getgrgid() function and gr_name field. */
1784622f0e1SPawel Jakub Dawidek cmds[0] = "getgrgid";
1798ff3952bSPawel Jakub Dawidek if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
1808ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service");
1814622f0e1SPawel Jakub Dawidek fields[0] = "gr_name";
1828ff3952bSPawel Jakub Dawidek if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
1838ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service");
1844622f0e1SPawel Jakub Dawidek
1854622f0e1SPawel Jakub Dawidek *cappwdp = cappwdloc;
1864622f0e1SPawel Jakub Dawidek *capgrpp = capgrploc;
1874622f0e1SPawel Jakub Dawidek return (0);
1884622f0e1SPawel Jakub Dawidek }
1892560d181SMariusz Zaborski #endif /* WITH_CASPER */
1904622f0e1SPawel Jakub Dawidek
1918b8e2e8fSDmitry Chagin void
print_integer_arg(const char * (* decoder)(int),int value)1929289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value)
1939289f547SJohn Baldwin {
1949289f547SJohn Baldwin const char *str;
1959289f547SJohn Baldwin
1969289f547SJohn Baldwin str = decoder(value);
1979289f547SJohn Baldwin if (str != NULL)
1989289f547SJohn Baldwin printf("%s", str);
1999289f547SJohn Baldwin else {
2009289f547SJohn Baldwin if (decimal)
2019289f547SJohn Baldwin printf("<invalid=%d>", value);
2029289f547SJohn Baldwin else
2039289f547SJohn Baldwin printf("<invalid=%#x>", value);
2049289f547SJohn Baldwin }
2059289f547SJohn Baldwin }
2069289f547SJohn Baldwin
2079289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */
2088b8e2e8fSDmitry Chagin void
print_integer_arg_valid(const char * (* decoder)(int),int value)2099289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value)
2109289f547SJohn Baldwin {
2119289f547SJohn Baldwin const char *str;
2129289f547SJohn Baldwin
2139289f547SJohn Baldwin str = decoder(value);
2149289f547SJohn Baldwin if (str != NULL)
2159289f547SJohn Baldwin printf("%s", str);
2169289f547SJohn Baldwin else {
2179289f547SJohn Baldwin if (decimal)
2189289f547SJohn Baldwin printf("%d", value);
2199289f547SJohn Baldwin else
2209289f547SJohn Baldwin printf("%#x", value);
2219289f547SJohn Baldwin }
2229289f547SJohn Baldwin }
2239289f547SJohn Baldwin
2248b8e2e8fSDmitry Chagin bool
print_mask_arg_part(bool (* decoder)(FILE *,int,int *),int value,int * rem)225c2679dd7SKyle Evans print_mask_arg_part(bool (*decoder)(FILE *, int, int *), int value, int *rem)
226c2679dd7SKyle Evans {
227c2679dd7SKyle Evans
228c2679dd7SKyle Evans printf("%#x<", value);
229c2679dd7SKyle Evans return (decoder(stdout, value, rem));
230c2679dd7SKyle Evans }
231c2679dd7SKyle Evans
2328b8e2e8fSDmitry Chagin void
print_mask_arg(bool (* decoder)(FILE *,int,int *),int value)2339289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
2349289f547SJohn Baldwin {
2359289f547SJohn Baldwin bool invalid;
2369289f547SJohn Baldwin int rem;
2379289f547SJohn Baldwin
238c2679dd7SKyle Evans invalid = !print_mask_arg_part(decoder, value, &rem);
2399289f547SJohn Baldwin printf(">");
2409289f547SJohn Baldwin if (invalid)
2419289f547SJohn Baldwin printf("<invalid>%u", rem);
2429289f547SJohn Baldwin }
2439289f547SJohn Baldwin
2448b8e2e8fSDmitry Chagin void
print_mask_arg0(bool (* decoder)(FILE *,int,int *),int value)2459289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
2469289f547SJohn Baldwin {
2479289f547SJohn Baldwin bool invalid;
2489289f547SJohn Baldwin int rem;
2499289f547SJohn Baldwin
2509289f547SJohn Baldwin if (value == 0) {
2519289f547SJohn Baldwin printf("0");
2529289f547SJohn Baldwin return;
2539289f547SJohn Baldwin }
2549289f547SJohn Baldwin printf("%#x<", value);
2559289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem);
2569289f547SJohn Baldwin printf(">");
2579289f547SJohn Baldwin if (invalid)
2589289f547SJohn Baldwin printf("<invalid>%u", rem);
2599289f547SJohn Baldwin }
2609289f547SJohn Baldwin
2619289f547SJohn Baldwin static void
decode_fileflags(fflags_t value)2629289f547SJohn Baldwin decode_fileflags(fflags_t value)
2639289f547SJohn Baldwin {
2649289f547SJohn Baldwin bool invalid;
2659289f547SJohn Baldwin fflags_t rem;
2669289f547SJohn Baldwin
2679289f547SJohn Baldwin if (value == 0) {
2689289f547SJohn Baldwin printf("0");
2699289f547SJohn Baldwin return;
2709289f547SJohn Baldwin }
2719289f547SJohn Baldwin printf("%#x<", value);
2729289f547SJohn Baldwin invalid = !sysdecode_fileflags(stdout, value, &rem);
2739289f547SJohn Baldwin printf(">");
2749289f547SJohn Baldwin if (invalid)
2759289f547SJohn Baldwin printf("<invalid>%u", rem);
2769289f547SJohn Baldwin }
2779289f547SJohn Baldwin
278ed2f123aSDmitry Chagin void
decode_filemode(int value)2799289f547SJohn Baldwin decode_filemode(int value)
2809289f547SJohn Baldwin {
2819289f547SJohn Baldwin bool invalid;
2829289f547SJohn Baldwin int rem;
2839289f547SJohn Baldwin
2849289f547SJohn Baldwin if (value == 0) {
2859289f547SJohn Baldwin printf("0");
2869289f547SJohn Baldwin return;
2879289f547SJohn Baldwin }
2889289f547SJohn Baldwin printf("%#o<", value);
2899289f547SJohn Baldwin invalid = !sysdecode_filemode(stdout, value, &rem);
2909289f547SJohn Baldwin printf(">");
2919289f547SJohn Baldwin if (invalid)
2929289f547SJohn Baldwin printf("<invalid>%u", rem);
2939289f547SJohn Baldwin }
2949289f547SJohn Baldwin
2958b8e2e8fSDmitry Chagin void
print_mask_arg32(bool (* decoder)(FILE *,uint32_t,uint32_t *),uint32_t value)2969289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
2979289f547SJohn Baldwin {
2989289f547SJohn Baldwin bool invalid;
2999289f547SJohn Baldwin uint32_t rem;
3009289f547SJohn Baldwin
3019289f547SJohn Baldwin printf("%#x<", value);
3029289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem);
3039289f547SJohn Baldwin printf(">");
3049289f547SJohn Baldwin if (invalid)
3059289f547SJohn Baldwin printf("<invalid>%u", rem);
3069289f547SJohn Baldwin }
3079289f547SJohn Baldwin
3088b8e2e8fSDmitry Chagin void
print_mask_argul(bool (* decoder)(FILE *,u_long,u_long *),u_long value)3099289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
3109289f547SJohn Baldwin {
3119289f547SJohn Baldwin bool invalid;
3129289f547SJohn Baldwin u_long rem;
3139289f547SJohn Baldwin
3149289f547SJohn Baldwin if (value == 0) {
3159289f547SJohn Baldwin printf("0");
3169289f547SJohn Baldwin return;
3179289f547SJohn Baldwin }
3189289f547SJohn Baldwin printf("%#lx<", value);
3199289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem);
3209289f547SJohn Baldwin printf(">");
3219289f547SJohn Baldwin if (invalid)
3229289f547SJohn Baldwin printf("<invalid>%lu", rem);
3239289f547SJohn Baldwin }
3249289f547SJohn Baldwin
32591fbb9c1SDavid Malone int
main(int argc,char * argv[])32691fbb9c1SDavid Malone main(int argc, char *argv[])
3279b50d902SRodney W. Grimes {
3289b50d902SRodney W. Grimes int ch, ktrlen, size;
32991fbb9c1SDavid Malone void *m;
3309b50d902SRodney W. Grimes int trpoints = ALL_POINTS;
331db53f66bSJohn Baldwin int drop_logged;
332ec4beb5dSPeter Wemm pid_t pid = 0;
3337144d36fSDmitry Chagin u_int sv_flags;
3349b50d902SRodney W. Grimes
33509307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, "");
3365ccbfb26SAndrey A. Chernov
337c1269d20SMaxim Sobolev timestamp = TIMESTAMP_NONE;
338c1269d20SMaxim Sobolev
339fc90f3a2SDmitry Chagin while ((ch = getopt(argc,argv,"f:cdElm:np:AHRrSsTt:")) != -1)
34009307b25SDag-Erling Smørgrav switch (ch) {
3417144d36fSDmitry Chagin case 'A':
3425cb9940cSJohn Baldwin abiflag = true;
3437144d36fSDmitry Chagin break;
3449b50d902SRodney W. Grimes case 'f':
3459b50d902SRodney W. Grimes tracefile = optarg;
3469b50d902SRodney W. Grimes break;
347fc90f3a2SDmitry Chagin case 'c':
348fc90f3a2SDmitry Chagin cpuflag = true;
349fc90f3a2SDmitry Chagin break;
3509b50d902SRodney W. Grimes case 'd':
3515cb9940cSJohn Baldwin decimal = true;
3529b50d902SRodney W. Grimes break;
3539b50d902SRodney W. Grimes case 'l':
3545cb9940cSJohn Baldwin tail = true;
3559b50d902SRodney W. Grimes break;
3569b50d902SRodney W. Grimes case 'm':
3579b50d902SRodney W. Grimes maxdata = atoi(optarg);
3589b50d902SRodney W. Grimes break;
3599b50d902SRodney W. Grimes case 'n':
3605cb9940cSJohn Baldwin fancy = false;
3619b50d902SRodney W. Grimes break;
362ec4beb5dSPeter Wemm case 'p':
363ec4beb5dSPeter Wemm pid = atoi(optarg);
364ec4beb5dSPeter Wemm break;
36560e15db9SDag-Erling Smørgrav case 'r':
3665cb9940cSJohn Baldwin resolv = true;
36760e15db9SDag-Erling Smørgrav break;
368b9034ce2SBryan Drewery case 'S':
3695cb9940cSJohn Baldwin syscallno = true;
370b9034ce2SBryan Drewery break;
371df0c8868SRobert Watson case 's':
3725cb9940cSJohn Baldwin suppressdata = true;
373df0c8868SRobert Watson break;
374ec131914SPeter Wemm case 'E':
375c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ELAPSED;
376ec131914SPeter Wemm break;
377a9ac598bSRobert Watson case 'H':
3785cb9940cSJohn Baldwin threads = true;
379a9ac598bSRobert Watson break;
3809b50d902SRodney W. Grimes case 'R':
381c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_RELATIVE;
3829b50d902SRodney W. Grimes break;
3839b50d902SRodney W. Grimes case 'T':
384c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ABSOLUTE;
3859b50d902SRodney W. Grimes break;
3869b50d902SRodney W. Grimes case 't':
3879b50d902SRodney W. Grimes trpoints = getpoints(optarg);
38815fc002bSPhilippe Charnier if (trpoints < 0)
38915fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg);
3909b50d902SRodney W. Grimes break;
3919b50d902SRodney W. Grimes default:
3929b50d902SRodney W. Grimes usage();
3939b50d902SRodney W. Grimes }
3949b50d902SRodney W. Grimes
39580844fd1SBill Fenner if (argc > optind)
3969b50d902SRodney W. Grimes usage();
3979b50d902SRodney W. Grimes
39809307b25SDag-Erling Smørgrav m = malloc(size = 1025);
39915fc002bSPhilippe Charnier if (m == NULL)
40015fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM));
4019d0fa50eSSimon J. Gerraty if (strcmp(tracefile, "-") != 0)
40215fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin))
40315fc002bSPhilippe Charnier err(1, "%s", tracefile);
404f9b20fc8SPawel Jakub Dawidek
405c5033697SMariusz Zaborski caph_cache_catpages();
406c5033697SMariusz Zaborski caph_cache_tzdata();
407c5033697SMariusz Zaborski
4082560d181SMariusz Zaborski #ifdef WITH_CASPER
4095cb9940cSJohn Baldwin if (resolv) {
4104622f0e1SPawel Jakub Dawidek if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
4114622f0e1SPawel Jakub Dawidek cappwd = NULL;
4124622f0e1SPawel Jakub Dawidek capgrp = NULL;
4134622f0e1SPawel Jakub Dawidek }
4144622f0e1SPawel Jakub Dawidek }
4155cb9940cSJohn Baldwin if (!resolv || (cappwd != NULL && capgrp != NULL)) {
4167672a014SMariusz Zaborski if (caph_enter() < 0)
4174622f0e1SPawel Jakub Dawidek err(1, "unable to enter capability mode");
4184622f0e1SPawel Jakub Dawidek }
4194622f0e1SPawel Jakub Dawidek #else
4205cb9940cSJohn Baldwin if (!resolv) {
4217672a014SMariusz Zaborski if (caph_enter() < 0)
422f9b20fc8SPawel Jakub Dawidek err(1, "unable to enter capability mode");
423d2c9ca44SPawel Jakub Dawidek }
4244622f0e1SPawel Jakub Dawidek #endif
425a4e3fc54SMariusz Zaborski if (caph_limit_stdio() == -1)
426a4e3fc54SMariusz Zaborski err(1, "unable to limit stdio");
427f9b20fc8SPawel Jakub Dawidek
4287144d36fSDmitry Chagin TAILQ_INIT(&trace_procs);
429db53f66bSJohn Baldwin drop_logged = 0;
4309b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
431fc90f3a2SDmitry Chagin if (ktr_header.ktr_type & KTR_VERSIONED) {
432fc90f3a2SDmitry Chagin ktr_header.ktr_type &= ~KTR_VERSIONED;
433fc90f3a2SDmitry Chagin version = ktr_header.ktr_version;
434fc90f3a2SDmitry Chagin } else
435fc90f3a2SDmitry Chagin version = KTR_VERSION0;
436db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) {
437db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP;
438a9ac598bSRobert Watson if (!drop_logged && threads) {
43909307b25SDag-Erling Smørgrav printf(
440bb239328SBrooks Davis "%6d %6d %-8.*s Events dropped.\n",
441bb239328SBrooks Davis ktr_header.ktr_pid,
442c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ?
443bb239328SBrooks Davis (lwpid_t)ktr_header.ktr_tid : 0,
444c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm);
445a9ac598bSRobert Watson drop_logged = 1;
446a9ac598bSRobert Watson } else if (!drop_logged) {
447bb239328SBrooks Davis printf("%6d %-8.*s Events dropped.\n",
448bb239328SBrooks Davis ktr_header.ktr_pid, MAXCOMLEN,
449db53f66bSJohn Baldwin ktr_header.ktr_comm);
450db53f66bSJohn Baldwin drop_logged = 1;
451db53f66bSJohn Baldwin }
452db53f66bSJohn Baldwin }
45315fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0)
45415fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen);
4559b50d902SRodney W. Grimes if (ktrlen > size) {
45609307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1);
45715fc002bSPhilippe Charnier if (m == NULL)
45815fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM));
4599b50d902SRodney W. Grimes size = ktrlen;
4609b50d902SRodney W. Grimes }
461fc90f3a2SDmitry Chagin if (version == KTR_VERSION0 &&
462fc90f3a2SDmitry Chagin fseek(stdin, KTR_OFFSET_V0, SEEK_CUR) < 0)
463fc90f3a2SDmitry Chagin errx(1, "%s", strerror(errno));
46415fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
46515fc002bSPhilippe Charnier errx(1, "data too short");
4667144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
4677144d36fSDmitry Chagin continue;
46801a36e29SJohn Baldwin if (pid && ktr_header.ktr_pid != pid &&
46901a36e29SJohn Baldwin ktr_header.ktr_tid != pid)
470ec4beb5dSPeter Wemm continue;
4719b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
4729b50d902SRodney W. Grimes continue;
4737cf2ca3bSJohn Baldwin sv_flags = findabi(&ktr_header);
4747cf2ca3bSJohn Baldwin dumpheader(&ktr_header, sv_flags);
475db53f66bSJohn Baldwin drop_logged = 0;
4769b50d902SRodney W. Grimes switch (ktr_header.ktr_type) {
4779b50d902SRodney W. Grimes case KTR_SYSCALL:
4787144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags);
4799b50d902SRodney W. Grimes break;
4809b50d902SRodney W. Grimes case KTR_SYSRET:
4817144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags);
4829b50d902SRodney W. Grimes break;
4839b50d902SRodney W. Grimes case KTR_NAMEI:
484a56be37eSJohn Baldwin case KTR_SYSCTL:
4859b50d902SRodney W. Grimes ktrnamei(m, ktrlen);
4869b50d902SRodney W. Grimes break;
4879b50d902SRodney W. Grimes case KTR_GENIO:
4889b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen);
4899b50d902SRodney W. Grimes break;
4909b50d902SRodney W. Grimes case KTR_PSIG:
491dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m);
4929b50d902SRodney W. Grimes break;
4939b50d902SRodney W. Grimes case KTR_CSW:
49488bf5036SJohn Baldwin if (ktrlen == sizeof(struct ktr_csw_old))
49588bf5036SJohn Baldwin ktrcsw_old((struct ktr_csw_old *)m);
49688bf5036SJohn Baldwin else
4979b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m);
4989b50d902SRodney W. Grimes break;
49982e2dd32SPoul-Henning Kamp case KTR_USER:
5003f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m);
50182e2dd32SPoul-Henning Kamp break;
50260e15db9SDag-Erling Smørgrav case KTR_STRUCT:
50360e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen);
50460e15db9SDag-Erling Smørgrav break;
505c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL:
506c601ad8eSDag-Erling Smørgrav ktrcapfail((struct ktr_cap_fail *)m);
50735818d2eSJohn Baldwin break;
50835818d2eSJohn Baldwin case KTR_FAULT:
50935818d2eSJohn Baldwin ktrfault((struct ktr_fault *)m);
51035818d2eSJohn Baldwin break;
51135818d2eSJohn Baldwin case KTR_FAULTEND:
51235818d2eSJohn Baldwin ktrfaultend((struct ktr_faultend *)m);
51335818d2eSJohn Baldwin break;
514ffb66079SJohn Baldwin case KTR_STRUCT_ARRAY:
515ffb66079SJohn Baldwin ktrstructarray((struct ktr_struct_array *)m, ktrlen);
516ffb66079SJohn Baldwin break;
517b9609ab1SJohn Baldwin default:
518b9609ab1SJohn Baldwin printf("\n");
519b9609ab1SJohn Baldwin break;
5209b50d902SRodney W. Grimes }
5219b50d902SRodney W. Grimes if (tail)
52209307b25SDag-Erling Smørgrav fflush(stdout);
5239b50d902SRodney W. Grimes }
52491fbb9c1SDavid Malone return 0;
5259b50d902SRodney W. Grimes }
5269b50d902SRodney W. Grimes
52791fbb9c1SDavid Malone int
fread_tail(void * buf,int size,int num)52891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
5299b50d902SRodney W. Grimes {
5309b50d902SRodney W. Grimes int i;
5319b50d902SRodney W. Grimes
5329b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
53309307b25SDag-Erling Smørgrav sleep(1);
5349b50d902SRodney W. Grimes clearerr(stdin);
5359b50d902SRodney W. Grimes }
5369b50d902SRodney W. Grimes return (i);
5379b50d902SRodney W. Grimes }
5389b50d902SRodney W. Grimes
5397144d36fSDmitry Chagin int
fetchprocinfo(struct ktr_header * kth,u_int * flags)5407144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
5417144d36fSDmitry Chagin {
5427144d36fSDmitry Chagin struct proc_info *pi;
5437144d36fSDmitry Chagin
5447144d36fSDmitry Chagin switch (kth->ktr_type) {
5457144d36fSDmitry Chagin case KTR_PROCCTOR:
5467144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) {
5477144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) {
5487144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info);
5497144d36fSDmitry Chagin break;
5507144d36fSDmitry Chagin }
5517144d36fSDmitry Chagin }
5527144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info));
5537144d36fSDmitry Chagin if (pi == NULL)
5547144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM));
5557144d36fSDmitry Chagin pi->sv_flags = *flags;
5567144d36fSDmitry Chagin pi->pid = kth->ktr_pid;
5577144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info);
5587144d36fSDmitry Chagin return (1);
5597144d36fSDmitry Chagin
5607144d36fSDmitry Chagin case KTR_PROCDTOR:
5617144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) {
5627144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) {
5637144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info);
5647144d36fSDmitry Chagin free(pi);
5657144d36fSDmitry Chagin break;
5667144d36fSDmitry Chagin }
5677144d36fSDmitry Chagin }
5687144d36fSDmitry Chagin return (1);
5697144d36fSDmitry Chagin }
5707144d36fSDmitry Chagin
5717144d36fSDmitry Chagin return (0);
5727144d36fSDmitry Chagin }
5737144d36fSDmitry Chagin
5747144d36fSDmitry Chagin u_int
findabi(struct ktr_header * kth)5757cf2ca3bSJohn Baldwin findabi(struct ktr_header *kth)
5767144d36fSDmitry Chagin {
5777144d36fSDmitry Chagin struct proc_info *pi;
5787144d36fSDmitry Chagin
5797144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) {
5807144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) {
5817cf2ca3bSJohn Baldwin return (pi->sv_flags);
5827144d36fSDmitry Chagin }
5837144d36fSDmitry Chagin }
5847cf2ca3bSJohn Baldwin return (0);
5857144d36fSDmitry Chagin }
5867144d36fSDmitry Chagin
58791fbb9c1SDavid Malone void
dumptimeval(struct ktr_header_v0 * kth)588fc90f3a2SDmitry Chagin dumptimeval(struct ktr_header_v0 *kth)
589fc90f3a2SDmitry Chagin {
590fc90f3a2SDmitry Chagin static struct timeval prevtime, prevtime_e;
591fc90f3a2SDmitry Chagin struct timeval temp;
592fc90f3a2SDmitry Chagin const char *sign;
593fc90f3a2SDmitry Chagin
594fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_ABSOLUTE) {
595fc90f3a2SDmitry Chagin printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
596fc90f3a2SDmitry Chagin kth->ktr_time.tv_usec);
597fc90f3a2SDmitry Chagin }
598fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_ELAPSED) {
599fc90f3a2SDmitry Chagin if (prevtime_e.tv_sec == 0)
600fc90f3a2SDmitry Chagin prevtime_e = kth->ktr_time;
601fc90f3a2SDmitry Chagin timersub(&kth->ktr_time, &prevtime_e, &temp);
602fc90f3a2SDmitry Chagin printf("%jd.%06ld ", (intmax_t)temp.tv_sec,
603fc90f3a2SDmitry Chagin temp.tv_usec);
604fc90f3a2SDmitry Chagin }
605fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_RELATIVE) {
606fc90f3a2SDmitry Chagin if (prevtime.tv_sec == 0)
607fc90f3a2SDmitry Chagin prevtime = kth->ktr_time;
608fc90f3a2SDmitry Chagin if (timercmp(&kth->ktr_time, &prevtime, <)) {
609fc90f3a2SDmitry Chagin timersub(&prevtime, &kth->ktr_time, &temp);
610fc90f3a2SDmitry Chagin sign = "-";
611fc90f3a2SDmitry Chagin } else {
612fc90f3a2SDmitry Chagin timersub(&kth->ktr_time, &prevtime, &temp);
613fc90f3a2SDmitry Chagin sign = "";
614fc90f3a2SDmitry Chagin }
615fc90f3a2SDmitry Chagin prevtime = kth->ktr_time;
616fc90f3a2SDmitry Chagin printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec,
617fc90f3a2SDmitry Chagin temp.tv_usec);
618fc90f3a2SDmitry Chagin }
619fc90f3a2SDmitry Chagin }
620fc90f3a2SDmitry Chagin
621fc90f3a2SDmitry Chagin void
dumptimespec(struct ktr_header * kth)622fc90f3a2SDmitry Chagin dumptimespec(struct ktr_header *kth)
623fc90f3a2SDmitry Chagin {
624fc90f3a2SDmitry Chagin static struct timespec prevtime, prevtime_e;
625fc90f3a2SDmitry Chagin struct timespec temp;
626fc90f3a2SDmitry Chagin const char *sign;
627fc90f3a2SDmitry Chagin
628fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_ABSOLUTE) {
629fc90f3a2SDmitry Chagin printf("%jd.%09ld ", (intmax_t)kth->ktr_time.tv_sec,
630fc90f3a2SDmitry Chagin kth->ktr_time.tv_nsec);
631fc90f3a2SDmitry Chagin }
632fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_ELAPSED) {
633fc90f3a2SDmitry Chagin if (prevtime_e.tv_sec == 0)
634fc90f3a2SDmitry Chagin prevtime_e = kth->ktr_time;
635fc90f3a2SDmitry Chagin timespecsub(&kth->ktr_time, &prevtime_e, &temp);
636fc90f3a2SDmitry Chagin printf("%jd.%09ld ", (intmax_t)temp.tv_sec,
637fc90f3a2SDmitry Chagin temp.tv_nsec);
638fc90f3a2SDmitry Chagin }
639fc90f3a2SDmitry Chagin if (timestamp & TIMESTAMP_RELATIVE) {
640fc90f3a2SDmitry Chagin if (prevtime.tv_sec == 0)
641fc90f3a2SDmitry Chagin prevtime = kth->ktr_time;
642fc90f3a2SDmitry Chagin if (timespeccmp(&kth->ktr_time, &prevtime, <)) {
643fc90f3a2SDmitry Chagin timespecsub(&prevtime, &kth->ktr_time, &temp);
644fc90f3a2SDmitry Chagin sign = "-";
645fc90f3a2SDmitry Chagin } else {
646fc90f3a2SDmitry Chagin timespecsub(&kth->ktr_time, &prevtime, &temp);
647fc90f3a2SDmitry Chagin sign = "";
648fc90f3a2SDmitry Chagin }
649fc90f3a2SDmitry Chagin prevtime = kth->ktr_time;
650fc90f3a2SDmitry Chagin printf("%s%jd.%09ld ", sign, (intmax_t)temp.tv_sec,
651fc90f3a2SDmitry Chagin temp.tv_nsec);
652fc90f3a2SDmitry Chagin }
653fc90f3a2SDmitry Chagin }
654fc90f3a2SDmitry Chagin
655fc90f3a2SDmitry Chagin void
dumpheader(struct ktr_header * kth,u_int sv_flags)6567cf2ca3bSJohn Baldwin dumpheader(struct ktr_header *kth, u_int sv_flags)
6579b50d902SRodney W. Grimes {
6589b50d902SRodney W. Grimes static char unknown[64];
6597cf2ca3bSJohn Baldwin const char *abi;
6607cf2ca3bSJohn Baldwin const char *arch;
66191fbb9c1SDavid Malone const char *type;
6629b50d902SRodney W. Grimes
6639b50d902SRodney W. Grimes switch (kth->ktr_type) {
6649b50d902SRodney W. Grimes case KTR_SYSCALL:
6659b50d902SRodney W. Grimes type = "CALL";
6669b50d902SRodney W. Grimes break;
6679b50d902SRodney W. Grimes case KTR_SYSRET:
6689b50d902SRodney W. Grimes type = "RET ";
6699b50d902SRodney W. Grimes break;
6709b50d902SRodney W. Grimes case KTR_NAMEI:
6719b50d902SRodney W. Grimes type = "NAMI";
6729b50d902SRodney W. Grimes break;
6739b50d902SRodney W. Grimes case KTR_GENIO:
6749b50d902SRodney W. Grimes type = "GIO ";
6759b50d902SRodney W. Grimes break;
6769b50d902SRodney W. Grimes case KTR_PSIG:
6779b50d902SRodney W. Grimes type = "PSIG";
6789b50d902SRodney W. Grimes break;
6799b50d902SRodney W. Grimes case KTR_CSW:
6809b50d902SRodney W. Grimes type = "CSW ";
6819b50d902SRodney W. Grimes break;
68282e2dd32SPoul-Henning Kamp case KTR_USER:
68382e2dd32SPoul-Henning Kamp type = "USER";
68482e2dd32SPoul-Henning Kamp break;
68560e15db9SDag-Erling Smørgrav case KTR_STRUCT:
686ffb66079SJohn Baldwin case KTR_STRUCT_ARRAY:
68760e15db9SDag-Erling Smørgrav type = "STRU";
68860e15db9SDag-Erling Smørgrav break;
689a56be37eSJohn Baldwin case KTR_SYSCTL:
690a56be37eSJohn Baldwin type = "SCTL";
691a56be37eSJohn Baldwin break;
692c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL:
693c601ad8eSDag-Erling Smørgrav type = "CAP ";
694c601ad8eSDag-Erling Smørgrav break;
69535818d2eSJohn Baldwin case KTR_FAULT:
69635818d2eSJohn Baldwin type = "PFLT";
69735818d2eSJohn Baldwin break;
69835818d2eSJohn Baldwin case KTR_FAULTEND:
69935818d2eSJohn Baldwin type = "PRET";
70035818d2eSJohn Baldwin break;
7019b50d902SRodney W. Grimes default:
70209307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
7039b50d902SRodney W. Grimes type = unknown;
7049b50d902SRodney W. Grimes }
7059b50d902SRodney W. Grimes
706a9ac598bSRobert Watson /*
707a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held
708a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data
709a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only
710a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain
711a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing
712a9ac598bSRobert Watson * negative tid's as 0.
713a9ac598bSRobert Watson */
714a9ac598bSRobert Watson if (threads)
715bb239328SBrooks Davis printf("%6d %6d %-8.*s ", kth->ktr_pid,
716bb239328SBrooks Davis kth->ktr_tid > 0 ? (lwpid_t)kth->ktr_tid : 0,
717c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm);
718a9ac598bSRobert Watson else
719bb239328SBrooks Davis printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm);
7209b50d902SRodney W. Grimes if (timestamp) {
721fc90f3a2SDmitry Chagin if (version == KTR_VERSION0)
722fc90f3a2SDmitry Chagin dumptimeval((struct ktr_header_v0 *)kth);
723fc90f3a2SDmitry Chagin else
724fc90f3a2SDmitry Chagin dumptimespec(kth);
725ec131914SPeter Wemm }
726fc90f3a2SDmitry Chagin if (cpuflag && version > KTR_VERSION0)
727fc90f3a2SDmitry Chagin printf("%3d ", kth->ktr_cpu);
72809307b25SDag-Erling Smørgrav printf("%s ", type);
7297cf2ca3bSJohn Baldwin if (abiflag != 0) {
7307cf2ca3bSJohn Baldwin switch (sv_flags & SV_ABI_MASK) {
7317cf2ca3bSJohn Baldwin case SV_ABI_LINUX:
7327cf2ca3bSJohn Baldwin abi = "L";
7337cf2ca3bSJohn Baldwin break;
7347cf2ca3bSJohn Baldwin case SV_ABI_FREEBSD:
7357cf2ca3bSJohn Baldwin abi = "F";
7367cf2ca3bSJohn Baldwin break;
7377cf2ca3bSJohn Baldwin default:
7387cf2ca3bSJohn Baldwin abi = "U";
7397cf2ca3bSJohn Baldwin break;
7407cf2ca3bSJohn Baldwin }
7417cf2ca3bSJohn Baldwin
7427cf2ca3bSJohn Baldwin if ((sv_flags & SV_LP64) != 0)
7437cf2ca3bSJohn Baldwin arch = "64";
7447cf2ca3bSJohn Baldwin else if ((sv_flags & SV_ILP32) != 0)
7457cf2ca3bSJohn Baldwin arch = "32";
7467cf2ca3bSJohn Baldwin else
7477cf2ca3bSJohn Baldwin arch = "00";
7487cf2ca3bSJohn Baldwin
7497cf2ca3bSJohn Baldwin printf("%s%s ", abi, arch);
7507cf2ca3bSJohn Baldwin }
7519b50d902SRodney W. Grimes }
7529b50d902SRodney W. Grimes
7539b50d902SRodney W. Grimes #include <sys/syscall.h>
7549b50d902SRodney W. Grimes
755265e5898SJohn Baldwin static void
ioctlname(unsigned long val)756265e5898SJohn Baldwin ioctlname(unsigned long val)
757265e5898SJohn Baldwin {
758265e5898SJohn Baldwin const char *str;
759265e5898SJohn Baldwin
760265e5898SJohn Baldwin str = sysdecode_ioctlname(val);
761265e5898SJohn Baldwin if (str != NULL)
762265e5898SJohn Baldwin printf("%s", str);
763265e5898SJohn Baldwin else if (decimal)
764265e5898SJohn Baldwin printf("%lu", val);
765265e5898SJohn Baldwin else
766265e5898SJohn Baldwin printf("%#lx", val);
767265e5898SJohn Baldwin }
768265e5898SJohn Baldwin
769a5f14abfSJohn Baldwin static enum sysdecode_abi
syscallabi(u_int sv_flags)770a5f14abfSJohn Baldwin syscallabi(u_int sv_flags)
771a5f14abfSJohn Baldwin {
772a5f14abfSJohn Baldwin
773a5f14abfSJohn Baldwin if (sv_flags == 0)
7745842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD);
775a5f14abfSJohn Baldwin switch (sv_flags & SV_ABI_MASK) {
776a5f14abfSJohn Baldwin case SV_ABI_FREEBSD:
7775842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD);
778a5f14abfSJohn Baldwin case SV_ABI_LINUX:
779fc7d33b4SEd Maste #ifdef __LP64__
780a5f14abfSJohn Baldwin if (sv_flags & SV_ILP32)
7815842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX32);
782a5f14abfSJohn Baldwin #endif
7835842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX);
784a5f14abfSJohn Baldwin default:
7855842bd68SJohn Baldwin return (SYSDECODE_ABI_UNKNOWN);
786a5f14abfSJohn Baldwin }
787a5f14abfSJohn Baldwin }
788a5f14abfSJohn Baldwin
789a5f14abfSJohn Baldwin static void
syscallname(u_int code,u_int sv_flags)790a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags)
791a5f14abfSJohn Baldwin {
792a5f14abfSJohn Baldwin const char *name;
793a5f14abfSJohn Baldwin
794a5f14abfSJohn Baldwin name = sysdecode_syscallname(syscallabi(sv_flags), code);
795a5f14abfSJohn Baldwin if (name == NULL)
796a5f14abfSJohn Baldwin printf("[%d]", code);
797a5f14abfSJohn Baldwin else {
798a5f14abfSJohn Baldwin printf("%s", name);
799a5f14abfSJohn Baldwin if (syscallno)
800a5f14abfSJohn Baldwin printf("[%d]", code);
801a5f14abfSJohn Baldwin }
802a5f14abfSJohn Baldwin }
803a5f14abfSJohn Baldwin
8049289f547SJohn Baldwin static void
print_signal(int signo)8059289f547SJohn Baldwin print_signal(int signo)
8069289f547SJohn Baldwin {
8079289f547SJohn Baldwin const char *signame;
8089289f547SJohn Baldwin
8099289f547SJohn Baldwin signame = sysdecode_signal(signo);
8109289f547SJohn Baldwin if (signame != NULL)
8119289f547SJohn Baldwin printf("%s", signame);
8129289f547SJohn Baldwin else
8139289f547SJohn Baldwin printf("SIG %d", signo);
8149289f547SJohn Baldwin }
8159289f547SJohn Baldwin
81691fbb9c1SDavid Malone void
ktrsyscall(struct ktr_syscall * ktr,u_int sv_flags)817a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
8189b50d902SRodney W. Grimes {
81991fbb9c1SDavid Malone int narg = ktr->ktr_narg;
8208a0f6d8cSDmitry Chagin register_t *ip;
8218a0f6d8cSDmitry Chagin
8228a0f6d8cSDmitry Chagin syscallname(ktr->ktr_code, sv_flags);
8238a0f6d8cSDmitry Chagin ip = &ktr->ktr_args[0];
8248a0f6d8cSDmitry Chagin if (narg) {
8258a0f6d8cSDmitry Chagin char c = '(';
8268a0f6d8cSDmitry Chagin if (fancy) {
8278a0f6d8cSDmitry Chagin switch (sv_flags & SV_ABI_MASK) {
8288a0f6d8cSDmitry Chagin case SV_ABI_FREEBSD:
8298a0f6d8cSDmitry Chagin ktrsyscall_freebsd(ktr, &ip, &narg, &c,
8308a0f6d8cSDmitry Chagin sv_flags);
8318a0f6d8cSDmitry Chagin break;
8328a0f6d8cSDmitry Chagin #ifdef SYSDECODE_HAVE_LINUX
8338a0f6d8cSDmitry Chagin case SV_ABI_LINUX:
8348a0f6d8cSDmitry Chagin #ifdef __amd64__
8358a0f6d8cSDmitry Chagin if (sv_flags & SV_ILP32)
8368a0f6d8cSDmitry Chagin ktrsyscall_linux32(ktr, &ip,
8378a0f6d8cSDmitry Chagin &narg, &c);
8388a0f6d8cSDmitry Chagin else
8398a0f6d8cSDmitry Chagin #endif
8408a0f6d8cSDmitry Chagin ktrsyscall_linux(ktr, &ip, &narg, &c);
8418a0f6d8cSDmitry Chagin break;
8428a0f6d8cSDmitry Chagin #endif /* SYSDECODE_HAVE_LINUX */
8438a0f6d8cSDmitry Chagin }
8448a0f6d8cSDmitry Chagin }
8458a0f6d8cSDmitry Chagin while (narg > 0)
8468a0f6d8cSDmitry Chagin print_number(ip, narg, c);
8478a0f6d8cSDmitry Chagin putchar(')');
8488a0f6d8cSDmitry Chagin }
8498a0f6d8cSDmitry Chagin putchar('\n');
8508a0f6d8cSDmitry Chagin }
8518a0f6d8cSDmitry Chagin
8528a0f6d8cSDmitry Chagin void
ktrsyscall_freebsd(struct ktr_syscall * ktr,register_t ** resip,int * resnarg,char * resc,u_int sv_flags)8538a0f6d8cSDmitry Chagin ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip,
8548a0f6d8cSDmitry Chagin int *resnarg, char *resc, u_int sv_flags)
8558a0f6d8cSDmitry Chagin {
8568a0f6d8cSDmitry Chagin int narg = ktr->ktr_narg;
85771ed318eSJohn Baldwin register_t *ip, *first;
858c601ad8eSDag-Erling Smørgrav intmax_t arg;
85971ed318eSJohn Baldwin int quad_align, quad_slots;
8609b50d902SRodney W. Grimes
86171ed318eSJohn Baldwin ip = first = &ktr->ktr_args[0];
8628a0f6d8cSDmitry Chagin char c = *resc;
8638a0f6d8cSDmitry Chagin
86471ed318eSJohn Baldwin quad_align = 0;
86571ed318eSJohn Baldwin if (sv_flags & SV_ILP32) {
86671ed318eSJohn Baldwin #ifdef __powerpc__
86771ed318eSJohn Baldwin quad_align = 1;
86871ed318eSJohn Baldwin #endif
86971ed318eSJohn Baldwin quad_slots = 2;
87071ed318eSJohn Baldwin } else
87171ed318eSJohn Baldwin quad_slots = 1;
87273430055SDag-Erling Smørgrav switch (ktr->ktr_code) {
8731ca6c7fcSJilles Tjoelker case SYS_bindat:
874c4561fabSJohn Baldwin case SYS_chflagsat:
8751ca6c7fcSJilles Tjoelker case SYS_connectat:
8768447b7cdSJilles Tjoelker case SYS_faccessat:
8778447b7cdSJilles Tjoelker case SYS_fchmodat:
8788447b7cdSJilles Tjoelker case SYS_fchownat:
8798447b7cdSJilles Tjoelker case SYS_fstatat:
8808447b7cdSJilles Tjoelker case SYS_futimesat:
8818447b7cdSJilles Tjoelker case SYS_linkat:
8828447b7cdSJilles Tjoelker case SYS_mkdirat:
8838447b7cdSJilles Tjoelker case SYS_mkfifoat:
8848447b7cdSJilles Tjoelker case SYS_mknodat:
8858447b7cdSJilles Tjoelker case SYS_openat:
8868447b7cdSJilles Tjoelker case SYS_readlinkat:
8878447b7cdSJilles Tjoelker case SYS_renameat:
8888447b7cdSJilles Tjoelker case SYS_unlinkat:
8892205e0d1SJilles Tjoelker case SYS_utimensat:
8908447b7cdSJilles Tjoelker putchar('(');
8919289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip);
8928447b7cdSJilles Tjoelker c = ',';
8938447b7cdSJilles Tjoelker ip++;
8948447b7cdSJilles Tjoelker narg--;
8958447b7cdSJilles Tjoelker break;
8968447b7cdSJilles Tjoelker }
8978447b7cdSJilles Tjoelker switch (ktr->ktr_code) {
89873430055SDag-Erling Smørgrav case SYS_ioctl: {
89998a68a58SAlexander Leidinger print_number(ip, narg, c);
900d09e66beSDag-Erling Smørgrav putchar(c);
901265e5898SJohn Baldwin ioctlname(*ip);
9029b50d902SRodney W. Grimes c = ',';
9039b50d902SRodney W. Grimes ip++;
9049b50d902SRodney W. Grimes narg--;
90573430055SDag-Erling Smørgrav break;
90673430055SDag-Erling Smørgrav }
90773430055SDag-Erling Smørgrav case SYS_ptrace:
90809307b25SDag-Erling Smørgrav putchar('(');
9099289f547SJohn Baldwin print_integer_arg(sysdecode_ptrace_request, *ip);
9109b50d902SRodney W. Grimes c = ',';
9119b50d902SRodney W. Grimes ip++;
9129b50d902SRodney W. Grimes narg--;
91373430055SDag-Erling Smørgrav break;
91473430055SDag-Erling Smørgrav case SYS_access:
91573430055SDag-Erling Smørgrav case SYS_eaccess:
9168447b7cdSJilles Tjoelker case SYS_faccessat:
91798a68a58SAlexander Leidinger print_number(ip, narg, c);
91809307b25SDag-Erling Smørgrav putchar(',');
9199289f547SJohn Baldwin print_mask_arg(sysdecode_access_mode, *ip);
92098a68a58SAlexander Leidinger ip++;
92198a68a58SAlexander Leidinger narg--;
92273430055SDag-Erling Smørgrav break;
923f3f3e3c4SMateusz Guzik case SYS_close_range:
924f3f3e3c4SMateusz Guzik print_number(ip, narg, c);
925f3f3e3c4SMateusz Guzik print_number(ip, narg, c);
926f3f3e3c4SMateusz Guzik putchar(',');
927a2065247SKyle Evans print_mask_arg0(sysdecode_close_range_flags,
928a2065247SKyle Evans *ip);
929f3f3e3c4SMateusz Guzik ip += 3;
930f3f3e3c4SMateusz Guzik narg -= 3;
931f3f3e3c4SMateusz Guzik break;
93273430055SDag-Erling Smørgrav case SYS_open:
9338447b7cdSJilles Tjoelker case SYS_openat:
93498a68a58SAlexander Leidinger print_number(ip, narg, c);
93509307b25SDag-Erling Smørgrav putchar(',');
9369289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]);
9379289f547SJohn Baldwin if ((ip[0] & O_CREAT) == O_CREAT) {
9389289f547SJohn Baldwin putchar(',');
9399289f547SJohn Baldwin decode_filemode(ip[1]);
9409289f547SJohn Baldwin }
94173430055SDag-Erling Smørgrav ip += 2;
94298a68a58SAlexander Leidinger narg -= 2;
94373430055SDag-Erling Smørgrav break;
94473430055SDag-Erling Smørgrav case SYS_wait4:
94598a68a58SAlexander Leidinger print_number(ip, narg, c);
94698a68a58SAlexander Leidinger print_number(ip, narg, c);
94709307b25SDag-Erling Smørgrav putchar(',');
9489289f547SJohn Baldwin print_mask_arg0(sysdecode_wait4_options, *ip);
94934763d1cSJohn Baldwin ip++;
95034763d1cSJohn Baldwin narg--;
95134763d1cSJohn Baldwin break;
95234763d1cSJohn Baldwin case SYS_wait6:
95334763d1cSJohn Baldwin putchar('(');
9549289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip);
95534763d1cSJohn Baldwin c = ',';
95634763d1cSJohn Baldwin ip++;
95734763d1cSJohn Baldwin narg--;
95871ed318eSJohn Baldwin print_number64(first, ip, narg, c);
95934763d1cSJohn Baldwin print_number(ip, narg, c);
96034763d1cSJohn Baldwin putchar(',');
9619289f547SJohn Baldwin print_mask_arg(sysdecode_wait6_options, *ip);
96298a68a58SAlexander Leidinger ip++;
96398a68a58SAlexander Leidinger narg--;
96473430055SDag-Erling Smørgrav break;
96573430055SDag-Erling Smørgrav case SYS_chmod:
96673430055SDag-Erling Smørgrav case SYS_fchmod:
96773430055SDag-Erling Smørgrav case SYS_lchmod:
968eebea334SBaptiste Daroussin case SYS_fchmodat:
96998a68a58SAlexander Leidinger print_number(ip, narg, c);
97009307b25SDag-Erling Smørgrav putchar(',');
9719289f547SJohn Baldwin decode_filemode(*ip);
97298a68a58SAlexander Leidinger ip++;
97398a68a58SAlexander Leidinger narg--;
97473430055SDag-Erling Smørgrav break;
9758447b7cdSJilles Tjoelker case SYS_mknodat:
97698a68a58SAlexander Leidinger print_number(ip, narg, c);
97709307b25SDag-Erling Smørgrav putchar(',');
9789289f547SJohn Baldwin decode_filemode(*ip);
97998a68a58SAlexander Leidinger ip++;
98098a68a58SAlexander Leidinger narg--;
98173430055SDag-Erling Smørgrav break;
98273430055SDag-Erling Smørgrav case SYS_getfsstat:
98398a68a58SAlexander Leidinger print_number(ip, narg, c);
98498a68a58SAlexander Leidinger print_number(ip, narg, c);
98509307b25SDag-Erling Smørgrav putchar(',');
98648f79574SJohn Baldwin print_integer_arg(sysdecode_getfsstat_mode, *ip);
98798a68a58SAlexander Leidinger ip++;
98898a68a58SAlexander Leidinger narg--;
98973430055SDag-Erling Smørgrav break;
99073430055SDag-Erling Smørgrav case SYS_mount:
99198a68a58SAlexander Leidinger print_number(ip, narg, c);
99298a68a58SAlexander Leidinger print_number(ip, narg, c);
99309307b25SDag-Erling Smørgrav putchar(',');
994a2065247SKyle Evans print_mask_arg0(sysdecode_mount_flags, *ip);
99598a68a58SAlexander Leidinger ip++;
99698a68a58SAlexander Leidinger narg--;
99773430055SDag-Erling Smørgrav break;
99873430055SDag-Erling Smørgrav case SYS_unmount:
99998a68a58SAlexander Leidinger print_number(ip, narg, c);
100009307b25SDag-Erling Smørgrav putchar(',');
1001a2065247SKyle Evans print_mask_arg0(sysdecode_mount_flags, *ip);
100298a68a58SAlexander Leidinger ip++;
100398a68a58SAlexander Leidinger narg--;
100473430055SDag-Erling Smørgrav break;
100573430055SDag-Erling Smørgrav case SYS_recvmsg:
100673430055SDag-Erling Smørgrav case SYS_sendmsg:
100798a68a58SAlexander Leidinger print_number(ip, narg, c);
100898a68a58SAlexander Leidinger print_number(ip, narg, c);
100909307b25SDag-Erling Smørgrav putchar(',');
10109289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip);
101198a68a58SAlexander Leidinger ip++;
101298a68a58SAlexander Leidinger narg--;
101373430055SDag-Erling Smørgrav break;
101473430055SDag-Erling Smørgrav case SYS_recvfrom:
101573430055SDag-Erling Smørgrav case SYS_sendto:
101698a68a58SAlexander Leidinger print_number(ip, narg, c);
101798a68a58SAlexander Leidinger print_number(ip, narg, c);
101898a68a58SAlexander Leidinger print_number(ip, narg, c);
101909307b25SDag-Erling Smørgrav putchar(',');
10209289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip);
102198a68a58SAlexander Leidinger ip++;
102298a68a58SAlexander Leidinger narg--;
102373430055SDag-Erling Smørgrav break;
102473430055SDag-Erling Smørgrav case SYS_chflags:
1025c4561fabSJohn Baldwin case SYS_chflagsat:
102673430055SDag-Erling Smørgrav case SYS_fchflags:
102773430055SDag-Erling Smørgrav case SYS_lchflags:
102898a68a58SAlexander Leidinger print_number(ip, narg, c);
102909307b25SDag-Erling Smørgrav putchar(',');
10309289f547SJohn Baldwin decode_fileflags(*ip);
103198a68a58SAlexander Leidinger ip++;
103298a68a58SAlexander Leidinger narg--;
103373430055SDag-Erling Smørgrav break;
103473430055SDag-Erling Smørgrav case SYS_kill:
103598a68a58SAlexander Leidinger print_number(ip, narg, c);
103609307b25SDag-Erling Smørgrav putchar(',');
10379289f547SJohn Baldwin print_signal(*ip);
103898a68a58SAlexander Leidinger ip++;
103998a68a58SAlexander Leidinger narg--;
104073430055SDag-Erling Smørgrav break;
104173430055SDag-Erling Smørgrav case SYS_reboot:
104209307b25SDag-Erling Smørgrav putchar('(');
10439289f547SJohn Baldwin print_mask_arg(sysdecode_reboot_howto, *ip);
104498a68a58SAlexander Leidinger ip++;
104598a68a58SAlexander Leidinger narg--;
104673430055SDag-Erling Smørgrav break;
104773430055SDag-Erling Smørgrav case SYS_umask:
104809307b25SDag-Erling Smørgrav putchar('(');
10499289f547SJohn Baldwin decode_filemode(*ip);
105098a68a58SAlexander Leidinger ip++;
105198a68a58SAlexander Leidinger narg--;
105273430055SDag-Erling Smørgrav break;
105373430055SDag-Erling Smørgrav case SYS_msync:
105498a68a58SAlexander Leidinger print_number(ip, narg, c);
105598a68a58SAlexander Leidinger print_number(ip, narg, c);
105609307b25SDag-Erling Smørgrav putchar(',');
10579289f547SJohn Baldwin print_mask_arg(sysdecode_msync_flags, *ip);
105898a68a58SAlexander Leidinger ip++;
105998a68a58SAlexander Leidinger narg--;
106073430055SDag-Erling Smørgrav break;
1061cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
106273430055SDag-Erling Smørgrav case SYS_freebsd6_mmap:
1063cae1120aSPeter Wemm print_number(ip, narg, c);
1064cae1120aSPeter Wemm print_number(ip, narg, c);
106509307b25SDag-Erling Smørgrav putchar(',');
10669289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip);
106709307b25SDag-Erling Smørgrav putchar(',');
1068cae1120aSPeter Wemm ip++;
1069cae1120aSPeter Wemm narg--;
10709289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip);
1071cae1120aSPeter Wemm ip++;
1072cae1120aSPeter Wemm narg--;
107373430055SDag-Erling Smørgrav break;
1074cae1120aSPeter Wemm #endif
107573430055SDag-Erling Smørgrav case SYS_mmap:
107698a68a58SAlexander Leidinger print_number(ip, narg, c);
107798a68a58SAlexander Leidinger print_number(ip, narg, c);
107809307b25SDag-Erling Smørgrav putchar(',');
10799289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip);
108009307b25SDag-Erling Smørgrav putchar(',');
108198a68a58SAlexander Leidinger ip++;
108298a68a58SAlexander Leidinger narg--;
10839289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip);
108498a68a58SAlexander Leidinger ip++;
108598a68a58SAlexander Leidinger narg--;
108673430055SDag-Erling Smørgrav break;
108773430055SDag-Erling Smørgrav case SYS_mprotect:
108898a68a58SAlexander Leidinger print_number(ip, narg, c);
108998a68a58SAlexander Leidinger print_number(ip, narg, c);
109009307b25SDag-Erling Smørgrav putchar(',');
10919289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip);
109298a68a58SAlexander Leidinger ip++;
109398a68a58SAlexander Leidinger narg--;
109473430055SDag-Erling Smørgrav break;
109573430055SDag-Erling Smørgrav case SYS_madvise:
109698a68a58SAlexander Leidinger print_number(ip, narg, c);
109798a68a58SAlexander Leidinger print_number(ip, narg, c);
109809307b25SDag-Erling Smørgrav putchar(',');
10999289f547SJohn Baldwin print_integer_arg(sysdecode_madvice, *ip);
110098a68a58SAlexander Leidinger ip++;
110198a68a58SAlexander Leidinger narg--;
110273430055SDag-Erling Smørgrav break;
110339a3a438SJohn Baldwin case SYS_pathconf:
110439a3a438SJohn Baldwin case SYS_lpathconf:
110539a3a438SJohn Baldwin case SYS_fpathconf:
110639a3a438SJohn Baldwin print_number(ip, narg, c);
110739a3a438SJohn Baldwin putchar(',');
110839a3a438SJohn Baldwin print_integer_arg(sysdecode_pathconf_name, *ip);
110939a3a438SJohn Baldwin ip++;
111039a3a438SJohn Baldwin narg--;
111139a3a438SJohn Baldwin break;
11129483ab16SJohn Baldwin case SYS_getpriority:
111373430055SDag-Erling Smørgrav case SYS_setpriority:
11149483ab16SJohn Baldwin putchar('(');
11159289f547SJohn Baldwin print_integer_arg(sysdecode_prio_which, *ip);
11169483ab16SJohn Baldwin c = ',';
111798a68a58SAlexander Leidinger ip++;
111898a68a58SAlexander Leidinger narg--;
111973430055SDag-Erling Smørgrav break;
112073430055SDag-Erling Smørgrav case SYS_fcntl:
112198a68a58SAlexander Leidinger print_number(ip, narg, c);
112209307b25SDag-Erling Smørgrav putchar(',');
11239289f547SJohn Baldwin print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
11249289f547SJohn Baldwin if (sysdecode_fcntl_arg_p(ip[0])) {
11259289f547SJohn Baldwin putchar(',');
11269289f547SJohn Baldwin if (ip[0] == F_SETFL)
11279289f547SJohn Baldwin print_mask_arg(
11289289f547SJohn Baldwin sysdecode_fcntl_fileflags,
11299289f547SJohn Baldwin ip[1]);
11309289f547SJohn Baldwin else
11319289f547SJohn Baldwin sysdecode_fcntl_arg(stdout,
11329289f547SJohn Baldwin ip[0], ip[1],
11339289f547SJohn Baldwin decimal ? 10 : 16);
11349289f547SJohn Baldwin }
113573430055SDag-Erling Smørgrav ip += 2;
113698a68a58SAlexander Leidinger narg -= 2;
113773430055SDag-Erling Smørgrav break;
113873430055SDag-Erling Smørgrav case SYS_socket: {
11398bc31d83SCraig Rodrigues int sockdomain;
114009307b25SDag-Erling Smørgrav putchar('(');
114195bb676aSDag-Erling Smørgrav sockdomain = *ip;
11429289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain,
11439289f547SJohn Baldwin sockdomain);
114498a68a58SAlexander Leidinger ip++;
114598a68a58SAlexander Leidinger narg--;
114609307b25SDag-Erling Smørgrav putchar(',');
11479289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip);
114898a68a58SAlexander Leidinger ip++;
114998a68a58SAlexander Leidinger narg--;
11508bc31d83SCraig Rodrigues if (sockdomain == PF_INET ||
11518bc31d83SCraig Rodrigues sockdomain == PF_INET6) {
115209307b25SDag-Erling Smørgrav putchar(',');
11539289f547SJohn Baldwin print_integer_arg(sysdecode_ipproto,
11549289f547SJohn Baldwin *ip);
11558bc31d83SCraig Rodrigues ip++;
11568bc31d83SCraig Rodrigues narg--;
11578bc31d83SCraig Rodrigues }
115898a68a58SAlexander Leidinger c = ',';
115973430055SDag-Erling Smørgrav break;
116073430055SDag-Erling Smørgrav }
116173430055SDag-Erling Smørgrav case SYS_setsockopt:
11629289f547SJohn Baldwin case SYS_getsockopt: {
11639289f547SJohn Baldwin const char *str;
11649289f547SJohn Baldwin
116598a68a58SAlexander Leidinger print_number(ip, narg, c);
116609307b25SDag-Erling Smørgrav putchar(',');
11679289f547SJohn Baldwin print_integer_arg_valid(sysdecode_sockopt_level,
11689289f547SJohn Baldwin *ip);
11699289f547SJohn Baldwin str = sysdecode_sockopt_name(ip[0], ip[1]);
11709289f547SJohn Baldwin if (str != NULL) {
11719289f547SJohn Baldwin printf(",%s", str);
117298a68a58SAlexander Leidinger ip++;
117398a68a58SAlexander Leidinger narg--;
11740460d351SJohn Baldwin }
117598a68a58SAlexander Leidinger ip++;
117698a68a58SAlexander Leidinger narg--;
117773430055SDag-Erling Smørgrav break;
11789289f547SJohn Baldwin }
1179cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
118073430055SDag-Erling Smørgrav case SYS_freebsd6_lseek:
118198a68a58SAlexander Leidinger print_number(ip, narg, c);
118298a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */
118398a68a58SAlexander Leidinger print_number(ip, narg, c);
118471ed318eSJohn Baldwin print_number64(first, ip, narg, c);
118509307b25SDag-Erling Smørgrav putchar(',');
11869289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip);
118798a68a58SAlexander Leidinger ip++;
118898a68a58SAlexander Leidinger narg--;
118973430055SDag-Erling Smørgrav break;
1190cae1120aSPeter Wemm #endif
119173430055SDag-Erling Smørgrav case SYS_lseek:
1192cae1120aSPeter Wemm print_number(ip, narg, c);
119371ed318eSJohn Baldwin print_number64(first, ip, narg, c);
119409307b25SDag-Erling Smørgrav putchar(',');
11959289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip);
1196cae1120aSPeter Wemm ip++;
1197cae1120aSPeter Wemm narg--;
119873430055SDag-Erling Smørgrav break;
119973430055SDag-Erling Smørgrav case SYS_flock:
120098a68a58SAlexander Leidinger print_number(ip, narg, c);
120109307b25SDag-Erling Smørgrav putchar(',');
12029289f547SJohn Baldwin print_mask_arg(sysdecode_flock_operation, *ip);
120398a68a58SAlexander Leidinger ip++;
120498a68a58SAlexander Leidinger narg--;
120573430055SDag-Erling Smørgrav break;
120673430055SDag-Erling Smørgrav case SYS_mkfifo:
12078447b7cdSJilles Tjoelker case SYS_mkfifoat:
120873430055SDag-Erling Smørgrav case SYS_mkdir:
12098447b7cdSJilles Tjoelker case SYS_mkdirat:
121098a68a58SAlexander Leidinger print_number(ip, narg, c);
121109307b25SDag-Erling Smørgrav putchar(',');
12129289f547SJohn Baldwin decode_filemode(*ip);
121398a68a58SAlexander Leidinger ip++;
121498a68a58SAlexander Leidinger narg--;
121573430055SDag-Erling Smørgrav break;
121673430055SDag-Erling Smørgrav case SYS_shutdown:
121798a68a58SAlexander Leidinger print_number(ip, narg, c);
121809307b25SDag-Erling Smørgrav putchar(',');
12199289f547SJohn Baldwin print_integer_arg(sysdecode_shutdown_how, *ip);
122098a68a58SAlexander Leidinger ip++;
122198a68a58SAlexander Leidinger narg--;
122273430055SDag-Erling Smørgrav break;
122373430055SDag-Erling Smørgrav case SYS_socketpair:
122409307b25SDag-Erling Smørgrav putchar('(');
12259289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, *ip);
122698a68a58SAlexander Leidinger ip++;
122798a68a58SAlexander Leidinger narg--;
122809307b25SDag-Erling Smørgrav putchar(',');
12299289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip);
123098a68a58SAlexander Leidinger ip++;
123198a68a58SAlexander Leidinger narg--;
123298a68a58SAlexander Leidinger c = ',';
123373430055SDag-Erling Smørgrav break;
123473430055SDag-Erling Smørgrav case SYS_getrlimit:
123573430055SDag-Erling Smørgrav case SYS_setrlimit:
123609307b25SDag-Erling Smørgrav putchar('(');
12379289f547SJohn Baldwin print_integer_arg(sysdecode_rlimit, *ip);
123898a68a58SAlexander Leidinger ip++;
123998a68a58SAlexander Leidinger narg--;
124098a68a58SAlexander Leidinger c = ',';
124173430055SDag-Erling Smørgrav break;
1242ee8aa41dSJohn Baldwin case SYS_getrusage:
1243ee8aa41dSJohn Baldwin putchar('(');
1244ee8aa41dSJohn Baldwin print_integer_arg(sysdecode_getrusage_who, *ip);
1245ee8aa41dSJohn Baldwin ip++;
1246ee8aa41dSJohn Baldwin narg--;
1247ee8aa41dSJohn Baldwin c = ',';
1248ee8aa41dSJohn Baldwin break;
124973430055SDag-Erling Smørgrav case SYS_quotactl:
125098a68a58SAlexander Leidinger print_number(ip, narg, c);
125109307b25SDag-Erling Smørgrav putchar(',');
12529289f547SJohn Baldwin if (!sysdecode_quotactl_cmd(stdout, *ip)) {
12539289f547SJohn Baldwin if (decimal)
12549289f547SJohn Baldwin printf("<invalid=%d>", (int)*ip);
12559289f547SJohn Baldwin else
12569289f547SJohn Baldwin printf("<invalid=%#x>",
12579289f547SJohn Baldwin (int)*ip);
12589289f547SJohn Baldwin }
125998a68a58SAlexander Leidinger ip++;
126098a68a58SAlexander Leidinger narg--;
126198a68a58SAlexander Leidinger c = ',';
126273430055SDag-Erling Smørgrav break;
126373430055SDag-Erling Smørgrav case SYS_nfssvc:
126409307b25SDag-Erling Smørgrav putchar('(');
12659289f547SJohn Baldwin print_integer_arg(sysdecode_nfssvc_flags, *ip);
126698a68a58SAlexander Leidinger ip++;
126798a68a58SAlexander Leidinger narg--;
126898a68a58SAlexander Leidinger c = ',';
126973430055SDag-Erling Smørgrav break;
127073430055SDag-Erling Smørgrav case SYS_rtprio:
127166ba8943SJohn Baldwin case SYS_rtprio_thread:
127209307b25SDag-Erling Smørgrav putchar('(');
12739289f547SJohn Baldwin print_integer_arg(sysdecode_rtprio_function,
12749289f547SJohn Baldwin *ip);
127598a68a58SAlexander Leidinger ip++;
127698a68a58SAlexander Leidinger narg--;
127798a68a58SAlexander Leidinger c = ',';
127873430055SDag-Erling Smørgrav break;
127973430055SDag-Erling Smørgrav case SYS___semctl:
128098a68a58SAlexander Leidinger print_number(ip, narg, c);
128198a68a58SAlexander Leidinger print_number(ip, narg, c);
128209307b25SDag-Erling Smørgrav putchar(',');
12839289f547SJohn Baldwin print_integer_arg(sysdecode_semctl_cmd, *ip);
128498a68a58SAlexander Leidinger ip++;
128598a68a58SAlexander Leidinger narg--;
128673430055SDag-Erling Smørgrav break;
128773430055SDag-Erling Smørgrav case SYS_semget:
128898a68a58SAlexander Leidinger print_number(ip, narg, c);
128998a68a58SAlexander Leidinger print_number(ip, narg, c);
129009307b25SDag-Erling Smørgrav putchar(',');
12919289f547SJohn Baldwin print_mask_arg(sysdecode_semget_flags, *ip);
129298a68a58SAlexander Leidinger ip++;
129398a68a58SAlexander Leidinger narg--;
129473430055SDag-Erling Smørgrav break;
129573430055SDag-Erling Smørgrav case SYS_msgctl:
129698a68a58SAlexander Leidinger print_number(ip, narg, c);
129709307b25SDag-Erling Smørgrav putchar(',');
12989289f547SJohn Baldwin print_integer_arg(sysdecode_msgctl_cmd, *ip);
129998a68a58SAlexander Leidinger ip++;
130098a68a58SAlexander Leidinger narg--;
130173430055SDag-Erling Smørgrav break;
130273430055SDag-Erling Smørgrav case SYS_shmat:
130398a68a58SAlexander Leidinger print_number(ip, narg, c);
130498a68a58SAlexander Leidinger print_number(ip, narg, c);
130509307b25SDag-Erling Smørgrav putchar(',');
13069289f547SJohn Baldwin print_mask_arg(sysdecode_shmat_flags, *ip);
130798a68a58SAlexander Leidinger ip++;
130898a68a58SAlexander Leidinger narg--;
130973430055SDag-Erling Smørgrav break;
131073430055SDag-Erling Smørgrav case SYS_shmctl:
131198a68a58SAlexander Leidinger print_number(ip, narg, c);
131209307b25SDag-Erling Smørgrav putchar(',');
13139289f547SJohn Baldwin print_integer_arg(sysdecode_shmctl_cmd, *ip);
131498a68a58SAlexander Leidinger ip++;
131598a68a58SAlexander Leidinger narg--;
131673430055SDag-Erling Smørgrav break;
1317a9ac5e14SKyle Evans #ifdef SYS_freebsd12_shm_open
1318a9ac5e14SKyle Evans case SYS_freebsd12_shm_open:
1319550bec4fSKyle Evans if (ip[0] == (uintptr_t)SHM_ANON) {
1320550bec4fSKyle Evans printf("(SHM_ANON");
1321550bec4fSKyle Evans ip++;
1322550bec4fSKyle Evans } else {
1323777d35f4SRui Paulo print_number(ip, narg, c);
1324550bec4fSKyle Evans }
1325777d35f4SRui Paulo putchar(',');
13269289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]);
13279289f547SJohn Baldwin putchar(',');
13289289f547SJohn Baldwin decode_filemode(ip[1]);
13299289f547SJohn Baldwin ip += 2;
13309289f547SJohn Baldwin narg -= 2;
1331777d35f4SRui Paulo break;
1332a9ac5e14SKyle Evans #endif
1333c1b0c847SKyle Evans case SYS_shm_open2:
1334c1b0c847SKyle Evans if (ip[0] == (uintptr_t)SHM_ANON) {
1335c1b0c847SKyle Evans printf("(SHM_ANON");
1336c1b0c847SKyle Evans ip++;
1337c1b0c847SKyle Evans } else {
1338c1b0c847SKyle Evans print_number(ip, narg, c);
1339c1b0c847SKyle Evans }
1340c1b0c847SKyle Evans putchar(',');
1341c1b0c847SKyle Evans print_mask_arg(sysdecode_open_flags, ip[0]);
1342c1b0c847SKyle Evans putchar(',');
1343c1b0c847SKyle Evans decode_filemode(ip[1]);
1344c1b0c847SKyle Evans putchar(',');
1345c1b0c847SKyle Evans print_mask_arg(sysdecode_shmflags, ip[2]);
1346c1b0c847SKyle Evans ip += 3;
1347c1b0c847SKyle Evans narg -= 3;
1348c1b0c847SKyle Evans break;
134973430055SDag-Erling Smørgrav case SYS_minherit:
135098a68a58SAlexander Leidinger print_number(ip, narg, c);
135198a68a58SAlexander Leidinger print_number(ip, narg, c);
135209307b25SDag-Erling Smørgrav putchar(',');
13539289f547SJohn Baldwin print_integer_arg(sysdecode_minherit_inherit,
13549289f547SJohn Baldwin *ip);
135598a68a58SAlexander Leidinger ip++;
135698a68a58SAlexander Leidinger narg--;
135773430055SDag-Erling Smørgrav break;
135873430055SDag-Erling Smørgrav case SYS_rfork:
135909307b25SDag-Erling Smørgrav putchar('(');
13609289f547SJohn Baldwin print_mask_arg(sysdecode_rfork_flags, *ip);
136198a68a58SAlexander Leidinger ip++;
136298a68a58SAlexander Leidinger narg--;
136398a68a58SAlexander Leidinger c = ',';
136473430055SDag-Erling Smørgrav break;
136573430055SDag-Erling Smørgrav case SYS_lio_listio:
136609307b25SDag-Erling Smørgrav putchar('(');
13679289f547SJohn Baldwin print_integer_arg(sysdecode_lio_listio_mode,
13689289f547SJohn Baldwin *ip);
136998a68a58SAlexander Leidinger ip++;
137098a68a58SAlexander Leidinger narg--;
137198a68a58SAlexander Leidinger c = ',';
137273430055SDag-Erling Smørgrav break;
137373430055SDag-Erling Smørgrav case SYS_mlockall:
137409307b25SDag-Erling Smørgrav putchar('(');
13759289f547SJohn Baldwin print_mask_arg(sysdecode_mlockall_flags, *ip);
137698a68a58SAlexander Leidinger ip++;
137798a68a58SAlexander Leidinger narg--;
137873430055SDag-Erling Smørgrav break;
137973430055SDag-Erling Smørgrav case SYS_sched_setscheduler:
138098a68a58SAlexander Leidinger print_number(ip, narg, c);
138109307b25SDag-Erling Smørgrav putchar(',');
13829289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy,
13839289f547SJohn Baldwin *ip);
138498a68a58SAlexander Leidinger ip++;
138598a68a58SAlexander Leidinger narg--;
138673430055SDag-Erling Smørgrav break;
138773430055SDag-Erling Smørgrav case SYS_sched_get_priority_max:
138873430055SDag-Erling Smørgrav case SYS_sched_get_priority_min:
138909307b25SDag-Erling Smørgrav putchar('(');
13909289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy,
13919289f547SJohn Baldwin *ip);
139298a68a58SAlexander Leidinger ip++;
139398a68a58SAlexander Leidinger narg--;
139473430055SDag-Erling Smørgrav break;
139573430055SDag-Erling Smørgrav case SYS_sendfile:
139698a68a58SAlexander Leidinger print_number(ip, narg, c);
139798a68a58SAlexander Leidinger print_number(ip, narg, c);
139898a68a58SAlexander Leidinger print_number(ip, narg, c);
139998a68a58SAlexander Leidinger print_number(ip, narg, c);
140098a68a58SAlexander Leidinger print_number(ip, narg, c);
140198a68a58SAlexander Leidinger print_number(ip, narg, c);
140209307b25SDag-Erling Smørgrav putchar(',');
14039289f547SJohn Baldwin print_mask_arg(sysdecode_sendfile_flags, *ip);
140498a68a58SAlexander Leidinger ip++;
140598a68a58SAlexander Leidinger narg--;
140673430055SDag-Erling Smørgrav break;
140773430055SDag-Erling Smørgrav case SYS_kldsym:
140898a68a58SAlexander Leidinger print_number(ip, narg, c);
140909307b25SDag-Erling Smørgrav putchar(',');
14109289f547SJohn Baldwin print_integer_arg(sysdecode_kldsym_cmd, *ip);
141198a68a58SAlexander Leidinger ip++;
141298a68a58SAlexander Leidinger narg--;
141373430055SDag-Erling Smørgrav break;
141473430055SDag-Erling Smørgrav case SYS_sigprocmask:
141509307b25SDag-Erling Smørgrav putchar('(');
14169289f547SJohn Baldwin print_integer_arg(sysdecode_sigprocmask_how,
14179289f547SJohn Baldwin *ip);
141898a68a58SAlexander Leidinger ip++;
141998a68a58SAlexander Leidinger narg--;
142098a68a58SAlexander Leidinger c = ',';
142173430055SDag-Erling Smørgrav break;
142273430055SDag-Erling Smørgrav case SYS___acl_get_file:
142373430055SDag-Erling Smørgrav case SYS___acl_set_file:
142473430055SDag-Erling Smørgrav case SYS___acl_get_fd:
142573430055SDag-Erling Smørgrav case SYS___acl_set_fd:
142673430055SDag-Erling Smørgrav case SYS___acl_delete_file:
142773430055SDag-Erling Smørgrav case SYS___acl_delete_fd:
142873430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file:
142973430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd:
143073430055SDag-Erling Smørgrav case SYS___acl_get_link:
143173430055SDag-Erling Smørgrav case SYS___acl_set_link:
143273430055SDag-Erling Smørgrav case SYS___acl_delete_link:
143373430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link:
143498a68a58SAlexander Leidinger print_number(ip, narg, c);
143509307b25SDag-Erling Smørgrav putchar(',');
14369289f547SJohn Baldwin print_integer_arg(sysdecode_acltype, *ip);
143798a68a58SAlexander Leidinger ip++;
143898a68a58SAlexander Leidinger narg--;
143973430055SDag-Erling Smørgrav break;
144073430055SDag-Erling Smørgrav case SYS_sigaction:
144109307b25SDag-Erling Smørgrav putchar('(');
14429289f547SJohn Baldwin print_signal(*ip);
144398a68a58SAlexander Leidinger ip++;
144498a68a58SAlexander Leidinger narg--;
144598a68a58SAlexander Leidinger c = ',';
144673430055SDag-Erling Smørgrav break;
144773430055SDag-Erling Smørgrav case SYS_extattrctl:
144898a68a58SAlexander Leidinger print_number(ip, narg, c);
144909307b25SDag-Erling Smørgrav putchar(',');
14509289f547SJohn Baldwin print_integer_arg(sysdecode_extattrnamespace,
14519289f547SJohn Baldwin *ip);
145298a68a58SAlexander Leidinger ip++;
145398a68a58SAlexander Leidinger narg--;
145473430055SDag-Erling Smørgrav break;
145573430055SDag-Erling Smørgrav case SYS_nmount:
145698a68a58SAlexander Leidinger print_number(ip, narg, c);
145798a68a58SAlexander Leidinger print_number(ip, narg, c);
145809307b25SDag-Erling Smørgrav putchar(',');
1459a2065247SKyle Evans print_mask_arg0(sysdecode_mount_flags, *ip);
146098a68a58SAlexander Leidinger ip++;
146198a68a58SAlexander Leidinger narg--;
146273430055SDag-Erling Smørgrav break;
146373430055SDag-Erling Smørgrav case SYS_thr_create:
146498a68a58SAlexander Leidinger print_number(ip, narg, c);
146598a68a58SAlexander Leidinger print_number(ip, narg, c);
146609307b25SDag-Erling Smørgrav putchar(',');
14679289f547SJohn Baldwin print_mask_arg(sysdecode_thr_create_flags, *ip);
146898a68a58SAlexander Leidinger ip++;
146998a68a58SAlexander Leidinger narg--;
147073430055SDag-Erling Smørgrav break;
147173430055SDag-Erling Smørgrav case SYS_thr_kill:
147298a68a58SAlexander Leidinger print_number(ip, narg, c);
147309307b25SDag-Erling Smørgrav putchar(',');
14749289f547SJohn Baldwin print_signal(*ip);
147598a68a58SAlexander Leidinger ip++;
147698a68a58SAlexander Leidinger narg--;
147773430055SDag-Erling Smørgrav break;
147873430055SDag-Erling Smørgrav case SYS_kldunloadf:
147998a68a58SAlexander Leidinger print_number(ip, narg, c);
148009307b25SDag-Erling Smørgrav putchar(',');
14819289f547SJohn Baldwin print_integer_arg(sysdecode_kldunload_flags,
14829289f547SJohn Baldwin *ip);
148398a68a58SAlexander Leidinger ip++;
148498a68a58SAlexander Leidinger narg--;
148573430055SDag-Erling Smørgrav break;
14868447b7cdSJilles Tjoelker case SYS_linkat:
14878447b7cdSJilles Tjoelker case SYS_renameat:
14888447b7cdSJilles Tjoelker case SYS_symlinkat:
14898447b7cdSJilles Tjoelker print_number(ip, narg, c);
14908447b7cdSJilles Tjoelker putchar(',');
14919289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip);
14928447b7cdSJilles Tjoelker ip++;
14938447b7cdSJilles Tjoelker narg--;
149439a3a438SJohn Baldwin print_number(ip, narg, c);
14958447b7cdSJilles Tjoelker break;
14962609222aSPawel Jakub Dawidek case SYS_cap_fcntls_limit:
14972609222aSPawel Jakub Dawidek print_number(ip, narg, c);
14982609222aSPawel Jakub Dawidek putchar(',');
14992609222aSPawel Jakub Dawidek arg = *ip;
15002609222aSPawel Jakub Dawidek ip++;
15012609222aSPawel Jakub Dawidek narg--;
15029289f547SJohn Baldwin print_mask_arg32(sysdecode_cap_fcntlrights, arg);
15032609222aSPawel Jakub Dawidek break;
1504145e6aa9SJohn Baldwin case SYS_posix_fadvise:
1505145e6aa9SJohn Baldwin print_number(ip, narg, c);
1506145e6aa9SJohn Baldwin print_number(ip, narg, c);
1507145e6aa9SJohn Baldwin print_number(ip, narg, c);
1508145e6aa9SJohn Baldwin (void)putchar(',');
15099289f547SJohn Baldwin print_integer_arg(sysdecode_fadvice, *ip);
1510145e6aa9SJohn Baldwin ip++;
1511145e6aa9SJohn Baldwin narg--;
1512145e6aa9SJohn Baldwin break;
151355648840SJohn Baldwin case SYS_procctl:
151455648840SJohn Baldwin putchar('(');
15159289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip);
151655648840SJohn Baldwin c = ',';
151755648840SJohn Baldwin ip++;
151855648840SJohn Baldwin narg--;
151971ed318eSJohn Baldwin print_number64(first, ip, narg, c);
152055648840SJohn Baldwin putchar(',');
15219289f547SJohn Baldwin print_integer_arg(sysdecode_procctl_cmd, *ip);
152255648840SJohn Baldwin ip++;
152355648840SJohn Baldwin narg--;
152455648840SJohn Baldwin break;
1525c2679dd7SKyle Evans case SYS__umtx_op: {
1526c2679dd7SKyle Evans int op;
1527c2679dd7SKyle Evans
1528fdb5bf37SJohn Baldwin print_number(ip, narg, c);
1529fdb5bf37SJohn Baldwin putchar(',');
1530c2679dd7SKyle Evans if (print_mask_arg_part(sysdecode_umtx_op_flags,
1531c2679dd7SKyle Evans *ip, &op))
1532c2679dd7SKyle Evans putchar('|');
1533c2679dd7SKyle Evans print_integer_arg(sysdecode_umtx_op, op);
1534c2679dd7SKyle Evans putchar('>');
1535fdb5bf37SJohn Baldwin switch (*ip) {
1536fdb5bf37SJohn Baldwin case UMTX_OP_CV_WAIT:
1537fdb5bf37SJohn Baldwin ip++;
1538fdb5bf37SJohn Baldwin narg--;
1539fdb5bf37SJohn Baldwin putchar(',');
15409289f547SJohn Baldwin print_mask_argul(
15419289f547SJohn Baldwin sysdecode_umtx_cvwait_flags, *ip);
1542fdb5bf37SJohn Baldwin break;
1543fdb5bf37SJohn Baldwin case UMTX_OP_RW_RDLOCK:
1544fdb5bf37SJohn Baldwin ip++;
1545fdb5bf37SJohn Baldwin narg--;
1546fdb5bf37SJohn Baldwin putchar(',');
15479289f547SJohn Baldwin print_mask_argul(
15489289f547SJohn Baldwin sysdecode_umtx_rwlock_flags, *ip);
1549fdb5bf37SJohn Baldwin break;
1550fdb5bf37SJohn Baldwin }
1551fdb5bf37SJohn Baldwin ip++;
1552fdb5bf37SJohn Baldwin narg--;
15538dec6942SJohn Baldwin break;
1554c2679dd7SKyle Evans }
15558dec6942SJohn Baldwin case SYS_ftruncate:
15568dec6942SJohn Baldwin case SYS_truncate:
15578dec6942SJohn Baldwin print_number(ip, narg, c);
15588dec6942SJohn Baldwin print_number64(first, ip, narg, c);
15598dec6942SJohn Baldwin break;
156039a3a438SJohn Baldwin case SYS_fchownat:
156139a3a438SJohn Baldwin print_number(ip, narg, c);
156239a3a438SJohn Baldwin print_number(ip, narg, c);
156339a3a438SJohn Baldwin print_number(ip, narg, c);
156439a3a438SJohn Baldwin break;
156539a3a438SJohn Baldwin case SYS_fstatat:
156639a3a438SJohn Baldwin case SYS_utimensat:
156739a3a438SJohn Baldwin print_number(ip, narg, c);
156839a3a438SJohn Baldwin print_number(ip, narg, c);
156939a3a438SJohn Baldwin break;
157039a3a438SJohn Baldwin case SYS_unlinkat:
157139a3a438SJohn Baldwin print_number(ip, narg, c);
157239a3a438SJohn Baldwin break;
157339a3a438SJohn Baldwin case SYS_sysarch:
157439a3a438SJohn Baldwin putchar('(');
157539a3a438SJohn Baldwin print_integer_arg(sysdecode_sysarch_number, *ip);
157639a3a438SJohn Baldwin ip++;
157739a3a438SJohn Baldwin narg--;
157839a3a438SJohn Baldwin c = ',';
157939a3a438SJohn Baldwin break;
1580b9b86b67SDmitry Chagin case SYS_getitimer:
1581b9b86b67SDmitry Chagin case SYS_setitimer:
1582b9b86b67SDmitry Chagin putchar('(');
1583b9b86b67SDmitry Chagin print_integer_arg(sysdecode_itimer, *ip);
1584b9b86b67SDmitry Chagin ip++;
1585b9b86b67SDmitry Chagin narg--;
1586b9b86b67SDmitry Chagin c = ',';
1587b9b86b67SDmitry Chagin break;
158839a3a438SJohn Baldwin }
158939a3a438SJohn Baldwin switch (ktr->ktr_code) {
159039a3a438SJohn Baldwin case SYS_chflagsat:
159139a3a438SJohn Baldwin case SYS_fchownat:
159239a3a438SJohn Baldwin case SYS_faccessat:
159339a3a438SJohn Baldwin case SYS_fchmodat:
159439a3a438SJohn Baldwin case SYS_fstatat:
159539a3a438SJohn Baldwin case SYS_linkat:
159639a3a438SJohn Baldwin case SYS_unlinkat:
159739a3a438SJohn Baldwin case SYS_utimensat:
159839a3a438SJohn Baldwin putchar(',');
159939a3a438SJohn Baldwin print_mask_arg0(sysdecode_atflags, *ip);
160039a3a438SJohn Baldwin ip++;
160139a3a438SJohn Baldwin narg--;
160239a3a438SJohn Baldwin break;
16039b50d902SRodney W. Grimes }
16048a0f6d8cSDmitry Chagin *resc = c;
16058a0f6d8cSDmitry Chagin *resip = ip;
16068a0f6d8cSDmitry Chagin *resnarg = narg;
16079b50d902SRodney W. Grimes }
16089b50d902SRodney W. Grimes
160991fbb9c1SDavid Malone void
ktrsysret(struct ktr_sysret * ktr,u_int sv_flags)1610a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
16119b50d902SRodney W. Grimes {
161291fbb9c1SDavid Malone register_t ret = ktr->ktr_retval;
161391fbb9c1SDavid Malone int error = ktr->ktr_error;
16149b50d902SRodney W. Grimes
1615a5f14abfSJohn Baldwin syscallname(ktr->ktr_code, sv_flags);
1616b9034ce2SBryan Drewery printf(" ");
16179b50d902SRodney W. Grimes
16189b50d902SRodney W. Grimes if (error == 0) {
16199b50d902SRodney W. Grimes if (fancy) {
162009307b25SDag-Erling Smørgrav printf("%ld", (long)ret);
16219b50d902SRodney W. Grimes if (ret < 0 || ret > 9)
162209307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret);
16239b50d902SRodney W. Grimes } else {
16249b50d902SRodney W. Grimes if (decimal)
162509307b25SDag-Erling Smørgrav printf("%ld", (long)ret);
16269b50d902SRodney W. Grimes else
162709307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret);
16289b50d902SRodney W. Grimes }
16299b50d902SRodney W. Grimes } else if (error == ERESTART)
163009307b25SDag-Erling Smørgrav printf("RESTART");
16319b50d902SRodney W. Grimes else if (error == EJUSTRETURN)
163209307b25SDag-Erling Smørgrav printf("JUSTRETURN");
16339b50d902SRodney W. Grimes else {
1634287b96ddSJohn Baldwin printf("-1 errno %d", sysdecode_freebsd_to_abi_errno(
1635287b96ddSJohn Baldwin syscallabi(sv_flags), error));
16369b50d902SRodney W. Grimes if (fancy)
163709307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error));
16389b50d902SRodney W. Grimes }
163909307b25SDag-Erling Smørgrav putchar('\n');
16409b50d902SRodney W. Grimes }
16419b50d902SRodney W. Grimes
164291fbb9c1SDavid Malone void
ktrnamei(char * cp,int len)164391fbb9c1SDavid Malone ktrnamei(char *cp, int len)
16449b50d902SRodney W. Grimes {
164509307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp);
16469b50d902SRodney W. Grimes }
16479b50d902SRodney W. Grimes
164891fbb9c1SDavid Malone void
hexdump(char * p,int len,int screenwidth)1649ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
16509b50d902SRodney W. Grimes {
1651ec4beb5dSPeter Wemm int n, i;
1652ec4beb5dSPeter Wemm int width;
1653ec4beb5dSPeter Wemm
1654ec4beb5dSPeter Wemm width = 0;
1655ec4beb5dSPeter Wemm do {
1656ec4beb5dSPeter Wemm width += 2;
1657ec4beb5dSPeter Wemm i = 13; /* base offset */
1658ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */
1659ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */
1660ec4beb5dSPeter Wemm i += 3; /* " |" */
1661ec4beb5dSPeter Wemm i += width; /* each byte */
1662ec4beb5dSPeter Wemm i += 1; /* "|" */
1663ec4beb5dSPeter Wemm } while (i < screenwidth);
1664ec4beb5dSPeter Wemm width -= 2;
1665ec4beb5dSPeter Wemm
1666ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) {
1667ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) {
1668ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */
1669ec4beb5dSPeter Wemm printf(" 0x%04x", i);
1670ec4beb5dSPeter Wemm }
1671ec4beb5dSPeter Wemm if ((i % 2) == 0) {
1672ec4beb5dSPeter Wemm printf(" ");
1673ec4beb5dSPeter Wemm }
1674ec4beb5dSPeter Wemm if (i < len)
1675ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff);
1676ec4beb5dSPeter Wemm else
1677ec4beb5dSPeter Wemm printf(" ");
1678ec4beb5dSPeter Wemm }
1679ec4beb5dSPeter Wemm printf(" |");
1680ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) {
1681ec4beb5dSPeter Wemm if (i >= len)
1682ec4beb5dSPeter Wemm break;
1683ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~')
1684ec4beb5dSPeter Wemm printf("%c", p[i]);
1685ec4beb5dSPeter Wemm else
1686ec4beb5dSPeter Wemm printf(".");
1687ec4beb5dSPeter Wemm }
1688ec4beb5dSPeter Wemm printf("|\n");
1689ec4beb5dSPeter Wemm }
1690ec4beb5dSPeter Wemm if ((i % width) != 0)
1691ec4beb5dSPeter Wemm printf("\n");
1692ec4beb5dSPeter Wemm }
1693ec4beb5dSPeter Wemm
1694ec4beb5dSPeter Wemm void
visdump(char * dp,int datalen,int screenwidth)1695ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1696ec4beb5dSPeter Wemm {
169791fbb9c1SDavid Malone int col = 0;
1698ec4beb5dSPeter Wemm char *cp;
169991fbb9c1SDavid Malone int width;
17009b50d902SRodney W. Grimes char visbuf[5];
17019b50d902SRodney W. Grimes
170209307b25SDag-Erling Smørgrav printf(" \"");
17039b50d902SRodney W. Grimes col = 8;
17049b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) {
17051a3a57d7SAlex Richardson vis(visbuf, *dp, VIS_CSTYLE | VIS_NOLOCALE, *(dp+1));
17069b50d902SRodney W. Grimes cp = visbuf;
17079b50d902SRodney W. Grimes /*
17089b50d902SRodney W. Grimes * Keep track of printables and
17099b50d902SRodney W. Grimes * space chars (like fold(1)).
17109b50d902SRodney W. Grimes */
17119b50d902SRodney W. Grimes if (col == 0) {
171209307b25SDag-Erling Smørgrav putchar('\t');
17139b50d902SRodney W. Grimes col = 8;
17149b50d902SRodney W. Grimes }
17159b50d902SRodney W. Grimes switch(*cp) {
17169b50d902SRodney W. Grimes case '\n':
17179b50d902SRodney W. Grimes col = 0;
171809307b25SDag-Erling Smørgrav putchar('\n');
17199b50d902SRodney W. Grimes continue;
17209b50d902SRodney W. Grimes case '\t':
17219b50d902SRodney W. Grimes width = 8 - (col&07);
17229b50d902SRodney W. Grimes break;
17239b50d902SRodney W. Grimes default:
17249b50d902SRodney W. Grimes width = strlen(cp);
17259b50d902SRodney W. Grimes }
17269b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) {
172709307b25SDag-Erling Smørgrav printf("\\\n\t");
17289b50d902SRodney W. Grimes col = 8;
17299b50d902SRodney W. Grimes }
17309b50d902SRodney W. Grimes col += width;
17319b50d902SRodney W. Grimes do {
173209307b25SDag-Erling Smørgrav putchar(*cp++);
17339b50d902SRodney W. Grimes } while (*cp);
17349b50d902SRodney W. Grimes }
17359b50d902SRodney W. Grimes if (col == 0)
173609307b25SDag-Erling Smørgrav printf(" ");
173709307b25SDag-Erling Smørgrav printf("\"\n");
17389b50d902SRodney W. Grimes }
17399b50d902SRodney W. Grimes
1740ec4beb5dSPeter Wemm void
ktrgenio(struct ktr_genio * ktr,int len)1741ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1742ec4beb5dSPeter Wemm {
1743ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio);
1744ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio);
1745ec4beb5dSPeter Wemm static int screenwidth = 0;
1746ec4beb5dSPeter Wemm int i, binary;
1747ec4beb5dSPeter Wemm
17484b0ae512SPawel Jakub Dawidek printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
17494b0ae512SPawel Jakub Dawidek ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
17504b0ae512SPawel Jakub Dawidek datalen == 1 ? "" : "s");
17514b0ae512SPawel Jakub Dawidek if (suppressdata)
17524b0ae512SPawel Jakub Dawidek return;
1753ec4beb5dSPeter Wemm if (screenwidth == 0) {
1754ec4beb5dSPeter Wemm struct winsize ws;
1755ec4beb5dSPeter Wemm
1756ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1757ec4beb5dSPeter Wemm ws.ws_col > 8)
1758ec4beb5dSPeter Wemm screenwidth = ws.ws_col;
1759ec4beb5dSPeter Wemm else
1760ec4beb5dSPeter Wemm screenwidth = 80;
1761ec4beb5dSPeter Wemm }
1762ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata)
1763ec4beb5dSPeter Wemm datalen = maxdata;
1764ec4beb5dSPeter Wemm
1765ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) {
1766ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127)
1767ec4beb5dSPeter Wemm continue;
1768ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1769ec4beb5dSPeter Wemm continue;
1770ec4beb5dSPeter Wemm binary = 1;
1771ec4beb5dSPeter Wemm }
1772ec4beb5dSPeter Wemm if (binary)
1773ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth);
1774ec4beb5dSPeter Wemm else
1775ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth);
1776ec4beb5dSPeter Wemm }
1777ec4beb5dSPeter Wemm
177891fbb9c1SDavid Malone void
ktrpsig(struct ktr_psig * psig)1779dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
17809b50d902SRodney W. Grimes {
17819289f547SJohn Baldwin const char *str;
17829289f547SJohn Baldwin
17839289f547SJohn Baldwin print_signal(psig->signo);
17845677eef9SJilles Tjoelker if (psig->action == SIG_DFL) {
17859289f547SJohn Baldwin printf(" SIG_DFL");
17865677eef9SJilles Tjoelker } else {
17879289f547SJohn Baldwin printf(" caught handler=0x%lx mask=0x%x",
17885677eef9SJilles Tjoelker (u_long)psig->action, psig->mask.__bits[0]);
178991fbb9c1SDavid Malone }
17909289f547SJohn Baldwin printf(" code=");
17919289f547SJohn Baldwin str = sysdecode_sigcode(psig->signo, psig->code);
17929289f547SJohn Baldwin if (str != NULL)
17939289f547SJohn Baldwin printf("%s", str);
17949289f547SJohn Baldwin else
17959289f547SJohn Baldwin printf("<invalid=%#x>", psig->code);
17969289f547SJohn Baldwin putchar('\n');
17979b50d902SRodney W. Grimes }
17989b50d902SRodney W. Grimes
179991fbb9c1SDavid Malone void
ktrcsw_old(struct ktr_csw_old * cs)180088bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
18019b50d902SRodney W. Grimes {
180209307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume",
18039b50d902SRodney W. Grimes cs->user ? "user" : "kernel");
18049b50d902SRodney W. Grimes }
18059b50d902SRodney W. Grimes
180688bf5036SJohn Baldwin void
ktrcsw(struct ktr_csw * cs)180788bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
180888bf5036SJohn Baldwin {
180988bf5036SJohn Baldwin printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
181088bf5036SJohn Baldwin cs->user ? "user" : "kernel", cs->wmesg);
181188bf5036SJohn Baldwin }
181288bf5036SJohn Baldwin
181391fbb9c1SDavid Malone void
ktruser(int len,void * p)1814bb1a2d4aSJohn Baldwin ktruser(int len, void *p)
181582e2dd32SPoul-Henning Kamp {
1816bb1a2d4aSJohn Baldwin unsigned char *cp;
1817670b9e9fSJohn Baldwin
1818d6fb4894SJohn Baldwin if (sysdecode_utrace(stdout, p, len)) {
1819195aef99SBryan Drewery printf("\n");
1820670b9e9fSJohn Baldwin return;
1821670b9e9fSJohn Baldwin }
1822670b9e9fSJohn Baldwin
182309307b25SDag-Erling Smørgrav printf("%d ", len);
1824bb1a2d4aSJohn Baldwin cp = p;
18253f8ba9aeSPoul-Henning Kamp while (len--)
1826743f9174SPoul-Henning Kamp if (decimal)
1827bb1a2d4aSJohn Baldwin printf(" %d", *cp++);
1828743f9174SPoul-Henning Kamp else
1829bb1a2d4aSJohn Baldwin printf(" %02x", *cp++);
183009307b25SDag-Erling Smørgrav printf("\n");
183182e2dd32SPoul-Henning Kamp }
183282e2dd32SPoul-Henning Kamp
183391fbb9c1SDavid Malone void
ktrcaprights(cap_rights_t * rightsp)18347008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
18357008be5bSPawel Jakub Dawidek {
18367008be5bSPawel Jakub Dawidek
18377008be5bSPawel Jakub Dawidek printf("cap_rights_t ");
18389289f547SJohn Baldwin sysdecode_cap_rights(stdout, rightsp);
18397008be5bSPawel Jakub Dawidek printf("\n");
18407008be5bSPawel Jakub Dawidek }
18417008be5bSPawel Jakub Dawidek
1842de56aee0SKonstantin Belousov static void
ktrtimeval(struct timeval * tv)1843de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv)
1844de56aee0SKonstantin Belousov {
1845de56aee0SKonstantin Belousov
1846de56aee0SKonstantin Belousov printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1847de56aee0SKonstantin Belousov }
1848de56aee0SKonstantin Belousov
1849de56aee0SKonstantin Belousov void
ktritimerval(struct itimerval * it)1850de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it)
1851de56aee0SKonstantin Belousov {
1852de56aee0SKonstantin Belousov
1853de56aee0SKonstantin Belousov printf("itimerval { .interval = ");
1854de56aee0SKonstantin Belousov ktrtimeval(&it->it_interval);
1855de56aee0SKonstantin Belousov printf(", .value = ");
1856de56aee0SKonstantin Belousov ktrtimeval(&it->it_value);
1857de56aee0SKonstantin Belousov printf(" }\n");
1858de56aee0SKonstantin Belousov }
1859de56aee0SKonstantin Belousov
18607008be5bSPawel Jakub Dawidek void
ktrsockaddr(struct sockaddr * sa)186160e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
186260e15db9SDag-Erling Smørgrav {
186360e15db9SDag-Erling Smørgrav /*
186460e15db9SDag-Erling Smørgrav TODO: Support additional address families
1865237abf0cSDavide Italiano #include <netsmb/netbios.h>
1866237abf0cSDavide Italiano struct sockaddr_nb *nb;
186760e15db9SDag-Erling Smørgrav */
18689289f547SJohn Baldwin const char *str;
186960e15db9SDag-Erling Smørgrav char addr[64];
187060e15db9SDag-Erling Smørgrav
187160e15db9SDag-Erling Smørgrav /*
187260e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a
187360e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly
187460e15db9SDag-Erling Smørgrav * sa->sa_len bytes long.
187560e15db9SDag-Erling Smørgrav */
187660e15db9SDag-Erling Smørgrav printf("struct sockaddr { ");
18779289f547SJohn Baldwin str = sysdecode_sockaddr_family(sa->sa_family);
18789289f547SJohn Baldwin if (str != NULL)
18799289f547SJohn Baldwin printf("%s", str);
18809289f547SJohn Baldwin else
18819289f547SJohn Baldwin printf("<invalid=%d>", sa->sa_family);
188260e15db9SDag-Erling Smørgrav printf(", ");
188360e15db9SDag-Erling Smørgrav
188460e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \
188581a31394SDag-Erling Smørgrav if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) { \
188660e15db9SDag-Erling Smørgrav printf("invalid"); \
188760e15db9SDag-Erling Smørgrav break; \
188860e15db9SDag-Erling Smørgrav }
188960e15db9SDag-Erling Smørgrav
189060e15db9SDag-Erling Smørgrav switch(sa->sa_family) {
189160e15db9SDag-Erling Smørgrav case AF_INET: {
189281a31394SDag-Erling Smørgrav struct sockaddr_in sa_in;
189360e15db9SDag-Erling Smørgrav
189481a31394SDag-Erling Smørgrav memset(&sa_in, 0, sizeof(sa_in));
1895449df4ecSAndrey Zonov memcpy(&sa_in, sa, sa->sa_len);
189660e15db9SDag-Erling Smørgrav check_sockaddr_len(in);
189781a31394SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
189881a31394SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in.sin_port));
189960e15db9SDag-Erling Smørgrav break;
190060e15db9SDag-Erling Smørgrav }
190160e15db9SDag-Erling Smørgrav case AF_INET6: {
190281a31394SDag-Erling Smørgrav struct sockaddr_in6 sa_in6;
190360e15db9SDag-Erling Smørgrav
190481a31394SDag-Erling Smørgrav memset(&sa_in6, 0, sizeof(sa_in6));
1905449df4ecSAndrey Zonov memcpy(&sa_in6, sa, sa->sa_len);
190660e15db9SDag-Erling Smørgrav check_sockaddr_len(in6);
1907b9ef8051SAndrey V. Elsukov getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1908b9ef8051SAndrey V. Elsukov addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
190981a31394SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
191060e15db9SDag-Erling Smørgrav break;
191160e15db9SDag-Erling Smørgrav }
191260e15db9SDag-Erling Smørgrav case AF_UNIX: {
191381a31394SDag-Erling Smørgrav struct sockaddr_un sa_un;
191460e15db9SDag-Erling Smørgrav
191581a31394SDag-Erling Smørgrav memset(&sa_un, 0, sizeof(sa_un));
1916449df4ecSAndrey Zonov memcpy(&sa_un, sa, sa->sa_len);
191781a31394SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
191860e15db9SDag-Erling Smørgrav break;
191960e15db9SDag-Erling Smørgrav }
192060e15db9SDag-Erling Smørgrav default:
192160e15db9SDag-Erling Smørgrav printf("unknown address family");
192260e15db9SDag-Erling Smørgrav }
192360e15db9SDag-Erling Smørgrav printf(" }\n");
192460e15db9SDag-Erling Smørgrav }
192560e15db9SDag-Erling Smørgrav
192660e15db9SDag-Erling Smørgrav void
ktrstat(struct stat * statp)192760e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
192860e15db9SDag-Erling Smørgrav {
192960e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4];
193060e15db9SDag-Erling Smørgrav struct passwd *pwd;
193160e15db9SDag-Erling Smørgrav struct group *grp;
193260e15db9SDag-Erling Smørgrav struct tm *tm;
193360e15db9SDag-Erling Smørgrav
193460e15db9SDag-Erling Smørgrav /*
193560e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a
193660e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long.
193760e15db9SDag-Erling Smørgrav */
193860e15db9SDag-Erling Smørgrav printf("struct stat {");
193956f0ad0dSDag-Erling Smørgrav printf("dev=%ju, ino=%ju, ",
194056f0ad0dSDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
19415cb9940cSJohn Baldwin if (!resolv)
194256f0ad0dSDag-Erling Smørgrav printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
194356f0ad0dSDag-Erling Smørgrav else {
194460e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode);
194556f0ad0dSDag-Erling Smørgrav printf("mode=%s, ", mode);
194656f0ad0dSDag-Erling Smørgrav }
194756f0ad0dSDag-Erling Smørgrav printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
19485cb9940cSJohn Baldwin if (!resolv) {
19494622f0e1SPawel Jakub Dawidek pwd = NULL;
19504622f0e1SPawel Jakub Dawidek } else {
19512560d181SMariusz Zaborski #ifdef WITH_CASPER
19524622f0e1SPawel Jakub Dawidek if (cappwd != NULL)
19534622f0e1SPawel Jakub Dawidek pwd = cap_getpwuid(cappwd, statp->st_uid);
19544622f0e1SPawel Jakub Dawidek else
19554622f0e1SPawel Jakub Dawidek #endif
19564622f0e1SPawel Jakub Dawidek pwd = getpwuid(statp->st_uid);
19574622f0e1SPawel Jakub Dawidek }
19584622f0e1SPawel Jakub Dawidek if (pwd == NULL)
195960e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid);
196060e15db9SDag-Erling Smørgrav else
196160e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name);
19625cb9940cSJohn Baldwin if (!resolv) {
19634622f0e1SPawel Jakub Dawidek grp = NULL;
19644622f0e1SPawel Jakub Dawidek } else {
19652560d181SMariusz Zaborski #ifdef WITH_CASPER
19664622f0e1SPawel Jakub Dawidek if (capgrp != NULL)
19674622f0e1SPawel Jakub Dawidek grp = cap_getgrgid(capgrp, statp->st_gid);
19684622f0e1SPawel Jakub Dawidek else
19694622f0e1SPawel Jakub Dawidek #endif
19704622f0e1SPawel Jakub Dawidek grp = getgrgid(statp->st_gid);
19714622f0e1SPawel Jakub Dawidek }
19724622f0e1SPawel Jakub Dawidek if (grp == NULL)
197360e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid);
197460e15db9SDag-Erling Smørgrav else
197560e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name);
197660e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
197760e15db9SDag-Erling Smørgrav printf("atime=");
19785cb9940cSJohn Baldwin if (!resolv)
197999742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec);
198060e15db9SDag-Erling Smørgrav else {
198199742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec);
198209307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
198360e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr);
198460e15db9SDag-Erling Smørgrav }
198599742a23SEd Schouten if (statp->st_atim.tv_nsec != 0)
198699742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec);
198760e15db9SDag-Erling Smørgrav else
198860e15db9SDag-Erling Smørgrav printf(", ");
19890e80f258SEnji Cooper printf("mtime=");
19905cb9940cSJohn Baldwin if (!resolv)
199199742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
199260e15db9SDag-Erling Smørgrav else {
199399742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec);
199409307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
199560e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr);
199660e15db9SDag-Erling Smørgrav }
199799742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0)
199899742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec);
199960e15db9SDag-Erling Smørgrav else
200060e15db9SDag-Erling Smørgrav printf(", ");
200160e15db9SDag-Erling Smørgrav printf("ctime=");
20025cb9940cSJohn Baldwin if (!resolv)
200399742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
200460e15db9SDag-Erling Smørgrav else {
200599742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec);
200609307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
200760e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr);
200860e15db9SDag-Erling Smørgrav }
200999742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0)
201099742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec);
201160e15db9SDag-Erling Smørgrav else
201260e15db9SDag-Erling Smørgrav printf(", ");
201360e15db9SDag-Erling Smørgrav printf("birthtime=");
20145cb9940cSJohn Baldwin if (!resolv)
201599742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
201660e15db9SDag-Erling Smørgrav else {
201799742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec);
201809307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
201960e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr);
202060e15db9SDag-Erling Smørgrav }
202199742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0)
202299742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec);
202360e15db9SDag-Erling Smørgrav else
202460e15db9SDag-Erling Smørgrav printf(", ");
202560e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
202660e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
202760e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags);
202860e15db9SDag-Erling Smørgrav printf(" }\n");
202960e15db9SDag-Erling Smørgrav }
203060e15db9SDag-Erling Smørgrav
203160e15db9SDag-Erling Smørgrav void
ktrbitset(char * name,struct bitset * set,size_t setlen)2032586ed321SDmitry Chagin ktrbitset(char *name, struct bitset *set, size_t setlen)
2033586ed321SDmitry Chagin {
2034586ed321SDmitry Chagin int i, maxi, c = 0;
2035586ed321SDmitry Chagin
2036586ed321SDmitry Chagin if (setlen > INT32_MAX)
2037586ed321SDmitry Chagin setlen = INT32_MAX;
2038586ed321SDmitry Chagin maxi = setlen * CHAR_BIT;
2039586ed321SDmitry Chagin printf("%s [ ", name);
2040586ed321SDmitry Chagin for (i = 0; i < maxi; i++) {
2041586ed321SDmitry Chagin if (!BIT_ISSET(setlen, i, set))
2042586ed321SDmitry Chagin continue;
2043586ed321SDmitry Chagin if (c == 0)
2044586ed321SDmitry Chagin printf("%d", i);
2045586ed321SDmitry Chagin else
2046586ed321SDmitry Chagin printf(", %d", i);
2047586ed321SDmitry Chagin c++;
2048586ed321SDmitry Chagin }
2049586ed321SDmitry Chagin if (c == 0)
2050586ed321SDmitry Chagin printf(" empty ]\n");
2051586ed321SDmitry Chagin else
2052586ed321SDmitry Chagin printf(" ]\n");
2053586ed321SDmitry Chagin }
2054586ed321SDmitry Chagin
2055586ed321SDmitry Chagin void
ktrstruct(char * buf,size_t buflen)205660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
205760e15db9SDag-Erling Smørgrav {
205860e15db9SDag-Erling Smørgrav char *name, *data;
205960e15db9SDag-Erling Smørgrav size_t namelen, datalen;
206060e15db9SDag-Erling Smørgrav int i;
20617008be5bSPawel Jakub Dawidek cap_rights_t rights;
2062de56aee0SKonstantin Belousov struct itimerval it;
206330c1278fSWarner Losh struct stat sb;
206430c1278fSWarner Losh struct sockaddr_storage ss;
2065586ed321SDmitry Chagin struct bitset *set;
206660e15db9SDag-Erling Smørgrav
206760e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0;
206860e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0';
206960e15db9SDag-Erling Smørgrav ++namelen)
207060e15db9SDag-Erling Smørgrav /* nothing */;
207160e15db9SDag-Erling Smørgrav if (namelen == buflen)
207260e15db9SDag-Erling Smørgrav goto invalid;
207360e15db9SDag-Erling Smørgrav if (name[namelen] != '\0')
207460e15db9SDag-Erling Smørgrav goto invalid;
207560e15db9SDag-Erling Smørgrav data = buf + namelen + 1;
207660e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1;
207760e15db9SDag-Erling Smørgrav if (datalen == 0)
207860e15db9SDag-Erling Smørgrav goto invalid;
207960e15db9SDag-Erling Smørgrav /* sanity check */
208081a31394SDag-Erling Smørgrav for (i = 0; i < (int)namelen; ++i)
2081586ed321SDmitry Chagin if (!isalpha(name[i]) && name[i] != '_')
208260e15db9SDag-Erling Smørgrav goto invalid;
20837008be5bSPawel Jakub Dawidek if (strcmp(name, "caprights") == 0) {
20847008be5bSPawel Jakub Dawidek if (datalen != sizeof(cap_rights_t))
20857008be5bSPawel Jakub Dawidek goto invalid;
20867008be5bSPawel Jakub Dawidek memcpy(&rights, data, datalen);
20877008be5bSPawel Jakub Dawidek ktrcaprights(&rights);
2088de56aee0SKonstantin Belousov } else if (strcmp(name, "itimerval") == 0) {
2089de56aee0SKonstantin Belousov if (datalen != sizeof(struct itimerval))
2090de56aee0SKonstantin Belousov goto invalid;
2091de56aee0SKonstantin Belousov memcpy(&it, data, datalen);
2092de56aee0SKonstantin Belousov ktritimerval(&it);
20937008be5bSPawel Jakub Dawidek } else if (strcmp(name, "stat") == 0) {
209460e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat))
209560e15db9SDag-Erling Smørgrav goto invalid;
209630c1278fSWarner Losh memcpy(&sb, data, datalen);
209730c1278fSWarner Losh ktrstat(&sb);
209860e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) {
209930c1278fSWarner Losh if (datalen > sizeof(ss))
210060e15db9SDag-Erling Smørgrav goto invalid;
210130c1278fSWarner Losh memcpy(&ss, data, datalen);
21024b03484fSAndrey Zonov if (datalen != ss.ss_len)
210330c1278fSWarner Losh goto invalid;
210430c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss);
2105586ed321SDmitry Chagin } else if (strcmp(name, "cpuset_t") == 0) {
2106586ed321SDmitry Chagin if (datalen < 1)
2107586ed321SDmitry Chagin goto invalid;
2108586ed321SDmitry Chagin set = malloc(datalen);
2109586ed321SDmitry Chagin if (set == NULL)
2110586ed321SDmitry Chagin errx(1, "%s", strerror(ENOMEM));
2111586ed321SDmitry Chagin memcpy(set, data, datalen);
2112586ed321SDmitry Chagin ktrbitset(name, set, datalen);
2113586ed321SDmitry Chagin free(set);
211460e15db9SDag-Erling Smørgrav } else {
21153606a213SDmitry Chagin #ifdef SYSDECODE_HAVE_LINUX
21163606a213SDmitry Chagin if (ktrstruct_linux(name, data, datalen) == false)
21173606a213SDmitry Chagin #endif
211860e15db9SDag-Erling Smørgrav printf("unknown structure\n");
211960e15db9SDag-Erling Smørgrav }
212060e15db9SDag-Erling Smørgrav return;
212160e15db9SDag-Erling Smørgrav invalid:
212260e15db9SDag-Erling Smørgrav printf("invalid record\n");
212360e15db9SDag-Erling Smørgrav }
212460e15db9SDag-Erling Smørgrav
2125c601ad8eSDag-Erling Smørgrav void
ktrcapfail(struct ktr_cap_fail * ktr)2126c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
2127c601ad8eSDag-Erling Smørgrav {
21289bec8413SJake Freeland union ktr_cap_data *kcd = &ktr->cap_data;
21299bec8413SJake Freeland
2130e141be6fSDag-Erling Smørgrav switch (ktr->cap_type) {
2131e141be6fSDag-Erling Smørgrav case CAPFAIL_NOTCAPABLE:
2132e141be6fSDag-Erling Smørgrav /* operation on fd with insufficient capabilities */
2133e141be6fSDag-Erling Smørgrav printf("operation requires ");
21349bec8413SJake Freeland sysdecode_cap_rights(stdout, &kcd->cap_needed);
21352c93e2a3SPawel Jakub Dawidek printf(", descriptor holds ");
21369bec8413SJake Freeland sysdecode_cap_rights(stdout, &kcd->cap_held);
2137e141be6fSDag-Erling Smørgrav break;
2138e141be6fSDag-Erling Smørgrav case CAPFAIL_INCREASE:
2139e141be6fSDag-Erling Smørgrav /* requested more capabilities than fd already has */
2140e141be6fSDag-Erling Smørgrav printf("attempt to increase capabilities from ");
21419bec8413SJake Freeland sysdecode_cap_rights(stdout, &kcd->cap_held);
214260e45df8SDag-Erling Smørgrav printf(" to ");
21439bec8413SJake Freeland sysdecode_cap_rights(stdout, &kcd->cap_needed);
2144e141be6fSDag-Erling Smørgrav break;
2145e141be6fSDag-Erling Smørgrav case CAPFAIL_SYSCALL:
2146e141be6fSDag-Erling Smørgrav /* called restricted syscall */
21479bec8413SJake Freeland printf("system call not allowed: ");
21489bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21499bec8413SJake Freeland if (syscallabi(ktr->cap_svflags) == SYSDECODE_ABI_FREEBSD) {
21509bec8413SJake Freeland switch (ktr->cap_code) {
21519bec8413SJake Freeland case SYS_sysarch:
21529bec8413SJake Freeland printf(", op: ");
21539bec8413SJake Freeland print_integer_arg(sysdecode_sysarch_number,
21549bec8413SJake Freeland kcd->cap_int);
2155e141be6fSDag-Erling Smørgrav break;
21569bec8413SJake Freeland case SYS_fcntl:
21579bec8413SJake Freeland printf(", cmd: ");
21589bec8413SJake Freeland print_integer_arg(sysdecode_fcntl_cmd,
21599bec8413SJake Freeland kcd->cap_int);
21609bec8413SJake Freeland break;
21619bec8413SJake Freeland }
21629bec8413SJake Freeland }
21639bec8413SJake Freeland break;
21649bec8413SJake Freeland case CAPFAIL_SIGNAL:
21659bec8413SJake Freeland /* sent signal to proc other than self */
21669bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21679bec8413SJake Freeland printf(": signal delivery not allowed: ");
21689bec8413SJake Freeland print_integer_arg(sysdecode_signal, kcd->cap_int);
21699bec8413SJake Freeland break;
21709bec8413SJake Freeland case CAPFAIL_PROTO:
21719bec8413SJake Freeland /* created socket with restricted protocol */
21729bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21739bec8413SJake Freeland printf(": protocol not allowed: ");
21749bec8413SJake Freeland print_integer_arg(sysdecode_ipproto, kcd->cap_int);
21759bec8413SJake Freeland break;
21769bec8413SJake Freeland case CAPFAIL_SOCKADDR:
21779bec8413SJake Freeland /* unable to look up address */
21789bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21799bec8413SJake Freeland printf(": restricted address lookup: ");
21809bec8413SJake Freeland ktrsockaddr(&kcd->cap_sockaddr);
21819bec8413SJake Freeland return;
21829bec8413SJake Freeland case CAPFAIL_NAMEI:
2183c0347e18SEd Maste /* absolute or AT_FDCWD path, ".." path, etc. */
21849bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21859bec8413SJake Freeland printf(": restricted VFS lookup: %s\n", kcd->cap_path);
21869bec8413SJake Freeland return;
21879bec8413SJake Freeland case CAPFAIL_CPUSET:
21889bec8413SJake Freeland /* modification of an external cpuset */
21899bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21909bec8413SJake Freeland printf(": restricted cpuset operation\n");
21919bec8413SJake Freeland return;
2192e141be6fSDag-Erling Smørgrav default:
21939bec8413SJake Freeland syscallname(ktr->cap_code, ktr->cap_svflags);
21949bec8413SJake Freeland printf(": unknown capability failure\n");
21959bec8413SJake Freeland return;
2196e141be6fSDag-Erling Smørgrav }
219735818d2eSJohn Baldwin printf("\n");
219835818d2eSJohn Baldwin }
219935818d2eSJohn Baldwin
220035818d2eSJohn Baldwin void
ktrfault(struct ktr_fault * ktr)220135818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
220235818d2eSJohn Baldwin {
220335818d2eSJohn Baldwin
220478ec874dSDmitry Chagin printf("0x%jx ", (uintmax_t)ktr->vaddr);
22059289f547SJohn Baldwin print_mask_arg(sysdecode_vmprot, ktr->type);
220635818d2eSJohn Baldwin printf("\n");
220735818d2eSJohn Baldwin }
220835818d2eSJohn Baldwin
220935818d2eSJohn Baldwin void
ktrfaultend(struct ktr_faultend * ktr)221035818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
221135818d2eSJohn Baldwin {
22129289f547SJohn Baldwin const char *str;
221335818d2eSJohn Baldwin
22149289f547SJohn Baldwin str = sysdecode_vmresult(ktr->result);
22159289f547SJohn Baldwin if (str != NULL)
22169289f547SJohn Baldwin printf("%s", str);
22179289f547SJohn Baldwin else
22189289f547SJohn Baldwin printf("<invalid=%d>", ktr->result);
221935818d2eSJohn Baldwin printf("\n");
2220c601ad8eSDag-Erling Smørgrav }
2221c601ad8eSDag-Erling Smørgrav
222260e15db9SDag-Erling Smørgrav void
ktrkevent(struct kevent * kev)2223ffb66079SJohn Baldwin ktrkevent(struct kevent *kev)
2224ffb66079SJohn Baldwin {
2225ffb66079SJohn Baldwin
2226ffb66079SJohn Baldwin printf("{ ident=");
2227ffb66079SJohn Baldwin switch (kev->filter) {
2228ffb66079SJohn Baldwin case EVFILT_READ:
2229ffb66079SJohn Baldwin case EVFILT_WRITE:
2230ffb66079SJohn Baldwin case EVFILT_VNODE:
2231ffb66079SJohn Baldwin case EVFILT_PROC:
2232ffb66079SJohn Baldwin case EVFILT_TIMER:
2233ffb66079SJohn Baldwin case EVFILT_PROCDESC:
2234ffb66079SJohn Baldwin case EVFILT_EMPTY:
2235ffb66079SJohn Baldwin printf("%ju", (uintmax_t)kev->ident);
2236ffb66079SJohn Baldwin break;
2237ffb66079SJohn Baldwin case EVFILT_SIGNAL:
2238ffb66079SJohn Baldwin print_signal(kev->ident);
2239ffb66079SJohn Baldwin break;
2240ffb66079SJohn Baldwin default:
2241ffb66079SJohn Baldwin printf("%p", (void *)kev->ident);
2242ffb66079SJohn Baldwin }
2243ffb66079SJohn Baldwin printf(", filter=");
2244ffb66079SJohn Baldwin print_integer_arg(sysdecode_kevent_filter, kev->filter);
2245ffb66079SJohn Baldwin printf(", flags=");
2246ffb66079SJohn Baldwin print_mask_arg0(sysdecode_kevent_flags, kev->flags);
2247ffb66079SJohn Baldwin printf(", fflags=");
2248ffb66079SJohn Baldwin sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags,
2249ffb66079SJohn Baldwin decimal ? 10 : 16);
2250ffb66079SJohn Baldwin printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata);
2251ffb66079SJohn Baldwin }
2252ffb66079SJohn Baldwin
2253ffb66079SJohn Baldwin void
ktrpollfd(struct pollfd * pfd)225402c57f7bSKyle Evans ktrpollfd(struct pollfd *pfd)
225502c57f7bSKyle Evans {
225602c57f7bSKyle Evans
225702c57f7bSKyle Evans printf("{ fd=%d", pfd->fd);
225802c57f7bSKyle Evans printf(", events=");
225902c57f7bSKyle Evans print_mask_arg0(sysdecode_pollfd_events, pfd->events);
226002c57f7bSKyle Evans printf(", revents=");
226102c57f7bSKyle Evans print_mask_arg0(sysdecode_pollfd_events, pfd->revents);
226202c57f7bSKyle Evans printf("}");
226302c57f7bSKyle Evans }
226402c57f7bSKyle Evans
226502c57f7bSKyle Evans void
ktrstructarray(struct ktr_struct_array * ksa,size_t buflen)2266ffb66079SJohn Baldwin ktrstructarray(struct ktr_struct_array *ksa, size_t buflen)
2267ffb66079SJohn Baldwin {
2268ffb66079SJohn Baldwin struct kevent kev;
226902c57f7bSKyle Evans struct pollfd pfd;
2270ffb66079SJohn Baldwin char *name, *data;
2271ffb66079SJohn Baldwin size_t namelen, datalen;
2272ffb66079SJohn Baldwin int i;
2273ffb66079SJohn Baldwin bool first;
2274ffb66079SJohn Baldwin
2275ffb66079SJohn Baldwin buflen -= sizeof(*ksa);
2276ffb66079SJohn Baldwin for (name = (char *)(ksa + 1), namelen = 0;
2277ffb66079SJohn Baldwin namelen < buflen && name[namelen] != '\0';
2278ffb66079SJohn Baldwin ++namelen)
2279ffb66079SJohn Baldwin /* nothing */;
2280ffb66079SJohn Baldwin if (namelen == buflen)
2281ffb66079SJohn Baldwin goto invalid;
2282ffb66079SJohn Baldwin if (name[namelen] != '\0')
2283ffb66079SJohn Baldwin goto invalid;
2284ffb66079SJohn Baldwin /* sanity check */
2285ffb66079SJohn Baldwin for (i = 0; i < (int)namelen; ++i)
2286ffb66079SJohn Baldwin if (!isalnum(name[i]) && name[i] != '_')
2287ffb66079SJohn Baldwin goto invalid;
2288ffb66079SJohn Baldwin data = name + namelen + 1;
2289ffb66079SJohn Baldwin datalen = buflen - namelen - 1;
2290ffb66079SJohn Baldwin printf("struct %s[] = { ", name);
2291ffb66079SJohn Baldwin first = true;
2292ffb66079SJohn Baldwin for (; datalen >= ksa->struct_size;
2293ffb66079SJohn Baldwin data += ksa->struct_size, datalen -= ksa->struct_size) {
2294ffb66079SJohn Baldwin if (!first)
2295ffb66079SJohn Baldwin printf("\n ");
2296ffb66079SJohn Baldwin else
2297ffb66079SJohn Baldwin first = false;
2298ffb66079SJohn Baldwin if (strcmp(name, "kevent") == 0) {
2299ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev))
2300ffb66079SJohn Baldwin goto bad_size;
2301ffb66079SJohn Baldwin memcpy(&kev, data, sizeof(kev));
2302ffb66079SJohn Baldwin ktrkevent(&kev);
23038e4a3addSBrooks Davis } else if (strcmp(name, "freebsd11_kevent") == 0) {
23048e4a3addSBrooks Davis struct freebsd11_kevent kev11;
2305ffb66079SJohn Baldwin
2306ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev11))
2307ffb66079SJohn Baldwin goto bad_size;
2308ffb66079SJohn Baldwin memcpy(&kev11, data, sizeof(kev11));
2309ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev));
2310ffb66079SJohn Baldwin kev.ident = kev11.ident;
2311ffb66079SJohn Baldwin kev.filter = kev11.filter;
2312ffb66079SJohn Baldwin kev.flags = kev11.flags;
2313ffb66079SJohn Baldwin kev.fflags = kev11.fflags;
2314ffb66079SJohn Baldwin kev.data = kev11.data;
2315ffb66079SJohn Baldwin kev.udata = kev11.udata;
2316ffb66079SJohn Baldwin ktrkevent(&kev);
2317ffb66079SJohn Baldwin #ifdef _WANT_KEVENT32
2318ffb66079SJohn Baldwin } else if (strcmp(name, "kevent32") == 0) {
2319ffb66079SJohn Baldwin struct kevent32 kev32;
2320ffb66079SJohn Baldwin
2321ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev32))
2322ffb66079SJohn Baldwin goto bad_size;
2323ffb66079SJohn Baldwin memcpy(&kev32, data, sizeof(kev32));
2324ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev));
2325ffb66079SJohn Baldwin kev.ident = kev32.ident;
2326ffb66079SJohn Baldwin kev.filter = kev32.filter;
2327ffb66079SJohn Baldwin kev.flags = kev32.flags;
2328ffb66079SJohn Baldwin kev.fflags = kev32.fflags;
2329ffb66079SJohn Baldwin #if BYTE_ORDER == BIG_ENDIAN
2330ffb66079SJohn Baldwin kev.data = kev32.data2 | ((int64_t)kev32.data1 << 32);
2331ffb66079SJohn Baldwin #else
2332ffb66079SJohn Baldwin kev.data = kev32.data1 | ((int64_t)kev32.data2 << 32);
2333ffb66079SJohn Baldwin #endif
2334ffb66079SJohn Baldwin kev.udata = (void *)(uintptr_t)kev32.udata;
2335ffb66079SJohn Baldwin ktrkevent(&kev);
23368e4a3addSBrooks Davis } else if (strcmp(name, "freebsd11_kevent32") == 0) {
23378e4a3addSBrooks Davis struct freebsd11_kevent32 kev32;
2338ffb66079SJohn Baldwin
2339ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev32))
2340ffb66079SJohn Baldwin goto bad_size;
2341ffb66079SJohn Baldwin memcpy(&kev32, data, sizeof(kev32));
2342ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev));
2343ffb66079SJohn Baldwin kev.ident = kev32.ident;
2344ffb66079SJohn Baldwin kev.filter = kev32.filter;
2345ffb66079SJohn Baldwin kev.flags = kev32.flags;
2346ffb66079SJohn Baldwin kev.fflags = kev32.fflags;
2347ffb66079SJohn Baldwin kev.data = kev32.data;
2348ffb66079SJohn Baldwin kev.udata = (void *)(uintptr_t)kev32.udata;
2349ffb66079SJohn Baldwin ktrkevent(&kev);
2350ffb66079SJohn Baldwin #endif
235102c57f7bSKyle Evans } else if (strcmp(name, "pollfd") == 0) {
235202c57f7bSKyle Evans if (ksa->struct_size != sizeof(pfd))
235302c57f7bSKyle Evans goto bad_size;
235402c57f7bSKyle Evans memcpy(&pfd, data, sizeof(pfd));
235502c57f7bSKyle Evans ktrpollfd(&pfd);
2356ffb66079SJohn Baldwin } else {
2357ffb66079SJohn Baldwin printf("<unknown structure> }\n");
2358ffb66079SJohn Baldwin return;
2359ffb66079SJohn Baldwin }
2360ffb66079SJohn Baldwin }
2361ffb66079SJohn Baldwin printf(" }\n");
2362ffb66079SJohn Baldwin return;
2363ffb66079SJohn Baldwin invalid:
2364ffb66079SJohn Baldwin printf("invalid record\n");
2365ffb66079SJohn Baldwin return;
2366ffb66079SJohn Baldwin bad_size:
2367ffb66079SJohn Baldwin printf("<bad size> }\n");
2368ffb66079SJohn Baldwin return;
2369ffb66079SJohn Baldwin }
2370ffb66079SJohn Baldwin
2371ffb66079SJohn Baldwin void
usage(void)237291fbb9c1SDavid Malone usage(void)
23739b50d902SRodney W. Grimes {
2374b9034ce2SBryan Drewery fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2375da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n");
23769b50d902SRodney W. Grimes exit(1);
23779b50d902SRodney W. Grimes }
2378