? .gdbinit ? kdump ? kdump-ioctl.c ? kdump.html1 ? siginfo.c Index: kdump.c =================================================================== RCS file: /cvsroot/src/usr.bin/kdump/kdump.c,v retrieving revision 1.132 diff -u -r1.132 kdump.c --- kdump.c 23 Jul 2019 01:54:51 -0000 1.132 +++ kdump.c 2 Apr 2020 01:25:43 -0000 @@ -58,6 +58,7 @@ #include #include +#include #include #include #include @@ -107,6 +108,9 @@ "PTRACE_SYSCALL", }; +static const char default_format[] = { "%n %e %x\n" }; + +static void fmtprint(const char *, unsigned long int); static int fread_tail(void *, size_t, size_t); static int dumpheader(struct ktr_header *); static int output_ts(const struct timespec *); @@ -132,25 +136,33 @@ int main(int argc, char **argv) { + unsigned long int u; unsigned int ktrlen, size; int ch; void *m; int trpoints = 0; int trset = 0; const char *emul_name = "netbsd"; + const char *format = default_format; int col; + int e; char *cp; setprogname(argv[0]); - if (strcmp(getprogname(), "ioctlname") == 0) { + if (strcmp(getprogname(), "ioctlprint") == 0) { int i; - while ((ch = getopt(argc, argv, "e:")) != -1) + while ((ch = getopt(argc, argv, "e:f:")) != -1) switch (ch) { case 'e': emul_name = optarg; break; + case 'f': + if (format != default_format) + errx(1, "Too many formats"); + format = optarg; + break; default: usage(); break; @@ -163,8 +175,10 @@ usage(); for (i = 0; i < argc; i++) { - ioctldecode(strtoul(argv[i], NULL, 0)); - (void)putchar('\n'); + u = strtou(argv[i], NULL, 0, 0, ULONG_MAX, &e); + if (e) + errc(1, e, "invalid argument: `%s'", argv[i]); + fmtprint(format, u); } return 0; } @@ -323,6 +337,60 @@ return (0); } +static void +fmtprint(const char *fmt, unsigned long int u) +{ + const char *name; + int c; + + while ((c = *fmt++) != '\0') { + switch (c) { + default: + putchar(c); + continue; + case '\\': + switch (c = *fmt) { + case '\0': + continue; + case 'n': + putchar('\n'); + break; + case 't': + putchar('\t'); + break; + } + break; + case '%': + switch (c = *fmt) { + case '\0': + continue; + case '%': + default: + putchar(c); + break; + case 'e': + ioctldecode(u); + break; + case 'n': + name = ioctlname(u); + printf("%s", name ? name : "(null)"); + break; + case 'x': + printf("%#lx", u); + break; + case 'o': + printf("%#lo", u); + break; + case 'd': case 'i': + printf("%ld", u); + break; + } + break; + } + ++fmt; + } +} + static int fread_tail(void *buf, size_t num, size_t size) { @@ -1235,12 +1303,12 @@ static void usage(void) { - if (strcmp(getprogname(), "ioctlname") == 0) { - (void)fprintf(stderr, "Usage: %s [-e emulation] ...\n", + if (strcmp(getprogname(), "ioctlprint") == 0) { + (void)fprintf(stderr, "Usage: %s [-f format] [-e emulation] ...\n", getprogname()); } else { (void)fprintf(stderr, "Usage: %s [-dElNnRT] [-e emulation] " - "[-f file] [-m maxdata] [-p pid]\n [-t trstr] " + "[-f file] [-m maxdata] [-p pid]\n [-t trstr] " "[-x | -X size] [file]\n", getprogname()); } exit(1);