]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - usr.bin/kdump/kdump.c
- Copy stable/10@296371 to releng/10.3 in preparation for 10.3-RC1
[FreeBSD/releng/10.3.git] / usr.bin / kdump / kdump.c
1 /*-
2  * Copyright (c) 1988, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #ifndef lint
31 static const char copyright[] =
32 "@(#) Copyright (c) 1988, 1993\n\
33         The Regents of the University of California.  All rights reserved.\n";
34 #endif /* not lint */
35
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)kdump.c     8.1 (Berkeley) 6/6/93";
39 #endif
40 #endif /* not lint */
41 #include <sys/cdefs.h>
42 __FBSDID("$FreeBSD$");
43
44 #define _KERNEL
45 extern int errno;
46 #include <sys/errno.h>
47 #undef _KERNEL
48 #include <sys/param.h>
49 #include <sys/capsicum.h>
50 #include <sys/errno.h>
51 #define _KERNEL
52 #include <sys/time.h>
53 #undef _KERNEL
54 #include <sys/uio.h>
55 #include <sys/ktrace.h>
56 #include <sys/ioctl.h>
57 #include <sys/socket.h>
58 #include <sys/stat.h>
59 #include <sys/sysent.h>
60 #include <sys/umtx.h>
61 #include <sys/un.h>
62 #include <sys/queue.h>
63 #include <sys/wait.h>
64 #ifdef IPX
65 #include <sys/types.h>
66 #include <netipx/ipx.h>
67 #endif
68 #ifdef NETATALK
69 #include <netatalk/at.h>
70 #endif
71 #include <arpa/inet.h>
72 #include <netinet/in.h>
73 #include <ctype.h>
74 #include <dlfcn.h>
75 #include <err.h>
76 #include <grp.h>
77 #include <inttypes.h>
78 #include <locale.h>
79 #include <netdb.h>
80 #include <nl_types.h>
81 #include <pwd.h>
82 #include <stdio.h>
83 #include <stdlib.h>
84 #include <string.h>
85 #include <termios.h>
86 #include <time.h>
87 #include <unistd.h>
88 #include <vis.h>
89 #include "ktrace.h"
90 #include "kdump_subr.h"
91
92 u_int abidump(struct ktr_header *);
93 int fetchprocinfo(struct ktr_header *, u_int *);
94 int fread_tail(void *, int, int);
95 void dumpheader(struct ktr_header *);
96 void ktrsyscall(struct ktr_syscall *, u_int);
97 void ktrsysret(struct ktr_sysret *, u_int);
98 void ktrnamei(char *, int);
99 void hexdump(char *, int, int);
100 void visdump(char *, int, int);
101 void ktrgenio(struct ktr_genio *, int);
102 void ktrpsig(struct ktr_psig *);
103 void ktrcsw(struct ktr_csw *);
104 void ktrcsw_old(struct ktr_csw_old *);
105 void ktruser_malloc(void *);
106 void ktruser_rtld(int, void *);
107 void ktruser(int, void *);
108 void ktrcaprights(cap_rights_t *);
109 void ktrsockaddr(struct sockaddr *);
110 void ktrstat(struct stat *);
111 void ktrstruct(char *, size_t);
112 void ktrcapfail(struct ktr_cap_fail *);
113 void ktrfault(struct ktr_fault *);
114 void ktrfaultend(struct ktr_faultend *);
115 void limitfd(int fd);
116 void usage(void);
117 void ioctlname(unsigned long, int);
118
119 extern const char *signames[], *syscallnames[];
120 extern int nsyscalls;
121
122 static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
123     resolv = 0, abiflag = 0, syscallno = 0;
124 static const char *tracefile = DEF_TRACEFILE;
125 static struct ktr_header ktr_header;
126
127 #define TIME_FORMAT     "%b %e %T %Y"
128 #define eqs(s1, s2)     (strcmp((s1), (s2)) == 0)
129
130 #define print_number(i,n,c) do {                                        \
131         if (decimal)                                                    \
132                 printf("%c%jd", c, (intmax_t)*i);                       \
133         else                                                            \
134                 printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);       \
135         i++;                                                            \
136         n--;                                                            \
137         c = ',';                                                        \
138 } while (0)
139
140 #if defined(__amd64__) || defined(__i386__)
141
142 void linux_ktrsyscall(struct ktr_syscall *, u_int);
143 void linux_ktrsysret(struct ktr_sysret *, u_int);
144 extern const char *linux_syscallnames[];
145
146 #include <linux_syscalls.c>
147
148 /*
149  * from linux.h
150  * Linux syscalls return negative errno's, we do positive and map them
151  */
152 static int bsd_to_linux_errno[ELAST + 1] = {
153         -0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
154         -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
155         -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
156         -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
157         -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
158         -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
159         -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
160         -116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
161         -6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
162         -72, -67, -71
163 };
164 #endif
165
166 #if defined(__amd64__)
167 extern const char *linux32_syscallnames[];
168
169 #include <linux32_syscalls.c>
170 #endif
171
172 struct proc_info
173 {
174         TAILQ_ENTRY(proc_info)  info;
175         u_int                   sv_flags;
176         pid_t                   pid;
177 };
178
179 static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
180
181 static void
182 strerror_init(void)
183 {
184
185         /*
186          * Cache NLS data before entering capability mode.
187          * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
188          */
189         (void)catopen("libc", NL_CAT_LOCALE);
190 }
191
192 static void
193 localtime_init(void)
194 {
195         time_t ltime;
196
197         /*
198          * Allow localtime(3) to cache /etc/localtime content before entering
199          * capability mode.
200          * XXXPJD: There should be localtime_init() in libc.
201          */
202         (void)time(&ltime);
203         (void)localtime(&ltime);
204 }
205
206 int
207 main(int argc, char *argv[])
208 {
209         int ch, ktrlen, size;
210         void *m;
211         int trpoints = ALL_POINTS;
212         int drop_logged;
213         pid_t pid = 0;
214         u_int sv_flags;
215
216         setlocale(LC_CTYPE, "");
217
218         while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
219                 switch (ch) {
220                 case 'A':
221                         abiflag = 1;
222                         break;
223                 case 'f':
224                         tracefile = optarg;
225                         break;
226                 case 'd':
227                         decimal = 1;
228                         break;
229                 case 'l':
230                         tail = 1;
231                         break;
232                 case 'm':
233                         maxdata = atoi(optarg);
234                         break;
235                 case 'n':
236                         fancy = 0;
237                         break;
238                 case 'p':
239                         pid = atoi(optarg);
240                         break;
241                 case 'r':
242                         resolv = 1;
243                         break;
244                 case 'S':
245                         syscallno = 1;
246                         break;
247                 case 's':
248                         suppressdata = 1;
249                         break;
250                 case 'E':
251                         timestamp = 3;  /* elapsed timestamp */
252                         break;
253                 case 'H':
254                         threads = 1;
255                         break;
256                 case 'R':
257                         timestamp = 2;  /* relative timestamp */
258                         break;
259                 case 'T':
260                         timestamp = 1;
261                         break;
262                 case 't':
263                         trpoints = getpoints(optarg);
264                         if (trpoints < 0)
265                                 errx(1, "unknown trace point in %s", optarg);
266                         break;
267                 default:
268                         usage();
269                 }
270
271         if (argc > optind)
272                 usage();
273
274         m = malloc(size = 1025);
275         if (m == NULL)
276                 errx(1, "%s", strerror(ENOMEM));
277         if (!freopen(tracefile, "r", stdin))
278                 err(1, "%s", tracefile);
279
280         strerror_init();
281         localtime_init();
282
283         if (resolv == 0) {
284                 if (cap_enter() < 0 && errno != ENOSYS)
285                         err(1, "unable to enter capability mode");
286         }
287         limitfd(STDIN_FILENO);
288         limitfd(STDOUT_FILENO);
289         limitfd(STDERR_FILENO);
290
291         TAILQ_INIT(&trace_procs);
292         drop_logged = 0;
293         while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
294                 if (ktr_header.ktr_type & KTR_DROP) {
295                         ktr_header.ktr_type &= ~KTR_DROP;
296                         if (!drop_logged && threads) {
297                                 printf(
298                                     "%6jd %6jd %-8.*s Events dropped.\n",
299                                     (intmax_t)ktr_header.ktr_pid,
300                                     ktr_header.ktr_tid > 0 ?
301                                     (intmax_t)ktr_header.ktr_tid : 0,
302                                     MAXCOMLEN, ktr_header.ktr_comm);
303                                 drop_logged = 1;
304                         } else if (!drop_logged) {
305                                 printf("%6jd %-8.*s Events dropped.\n",
306                                     (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
307                                     ktr_header.ktr_comm);
308                                 drop_logged = 1;
309                         }
310                 }
311                 if (trpoints & (1<<ktr_header.ktr_type))
312                         if (pid == 0 || ktr_header.ktr_pid == pid ||
313                             ktr_header.ktr_tid == pid)
314                                 dumpheader(&ktr_header);
315                 if ((ktrlen = ktr_header.ktr_len) < 0)
316                         errx(1, "bogus length 0x%x", ktrlen);
317                 if (ktrlen > size) {
318                         m = realloc(m, ktrlen+1);
319                         if (m == NULL)
320                                 errx(1, "%s", strerror(ENOMEM));
321                         size = ktrlen;
322                 }
323                 if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
324                         errx(1, "data too short");
325                 if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
326                         continue;
327                 sv_flags = abidump(&ktr_header);
328                 if (pid && ktr_header.ktr_pid != pid &&
329                     ktr_header.ktr_tid != pid)
330                         continue;
331                 if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
332                         continue;
333                 drop_logged = 0;
334                 switch (ktr_header.ktr_type) {
335                 case KTR_SYSCALL:
336 #if defined(__amd64__) || defined(__i386__)
337                         if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
338                                 linux_ktrsyscall((struct ktr_syscall *)m,
339                                     sv_flags);
340                         else
341 #endif
342                                 ktrsyscall((struct ktr_syscall *)m, sv_flags);
343                         break;
344                 case KTR_SYSRET:
345 #if defined(__amd64__) || defined(__i386__)
346                         if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
347                                 linux_ktrsysret((struct ktr_sysret *)m, 
348                                     sv_flags);
349                         else
350 #endif
351                                 ktrsysret((struct ktr_sysret *)m, sv_flags);
352                         break;
353                 case KTR_NAMEI:
354                 case KTR_SYSCTL:
355                         ktrnamei(m, ktrlen);
356                         break;
357                 case KTR_GENIO:
358                         ktrgenio((struct ktr_genio *)m, ktrlen);
359                         break;
360                 case KTR_PSIG:
361                         ktrpsig((struct ktr_psig *)m);
362                         break;
363                 case KTR_CSW:
364                         if (ktrlen == sizeof(struct ktr_csw_old))
365                                 ktrcsw_old((struct ktr_csw_old *)m);
366                         else
367                                 ktrcsw((struct ktr_csw *)m);
368                         break;
369                 case KTR_USER:
370                         ktruser(ktrlen, m);
371                         break;
372                 case KTR_STRUCT:
373                         ktrstruct(m, ktrlen);
374                         break;
375                 case KTR_CAPFAIL:
376                         ktrcapfail((struct ktr_cap_fail *)m);
377                         break;
378                 case KTR_FAULT:
379                         ktrfault((struct ktr_fault *)m);
380                         break;
381                 case KTR_FAULTEND:
382                         ktrfaultend((struct ktr_faultend *)m);
383                         break;
384                 default:
385                         printf("\n");
386                         break;
387                 }
388                 if (tail)
389                         fflush(stdout);
390         }
391         return 0;
392 }
393
394 void
395 limitfd(int fd)
396 {
397         cap_rights_t rights;
398         unsigned long cmd;
399
400         cap_rights_init(&rights, CAP_FSTAT);
401         cmd = 0;
402
403         switch (fd) {
404         case STDIN_FILENO:
405                 cap_rights_set(&rights, CAP_READ);
406                 break;
407         case STDOUT_FILENO:
408                 cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
409                 cmd = TIOCGETA; /* required by isatty(3) in printf(3) */
410                 break;
411         case STDERR_FILENO:
412                 cap_rights_set(&rights, CAP_WRITE);
413                 if (!suppressdata) {
414                         cap_rights_set(&rights, CAP_IOCTL);
415                         cmd = TIOCGWINSZ;
416                 }
417                 break;
418         default:
419                 abort();
420         }
421
422         if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
423                 err(1, "unable to limit rights for descriptor %d", fd);
424         if (cmd != 0 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
425                 err(1, "unable to limit ioctls for descriptor %d", fd);
426 }
427
428 int
429 fread_tail(void *buf, int size, int num)
430 {
431         int i;
432
433         while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
434                 sleep(1);
435                 clearerr(stdin);
436         }
437         return (i);
438 }
439
440 int
441 fetchprocinfo(struct ktr_header *kth, u_int *flags)
442 {
443         struct proc_info *pi;
444
445         switch (kth->ktr_type) {
446         case KTR_PROCCTOR:
447                 TAILQ_FOREACH(pi, &trace_procs, info) {
448                         if (pi->pid == kth->ktr_pid) {
449                                 TAILQ_REMOVE(&trace_procs, pi, info);
450                                 break;
451                         }
452                 }
453                 pi = malloc(sizeof(struct proc_info));
454                 if (pi == NULL)
455                         errx(1, "%s", strerror(ENOMEM));
456                 pi->sv_flags = *flags;
457                 pi->pid = kth->ktr_pid;
458                 TAILQ_INSERT_TAIL(&trace_procs, pi, info);
459                 return (1);
460
461         case KTR_PROCDTOR:
462                 TAILQ_FOREACH(pi, &trace_procs, info) {
463                         if (pi->pid == kth->ktr_pid) {
464                                 TAILQ_REMOVE(&trace_procs, pi, info);
465                                 free(pi);
466                                 break;
467                         }
468                 }
469                 return (1);
470         }
471
472         return (0);
473 }
474
475 u_int
476 abidump(struct ktr_header *kth)
477 {
478         struct proc_info *pi;
479         const char *abi;
480         const char *arch;
481         u_int flags = 0;
482
483         TAILQ_FOREACH(pi, &trace_procs, info) {
484                 if (pi->pid == kth->ktr_pid) {
485                         flags = pi->sv_flags;
486                         break;
487                 }
488         }
489
490         if (abiflag == 0)
491                 return (flags);
492
493         switch (flags & SV_ABI_MASK) {
494         case SV_ABI_LINUX:
495                 abi = "L";
496                 break;
497         case SV_ABI_FREEBSD:
498                 abi = "F";
499                 break;
500         default:
501                 abi = "U";
502                 break;
503         }
504
505         if (flags != 0) {
506                 if (flags & SV_LP64)
507                         arch = "64";
508                 else
509                         arch = "32";
510         } else
511                 arch = "00";
512
513         printf("%s%s  ", abi, arch);
514
515         return (flags);
516 }
517
518 void
519 dumpheader(struct ktr_header *kth)
520 {
521         static char unknown[64];
522         static struct timeval prevtime, temp;
523         const char *type;
524
525         switch (kth->ktr_type) {
526         case KTR_SYSCALL:
527                 type = "CALL";
528                 break;
529         case KTR_SYSRET:
530                 type = "RET ";
531                 break;
532         case KTR_NAMEI:
533                 type = "NAMI";
534                 break;
535         case KTR_GENIO:
536                 type = "GIO ";
537                 break;
538         case KTR_PSIG:
539                 type = "PSIG";
540                 break;
541         case KTR_CSW:
542                 type = "CSW ";
543                 break;
544         case KTR_USER:
545                 type = "USER";
546                 break;
547         case KTR_STRUCT:
548                 type = "STRU";
549                 break;
550         case KTR_SYSCTL:
551                 type = "SCTL";
552                 break;
553         case KTR_PROCCTOR:
554                 /* FALLTHROUGH */
555         case KTR_PROCDTOR:
556                 return;
557         case KTR_CAPFAIL:
558                 type = "CAP ";
559                 break;
560         case KTR_FAULT:
561                 type = "PFLT";
562                 break;
563         case KTR_FAULTEND:
564                 type = "PRET";
565                 break;
566         default:
567                 sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
568                 type = unknown;
569         }
570
571         /*
572          * The ktr_tid field was previously the ktr_buffer field, which held
573          * the kernel pointer value for the buffer associated with data
574          * following the record header.  It now holds a threadid, but only
575          * for trace files after the change.  Older trace files still contain
576          * kernel pointers.  Detect this and suppress the results by printing
577          * negative tid's as 0.
578          */
579         if (threads)
580                 printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
581                     kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
582                     MAXCOMLEN, kth->ktr_comm);
583         else
584                 printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
585                     kth->ktr_comm);
586         if (timestamp) {
587                 if (timestamp == 3) {
588                         if (prevtime.tv_sec == 0)
589                                 prevtime = kth->ktr_time;
590                         timevalsub(&kth->ktr_time, &prevtime);
591                 }
592                 if (timestamp == 2) {
593                         temp = kth->ktr_time;
594                         timevalsub(&kth->ktr_time, &prevtime);
595                         prevtime = temp;
596                 }
597                 printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
598                     kth->ktr_time.tv_usec);
599         }
600         printf("%s  ", type);
601 }
602
603 #include <sys/syscall.h>
604 #define KTRACE
605 #include <sys/kern/syscalls.c>
606 #undef KTRACE
607 int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
608
609 void
610 ktrsyscall(struct ktr_syscall *ktr, u_int flags)
611 {
612         int narg = ktr->ktr_narg;
613         register_t *ip;
614         intmax_t arg;
615
616         if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
617             (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
618                 printf("[%d]", ktr->ktr_code);
619         else {
620                 printf("%s", syscallnames[ktr->ktr_code]);
621                 if (syscallno)
622                         printf("[%d]", ktr->ktr_code);
623         }
624         ip = &ktr->ktr_args[0];
625         if (narg) {
626                 char c = '(';
627                 if (fancy &&
628                     (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
629                         switch (ktr->ktr_code) {
630                         case SYS_bindat:
631                         case SYS_connectat:
632                         case SYS_faccessat:
633                         case SYS_fchmodat:
634                         case SYS_fchownat:
635                         case SYS_fstatat:
636                         case SYS_futimesat:
637                         case SYS_linkat:
638                         case SYS_mkdirat:
639                         case SYS_mkfifoat:
640                         case SYS_mknodat:
641                         case SYS_openat:
642                         case SYS_readlinkat:
643                         case SYS_renameat:
644                         case SYS_unlinkat:
645                         case SYS_utimensat:
646                                 putchar('(');
647                                 atfdname(*ip, decimal);
648                                 c = ',';
649                                 ip++;
650                                 narg--;
651                                 break;
652                         }
653                         switch (ktr->ktr_code) {
654                         case SYS_ioctl: {
655                                 print_number(ip, narg, c);
656                                 putchar(c);
657                                 ioctlname(*ip, decimal);
658                                 c = ',';
659                                 ip++;
660                                 narg--;
661                                 break;
662                         }
663                         case SYS_ptrace:
664                                 putchar('(');
665                                 ptraceopname(*ip);
666                                 c = ',';
667                                 ip++;
668                                 narg--;
669                                 break;
670                         case SYS_access:
671                         case SYS_eaccess:
672                         case SYS_faccessat:
673                                 print_number(ip, narg, c);
674                                 putchar(',');
675                                 accessmodename(*ip);
676                                 ip++;
677                                 narg--;
678                                 break;
679                         case SYS_open:
680                         case SYS_openat:
681                                 print_number(ip, narg, c);
682                                 putchar(',');
683                                 flagsandmodename(ip[0], ip[1], decimal);
684                                 ip += 2;
685                                 narg -= 2;
686                                 break;
687                         case SYS_wait4:
688                                 print_number(ip, narg, c);
689                                 print_number(ip, narg, c);
690                                 /*
691                                  * A flags value of zero is valid for
692                                  * wait4() but not for wait6(), so
693                                  * handle zero special here.
694                                  */
695                                 if (*ip == 0) {
696                                         print_number(ip, narg, c);
697                                 } else {
698                                         putchar(',');
699                                         wait6optname(*ip);
700                                         ip++;
701                                         narg--;
702                                 }
703                                 break;
704                         case SYS_wait6:
705                                 putchar('(');
706                                 idtypename(*ip, decimal);
707                                 c = ',';
708                                 ip++;
709                                 narg--;
710                                 print_number(ip, narg, c);
711                                 print_number(ip, narg, c);
712                                 putchar(',');
713                                 wait6optname(*ip);
714                                 ip++;
715                                 narg--;
716                                 break;
717                         case SYS_chmod:
718                         case SYS_fchmod:
719                         case SYS_lchmod:
720                                 print_number(ip, narg, c);
721                                 putchar(',');
722                                 modename(*ip);
723                                 ip++;
724                                 narg--;
725                                 break;
726                         case SYS_mknod:
727                         case SYS_mknodat:
728                                 print_number(ip, narg, c);
729                                 putchar(',');
730                                 modename(*ip);
731                                 ip++;
732                                 narg--;
733                                 break;
734                         case SYS_getfsstat:
735                                 print_number(ip, narg, c);
736                                 print_number(ip, narg, c);
737                                 putchar(',');
738                                 getfsstatflagsname(*ip);
739                                 ip++;
740                                 narg--;
741                                 break;
742                         case SYS_mount:
743                                 print_number(ip, narg, c);
744                                 print_number(ip, narg, c);
745                                 putchar(',');
746                                 mountflagsname(*ip);
747                                 ip++;
748                                 narg--;
749                                 break;
750                         case SYS_unmount:
751                                 print_number(ip, narg, c);
752                                 putchar(',');
753                                 mountflagsname(*ip);
754                                 ip++;
755                                 narg--;
756                                 break;
757                         case SYS_recvmsg:
758                         case SYS_sendmsg:
759                                 print_number(ip, narg, c);
760                                 print_number(ip, narg, c);
761                                 putchar(',');
762                                 sendrecvflagsname(*ip);
763                                 ip++;
764                                 narg--;
765                                 break;
766                         case SYS_recvfrom:
767                         case SYS_sendto:
768                                 print_number(ip, narg, c);
769                                 print_number(ip, narg, c);
770                                 print_number(ip, narg, c);
771                                 putchar(',');
772                                 sendrecvflagsname(*ip);
773                                 ip++;
774                                 narg--;
775                                 break;
776                         case SYS_chflags:
777                         case SYS_fchflags:
778                         case SYS_lchflags:
779                                 print_number(ip, narg, c);
780                                 putchar(',');
781                                 modename(*ip);
782                                 ip++;
783                                 narg--;
784                                 break;
785                         case SYS_kill:
786                                 print_number(ip, narg, c);
787                                 putchar(',');
788                                 signame(*ip);
789                                 ip++;
790                                 narg--;
791                                 break;
792                         case SYS_reboot:
793                                 putchar('(');
794                                 rebootoptname(*ip);
795                                 ip++;
796                                 narg--;
797                                 break;
798                         case SYS_umask:
799                                 putchar('(');
800                                 modename(*ip);
801                                 ip++;
802                                 narg--;
803                                 break;
804                         case SYS_msync:
805                                 print_number(ip, narg, c);
806                                 print_number(ip, narg, c);
807                                 putchar(',');
808                                 msyncflagsname(*ip);
809                                 ip++;
810                                 narg--;
811                                 break;
812 #ifdef SYS_freebsd6_mmap
813                         case SYS_freebsd6_mmap:
814                                 print_number(ip, narg, c);
815                                 print_number(ip, narg, c);
816                                 putchar(',');
817                                 mmapprotname(*ip);
818                                 putchar(',');
819                                 ip++;
820                                 narg--;
821                                 mmapflagsname(*ip);
822                                 ip++;
823                                 narg--;
824                                 break;
825 #endif
826                         case SYS_mmap:
827                                 print_number(ip, narg, c);
828                                 print_number(ip, narg, c);
829                                 putchar(',');
830                                 mmapprotname(*ip);
831                                 putchar(',');
832                                 ip++;
833                                 narg--;
834                                 mmapflagsname(*ip);
835                                 ip++;
836                                 narg--;
837                                 break;
838                         case SYS_mprotect:
839                                 print_number(ip, narg, c);
840                                 print_number(ip, narg, c);
841                                 putchar(',');
842                                 mmapprotname(*ip);
843                                 ip++;
844                                 narg--;
845                                 break;
846                         case SYS_madvise:
847                                 print_number(ip, narg, c);
848                                 print_number(ip, narg, c);
849                                 putchar(',');
850                                 madvisebehavname(*ip);
851                                 ip++;
852                                 narg--;
853                                 break;
854                         case SYS_setpriority:
855                                 print_number(ip, narg, c);
856                                 print_number(ip, narg, c);
857                                 putchar(',');
858                                 prioname(*ip);
859                                 ip++;
860                                 narg--;
861                                 break;
862                         case SYS_fcntl:
863                                 print_number(ip, narg, c);
864                                 putchar(',');
865                                 fcntlcmdname(ip[0], ip[1], decimal);
866                                 ip += 2;
867                                 narg -= 2;
868                                 break;
869                         case SYS_socket: {
870                                 int sockdomain;
871                                 putchar('(');
872                                 sockdomain = *ip;
873                                 sockdomainname(sockdomain);
874                                 ip++;
875                                 narg--;
876                                 putchar(',');
877                                 socktypenamewithflags(*ip);
878                                 ip++;
879                                 narg--;
880                                 if (sockdomain == PF_INET ||
881                                     sockdomain == PF_INET6) {
882                                         putchar(',');
883                                         sockipprotoname(*ip);
884                                         ip++;
885                                         narg--;
886                                 }
887                                 c = ',';
888                                 break;
889                         }
890                         case SYS_setsockopt:
891                         case SYS_getsockopt:
892                                 print_number(ip, narg, c);
893                                 putchar(',');
894                                 sockoptlevelname(*ip, decimal);
895                                 if (*ip == SOL_SOCKET) {
896                                         ip++;
897                                         narg--;
898                                         putchar(',');
899                                         sockoptname(*ip);
900                                 }
901                                 ip++;
902                                 narg--;
903                                 break;
904 #ifdef SYS_freebsd6_lseek
905                         case SYS_freebsd6_lseek:
906                                 print_number(ip, narg, c);
907                                 /* Hidden 'pad' argument, not in lseek(2) */
908                                 print_number(ip, narg, c);
909                                 print_number(ip, narg, c);
910                                 putchar(',');
911                                 whencename(*ip);
912                                 ip++;
913                                 narg--;
914                                 break;
915 #endif
916                         case SYS_lseek:
917                                 print_number(ip, narg, c);
918                                 /* Hidden 'pad' argument, not in lseek(2) */
919                                 print_number(ip, narg, c);
920                                 putchar(',');
921                                 whencename(*ip);
922                                 ip++;
923                                 narg--;
924                                 break;
925                         case SYS_flock:
926                                 print_number(ip, narg, c);
927                                 putchar(',');
928                                 flockname(*ip);
929                                 ip++;
930                                 narg--;
931                                 break;
932                         case SYS_mkfifo:
933                         case SYS_mkfifoat:
934                         case SYS_mkdir:
935                         case SYS_mkdirat:
936                                 print_number(ip, narg, c);
937                                 putchar(',');
938                                 modename(*ip);
939                                 ip++;
940                                 narg--;
941                                 break;
942                         case SYS_shutdown:
943                                 print_number(ip, narg, c);
944                                 putchar(',');
945                                 shutdownhowname(*ip);
946                                 ip++;
947                                 narg--;
948                                 break;
949                         case SYS_socketpair:
950                                 putchar('(');
951                                 sockdomainname(*ip);
952                                 ip++;
953                                 narg--;
954                                 putchar(',');
955                                 socktypenamewithflags(*ip);
956                                 ip++;
957                                 narg--;
958                                 c = ',';
959                                 break;
960                         case SYS_getrlimit:
961                         case SYS_setrlimit:
962                                 putchar('(');
963                                 rlimitname(*ip);
964                                 ip++;
965                                 narg--;
966                                 c = ',';
967                                 break;
968                         case SYS_quotactl:
969                                 print_number(ip, narg, c);
970                                 putchar(',');
971                                 quotactlname(*ip);
972                                 ip++;
973                                 narg--;
974                                 c = ',';
975                                 break;
976                         case SYS_nfssvc:
977                                 putchar('(');
978                                 nfssvcname(*ip);
979                                 ip++;
980                                 narg--;
981                                 c = ',';
982                                 break;
983                         case SYS_rtprio:
984                                 putchar('(');
985                                 rtprioname(*ip);
986                                 ip++;
987                                 narg--;
988                                 c = ',';
989                                 break;
990                         case SYS___semctl:
991                                 print_number(ip, narg, c);
992                                 print_number(ip, narg, c);
993                                 putchar(',');
994                                 semctlname(*ip);
995                                 ip++;
996                                 narg--;
997                                 break;
998                         case SYS_semget:
999                                 print_number(ip, narg, c);
1000                                 print_number(ip, narg, c);
1001                                 putchar(',');
1002                                 semgetname(*ip);
1003                                 ip++;
1004                                 narg--;
1005                                 break;
1006                         case SYS_msgctl:
1007                                 print_number(ip, narg, c);
1008                                 putchar(',');
1009                                 shmctlname(*ip);
1010                                 ip++;
1011                                 narg--;
1012                                 break;
1013                         case SYS_shmat:
1014                                 print_number(ip, narg, c);
1015                                 print_number(ip, narg, c);
1016                                 putchar(',');
1017                                 shmatname(*ip);
1018                                 ip++;
1019                                 narg--;
1020                                 break;
1021                         case SYS_shmctl:
1022                                 print_number(ip, narg, c);
1023                                 putchar(',');
1024                                 shmctlname(*ip);
1025                                 ip++;
1026                                 narg--;
1027                                 break;
1028                         case SYS_shm_open:
1029                                 print_number(ip, narg, c);
1030                                 putchar(',');
1031                                 flagsname(ip[0]);
1032                                 printf(",0%o", (unsigned int)ip[1]);
1033                                 ip += 3;
1034                                 narg -= 3;
1035                                 break;
1036                         case SYS_minherit:
1037                                 print_number(ip, narg, c);
1038                                 print_number(ip, narg, c);
1039                                 putchar(',');
1040                                 minheritname(*ip);
1041                                 ip++;
1042                                 narg--;
1043                                 break;
1044                         case SYS_rfork:
1045                                 putchar('(');
1046                                 rforkname(*ip);
1047                                 ip++;
1048                                 narg--;
1049                                 c = ',';
1050                                 break;
1051                         case SYS_lio_listio:
1052                                 putchar('(');
1053                                 lio_listioname(*ip);
1054                                 ip++;
1055                                 narg--;
1056                                 c = ',';
1057                                 break;
1058                         case SYS_mlockall:
1059                                 putchar('(');
1060                                 mlockallname(*ip);
1061                                 ip++;
1062                                 narg--;
1063                                 break;
1064                         case SYS_sched_setscheduler:
1065                                 print_number(ip, narg, c);
1066                                 putchar(',');
1067                                 schedpolicyname(*ip);
1068                                 ip++;
1069                                 narg--;
1070                                 break;
1071                         case SYS_sched_get_priority_max:
1072                         case SYS_sched_get_priority_min:
1073                                 putchar('(');
1074                                 schedpolicyname(*ip);
1075                                 ip++;
1076                                 narg--;
1077                                 break;
1078                         case SYS_sendfile:
1079                                 print_number(ip, narg, c);
1080                                 print_number(ip, narg, c);
1081                                 print_number(ip, narg, c);
1082                                 print_number(ip, narg, c);
1083                                 print_number(ip, narg, c);
1084                                 print_number(ip, narg, c);
1085                                 putchar(',');
1086                                 sendfileflagsname(*(int *)ip);
1087                                 ip++;
1088                                 narg--;
1089                                 break;
1090                         case SYS_kldsym:
1091                                 print_number(ip, narg, c);
1092                                 putchar(',');
1093                                 kldsymcmdname(*ip);
1094                                 ip++;
1095                                 narg--;
1096                                 break;
1097                         case SYS_sigprocmask:
1098                                 putchar('(');
1099                                 sigprocmaskhowname(*ip);
1100                                 ip++;
1101                                 narg--;
1102                                 c = ',';
1103                                 break;
1104                         case SYS___acl_get_file:
1105                         case SYS___acl_set_file:
1106                         case SYS___acl_get_fd:
1107                         case SYS___acl_set_fd:
1108                         case SYS___acl_delete_file:
1109                         case SYS___acl_delete_fd:
1110                         case SYS___acl_aclcheck_file:
1111                         case SYS___acl_aclcheck_fd:
1112                         case SYS___acl_get_link:
1113                         case SYS___acl_set_link:
1114                         case SYS___acl_delete_link:
1115                         case SYS___acl_aclcheck_link:
1116                                 print_number(ip, narg, c);
1117                                 putchar(',');
1118                                 acltypename(*ip);
1119                                 ip++;
1120                                 narg--;
1121                                 break;
1122                         case SYS_sigaction:
1123                                 putchar('(');
1124                                 signame(*ip);
1125                                 ip++;
1126                                 narg--;
1127                                 c = ',';
1128                                 break;
1129                         case SYS_extattrctl:
1130                                 print_number(ip, narg, c);
1131                                 putchar(',');
1132                                 extattrctlname(*ip);
1133                                 ip++;
1134                                 narg--;
1135                                 break;
1136                         case SYS_nmount:
1137                                 print_number(ip, narg, c);
1138                                 print_number(ip, narg, c);
1139                                 putchar(',');
1140                                 mountflagsname(*ip);
1141                                 ip++;
1142                                 narg--;
1143                                 break;
1144                         case SYS_thr_create:
1145                                 print_number(ip, narg, c);
1146                                 print_number(ip, narg, c);
1147                                 putchar(',');
1148                                 thrcreateflagsname(*ip);
1149                                 ip++;
1150                                 narg--;
1151                                 break;
1152                         case SYS_thr_kill:
1153                                 print_number(ip, narg, c);
1154                                 putchar(',');
1155                                 signame(*ip);
1156                                 ip++;
1157                                 narg--;
1158                                 break;
1159                         case SYS_kldunloadf:
1160                                 print_number(ip, narg, c);
1161                                 putchar(',');
1162                                 kldunloadfflagsname(*ip);
1163                                 ip++;
1164                                 narg--;
1165                                 break;
1166                         case SYS_linkat:
1167                         case SYS_renameat:
1168                         case SYS_symlinkat:
1169                                 print_number(ip, narg, c);
1170                                 putchar(',');
1171                                 atfdname(*ip, decimal);
1172                                 ip++;
1173                                 narg--;
1174                                 break;
1175                         case SYS_cap_fcntls_limit:
1176                                 print_number(ip, narg, c);
1177                                 putchar(',');
1178                                 arg = *ip;
1179                                 ip++;
1180                                 narg--;
1181                                 capfcntlname(arg);
1182                                 break;
1183                         case SYS_posix_fadvise:
1184                                 print_number(ip, narg, c);
1185                                 print_number(ip, narg, c);
1186                                 print_number(ip, narg, c);
1187                                 (void)putchar(',');
1188                                 fadvisebehavname((int)*ip);
1189                                 ip++;
1190                                 narg--;
1191                                 break;
1192                         case SYS_procctl:
1193                                 putchar('(');
1194                                 idtypename(*ip, decimal);
1195                                 c = ',';
1196                                 ip++;
1197                                 narg--;
1198                                 print_number(ip, narg, c);
1199                                 putchar(',');
1200                                 procctlcmdname(*ip);
1201                                 ip++;
1202                                 narg--;
1203                                 break;
1204                         case SYS__umtx_op:
1205                                 print_number(ip, narg, c);
1206                                 putchar(',');
1207                                 umtxopname(*ip);
1208                                 switch (*ip) {
1209                                 case UMTX_OP_CV_WAIT:
1210                                         ip++;
1211                                         narg--;
1212                                         putchar(',');
1213                                         umtxcvwaitflags(*ip);
1214                                         break;
1215                                 case UMTX_OP_RW_RDLOCK:
1216                                         ip++;
1217                                         narg--;
1218                                         putchar(',');
1219                                         umtxrwlockflags(*ip);
1220                                         break;
1221                                 }
1222                                 ip++;
1223                                 narg--;
1224                         }
1225                 }
1226                 while (narg > 0) {
1227                         print_number(ip, narg, c);
1228                 }
1229                 putchar(')');
1230         }
1231         putchar('\n');
1232 }
1233
1234 void
1235 ktrsysret(struct ktr_sysret *ktr, u_int flags)
1236 {
1237         register_t ret = ktr->ktr_retval;
1238         int error = ktr->ktr_error;
1239         int code = ktr->ktr_code;
1240
1241         if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
1242             (code >= nsyscalls || code < 0))
1243                 printf("[%d] ", code);
1244         else {
1245                 printf("%s", syscallnames[code]);
1246                 if (syscallno)
1247                         printf("[%d]", code);
1248                 printf(" ");
1249         }
1250
1251         if (error == 0) {
1252                 if (fancy) {
1253                         printf("%ld", (long)ret);
1254                         if (ret < 0 || ret > 9)
1255                                 printf("/%#lx", (unsigned long)ret);
1256                 } else {
1257                         if (decimal)
1258                                 printf("%ld", (long)ret);
1259                         else
1260                                 printf("%#lx", (unsigned long)ret);
1261                 }
1262         } else if (error == ERESTART)
1263                 printf("RESTART");
1264         else if (error == EJUSTRETURN)
1265                 printf("JUSTRETURN");
1266         else {
1267                 printf("-1 errno %d", ktr->ktr_error);
1268                 if (fancy)
1269                         printf(" %s", strerror(ktr->ktr_error));
1270         }
1271         putchar('\n');
1272 }
1273
1274 void
1275 ktrnamei(char *cp, int len)
1276 {
1277         printf("\"%.*s\"\n", len, cp);
1278 }
1279
1280 void
1281 hexdump(char *p, int len, int screenwidth)
1282 {
1283         int n, i;
1284         int width;
1285
1286         width = 0;
1287         do {
1288                 width += 2;
1289                 i = 13;                 /* base offset */
1290                 i += (width / 2) + 1;   /* spaces every second byte */
1291                 i += (width * 2);       /* width of bytes */
1292                 i += 3;                 /* "  |" */
1293                 i += width;             /* each byte */
1294                 i += 1;                 /* "|" */
1295         } while (i < screenwidth);
1296         width -= 2;
1297
1298         for (n = 0; n < len; n += width) {
1299                 for (i = n; i < n + width; i++) {
1300                         if ((i % width) == 0) { /* beginning of line */
1301                                 printf("       0x%04x", i);
1302                         }
1303                         if ((i % 2) == 0) {
1304                                 printf(" ");
1305                         }
1306                         if (i < len)
1307                                 printf("%02x", p[i] & 0xff);
1308                         else
1309                                 printf("  ");
1310                 }
1311                 printf("  |");
1312                 for (i = n; i < n + width; i++) {
1313                         if (i >= len)
1314                                 break;
1315                         if (p[i] >= ' ' && p[i] <= '~')
1316                                 printf("%c", p[i]);
1317                         else
1318                                 printf(".");
1319                 }
1320                 printf("|\n");
1321         }
1322         if ((i % width) != 0)
1323                 printf("\n");
1324 }
1325
1326 void
1327 visdump(char *dp, int datalen, int screenwidth)
1328 {
1329         int col = 0;
1330         char *cp;
1331         int width;
1332         char visbuf[5];
1333
1334         printf("       \"");
1335         col = 8;
1336         for (;datalen > 0; datalen--, dp++) {
1337                  vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
1338                 cp = visbuf;
1339                 /*
1340                  * Keep track of printables and
1341                  * space chars (like fold(1)).
1342                  */
1343                 if (col == 0) {
1344                         putchar('\t');
1345                         col = 8;
1346                 }
1347                 switch(*cp) {
1348                 case '\n':
1349                         col = 0;
1350                         putchar('\n');
1351                         continue;
1352                 case '\t':
1353                         width = 8 - (col&07);
1354                         break;
1355                 default:
1356                         width = strlen(cp);
1357                 }
1358                 if (col + width > (screenwidth-2)) {
1359                         printf("\\\n\t");
1360                         col = 8;
1361                 }
1362                 col += width;
1363                 do {
1364                         putchar(*cp++);
1365                 } while (*cp);
1366         }
1367         if (col == 0)
1368                 printf("       ");
1369         printf("\"\n");
1370 }
1371
1372 void
1373 ktrgenio(struct ktr_genio *ktr, int len)
1374 {
1375         int datalen = len - sizeof (struct ktr_genio);
1376         char *dp = (char *)ktr + sizeof (struct ktr_genio);
1377         static int screenwidth = 0;
1378         int i, binary;
1379
1380         printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
1381                 ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
1382                 datalen == 1 ? "" : "s");
1383         if (suppressdata)
1384                 return;
1385         if (screenwidth == 0) {
1386                 struct winsize ws;
1387
1388                 if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1389                     ws.ws_col > 8)
1390                         screenwidth = ws.ws_col;
1391                 else
1392                         screenwidth = 80;
1393         }
1394         if (maxdata && datalen > maxdata)
1395                 datalen = maxdata;
1396
1397         for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1398                 if (dp[i] >= 32 && dp[i] < 127)
1399                         continue;
1400                 if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1401                         continue;
1402                 binary = 1;
1403         }
1404         if (binary)
1405                 hexdump(dp, datalen, screenwidth);
1406         else
1407                 visdump(dp, datalen, screenwidth);
1408 }
1409
1410 const char *signames[] = {
1411         "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",     /*  1 - 6  */
1412         "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",             /*  7 - 12 */
1413         "PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",         /* 13 - 18 */
1414         "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",           /* 19 - 24 */
1415         "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",        /* 25 - 30 */
1416         "USR2", NULL,                                           /* 31 - 32 */
1417 };
1418
1419 void
1420 ktrpsig(struct ktr_psig *psig)
1421 {
1422         if (psig->signo > 0 && psig->signo < NSIG)
1423                 printf("SIG%s ", signames[psig->signo]);
1424         else
1425                 printf("SIG %d ", psig->signo);
1426         if (psig->action == SIG_DFL) {
1427                 printf("SIG_DFL code=");
1428                 sigcodename(psig->signo, psig->code);
1429                 putchar('\n');
1430         } else {
1431                 printf("caught handler=0x%lx mask=0x%x code=",
1432                     (u_long)psig->action, psig->mask.__bits[0]);
1433                 sigcodename(psig->signo, psig->code);
1434                 putchar('\n');
1435         }
1436 }
1437
1438 void
1439 ktrcsw_old(struct ktr_csw_old *cs)
1440 {
1441         printf("%s %s\n", cs->out ? "stop" : "resume",
1442                 cs->user ? "user" : "kernel");
1443 }
1444
1445 void
1446 ktrcsw(struct ktr_csw *cs)
1447 {
1448         printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
1449             cs->user ? "user" : "kernel", cs->wmesg);
1450 }
1451
1452 #define UTRACE_DLOPEN_START             1
1453 #define UTRACE_DLOPEN_STOP              2
1454 #define UTRACE_DLCLOSE_START            3
1455 #define UTRACE_DLCLOSE_STOP             4
1456 #define UTRACE_LOAD_OBJECT              5
1457 #define UTRACE_UNLOAD_OBJECT            6
1458 #define UTRACE_ADD_RUNDEP               7
1459 #define UTRACE_PRELOAD_FINISHED         8
1460 #define UTRACE_INIT_CALL                9
1461 #define UTRACE_FINI_CALL                10
1462 #define UTRACE_DLSYM_START              11
1463 #define UTRACE_DLSYM_STOP               12
1464
1465 struct utrace_rtld {
1466         char sig[4];                            /* 'RTLD' */
1467         int event;
1468         void *handle;
1469         void *mapbase;
1470         size_t mapsize;
1471         int refcnt;
1472         char name[MAXPATHLEN];
1473 };
1474
1475 void
1476 ktruser_rtld(int len, void *p)
1477 {
1478         struct utrace_rtld *ut = p;
1479         unsigned char *cp;
1480         void *parent;
1481         int mode;
1482
1483         switch (ut->event) {
1484         case UTRACE_DLOPEN_START:
1485                 mode = ut->refcnt;
1486                 printf("dlopen(%s, ", ut->name);
1487                 switch (mode & RTLD_MODEMASK) {
1488                 case RTLD_NOW:
1489                         printf("RTLD_NOW");
1490                         break;
1491                 case RTLD_LAZY:
1492                         printf("RTLD_LAZY");
1493                         break;
1494                 default:
1495                         printf("%#x", mode & RTLD_MODEMASK);
1496                 }
1497                 if (mode & RTLD_GLOBAL)
1498                         printf(" | RTLD_GLOBAL");
1499                 if (mode & RTLD_TRACE)
1500                         printf(" | RTLD_TRACE");
1501                 if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
1502                         printf(" | %#x", mode &
1503                             ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
1504                 printf(")\n");
1505                 break;
1506         case UTRACE_DLOPEN_STOP:
1507                 printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
1508                     ut->refcnt);
1509                 break;
1510         case UTRACE_DLCLOSE_START:
1511                 printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
1512                     ut->refcnt);
1513                 break;
1514         case UTRACE_DLCLOSE_STOP:
1515                 printf("dlclose(%p) finished\n", ut->handle);
1516                 break;
1517         case UTRACE_LOAD_OBJECT:
1518                 printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
1519                     ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1520                     ut->name);
1521                 break;
1522         case UTRACE_UNLOAD_OBJECT:
1523                 printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
1524                     ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1525                     ut->name);
1526                 break;
1527         case UTRACE_ADD_RUNDEP:
1528                 parent = ut->mapbase;
1529                 printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
1530                     ut->handle, ut->name, ut->refcnt);
1531                 break;
1532         case UTRACE_PRELOAD_FINISHED:
1533                 printf("RTLD: LD_PRELOAD finished\n");
1534                 break;
1535         case UTRACE_INIT_CALL:
1536                 printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
1537                     ut->name);
1538                 break;
1539         case UTRACE_FINI_CALL:
1540                 printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
1541                     ut->name);
1542                 break;
1543         case UTRACE_DLSYM_START:
1544                 printf("RTLD: dlsym(%p, %s)\n", ut->handle, ut->name);
1545                 break;
1546         case UTRACE_DLSYM_STOP:
1547                 printf("RTLD: %p = dlsym(%p, %s)\n", ut->mapbase, ut->handle,
1548                     ut->name);
1549                 break;
1550         default:
1551                 cp = p;
1552                 cp += 4;
1553                 len -= 4;
1554                 printf("RTLD: %d ", len);
1555                 while (len--)
1556                         if (decimal)
1557                                 printf(" %d", *cp++);
1558                         else
1559                                 printf(" %02x", *cp++);
1560                 printf("\n");
1561         }
1562 }
1563
1564 struct utrace_malloc {
1565         void *p;
1566         size_t s;
1567         void *r;
1568 };
1569
1570 void
1571 ktruser_malloc(void *p)
1572 {
1573         struct utrace_malloc *ut = p;
1574
1575         if (ut->p == (void *)(intptr_t)(-1))
1576                 printf("malloc_init()\n");
1577         else if (ut->s == 0)
1578                 printf("free(%p)\n", ut->p);
1579         else if (ut->p == NULL)
1580                 printf("%p = malloc(%zu)\n", ut->r, ut->s);
1581         else
1582                 printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1583 }
1584
1585 void
1586 ktruser(int len, void *p)
1587 {
1588         unsigned char *cp;
1589
1590         if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
1591                 ktruser_rtld(len, p);
1592                 return;
1593         }
1594
1595         if (len == sizeof(struct utrace_malloc)) {
1596                 ktruser_malloc(p);
1597                 return;
1598         }
1599
1600         printf("%d ", len);
1601         cp = p;
1602         while (len--)
1603                 if (decimal)
1604                         printf(" %d", *cp++);
1605                 else
1606                         printf(" %02x", *cp++);
1607         printf("\n");
1608 }
1609
1610 void
1611 ktrcaprights(cap_rights_t *rightsp)
1612 {
1613
1614         printf("cap_rights_t ");
1615         capname(rightsp);
1616         printf("\n");
1617 }
1618
1619 void
1620 ktrsockaddr(struct sockaddr *sa)
1621 {
1622 /*
1623  TODO: Support additional address families
1624         #include <netnatm/natm.h>
1625         struct sockaddr_natm    *natm;
1626         #include <netsmb/netbios.h>
1627         struct sockaddr_nb      *nb;
1628 */
1629         char addr[64];
1630
1631         /*
1632          * note: ktrstruct() has already verified that sa points to a
1633          * buffer at least sizeof(struct sockaddr) bytes long and exactly
1634          * sa->sa_len bytes long.
1635          */
1636         printf("struct sockaddr { ");
1637         sockfamilyname(sa->sa_family);
1638         printf(", ");
1639
1640 #define check_sockaddr_len(n)                                   \
1641         if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {  \
1642                 printf("invalid");                              \
1643                 break;                                          \
1644         }
1645
1646         switch(sa->sa_family) {
1647         case AF_INET: {
1648                 struct sockaddr_in sa_in;
1649
1650                 memset(&sa_in, 0, sizeof(sa_in));
1651                 memcpy(&sa_in, sa, sa->sa_len);
1652                 check_sockaddr_len(in);
1653                 inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
1654                 printf("%s:%u", addr, ntohs(sa_in.sin_port));
1655                 break;
1656         }
1657 #ifdef NETATALK
1658         case AF_APPLETALK: {
1659                 struct sockaddr_at      sa_at;
1660                 struct netrange         *nr;
1661
1662                 memset(&sa_at, 0, sizeof(sa_at));
1663                 memcpy(&sa_at, sa, sa->sa_len);
1664                 check_sockaddr_len(at);
1665                 nr = &sa_at.sat_range.r_netrange;
1666                 printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
1667                         sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
1668                         ntohs(nr->nr_lastnet), nr->nr_phase);
1669                 break;
1670         }
1671 #endif
1672         case AF_INET6: {
1673                 struct sockaddr_in6 sa_in6;
1674
1675                 memset(&sa_in6, 0, sizeof(sa_in6));
1676                 memcpy(&sa_in6, sa, sa->sa_len);
1677                 check_sockaddr_len(in6);
1678                 getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1679                     addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
1680                 printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
1681                 break;
1682         }
1683 #ifdef IPX
1684         case AF_IPX: {
1685                 struct sockaddr_ipx sa_ipx;
1686
1687                 memset(&sa_ipx, 0, sizeof(sa_ipx));
1688                 memcpy(&sa_ipx, sa, sa->sa_len);
1689                 check_sockaddr_len(ipx);
1690                 /* XXX wish we had ipx_ntop */
1691                 printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
1692                 free(sa_ipx);
1693                 break;
1694         }
1695 #endif
1696         case AF_UNIX: {
1697                 struct sockaddr_un sa_un;
1698
1699                 memset(&sa_un, 0, sizeof(sa_un));
1700                 memcpy(&sa_un, sa, sa->sa_len);
1701                 printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
1702                 break;
1703         }
1704         default:
1705                 printf("unknown address family");
1706         }
1707         printf(" }\n");
1708 }
1709
1710 void
1711 ktrstat(struct stat *statp)
1712 {
1713         char mode[12], timestr[PATH_MAX + 4];
1714         struct passwd *pwd;
1715         struct group  *grp;
1716         struct tm *tm;
1717
1718         /*
1719          * note: ktrstruct() has already verified that statp points to a
1720          * buffer exactly sizeof(struct stat) bytes long.
1721          */
1722         printf("struct stat {");
1723         printf("dev=%ju, ino=%ju, ",
1724                 (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
1725         if (resolv == 0)
1726                 printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
1727         else {
1728                 strmode(statp->st_mode, mode);
1729                 printf("mode=%s, ", mode);
1730         }
1731         printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
1732         if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
1733                 printf("uid=%ju, ", (uintmax_t)statp->st_uid);
1734         else
1735                 printf("uid=\"%s\", ", pwd->pw_name);
1736         if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
1737                 printf("gid=%ju, ", (uintmax_t)statp->st_gid);
1738         else
1739                 printf("gid=\"%s\", ", grp->gr_name);
1740         printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
1741         printf("atime=");
1742         if (resolv == 0)
1743                 printf("%jd", (intmax_t)statp->st_atim.tv_sec);
1744         else {
1745                 tm = localtime(&statp->st_atim.tv_sec);
1746                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1747                 printf("\"%s\"", timestr);
1748         }
1749         if (statp->st_atim.tv_nsec != 0)
1750                 printf(".%09ld, ", statp->st_atim.tv_nsec);
1751         else
1752                 printf(", ");
1753         printf("stime=");
1754         if (resolv == 0)
1755                 printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
1756         else {
1757                 tm = localtime(&statp->st_mtim.tv_sec);
1758                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1759                 printf("\"%s\"", timestr);
1760         }
1761         if (statp->st_mtim.tv_nsec != 0)
1762                 printf(".%09ld, ", statp->st_mtim.tv_nsec);
1763         else
1764                 printf(", ");
1765         printf("ctime=");
1766         if (resolv == 0)
1767                 printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
1768         else {
1769                 tm = localtime(&statp->st_ctim.tv_sec);
1770                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1771                 printf("\"%s\"", timestr);
1772         }
1773         if (statp->st_ctim.tv_nsec != 0)
1774                 printf(".%09ld, ", statp->st_ctim.tv_nsec);
1775         else
1776                 printf(", ");
1777         printf("birthtime=");
1778         if (resolv == 0)
1779                 printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
1780         else {
1781                 tm = localtime(&statp->st_birthtim.tv_sec);
1782                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1783                 printf("\"%s\"", timestr);
1784         }
1785         if (statp->st_birthtim.tv_nsec != 0)
1786                 printf(".%09ld, ", statp->st_birthtim.tv_nsec);
1787         else
1788                 printf(", ");
1789         printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
1790                 (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
1791                 (intmax_t)statp->st_blocks, statp->st_flags);
1792         printf(" }\n");
1793 }
1794
1795 void
1796 ktrstruct(char *buf, size_t buflen)
1797 {
1798         char *name, *data;
1799         size_t namelen, datalen;
1800         int i;
1801         cap_rights_t rights;
1802         struct stat sb;
1803         struct sockaddr_storage ss;
1804
1805         for (name = buf, namelen = 0;
1806              namelen < buflen && name[namelen] != '\0';
1807              ++namelen)
1808                 /* nothing */;
1809         if (namelen == buflen)
1810                 goto invalid;
1811         if (name[namelen] != '\0')
1812                 goto invalid;
1813         data = buf + namelen + 1;
1814         datalen = buflen - namelen - 1;
1815         if (datalen == 0)
1816                 goto invalid;
1817         /* sanity check */
1818         for (i = 0; i < (int)namelen; ++i)
1819                 if (!isalpha(name[i]))
1820                         goto invalid;
1821         if (strcmp(name, "caprights") == 0) {
1822                 if (datalen != sizeof(cap_rights_t))
1823                         goto invalid;
1824                 memcpy(&rights, data, datalen);
1825                 ktrcaprights(&rights);
1826         } else if (strcmp(name, "stat") == 0) {
1827                 if (datalen != sizeof(struct stat))
1828                         goto invalid;
1829                 memcpy(&sb, data, datalen);
1830                 ktrstat(&sb);
1831         } else if (strcmp(name, "sockaddr") == 0) {
1832                 if (datalen > sizeof(ss))
1833                         goto invalid;
1834                 memcpy(&ss, data, datalen);
1835                 if (datalen != ss.ss_len)
1836                         goto invalid;
1837                 ktrsockaddr((struct sockaddr *)&ss);
1838         } else {
1839                 printf("unknown structure\n");
1840         }
1841         return;
1842 invalid:
1843         printf("invalid record\n");
1844 }
1845
1846 void
1847 ktrcapfail(struct ktr_cap_fail *ktr)
1848 {
1849         switch (ktr->cap_type) {
1850         case CAPFAIL_NOTCAPABLE:
1851                 /* operation on fd with insufficient capabilities */
1852                 printf("operation requires ");
1853                 capname(&ktr->cap_needed);
1854                 printf(", process holds ");
1855                 capname(&ktr->cap_held);
1856                 break;
1857         case CAPFAIL_INCREASE:
1858                 /* requested more capabilities than fd already has */
1859                 printf("attempt to increase capabilities from ");
1860                 capname(&ktr->cap_held);
1861                 printf(" to ");
1862                 capname(&ktr->cap_needed);
1863                 break;
1864         case CAPFAIL_SYSCALL:
1865                 /* called restricted syscall */
1866                 printf("disallowed system call");
1867                 break;
1868         case CAPFAIL_LOOKUP:
1869                 /* used ".." in strict-relative mode */
1870                 printf("restricted VFS lookup");
1871                 break;
1872         default:
1873                 printf("unknown capability failure: ");
1874                 capname(&ktr->cap_needed);
1875                 printf(" ");
1876                 capname(&ktr->cap_held);
1877                 break;
1878         }
1879         printf("\n");
1880 }
1881
1882 void
1883 ktrfault(struct ktr_fault *ktr)
1884 {
1885
1886         printf("0x%jx ", (uintmax_t)ktr->vaddr);
1887         vmprotname(ktr->type);
1888         printf("\n");
1889 }
1890
1891 void
1892 ktrfaultend(struct ktr_faultend *ktr)
1893 {
1894
1895         vmresultname(ktr->result);
1896         printf("\n");
1897 }
1898
1899 #if defined(__amd64__) || defined(__i386__)
1900
1901 #if defined(__amd64__)
1902 #define NLINUX_SYSCALLS(v)              ((v) & SV_ILP32 ?               \
1903             nitems(linux32_syscallnames) : nitems(linux_syscallnames))
1904 #define LINUX_SYSCALLNAMES(v, i)        ((v) & SV_ILP32 ?               \
1905             linux32_syscallnames[i] : linux_syscallnames[i])
1906 #else
1907 #define NLINUX_SYSCALLS(v)              (nitems(linux_syscallnames))
1908 #define LINUX_SYSCALLNAMES(v, i)        (linux_syscallnames[i])
1909 #endif
1910
1911 void
1912 linux_ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
1913 {
1914         int narg = ktr->ktr_narg;
1915         unsigned code = ktr->ktr_code;
1916         register_t *ip;
1917
1918         if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
1919                 printf("[%d]", ktr->ktr_code);
1920         else {
1921                 printf("%s", LINUX_SYSCALLNAMES(sv_flags, ktr->ktr_code));
1922                 if (syscallno)
1923                         printf("[%d]", ktr->ktr_code);
1924         }
1925         ip = &ktr->ktr_args[0];
1926         if (narg) {
1927                 char c = '(';
1928                 while (narg > 0)
1929                         print_number(ip, narg, c);
1930                 putchar(')');
1931         }
1932         putchar('\n');
1933 }
1934
1935 void
1936 linux_ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
1937 {
1938         register_t ret = ktr->ktr_retval;
1939         unsigned code = ktr->ktr_code;
1940         int error = ktr->ktr_error;
1941
1942         if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
1943                 printf("[%d] ", ktr->ktr_code);
1944         else {
1945                 printf("%s ", LINUX_SYSCALLNAMES(sv_flags, code));
1946                 if (syscallno)
1947                         printf("[%d]", code);
1948                 printf(" ");
1949         }
1950
1951         if (error == 0) {
1952                 if (fancy) {
1953                         printf("%ld", (long)ret);
1954                         if (ret < 0 || ret > 9)
1955                                 printf("/%#lx", (unsigned long)ret);
1956                 } else {
1957                         if (decimal)
1958                                 printf("%ld", (long)ret);
1959                         else
1960                                 printf("%#lx", (unsigned long)ret);
1961                 }
1962         } else if (error == ERESTART)
1963                 printf("RESTART");
1964         else if (error == EJUSTRETURN)
1965                 printf("JUSTRETURN");
1966         else {
1967                 if (ktr->ktr_error <= ELAST + 1)
1968                         error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1969                 else
1970                         error = 999;
1971                 printf("-1 errno %d", error);
1972                 if (fancy)
1973                         printf(" %s", strerror(ktr->ktr_error));
1974         }
1975         putchar('\n');
1976 }
1977 #endif
1978
1979 void
1980 usage(void)
1981 {
1982         fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
1983             "[-m maxdata] [-p pid] [-t trstr]\n");
1984         exit(1);
1985 }