DF-3439 / kfdump.c
/* * kfdump.c - dump ipfw3 filter_funcs row 0 via libkvm (/dev/kmem) * usage: kfdump [row] */ #include <sys/param.h> #include <sys/types.h> #include <fcntl.h> #include <kvm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_MODULE 10 #define MAX_OPCODE_PER_MODULE 100 int main(int argc, char **argv) { kvm_t *kd; struct nlist nl[8]; unsigned long (*fa)[MAX_OPCODE_PER_MODULE]; long addr; int row = (argc > 1) ? atoi(argv[1]) : 0; int i; static unsigned long buf[MAX_MODULE * MAX_OPCODE_PER_MODULE]; memset(nl, 0, sizeof(nl)); nl[0].n_name = "filter_funcs"; nl[1].n_name = "check_proto"; nl[2].n_name = "check_deny"; nl[3].n_name = "check_accept"; nl[4].n_name = "check_skipto"; kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); if (kd == NULL) { fprintf(stderr, "kvm_openfiles: %s\n", kvm_geterr(kd)); return 1; } if (kvm_nlist(kd, nl) < 0 || nl[0].n_value == 0) { fprintf(stderr, "nlist: %s\n", kvm_geterr(kd)); return 1; } printf("filter_funcs @ 0x%lx\n", (unsigned long)nl[0].n_value); for (i = 1; i <= 4; i++) if (nl[i].n_value) printf("%-14s @ 0x%lx\n", nl[i].n_name, (unsigned long)nl[i].n_value); addr = nl[0].n_value; if (kvm_read(kd, addr, buf, sizeof(buf)) != sizeof(buf)) { fprintf(stderr, "kvm_read: %s\n", kvm_geterr(kd)); return 1; } fa = (unsigned long (*)[MAX_OPCODE_PER_MODULE])buf; printf("row %d:\n", row); for (i = 0; i < MAX_OPCODE_PER_MODULE; i++) { if (fa[row][i] == 0) continue; printf(" [%d] = 0x%lx\n", i, (unsigned long)fa[row][i]); } return 0; } |