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