kdump.c revision 190168
138032Speter/*- 2285303Sgshapiro * Copyright (c) 1988, 1993 364562Sgshapiro * The Regents of the University of California. All rights reserved. 438032Speter * 538032Speter * Redistribution and use in source and binary forms, with or without 638032Speter * modification, are permitted provided that the following conditions 738032Speter * are met: 838032Speter * 1. Redistributions of source code must retain the above copyright 938032Speter * notice, this list of conditions and the following disclaimer. 1038032Speter * 2. Redistributions in binary form must reproduce the above copyright 1138032Speter * notice, this list of conditions and the following disclaimer in the 1238032Speter * documentation and/or other materials provided with the distribution. 1338032Speter * 3. All advertising materials mentioning features or use of this software 1464562Sgshapiro * must display the following acknowledgement: 1538032Speter * This product includes software developed by the University of 16266692Sgshapiro * California, Berkeley and its contributors. 1764562Sgshapiro * 4. Neither the name of the University nor the names of its contributors 1864562Sgshapiro * may be used to endorse or promote products derived from this software 1964562Sgshapiro * without specific prior written permission. 2038032Speter * 2164562Sgshapiro * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2264562Sgshapiro * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2390792Sgshapiro * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2438032Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2590792Sgshapiro * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2690792Sgshapiro * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2790792Sgshapiro * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2890792Sgshapiro * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2990792Sgshapiro * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3038032Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3138032Speter * SUCH DAMAGE. 3238032Speter */ 3338032Speter 3438032Speter#ifndef lint 3538032Speterstatic const char copyright[] = 3690792Sgshapiro"@(#) Copyright (c) 1988, 1993\n\ 3738032Speter The Regents of the University of California. All rights reserved.\n"; 3890792Sgshapiro#endif /* not lint */ 3938032Speter 4090792Sgshapiro#ifndef lint 4190792Sgshapiro#if 0 4290792Sgshapirostatic char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; 4364562Sgshapiro#endif 4464562Sgshapiro#endif /* not lint */ 4564562Sgshapiro#include <sys/cdefs.h> 4690792Sgshapiro__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 190168 2009-03-20 18:29:52Z delphij $"); 4738032Speter 4838032Speter#define _KERNEL 4938032Speterextern int errno; 5038032Speter#include <sys/errno.h> 5138032Speter#undef _KERNEL 5238032Speter#include <sys/param.h> 5364562Sgshapiro#include <sys/errno.h> 5464562Sgshapiro#define _KERNEL 5564562Sgshapiro#include <sys/time.h> 5638032Speter#undef _KERNEL 5738032Speter#include <sys/uio.h> 5838032Speter#include <sys/ktrace.h> 5938032Speter#include <sys/ioctl.h> 6038032Speter#include <sys/socket.h> 6138032Speter#include <sys/stat.h> 6238032Speter#include <sys/un.h> 6338032Speter#ifdef IPX 6438032Speter#include <sys/types.h> 6564562Sgshapiro#include <netipx/ipx.h> 6638032Speter#endif 6738032Speter#ifdef NETATALK 6838032Speter#include <netatalk/at.h> 6964562Sgshapiro#endif 7038032Speter#include <arpa/inet.h> 7138032Speter#include <netinet/in.h> 7294334Sgshapiro#include <ctype.h> 7338032Speter#include <dlfcn.h> 7464562Sgshapiro#include <err.h> 7564562Sgshapiro#include <grp.h> 7638032Speter#include <inttypes.h> 7764562Sgshapiro#include <locale.h> 7838032Speter#include <pwd.h> 7938032Speter#include <stdio.h> 8090792Sgshapiro#include <stdlib.h> 81132943Sgshapiro#include <string.h> 8238032Speter#include <time.h> 8338032Speter#include <unistd.h> 8438032Speter#include <vis.h> 8538032Speter#include "ktrace.h" 8638032Speter#include "kdump_subr.h" 8738032Speter 8838032Speterint fread_tail(void *, int, int); 89141867Sgshapirovoid dumpheader(struct ktr_header *); 9038032Spetervoid ktrsyscall(struct ktr_syscall *); 9138032Spetervoid ktrsysret(struct ktr_sysret *); 9238032Spetervoid ktrnamei(char *, int); 9390792Sgshapirovoid hexdump(char *, int, int); 9494334Sgshapirovoid visdump(char *, int, int); 95285303Sgshapirovoid ktrgenio(struct ktr_genio *, int); 96285303Sgshapirovoid ktrpsig(struct ktr_psig *); 97285303Sgshapirovoid ktrcsw(struct ktr_csw *); 98285303Sgshapirovoid ktruser(int, unsigned char *); 99285303Sgshapirovoid ktrsockaddr(struct sockaddr *); 10098121Sgshapirovoid ktrstat(struct stat *); 10138032Spetervoid ktrstruct(char *, size_t); 10290792Sgshapirovoid usage(void); 10390792Sgshapirovoid sockfamilyname(int); 10490792Sgshapiroconst char *ioctlname(u_long); 10538032Speter 10638032Speterint timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 10764562Sgshapiro resolv = 0; 10838032Speterconst char *tracefile = DEF_TRACEFILE; 10938032Speterstruct ktr_header ktr_header; 11064562Sgshapiro 11164562Sgshapiro#define TIME_FORMAT "%b %e %T %Y" 11264562Sgshapiro#define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 11338032Speter 11438032Speterint 11564562Sgshapiromain(int argc, char *argv[]) 11638032Speter{ 11738032Speter int ch, ktrlen, size; 11838032Speter void *m; 11964562Sgshapiro int trpoints = ALL_POINTS; 12038032Speter int drop_logged; 12138032Speter pid_t pid = 0; 12294334Sgshapiro 12338032Speter (void) setlocale(LC_CTYPE, ""); 12438032Speter 12538032Speter while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1) 12638032Speter switch((char)ch) { 12738032Speter case 'f': 12864562Sgshapiro tracefile = optarg; 12964562Sgshapiro break; 13038032Speter case 'd': 13138032Speter decimal = 1; 132110560Sgshapiro break; 13338032Speter case 'l': 13438032Speter tail = 1; 13538032Speter break; 13638032Speter case 'm': 13738032Speter maxdata = atoi(optarg); 13838032Speter break; 13938032Speter case 'n': 14038032Speter fancy = 0; 14190792Sgshapiro break; 14264562Sgshapiro case 'p': 143223067Sgshapiro pid = atoi(optarg); 14438032Speter break; 14538032Speter case 'r': 14638032Speter resolv = 1; 14738032Speter break; 14838032Speter case 's': 14938032Speter suppressdata = 1; 15038032Speter break; 15138032Speter case 'E': 15238032Speter timestamp = 3; /* elapsed timestamp */ 15338032Speter break; 15438032Speter case 'H': 15538032Speter threads = 1; 15664562Sgshapiro break; 15738032Speter case 'R': 15838032Speter timestamp = 2; /* relative timestamp */ 15964562Sgshapiro break; 16038032Speter case 'T': 16138032Speter timestamp = 1; 16290792Sgshapiro break; 16390792Sgshapiro case 't': 16490792Sgshapiro trpoints = getpoints(optarg); 16538032Speter if (trpoints < 0) 16638032Speter errx(1, "unknown trace point in %s", optarg); 16764562Sgshapiro break; 16838032Speter default: 16938032Speter usage(); 17090792Sgshapiro } 17190792Sgshapiro 17238032Speter if (argc > optind) 17364562Sgshapiro usage(); 17438032Speter 17538032Speter m = (void *)malloc(size = 1025); 17638032Speter if (m == NULL) 17738032Speter errx(1, "%s", strerror(ENOMEM)); 17864562Sgshapiro if (!freopen(tracefile, "r", stdin)) 17938032Speter err(1, "%s", tracefile); 18090792Sgshapiro drop_logged = 0; 18190792Sgshapiro while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 18290792Sgshapiro if (ktr_header.ktr_type & KTR_DROP) { 18338032Speter ktr_header.ktr_type &= ~KTR_DROP; 18490792Sgshapiro if (!drop_logged && threads) { 18564562Sgshapiro (void)printf("%6d %6d %-8.*s Events dropped.\n", 18690792Sgshapiro ktr_header.ktr_pid, ktr_header.ktr_tid > 18790792Sgshapiro 0 ? ktr_header.ktr_tid : 0, MAXCOMLEN, 18890792Sgshapiro ktr_header.ktr_comm); 189223067Sgshapiro drop_logged = 1; 19038032Speter } else if (!drop_logged) { 19138032Speter (void)printf("%6d %-8.*s Events dropped.\n", 19238032Speter ktr_header.ktr_pid, MAXCOMLEN, 19338032Speter ktr_header.ktr_comm); 19438032Speter drop_logged = 1; 19538032Speter } 19638032Speter } 19738032Speter if (trpoints & (1<<ktr_header.ktr_type)) 19838032Speter if (pid == 0 || ktr_header.ktr_pid == pid) 19938032Speter dumpheader(&ktr_header); 20038032Speter if ((ktrlen = ktr_header.ktr_len) < 0) 20138032Speter errx(1, "bogus length 0x%x", ktrlen); 20238032Speter if (ktrlen > size) { 20338032Speter m = (void *)realloc(m, ktrlen+1); 20438032Speter if (m == NULL) 20538032Speter errx(1, "%s", strerror(ENOMEM)); 20638032Speter size = ktrlen; 20738032Speter } 20838032Speter if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 20938032Speter errx(1, "data too short"); 21038032Speter if (pid && ktr_header.ktr_pid != pid) 21138032Speter continue; 21238032Speter if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 21338032Speter continue; 21438032Speter drop_logged = 0; 21538032Speter switch (ktr_header.ktr_type) { 21638032Speter case KTR_SYSCALL: 21790792Sgshapiro ktrsyscall((struct ktr_syscall *)m); 21838032Speter break; 21964562Sgshapiro case KTR_SYSRET: 22038032Speter ktrsysret((struct ktr_sysret *)m); 22177349Sgshapiro break; 22277349Sgshapiro case KTR_NAMEI: 22338032Speter case KTR_SYSCTL: 22438032Speter ktrnamei(m, ktrlen); 22538032Speter break; 22638032Speter case KTR_GENIO: 22738032Speter ktrgenio((struct ktr_genio *)m, ktrlen); 22838032Speter break; 22938032Speter case KTR_PSIG: 23038032Speter ktrpsig((struct ktr_psig *)m); 231132943Sgshapiro break; 23238032Speter case KTR_CSW: 23338032Speter ktrcsw((struct ktr_csw *)m); 234132943Sgshapiro break; 235285303Sgshapiro case KTR_USER: 23638032Speter ktruser(ktrlen, m); 23738032Speter break; 23838032Speter case KTR_STRUCT: 239132943Sgshapiro ktrstruct(m, ktrlen); 240132943Sgshapiro break; 24138032Speter default: 24238032Speter printf("\n"); 24338032Speter break; 24438032Speter } 24538032Speter if (tail) 24638032Speter (void)fflush(stdout); 24738032Speter } 24838032Speter return 0; 24938032Speter} 25038032Speter 25138032Speterint 25238032Speterfread_tail(void *buf, int size, int num) 25338032Speter{ 25464562Sgshapiro int i; 25538032Speter 25638032Speter while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 25738032Speter (void)sleep(1); 25838032Speter clearerr(stdin); 25938032Speter } 26038032Speter return (i); 26164562Sgshapiro} 26264562Sgshapiro 26338032Spetervoid 26438032Speterdumpheader(struct ktr_header *kth) 26538032Speter{ 26638032Speter static char unknown[64]; 26738032Speter static struct timeval prevtime, temp; 26838032Speter const char *type; 26938032Speter 27038032Speter switch (kth->ktr_type) { 27138032Speter case KTR_SYSCALL: 27290792Sgshapiro type = "CALL"; 27338032Speter break; 27438032Speter case KTR_SYSRET: 27538032Speter type = "RET "; 27638032Speter break; 27738032Speter case KTR_NAMEI: 27838032Speter type = "NAMI"; 27938032Speter break; 28038032Speter case KTR_GENIO: 28138032Speter type = "GIO "; 28238032Speter break; 28338032Speter case KTR_PSIG: 28438032Speter type = "PSIG"; 28538032Speter break; 28664562Sgshapiro case KTR_CSW: 28738032Speter type = "CSW "; 28838032Speter break; 28938032Speter case KTR_USER: 29038032Speter type = "USER"; 29138032Speter break; 29238032Speter case KTR_STRUCT: 29338032Speter type = "STRU"; 29438032Speter break; 29538032Speter case KTR_SYSCTL: 29690792Sgshapiro type = "SCTL"; 29790792Sgshapiro break; 29890792Sgshapiro default: 29990792Sgshapiro (void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 30090792Sgshapiro type = unknown; 30190792Sgshapiro } 30290792Sgshapiro 30390792Sgshapiro /* 30490792Sgshapiro * The ktr_tid field was previously the ktr_buffer field, which held 30538032Speter * the kernel pointer value for the buffer associated with data 30638032Speter * following the record header. It now holds a threadid, but only 30738032Speter * for trace files after the change. Older trace files still contain 30890792Sgshapiro * kernel pointers. Detect this and suppress the results by printing 30990792Sgshapiro * negative tid's as 0. 31090792Sgshapiro */ 31190792Sgshapiro if (threads) 31290792Sgshapiro (void)printf("%6d %6d %-8.*s ", kth->ktr_pid, kth->ktr_tid > 31390792Sgshapiro 0 ? kth->ktr_tid : 0, MAXCOMLEN, kth->ktr_comm); 31464562Sgshapiro else 31564562Sgshapiro (void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, 31664562Sgshapiro kth->ktr_comm); 31764562Sgshapiro if (timestamp) { 31890792Sgshapiro if (timestamp == 3) { 31964562Sgshapiro if (prevtime.tv_sec == 0) 32064562Sgshapiro prevtime = kth->ktr_time; 32164562Sgshapiro timevalsub(&kth->ktr_time, &prevtime); 32264562Sgshapiro } 32364562Sgshapiro if (timestamp == 2) { 32464562Sgshapiro temp = kth->ktr_time; 32590792Sgshapiro timevalsub(&kth->ktr_time, &prevtime); 32664562Sgshapiro prevtime = temp; 32790792Sgshapiro } 32864562Sgshapiro (void)printf("%ld.%06ld ", 32964562Sgshapiro kth->ktr_time.tv_sec, kth->ktr_time.tv_usec); 33064562Sgshapiro } 33164562Sgshapiro (void)printf("%s ", type); 33264562Sgshapiro} 33364562Sgshapiro 33464562Sgshapiro#include <sys/syscall.h> 33564562Sgshapiro#define KTRACE 33664562Sgshapiro#include <sys/kern/syscalls.c> 33764562Sgshapiro#undef KTRACE 33864562Sgshapiroint nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]); 339223067Sgshapiro 340223067Sgshapirovoid 341223067Sgshapiroktrsyscall(struct ktr_syscall *ktr) 342223067Sgshapiro{ 343223067Sgshapiro int narg = ktr->ktr_narg; 344223067Sgshapiro register_t *ip; 345223067Sgshapiro 346223067Sgshapiro if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0) 347223067Sgshapiro (void)printf("[%d]", ktr->ktr_code); 34890792Sgshapiro else 34990792Sgshapiro (void)printf("%s", syscallnames[ktr->ktr_code]); 35090792Sgshapiro ip = &ktr->ktr_args[0]; 35190792Sgshapiro if (narg) { 35290792Sgshapiro char c = '('; 35390792Sgshapiro if (fancy) { 35490792Sgshapiro 35577349Sgshapiro#define print_number(i,n,c) do { \ 35664562Sgshapiro if (decimal) \ 35764562Sgshapiro (void)printf("%c%ld", c, (long)*i); \ 35864562Sgshapiro else \ 35964562Sgshapiro (void)printf("%c%#lx", c, (long)*i); \ 36064562Sgshapiro i++; \ 36164562Sgshapiro n--; \ 36264562Sgshapiro c = ','; \ 36364562Sgshapiro } while (0); 36464562Sgshapiro 36564562Sgshapiro if (ktr->ktr_code == SYS_ioctl) { 36664562Sgshapiro const char *cp; 36764562Sgshapiro print_number(ip,narg,c); 36864562Sgshapiro if ((cp = ioctlname(*ip)) != NULL) 36964562Sgshapiro (void)printf(",%s", cp); 37064562Sgshapiro else { 37164562Sgshapiro if (decimal) 37264562Sgshapiro (void)printf(",%ld", (long)*ip); 37364562Sgshapiro else 37464562Sgshapiro (void)printf(",%#lx ", (long)*ip); 37564562Sgshapiro } 37664562Sgshapiro c = ','; 37764562Sgshapiro ip++; 37864562Sgshapiro narg--; 37964562Sgshapiro } else if (ktr->ktr_code == SYS_ptrace) { 38064562Sgshapiro (void)putchar('('); 38164562Sgshapiro ptraceopname ((int)*ip); 38264562Sgshapiro c = ','; 38364562Sgshapiro ip++; 38464562Sgshapiro narg--; 38564562Sgshapiro } else if (ktr->ktr_code == SYS_access || 38664562Sgshapiro ktr->ktr_code == SYS_eaccess) { 38764562Sgshapiro print_number(ip,narg,c); 38864562Sgshapiro (void)putchar(','); 38990792Sgshapiro accessmodename ((int)*ip); 39090792Sgshapiro ip++; 39190792Sgshapiro narg--; 39238032Speter } else if (ktr->ktr_code == SYS_open) { 39338032Speter int flags; 39438032Speter int mode; 39538032Speter print_number(ip,narg,c); 39638032Speter flags = *ip; 39738032Speter mode = *++ip; 39838032Speter (void)putchar(','); 39990792Sgshapiro flagsandmodename (flags, mode, decimal); 40038032Speter ip++; 40138032Speter narg-=2; 40238032Speter } else if (ktr->ktr_code == SYS_wait4) { 40338032Speter print_number(ip,narg,c); 40438032Speter print_number(ip,narg,c); 40564562Sgshapiro (void)putchar(','); 40638032Speter wait4optname ((int)*ip); 40738032Speter ip++; 40838032Speter narg--; 40938032Speter } else if (ktr->ktr_code == SYS_chmod || 41038032Speter ktr->ktr_code == SYS_fchmod || 41138032Speter ktr->ktr_code == SYS_lchmod) { 41238032Speter print_number(ip,narg,c); 41338032Speter (void)putchar(','); 41490792Sgshapiro modename ((int)*ip); 41590792Sgshapiro ip++; 41690792Sgshapiro narg--; 41738032Speter } else if (ktr->ktr_code == SYS_mknod) { 41838032Speter print_number(ip,narg,c); 41964562Sgshapiro (void)putchar(','); 420223067Sgshapiro modename ((int)*ip); 42190792Sgshapiro ip++; 42290792Sgshapiro narg--; 42390792Sgshapiro } else if (ktr->ktr_code == SYS_getfsstat) { 42438032Speter print_number(ip,narg,c); 42564562Sgshapiro print_number(ip,narg,c); 42690792Sgshapiro (void)putchar(','); 42790792Sgshapiro getfsstatflagsname ((int)*ip); 42890792Sgshapiro ip++; 42990792Sgshapiro narg--; 43090792Sgshapiro } else if (ktr->ktr_code == SYS_mount) { 43190792Sgshapiro print_number(ip,narg,c); 43290792Sgshapiro print_number(ip,narg,c); 43390792Sgshapiro (void)putchar(','); 43490792Sgshapiro mountflagsname ((int)*ip); 43590792Sgshapiro ip++; 43690792Sgshapiro narg--; 43790792Sgshapiro } else if (ktr->ktr_code == SYS_unmount) { 43890792Sgshapiro print_number(ip,narg,c); 43990792Sgshapiro (void)putchar(','); 44038032Speter mountflagsname ((int)*ip); 44190792Sgshapiro ip++; 44238032Speter narg--; 44338032Speter } else if (ktr->ktr_code == SYS_recvmsg || 44464562Sgshapiro ktr->ktr_code == SYS_sendmsg) { 44538032Speter print_number(ip,narg,c); 44638032Speter print_number(ip,narg,c); 44790792Sgshapiro (void)putchar(','); 44838032Speter sendrecvflagsname ((int)*ip); 44938032Speter ip++; 45038032Speter narg--; 45138032Speter } else if (ktr->ktr_code == SYS_recvfrom || 45238032Speter ktr->ktr_code == SYS_sendto) { 45390792Sgshapiro print_number(ip,narg,c); 45438032Speter print_number(ip,narg,c); 45538032Speter print_number(ip,narg,c); 45638032Speter (void)putchar(','); 45738032Speter sendrecvflagsname ((int)*ip); 45890792Sgshapiro ip++; 45938032Speter narg--; 46090792Sgshapiro } else if (ktr->ktr_code == SYS_chflags || 46138032Speter ktr->ktr_code == SYS_fchflags || 46290792Sgshapiro ktr->ktr_code == SYS_lchflags) { 46364562Sgshapiro print_number(ip,narg,c); 46490792Sgshapiro (void)putchar(','); 46590792Sgshapiro modename((int)*ip); 466110560Sgshapiro ip++; 467110560Sgshapiro narg--; 46890792Sgshapiro } else if (ktr->ktr_code == SYS_kill) { 46990792Sgshapiro print_number(ip,narg,c); 47064562Sgshapiro (void)putchar(','); 47190792Sgshapiro signame((int)*ip); 47290792Sgshapiro ip++; 47364562Sgshapiro narg--; 47490792Sgshapiro } else if (ktr->ktr_code == SYS_reboot) { 47590792Sgshapiro (void)putchar('('); 47690792Sgshapiro rebootoptname((int)*ip); 47790792Sgshapiro ip++; 47890792Sgshapiro narg--; 47990792Sgshapiro } else if (ktr->ktr_code == SYS_umask) { 48090792Sgshapiro (void)putchar('('); 481223067Sgshapiro modename((int)*ip); 482223067Sgshapiro ip++; 48364562Sgshapiro narg--; 48464562Sgshapiro } else if (ktr->ktr_code == SYS_msync) { 48564562Sgshapiro print_number(ip,narg,c); 48664562Sgshapiro print_number(ip,narg,c); 48790792Sgshapiro (void)putchar(','); 48864562Sgshapiro msyncflagsname((int)*ip); 48964562Sgshapiro ip++; 49064562Sgshapiro narg--; 49190792Sgshapiro#ifdef SYS_freebsd6_mmap 49290792Sgshapiro } else if (ktr->ktr_code == SYS_freebsd6_mmap) { 49390792Sgshapiro print_number(ip,narg,c); 494223067Sgshapiro print_number(ip,narg,c); 49564562Sgshapiro (void)putchar(','); 49664562Sgshapiro mmapprotname ((int)*ip); 49764562Sgshapiro (void)putchar(','); 49864562Sgshapiro ip++; 49964562Sgshapiro narg--; 50064562Sgshapiro mmapflagsname ((int)*ip); 50190792Sgshapiro ip++; 50290792Sgshapiro narg--; 50390792Sgshapiro#endif 50490792Sgshapiro } else if (ktr->ktr_code == SYS_mmap) { 50590792Sgshapiro print_number(ip,narg,c); 50690792Sgshapiro print_number(ip,narg,c); 50790792Sgshapiro (void)putchar(','); 50890792Sgshapiro mmapprotname ((int)*ip); 50964562Sgshapiro (void)putchar(','); 51064562Sgshapiro ip++; 511223067Sgshapiro narg--; 512223067Sgshapiro mmapflagsname ((int)*ip); 513223067Sgshapiro ip++; 51464562Sgshapiro narg--; 51590792Sgshapiro } else if (ktr->ktr_code == SYS_mprotect) { 51638032Speter print_number(ip,narg,c); 51790792Sgshapiro print_number(ip,narg,c); 51864562Sgshapiro (void)putchar(','); 51990792Sgshapiro mmapprotname ((int)*ip); 52090792Sgshapiro ip++; 52190792Sgshapiro narg--; 52290792Sgshapiro } else if (ktr->ktr_code == SYS_madvise) { 52390792Sgshapiro print_number(ip,narg,c); 52490792Sgshapiro print_number(ip,narg,c); 52590792Sgshapiro (void)putchar(','); 52690792Sgshapiro madvisebehavname((int)*ip); 52790792Sgshapiro ip++; 52890792Sgshapiro narg--; 529225906Sume } else if (ktr->ktr_code == SYS_setpriority) { 53090792Sgshapiro print_number(ip,narg,c); 531225906Sume print_number(ip,narg,c); 53290792Sgshapiro (void)putchar(','); 533225906Sume prioname((int)*ip); 53490792Sgshapiro ip++; 535225906Sume narg--; 53690792Sgshapiro } else if (ktr->ktr_code == SYS_fcntl) { 537225906Sume int cmd; 53890792Sgshapiro int arg; 53990792Sgshapiro print_number(ip,narg,c); 54090792Sgshapiro cmd = *ip; 54190792Sgshapiro arg = *++ip; 54290792Sgshapiro (void)putchar(','); 54390792Sgshapiro fcntlcmdname(cmd, arg, decimal); 54490792Sgshapiro ip++; 54590792Sgshapiro narg-=2; 54690792Sgshapiro } else if (ktr->ktr_code == SYS_socket) { 54790792Sgshapiro int sockdomain; 54890792Sgshapiro (void)putchar('('); 54990792Sgshapiro sockdomain=(int)*ip; 55090792Sgshapiro sockdomainname(sockdomain); 55190792Sgshapiro ip++; 55290792Sgshapiro narg--; 55390792Sgshapiro (void)putchar(','); 554168515Sgshapiro socktypename((int)*ip); 555168515Sgshapiro ip++; 556168515Sgshapiro narg--; 557168515Sgshapiro if (sockdomain == PF_INET || 55890792Sgshapiro sockdomain == PF_INET6) { 55990792Sgshapiro (void)putchar(','); 56090792Sgshapiro sockipprotoname((int)*ip); 56190792Sgshapiro ip++; 56290792Sgshapiro narg--; 56390792Sgshapiro } 56490792Sgshapiro c = ','; 56590792Sgshapiro } else if (ktr->ktr_code == SYS_setsockopt || 56690792Sgshapiro ktr->ktr_code == SYS_getsockopt) { 56790792Sgshapiro print_number(ip,narg,c); 56890792Sgshapiro (void)putchar(','); 56990792Sgshapiro sockoptlevelname((int)*ip, decimal); 57090792Sgshapiro if ((int)*ip == SOL_SOCKET) { 57190792Sgshapiro ip++; 57290792Sgshapiro narg--; 57390792Sgshapiro (void)putchar(','); 57490792Sgshapiro sockoptname((int)*ip); 57590792Sgshapiro } 57690792Sgshapiro ip++; 57790792Sgshapiro narg--; 57890792Sgshapiro#ifdef SYS_freebsd6_lseek 57990792Sgshapiro } else if (ktr->ktr_code == SYS_freebsd6_lseek) { 58090792Sgshapiro print_number(ip,narg,c); 58190792Sgshapiro /* Hidden 'pad' argument, not in lseek(2) */ 58290792Sgshapiro print_number(ip,narg,c); 58390792Sgshapiro print_number(ip,narg,c); 58490792Sgshapiro (void)putchar(','); 58590792Sgshapiro whencename ((int)*ip); 58690792Sgshapiro ip++; 58790792Sgshapiro narg--; 58890792Sgshapiro#endif 58990792Sgshapiro } else if (ktr->ktr_code == SYS_lseek) { 59090792Sgshapiro print_number(ip,narg,c); 59190792Sgshapiro /* Hidden 'pad' argument, not in lseek(2) */ 59290792Sgshapiro print_number(ip,narg,c); 59390792Sgshapiro (void)putchar(','); 59490792Sgshapiro whencename ((int)*ip); 59590792Sgshapiro ip++; 59690792Sgshapiro narg--; 59790792Sgshapiro 59864562Sgshapiro } else if (ktr->ktr_code == SYS_flock) { 59964562Sgshapiro print_number(ip,narg,c); 60064562Sgshapiro (void)putchar(','); 60190792Sgshapiro flockname((int)*ip); 60264562Sgshapiro ip++; 60364562Sgshapiro narg--; 60464562Sgshapiro } else if (ktr->ktr_code == SYS_mkfifo || 60564562Sgshapiro ktr->ktr_code == SYS_mkdir) { 60664562Sgshapiro print_number(ip,narg,c); 60764562Sgshapiro (void)putchar(','); 60890792Sgshapiro modename((int)*ip); 60964562Sgshapiro ip++; 61064562Sgshapiro narg--; 61164562Sgshapiro } else if (ktr->ktr_code == SYS_shutdown) { 61264562Sgshapiro print_number(ip,narg,c); 61364562Sgshapiro (void)putchar(','); 61490792Sgshapiro shutdownhowname((int)*ip); 61590792Sgshapiro ip++; 61690792Sgshapiro narg--; 61764562Sgshapiro } else if (ktr->ktr_code == SYS_socketpair) { 61864562Sgshapiro (void)putchar('('); 61964562Sgshapiro sockdomainname((int)*ip); 62064562Sgshapiro ip++; 62164562Sgshapiro narg--; 62264562Sgshapiro (void)putchar(','); 62364562Sgshapiro socktypename((int)*ip); 62464562Sgshapiro ip++; 62590792Sgshapiro narg--; 62698121Sgshapiro c = ','; 62764562Sgshapiro } else if (ktr->ktr_code == SYS_getrlimit || 62898121Sgshapiro ktr->ktr_code == SYS_setrlimit) { 62964562Sgshapiro (void)putchar('('); 63064562Sgshapiro rlimitname((int)*ip); 63190792Sgshapiro ip++; 63290792Sgshapiro narg--; 63364562Sgshapiro c = ','; 63490792Sgshapiro } else if (ktr->ktr_code == SYS_quotactl) { 63590792Sgshapiro print_number(ip,narg,c); 63664562Sgshapiro (void)putchar(','); 63790792Sgshapiro quotactlname((int)*ip); 63864562Sgshapiro ip++; 63964562Sgshapiro narg--; 64064562Sgshapiro c = ','; 64164562Sgshapiro } else if (ktr->ktr_code == SYS_nfssvc) { 64264562Sgshapiro (void)putchar('('); 64390792Sgshapiro nfssvcname((int)*ip); 64498121Sgshapiro ip++; 64598121Sgshapiro narg--; 64698121Sgshapiro c = ','; 64798121Sgshapiro } else if (ktr->ktr_code == SYS_rtprio) { 64898121Sgshapiro (void)putchar('('); 64998121Sgshapiro rtprioname((int)*ip); 65098121Sgshapiro ip++; 65198121Sgshapiro narg--; 65298121Sgshapiro c = ','; 65398121Sgshapiro } else if (ktr->ktr_code == SYS___semctl) { 65498121Sgshapiro print_number(ip,narg,c); 65598121Sgshapiro print_number(ip,narg,c); 65664562Sgshapiro (void)putchar(','); 65798121Sgshapiro semctlname((int)*ip); 65898121Sgshapiro ip++; 65998121Sgshapiro narg--; 66098121Sgshapiro } else if (ktr->ktr_code == SYS_semget) { 66198121Sgshapiro print_number(ip,narg,c); 66298121Sgshapiro print_number(ip,narg,c); 66398121Sgshapiro (void)putchar(','); 66498121Sgshapiro semgetname((int)*ip); 66590792Sgshapiro ip++; 66698121Sgshapiro narg--; 66764562Sgshapiro } else if (ktr->ktr_code == SYS_msgctl) { 66864562Sgshapiro print_number(ip,narg,c); 66964562Sgshapiro (void)putchar(','); 67064562Sgshapiro shmctlname((int)*ip); 67164562Sgshapiro ip++; 67290792Sgshapiro narg--; 67390792Sgshapiro } else if (ktr->ktr_code == SYS_shmat) { 67490792Sgshapiro print_number(ip,narg,c); 67590792Sgshapiro print_number(ip,narg,c); 67690792Sgshapiro (void)putchar(','); 67790792Sgshapiro shmatname((int)*ip); 67890792Sgshapiro ip++; 67964562Sgshapiro narg--; 68064562Sgshapiro } else if (ktr->ktr_code == SYS_shmctl) { 68164562Sgshapiro print_number(ip,narg,c); 68264562Sgshapiro (void)putchar(','); 68390792Sgshapiro shmctlname((int)*ip); 68464562Sgshapiro ip++; 68564562Sgshapiro narg--; 68664562Sgshapiro } else if (ktr->ktr_code == SYS_minherit) { 68764562Sgshapiro print_number(ip,narg,c); 68864562Sgshapiro print_number(ip,narg,c); 68990792Sgshapiro (void)putchar(','); 69064562Sgshapiro minheritname((int)*ip); 69164562Sgshapiro ip++; 69264562Sgshapiro narg--; 69398121Sgshapiro } else if (ktr->ktr_code == SYS_rfork) { 69464562Sgshapiro (void)putchar('('); 69564562Sgshapiro rforkname((int)*ip); 69690792Sgshapiro ip++; 69790792Sgshapiro narg--; 69864562Sgshapiro c = ','; 69964562Sgshapiro } else if (ktr->ktr_code == SYS_lio_listio) { 70064562Sgshapiro (void)putchar('('); 70164562Sgshapiro lio_listioname((int)*ip); 70290792Sgshapiro ip++; 70390792Sgshapiro narg--; 70464562Sgshapiro c = ','; 70564562Sgshapiro } else if (ktr->ktr_code == SYS_mlockall) { 70690792Sgshapiro (void)putchar('('); 70790792Sgshapiro mlockallname((int)*ip); 70890792Sgshapiro ip++; 70964562Sgshapiro narg--; 71064562Sgshapiro } else if (ktr->ktr_code == SYS_sched_setscheduler) { 71164562Sgshapiro print_number(ip,narg,c); 71264562Sgshapiro (void)putchar(','); 71364562Sgshapiro schedpolicyname((int)*ip); 71490792Sgshapiro ip++; 71564562Sgshapiro narg--; 71664562Sgshapiro } else if (ktr->ktr_code == SYS_sched_get_priority_max || 71790792Sgshapiro ktr->ktr_code == SYS_sched_get_priority_min) { 71864562Sgshapiro (void)putchar('('); 71990792Sgshapiro schedpolicyname((int)*ip); 72090792Sgshapiro ip++; 72164562Sgshapiro narg--; 72264562Sgshapiro } else if (ktr->ktr_code == SYS_sendfile) { 72390792Sgshapiro print_number(ip,narg,c); 72490792Sgshapiro print_number(ip,narg,c); 72564562Sgshapiro print_number(ip,narg,c); 72690792Sgshapiro print_number(ip,narg,c); 72764562Sgshapiro print_number(ip,narg,c); 72864562Sgshapiro print_number(ip,narg,c); 72964562Sgshapiro (void)putchar(','); 73090792Sgshapiro sendfileflagsname((int)*ip); 73190792Sgshapiro ip++; 73264562Sgshapiro narg--; 73364562Sgshapiro } else if (ktr->ktr_code == SYS_kldsym) { 73490792Sgshapiro print_number(ip,narg,c); 73590792Sgshapiro (void)putchar(','); 73664562Sgshapiro kldsymcmdname((int)*ip); 73764562Sgshapiro ip++; 73864562Sgshapiro narg--; 73964562Sgshapiro } else if (ktr->ktr_code == SYS_sigprocmask) { 74064562Sgshapiro (void)putchar('('); 74164562Sgshapiro sigprocmaskhowname((int)*ip); 74264562Sgshapiro ip++; 74390792Sgshapiro narg--; 74464562Sgshapiro c = ','; 74564562Sgshapiro } else if (ktr->ktr_code == SYS___acl_get_file || 74664562Sgshapiro ktr->ktr_code == SYS___acl_set_file || 74764562Sgshapiro ktr->ktr_code == SYS___acl_get_fd || 74864562Sgshapiro ktr->ktr_code == SYS___acl_set_fd || 74964562Sgshapiro ktr->ktr_code == SYS___acl_delete_file || 75064562Sgshapiro ktr->ktr_code == SYS___acl_delete_fd || 75164562Sgshapiro ktr->ktr_code == SYS___acl_aclcheck_file || 75264562Sgshapiro ktr->ktr_code == SYS___acl_aclcheck_fd || 75364562Sgshapiro ktr->ktr_code == SYS___acl_get_link || 75464562Sgshapiro ktr->ktr_code == SYS___acl_set_link || 75564562Sgshapiro ktr->ktr_code == SYS___acl_delete_link || 75664562Sgshapiro ktr->ktr_code == SYS___acl_aclcheck_link) { 75764562Sgshapiro print_number(ip,narg,c); 75864562Sgshapiro (void)putchar(','); 75964562Sgshapiro acltypename((int)*ip); 76064562Sgshapiro ip++; 76164562Sgshapiro narg--; 76264562Sgshapiro } else if (ktr->ktr_code == SYS_sigaction) { 76364562Sgshapiro (void)putchar('('); 76490792Sgshapiro signame((int)*ip); 76590792Sgshapiro ip++; 76664562Sgshapiro narg--; 76764562Sgshapiro c = ','; 76864562Sgshapiro } else if (ktr->ktr_code == SYS_extattrctl) { 76964562Sgshapiro print_number(ip,narg,c); 77064562Sgshapiro (void)putchar(','); 77190792Sgshapiro extattrctlname((int)*ip); 77290792Sgshapiro ip++; 77390792Sgshapiro narg--; 77490792Sgshapiro } else if (ktr->ktr_code == SYS_nmount) { 77564562Sgshapiro print_number(ip,narg,c); 77664562Sgshapiro print_number(ip,narg,c); 77790792Sgshapiro (void)putchar(','); 77864562Sgshapiro mountflagsname ((int)*ip); 77964562Sgshapiro ip++; 78064562Sgshapiro narg--; 78164562Sgshapiro } else if (ktr->ktr_code == SYS_thr_create) { 78264562Sgshapiro print_number(ip,narg,c); 78364562Sgshapiro print_number(ip,narg,c); 78490792Sgshapiro (void)putchar(','); 78564562Sgshapiro thrcreateflagsname ((int)*ip); 78664562Sgshapiro ip++; 78764562Sgshapiro narg--; 78864562Sgshapiro } else if (ktr->ktr_code == SYS_thr_kill) { 78964562Sgshapiro print_number(ip,narg,c); 79064562Sgshapiro (void)putchar(','); 79164562Sgshapiro signame ((int)*ip); 79264562Sgshapiro ip++; 79364562Sgshapiro narg--; 79464562Sgshapiro } else if (ktr->ktr_code == SYS_kldunloadf) { 79590792Sgshapiro print_number(ip,narg,c); 79690792Sgshapiro (void)putchar(','); 79790792Sgshapiro kldunloadfflagsname ((int)*ip); 79890792Sgshapiro ip++; 79990792Sgshapiro narg--; 80064562Sgshapiro } 80164562Sgshapiro } 80264562Sgshapiro while (narg) { 80390792Sgshapiro print_number(ip,narg,c); 804249729Sgshapiro } 80564562Sgshapiro (void)putchar(')'); 80664562Sgshapiro } 80790792Sgshapiro (void)putchar('\n'); 80890792Sgshapiro} 80990792Sgshapiro 81090792Sgshapirovoid 81164562Sgshapiroktrsysret(struct ktr_sysret *ktr) 81290792Sgshapiro{ 81364562Sgshapiro register_t ret = ktr->ktr_retval; 81464562Sgshapiro int error = ktr->ktr_error; 81590792Sgshapiro int code = ktr->ktr_code; 81664562Sgshapiro 81764562Sgshapiro if (code >= nsyscalls || code < 0) 81890792Sgshapiro (void)printf("[%d] ", code); 81964562Sgshapiro else 82090792Sgshapiro (void)printf("%s ", syscallnames[code]); 82190792Sgshapiro 82290792Sgshapiro if (error == 0) { 82390792Sgshapiro if (fancy) { 82490792Sgshapiro (void)printf("%d", ret); 82564562Sgshapiro if (ret < 0 || ret > 9) 82690792Sgshapiro (void)printf("/%#lx", (long)ret); 82764562Sgshapiro } else { 82864562Sgshapiro if (decimal) 82990792Sgshapiro (void)printf("%ld", (long)ret); 83090792Sgshapiro else 83190792Sgshapiro (void)printf("%#lx", (long)ret); 83290792Sgshapiro } 83390792Sgshapiro } else if (error == ERESTART) 83490792Sgshapiro (void)printf("RESTART"); 83590792Sgshapiro else if (error == EJUSTRETURN) 83690792Sgshapiro (void)printf("JUSTRETURN"); 83790792Sgshapiro else { 83890792Sgshapiro (void)printf("-1 errno %d", ktr->ktr_error); 83990792Sgshapiro if (fancy) 84090792Sgshapiro (void)printf(" %s", strerror(ktr->ktr_error)); 84190792Sgshapiro } 84290792Sgshapiro (void)putchar('\n'); 84390792Sgshapiro} 84490792Sgshapiro 84590792Sgshapirovoid 84690792Sgshapiroktrnamei(char *cp, int len) 84790792Sgshapiro{ 84864562Sgshapiro (void)printf("\"%.*s\"\n", len, cp); 84990792Sgshapiro} 85090792Sgshapiro 85190792Sgshapirovoid 85290792Sgshapirohexdump(char *p, int len, int screenwidth) 85390792Sgshapiro{ 85464562Sgshapiro int n, i; 85590792Sgshapiro int width; 85690792Sgshapiro 85790792Sgshapiro width = 0; 85864562Sgshapiro do { 85990792Sgshapiro width += 2; 86090792Sgshapiro i = 13; /* base offset */ 86190792Sgshapiro i += (width / 2) + 1; /* spaces every second byte */ 86290792Sgshapiro i += (width * 2); /* width of bytes */ 86390792Sgshapiro i += 3; /* " |" */ 86490792Sgshapiro i += width; /* each byte */ 86590792Sgshapiro i += 1; /* "|" */ 86690792Sgshapiro } while (i < screenwidth); 86790792Sgshapiro width -= 2; 86890792Sgshapiro 86990792Sgshapiro for (n = 0; n < len; n += width) { 87090792Sgshapiro for (i = n; i < n + width; i++) { 87190792Sgshapiro if ((i % width) == 0) { /* beginning of line */ 87290792Sgshapiro printf(" 0x%04x", i); 87390792Sgshapiro } 87490792Sgshapiro if ((i % 2) == 0) { 87590792Sgshapiro printf(" "); 87690792Sgshapiro } 87790792Sgshapiro if (i < len) 87890792Sgshapiro printf("%02x", p[i] & 0xff); 87990792Sgshapiro else 88090792Sgshapiro printf(" "); 88190792Sgshapiro } 88290792Sgshapiro printf(" |"); 88390792Sgshapiro for (i = n; i < n + width; i++) { 88490792Sgshapiro if (i >= len) 88590792Sgshapiro break; 88690792Sgshapiro if (p[i] >= ' ' && p[i] <= '~') 88790792Sgshapiro printf("%c", p[i]); 88890792Sgshapiro else 88990792Sgshapiro printf("."); 89090792Sgshapiro } 89190792Sgshapiro printf("|\n"); 89290792Sgshapiro } 89390792Sgshapiro if ((i % width) != 0) 89490792Sgshapiro printf("\n"); 89590792Sgshapiro} 89690792Sgshapiro 89790792Sgshapirovoid 89890792Sgshapirovisdump(char *dp, int datalen, int screenwidth) 89990792Sgshapiro{ 90090792Sgshapiro int col = 0; 90190792Sgshapiro char *cp; 90290792Sgshapiro int width; 90390792Sgshapiro char visbuf[5]; 90490792Sgshapiro 90590792Sgshapiro (void)printf(" \""); 90690792Sgshapiro col = 8; 90790792Sgshapiro for (;datalen > 0; datalen--, dp++) { 90890792Sgshapiro (void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 90990792Sgshapiro cp = visbuf; 91090792Sgshapiro /* 91190792Sgshapiro * Keep track of printables and 91290792Sgshapiro * space chars (like fold(1)). 91390792Sgshapiro */ 91490792Sgshapiro if (col == 0) { 91590792Sgshapiro (void)putchar('\t'); 91690792Sgshapiro col = 8; 91790792Sgshapiro } 91890792Sgshapiro switch(*cp) { 91990792Sgshapiro case '\n': 92090792Sgshapiro col = 0; 92190792Sgshapiro (void)putchar('\n'); 92290792Sgshapiro continue; 92390792Sgshapiro case '\t': 92490792Sgshapiro width = 8 - (col&07); 92590792Sgshapiro break; 92690792Sgshapiro default: 92790792Sgshapiro width = strlen(cp); 92890792Sgshapiro } 92990792Sgshapiro if (col + width > (screenwidth-2)) { 93090792Sgshapiro (void)printf("\\\n\t"); 93190792Sgshapiro col = 8; 93290792Sgshapiro } 93390792Sgshapiro col += width; 93490792Sgshapiro do { 93590792Sgshapiro (void)putchar(*cp++); 93690792Sgshapiro } while (*cp); 93790792Sgshapiro } 93898121Sgshapiro if (col == 0) 939102528Sgshapiro (void)printf(" "); 94098121Sgshapiro (void)printf("\"\n"); 94198121Sgshapiro} 94298121Sgshapiro 943102528Sgshapirovoid 94490792Sgshapiroktrgenio(struct ktr_genio *ktr, int len) 94598121Sgshapiro{ 946102528Sgshapiro int datalen = len - sizeof (struct ktr_genio); 94790792Sgshapiro char *dp = (char *)ktr + sizeof (struct ktr_genio); 94890792Sgshapiro static int screenwidth = 0; 94990792Sgshapiro int i, binary; 95090792Sgshapiro 95190792Sgshapiro if (screenwidth == 0) { 95290792Sgshapiro struct winsize ws; 95398121Sgshapiro 95490792Sgshapiro if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 95590792Sgshapiro ws.ws_col > 8) 95690792Sgshapiro screenwidth = ws.ws_col; 95790792Sgshapiro else 95890792Sgshapiro screenwidth = 80; 959102528Sgshapiro } 96090792Sgshapiro printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 96190792Sgshapiro ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 96290792Sgshapiro datalen == 1 ? "" : "s"); 96390792Sgshapiro if (suppressdata) 96490792Sgshapiro return; 96590792Sgshapiro if (maxdata && datalen > maxdata) 96690792Sgshapiro datalen = maxdata; 96790792Sgshapiro 96890792Sgshapiro for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 96990792Sgshapiro if (dp[i] >= 32 && dp[i] < 127) 97090792Sgshapiro continue; 97190792Sgshapiro if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 97290792Sgshapiro continue; 97390792Sgshapiro binary = 1; 97490792Sgshapiro } 97590792Sgshapiro if (binary) 97690792Sgshapiro hexdump(dp, datalen, screenwidth); 97790792Sgshapiro else 97890792Sgshapiro visdump(dp, datalen, screenwidth); 97990792Sgshapiro} 98090792Sgshapiro 98190792Sgshapiroconst char *signames[] = { 98290792Sgshapiro "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */ 98390792Sgshapiro "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ 98490792Sgshapiro "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ 98590792Sgshapiro "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ 98690792Sgshapiro "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */ 98790792Sgshapiro "USR2", NULL, /* 31 - 32 */ 98890792Sgshapiro}; 98990792Sgshapiro 99090792Sgshapirovoid 99190792Sgshapiroktrpsig(struct ktr_psig *psig) 99290792Sgshapiro{ 99390792Sgshapiro if (psig->signo > 0 && psig->signo < NSIG) 99490792Sgshapiro (void)printf("SIG%s ", signames[psig->signo]); 99590792Sgshapiro else 99690792Sgshapiro (void)printf("SIG %d ", psig->signo); 99790792Sgshapiro if (psig->action == SIG_DFL) 99890792Sgshapiro (void)printf("SIG_DFL\n"); 99990792Sgshapiro else { 100098121Sgshapiro (void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n", 100198121Sgshapiro (u_long)psig->action, psig->mask.__bits[0], psig->code); 100290792Sgshapiro } 100364562Sgshapiro} 100464562Sgshapiro 100564562Sgshapirovoid 100690792Sgshapiroktrcsw(struct ktr_csw *cs) 100764562Sgshapiro{ 100864562Sgshapiro (void)printf("%s %s\n", cs->out ? "stop" : "resume", 100964562Sgshapiro cs->user ? "user" : "kernel"); 101064562Sgshapiro} 101164562Sgshapiro 101264562Sgshapiro#define UTRACE_DLOPEN_START 1 101364562Sgshapiro#define UTRACE_DLOPEN_STOP 2 101464562Sgshapiro#define UTRACE_DLCLOSE_START 3 101564562Sgshapiro#define UTRACE_DLCLOSE_STOP 4 101664562Sgshapiro#define UTRACE_LOAD_OBJECT 5 101790792Sgshapiro#define UTRACE_UNLOAD_OBJECT 6 101864562Sgshapiro#define UTRACE_ADD_RUNDEP 7 101964562Sgshapiro#define UTRACE_PRELOAD_FINISHED 8 102064562Sgshapiro#define UTRACE_INIT_CALL 9 102164562Sgshapiro#define UTRACE_FINI_CALL 10 102298121Sgshapiro 102398121Sgshapirostruct utrace_rtld { 102498121Sgshapiro char sig[4]; /* 'RTLD' */ 102598121Sgshapiro int event; 102698121Sgshapiro void *handle; 102798121Sgshapiro void *mapbase; 102898121Sgshapiro size_t mapsize; 102998121Sgshapiro int refcnt; 103098121Sgshapiro char name[MAXPATHLEN]; 103198121Sgshapiro}; 103298121Sgshapiro 103398121Sgshapirovoid 103498121Sgshapiroktruser_rtld(int len, unsigned char *p) 103598121Sgshapiro{ 103698121Sgshapiro struct utrace_rtld *ut = (struct utrace_rtld *)p; 103798121Sgshapiro void *parent; 103898121Sgshapiro int mode; 103998121Sgshapiro 104098121Sgshapiro switch (ut->event) { 104198121Sgshapiro case UTRACE_DLOPEN_START: 104298121Sgshapiro mode = ut->refcnt; 104398121Sgshapiro printf("dlopen(%s, ", ut->name); 104498121Sgshapiro switch (mode & RTLD_MODEMASK) { 104598121Sgshapiro case RTLD_NOW: 104698121Sgshapiro printf("RTLD_NOW"); 104798121Sgshapiro break; 104898121Sgshapiro case RTLD_LAZY: 104998121Sgshapiro printf("RTLD_LAZY"); 105098121Sgshapiro break; 105198121Sgshapiro default: 105298121Sgshapiro printf("%#x", mode & RTLD_MODEMASK); 105398121Sgshapiro } 105498121Sgshapiro if (mode & RTLD_GLOBAL) 105598121Sgshapiro printf(" | RTLD_GLOBAL"); 105698121Sgshapiro if (mode & RTLD_TRACE) 105798121Sgshapiro printf(" | RTLD_TRACE"); 105898121Sgshapiro if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)) 105998121Sgshapiro printf(" | %#x", mode & 106098121Sgshapiro ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)); 106198121Sgshapiro printf(")\n"); 106298121Sgshapiro break; 106398121Sgshapiro case UTRACE_DLOPEN_STOP: 106498121Sgshapiro printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name, 106598121Sgshapiro ut->refcnt); 106698121Sgshapiro break; 106798121Sgshapiro case UTRACE_DLCLOSE_START: 106898121Sgshapiro printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name, 106998121Sgshapiro ut->refcnt); 107098121Sgshapiro break; 107198121Sgshapiro case UTRACE_DLCLOSE_STOP: 107298121Sgshapiro printf("dlclose(%p) finished\n", ut->handle); 107398121Sgshapiro break; 107498121Sgshapiro case UTRACE_LOAD_OBJECT: 107598121Sgshapiro printf("RTLD: loaded %p @ %p - %p (%s)\n", ut->handle, 107698121Sgshapiro ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 107798121Sgshapiro ut->name); 107898121Sgshapiro break; 107998121Sgshapiro case UTRACE_UNLOAD_OBJECT: 108098121Sgshapiro printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle, 108198121Sgshapiro ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 108298121Sgshapiro ut->name); 108398121Sgshapiro break; 108498121Sgshapiro case UTRACE_ADD_RUNDEP: 108598121Sgshapiro parent = ut->mapbase; 108698121Sgshapiro printf("RTLD: %p now depends on %p (%s, %d)\n", parent, 108798121Sgshapiro ut->handle, ut->name, ut->refcnt); 108898121Sgshapiro break; 108998121Sgshapiro case UTRACE_PRELOAD_FINISHED: 109098121Sgshapiro printf("RTLD: LD_PRELOAD finished\n"); 109198121Sgshapiro break; 109298121Sgshapiro case UTRACE_INIT_CALL: 109398121Sgshapiro printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle, 109498121Sgshapiro ut->name); 109598121Sgshapiro break; 109698121Sgshapiro case UTRACE_FINI_CALL: 109798121Sgshapiro printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle, 109898121Sgshapiro ut->name); 109998121Sgshapiro break; 1100120256Sgshapiro default: 110198121Sgshapiro p += 4; 110298121Sgshapiro len -= 4; 110398121Sgshapiro printf("RTLD: %d ", len); 110498121Sgshapiro while (len--) 110598121Sgshapiro if (decimal) 110698121Sgshapiro printf(" %d", *p++); 110798121Sgshapiro else 110898121Sgshapiro printf(" %02x", *p++); 110998121Sgshapiro printf("\n"); 111098121Sgshapiro } 111198121Sgshapiro} 111298121Sgshapiro 111398121Sgshapirostruct utrace_malloc { 111498121Sgshapiro void *p; 111598121Sgshapiro size_t s; 111698121Sgshapiro void *r; 111798121Sgshapiro}; 111898121Sgshapiro 111998121Sgshapirovoid 112098121Sgshapiroktruser_malloc(int len, unsigned char *p) 112198121Sgshapiro{ 112298121Sgshapiro struct utrace_malloc *ut = (struct utrace_malloc *)p; 112398121Sgshapiro 112498121Sgshapiro if (ut->p == NULL) { 112590792Sgshapiro if (ut->s == 0 && ut->r == NULL) 112690792Sgshapiro printf("malloc_init()\n"); 112790792Sgshapiro else 112890792Sgshapiro printf("%p = malloc(%zu)\n", ut->r, ut->s); 112990792Sgshapiro } else { 113090792Sgshapiro if (ut->s == 0) 113190792Sgshapiro printf("free(%p)\n", ut->p); 113264562Sgshapiro else 113390792Sgshapiro printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); 113464562Sgshapiro } 113590792Sgshapiro} 113664562Sgshapiro 113790792Sgshapirovoid 113890792Sgshapiroktruser(int len, unsigned char *p) 113990792Sgshapiro{ 114090792Sgshapiro 114190792Sgshapiro if (len >= 8 && bcmp(p, "RTLD", 4) == 0) { 114290792Sgshapiro ktruser_rtld(len, p); 114390792Sgshapiro return; 114490792Sgshapiro } 114590792Sgshapiro 114690792Sgshapiro if (len == sizeof(struct utrace_malloc)) { 114790792Sgshapiro ktruser_malloc(len, p); 114890792Sgshapiro return; 114990792Sgshapiro } 115090792Sgshapiro 115190792Sgshapiro (void)printf("%d ", len); 115290792Sgshapiro while (len--) 115390792Sgshapiro if (decimal) 115464562Sgshapiro (void)printf(" %d", *p++); 115564562Sgshapiro else 115664562Sgshapiro (void)printf(" %02x", *p++); 115790792Sgshapiro (void)printf("\n"); 115890792Sgshapiro} 115990792Sgshapiro 116064562Sgshapirovoid 116190792Sgshapiroktrsockaddr(struct sockaddr *sa) 116290792Sgshapiro{ 116390792Sgshapiro/* 116490792Sgshapiro TODO: Support additional address families 116564562Sgshapiro #include <netnatm/natm.h> 116690792Sgshapiro struct sockaddr_natm *natm; 116790792Sgshapiro #include <netsmb/netbios.h> 116864562Sgshapiro struct sockaddr_nb *nb; 116998121Sgshapiro*/ 117090792Sgshapiro char addr[64]; 117164562Sgshapiro 117290792Sgshapiro /* 117364562Sgshapiro * note: ktrstruct() has already verified that sa points to a 117464562Sgshapiro * buffer at least sizeof(struct sockaddr) bytes long and exactly 117564562Sgshapiro * sa->sa_len bytes long. 117690792Sgshapiro */ 117790792Sgshapiro printf("struct sockaddr { "); 117864562Sgshapiro sockfamilyname(sa->sa_family); 117990792Sgshapiro printf(", "); 118090792Sgshapiro 118177349Sgshapiro#define check_sockaddr_len(n) \ 118290792Sgshapiro if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) { \ 118390792Sgshapiro printf("invalid"); \ 118490792Sgshapiro break; \ 118590792Sgshapiro } 118690792Sgshapiro 118790792Sgshapiro switch(sa->sa_family) { 118864562Sgshapiro case AF_INET: { 118990792Sgshapiro struct sockaddr_in *sa_in; 119090792Sgshapiro 119164562Sgshapiro sa_in = (struct sockaddr_in *)sa; 119264562Sgshapiro check_sockaddr_len(in); 119364562Sgshapiro inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr); 119490792Sgshapiro printf("%s:%u", addr, ntohs(sa_in->sin_port)); 119590792Sgshapiro break; 119690792Sgshapiro } 119790792Sgshapiro#ifdef NETATALK 119890792Sgshapiro case AF_APPLETALK: { 119990792Sgshapiro struct sockaddr_at *sa_at; 120090792Sgshapiro struct netrange *nr; 120190792Sgshapiro 120290792Sgshapiro sa_at = (struct sockaddr_at *)sa; 120390792Sgshapiro check_sockaddr_len(at); 120490792Sgshapiro nr = &sa_at->sat_range.r_netrange; 120590792Sgshapiro printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net), 120690792Sgshapiro sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet), 120790792Sgshapiro ntohs(nr->nr_lastnet), nr->nr_phase); 120890792Sgshapiro break; 120990792Sgshapiro } 121090792Sgshapiro#endif 121190792Sgshapiro case AF_INET6: { 121290792Sgshapiro struct sockaddr_in6 *sa_in6; 121390792Sgshapiro 121490792Sgshapiro sa_in6 = (struct sockaddr_in6 *)sa; 121590792Sgshapiro check_sockaddr_len(in6); 121690792Sgshapiro inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr); 121790792Sgshapiro printf("[%s]:%u", addr, htons(sa_in6->sin6_port)); 121890792Sgshapiro break; 121990792Sgshapiro } 122090792Sgshapiro#ifdef IPX 122164562Sgshapiro case AF_IPX: { 122264562Sgshapiro struct sockaddr_ipx *sa_ipx; 122390792Sgshapiro 122464562Sgshapiro sa_ipx = (struct sockaddr_ipx *)sa; 122590792Sgshapiro check_sockaddr_len(ipx); 122690792Sgshapiro /* XXX wish we had ipx_ntop */ 122790792Sgshapiro printf("%s", ipx_ntoa(sa_ipx->sipx_addr)); 122890792Sgshapiro break; 122990792Sgshapiro } 123090792Sgshapiro#endif 123190792Sgshapiro case AF_UNIX: { 123290792Sgshapiro struct sockaddr_un *sa_un; 123390792Sgshapiro 123490792Sgshapiro sa_un = (struct sockaddr_un *)sa; 123590792Sgshapiro check_sockaddr_len(un); 123690792Sgshapiro printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path); 123790792Sgshapiro break; 123890792Sgshapiro } 123964562Sgshapiro default: 124098121Sgshapiro printf("unknown address family"); 124190792Sgshapiro } 124264562Sgshapiro printf(" }\n"); 124364562Sgshapiro} 124464562Sgshapiro 124564562Sgshapirovoid 124664562Sgshapiroktrstat(struct stat *statp) 124764562Sgshapiro{ 124864562Sgshapiro char mode[12], timestr[PATH_MAX + 4]; 124964562Sgshapiro struct passwd *pwd; 125064562Sgshapiro struct group *grp; 125164562Sgshapiro struct tm *tm; 125264562Sgshapiro 125364562Sgshapiro /* 125464562Sgshapiro * note: ktrstruct() has already verified that statp points to a 125564562Sgshapiro * buffer exactly sizeof(struct stat) bytes long. 125664562Sgshapiro */ 125790792Sgshapiro printf("struct stat {"); 125864562Sgshapiro strmode(statp->st_mode, mode); 125964562Sgshapiro printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ", 126064562Sgshapiro (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode, 126164562Sgshapiro (uintmax_t)statp->st_nlink); 126290792Sgshapiro if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL) 126364562Sgshapiro printf("uid=%ju, ", (uintmax_t)statp->st_uid); 126464562Sgshapiro else 126564562Sgshapiro printf("uid=\"%s\", ", pwd->pw_name); 126664562Sgshapiro if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL) 126764562Sgshapiro printf("gid=%ju, ", (uintmax_t)statp->st_gid); 126864562Sgshapiro else 126964562Sgshapiro printf("gid=\"%s\", ", grp->gr_name); 127064562Sgshapiro printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 127164562Sgshapiro printf("atime="); 127264562Sgshapiro if (resolv == 0) 127390792Sgshapiro printf("%ld", statp->st_atimespec.tv_sec); 127464562Sgshapiro else { 127564562Sgshapiro tm = localtime(&statp->st_atimespec.tv_sec); 127664562Sgshapiro (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 127764562Sgshapiro printf("\"%s\"", timestr); 127890792Sgshapiro } 127990792Sgshapiro if (statp->st_atimespec.tv_nsec != 0) 128064562Sgshapiro printf(".%09ld, ", statp->st_atimespec.tv_nsec); 128164562Sgshapiro else 128264562Sgshapiro printf(", "); 128364562Sgshapiro printf("stime="); 128490792Sgshapiro if (resolv == 0) 128590792Sgshapiro printf("%ld", statp->st_mtimespec.tv_sec); 128664562Sgshapiro else { 128790792Sgshapiro tm = localtime(&statp->st_mtimespec.tv_sec); 128890792Sgshapiro (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 128990792Sgshapiro printf("\"%s\"", timestr); 129090792Sgshapiro } 129190792Sgshapiro if (statp->st_mtimespec.tv_nsec != 0) 129290792Sgshapiro printf(".%09ld, ", statp->st_mtimespec.tv_nsec); 129364562Sgshapiro else 129464562Sgshapiro printf(", "); 129598121Sgshapiro printf("ctime="); 129698121Sgshapiro if (resolv == 0) 129790792Sgshapiro printf("%ld", statp->st_ctimespec.tv_sec); 129864562Sgshapiro else { 129964562Sgshapiro tm = localtime(&statp->st_ctimespec.tv_sec); 130064562Sgshapiro (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 130164562Sgshapiro printf("\"%s\"", timestr); 130264562Sgshapiro } 130364562Sgshapiro if (statp->st_ctimespec.tv_nsec != 0) 130464562Sgshapiro printf(".%09ld, ", statp->st_ctimespec.tv_nsec); 130564562Sgshapiro else 130690792Sgshapiro printf(", "); 130790792Sgshapiro printf("birthtime="); 130890792Sgshapiro if (resolv == 0) 130964562Sgshapiro printf("%ld", statp->st_birthtimespec.tv_sec); 131064562Sgshapiro else { 131190792Sgshapiro tm = localtime(&statp->st_birthtimespec.tv_sec); 131264562Sgshapiro (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 131390792Sgshapiro printf("\"%s\"", timestr); 131464562Sgshapiro } 131590792Sgshapiro if (statp->st_birthtimespec.tv_nsec != 0) 131664562Sgshapiro printf(".%09ld, ", statp->st_birthtimespec.tv_nsec); 131790792Sgshapiro else 131864562Sgshapiro printf(", "); 131998121Sgshapiro printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 132098121Sgshapiro (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 132198121Sgshapiro (intmax_t)statp->st_blocks, statp->st_flags); 132264562Sgshapiro printf(" }\n"); 132398121Sgshapiro} 132490792Sgshapiro 132598121Sgshapirovoid 132698121Sgshapiroktrstruct(char *buf, size_t buflen) 132798121Sgshapiro{ 132864562Sgshapiro char *name, *data; 132998121Sgshapiro size_t namelen, datalen; 133090792Sgshapiro int i; 133164562Sgshapiro 133264562Sgshapiro for (name = buf, namelen = 0; 133364562Sgshapiro namelen < buflen && name[namelen] != '\0'; 133490792Sgshapiro ++namelen) 133590792Sgshapiro /* nothing */; 133690792Sgshapiro if (namelen == buflen) 133764562Sgshapiro goto invalid; 133864562Sgshapiro if (name[namelen] != '\0') 133964562Sgshapiro goto invalid; 134064562Sgshapiro data = buf + namelen + 1; 134190792Sgshapiro datalen = buflen - namelen - 1; 134290792Sgshapiro if (datalen == 0) 134364562Sgshapiro goto invalid; 134464562Sgshapiro /* sanity check */ 134564562Sgshapiro for (i = 0; i < namelen; ++i) 134664562Sgshapiro if (!isalpha((unsigned char)name[i])) 134764562Sgshapiro goto invalid; 134864562Sgshapiro if (strcmp(name, "stat") == 0) { 134990792Sgshapiro if (datalen != sizeof(struct stat)) 135090792Sgshapiro goto invalid; 135190792Sgshapiro ktrstat((struct stat *)data); 135290792Sgshapiro } else if (strcmp(name, "sockaddr") == 0) { 135390792Sgshapiro if (datalen < sizeof(struct sockaddr) || 135490792Sgshapiro datalen != ((struct sockaddr *)(data))->sa_len) 135590792Sgshapiro goto invalid; 135690792Sgshapiro ktrsockaddr((struct sockaddr *)data); 135790792Sgshapiro } else { 135890792Sgshapiro printf("unknown structure\n"); 135964562Sgshapiro } 136064562Sgshapiro return; 136164562Sgshapiroinvalid: 136290792Sgshapiro printf("invalid record\n"); 136364562Sgshapiro} 136464562Sgshapiro 136564562Sgshapirovoid 136690792Sgshapirousage(void) 136790792Sgshapiro{ 136864562Sgshapiro fprintf(stderr, "usage: kdump [-dEnlHRrsT] [-f trfile] " 136990792Sgshapiro "[-m maxdata] [-p pid] [-t trstr]\n"); 137064562Sgshapiro exit(1); 137198121Sgshapiro} 137273188Sgshapiro