? .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);