Changeset View
Changeset View
Standalone View
Standalone View
sbin/kldstat/kldstat.c
Show All 34 Lines | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/module.h> | #include <sys/module.h> | ||||
#include <sys/linker.h> | #include <sys/linker.h> | ||||
#include <strings.h> | #include <strings.h> | ||||
#define POINTER_WIDTH ((int)(sizeof(void *) * 2 + 2)) | #define POINTER_WIDTH ((int)(sizeof(void *) * 2 + 2)) | ||||
static int showdata = 0; | static int showdata = 0; | ||||
static void | static void | ||||
printmod(int modid) | printmod(int modid) | ||||
{ | { | ||||
struct module_stat stat; | struct module_stat stat; | ||||
bzero(&stat, sizeof(stat)); | bzero(&stat, sizeof(stat)); | ||||
stat.version = sizeof(struct module_stat); | stat.version = sizeof(struct module_stat); | ||||
if (modstat(modid, &stat) < 0) | if (modstat(modid, &stat) < 0) | ||||
warn("can't stat module id %d", modid); | warn("can't stat module id %d", modid); | ||||
else { | |||||
if (showdata) | |||||
printf("\t\t%3d %s (%d, %u, 0x%lx)\n", stat.id, | |||||
stat.name, stat.data.intval, stat.data.uintval, | |||||
stat.data.ulongval); | |||||
else | else | ||||
if (showdata) { | |||||
printf("\t\t%3d %s (%d, %u, 0x%lx)\n", stat.id, stat.name, | |||||
stat.data.intval, stat.data.uintval, stat.data.ulongval); | |||||
} else { | |||||
printf("\t\t%3d %s\n", stat.id, stat.name); | printf("\t\t%3d %s\n", stat.id, stat.name); | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
printfile(int fileid, int verbose, int humanized) | printfile(int fileid, int verbose, int humanized) | ||||
{ | { | ||||
struct kld_file_stat stat; | struct kld_file_stat stat; | ||||
int modid; | int modid; | ||||
char buf[5]; | char buf[5]; | ||||
stat.version = sizeof(struct kld_file_stat); | stat.version = sizeof(struct kld_file_stat); | ||||
if (kldstat(fileid, &stat) < 0) { | if (kldstat(fileid, &stat) < 0) { | ||||
err(1, "can't stat file id %d", fileid); | err(1, "can't stat file id %d", fileid); | ||||
} else { | } else { | ||||
if (humanized) { | if (humanized) { | ||||
humanize_number(buf, sizeof(buf), stat.size, | humanize_number(buf, sizeof(buf), stat.size, | ||||
"", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE); | "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE); | ||||
printf("%2d %4d %*p %5s %s", | printf("%2d %4d %*p %5s %s", | ||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, buf, | stat.id, stat.refs, POINTER_WIDTH, stat.address, | ||||
stat.name); | buf, stat.name); | ||||
} else { | } else { | ||||
printf("%2d %4d %*p %8zx %s", | printf("%2d %4d %*p %8zx %s", | ||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, stat.size, | stat.id, stat.refs, POINTER_WIDTH, stat.address, | ||||
stat.name); | stat.size, stat.name); | ||||
} | } | ||||
} | } | ||||
if (verbose) { | if (verbose) { | ||||
printf(" (%s)\n", stat.pathname); | printf(" (%s)\n", stat.pathname); | ||||
printf("\tContains modules:\n"); | printf("\tContains modules:\n"); | ||||
printf("\t\t Id Name\n"); | printf("\t\t Id Name\n"); | ||||
for (modid = kldfirstmod(fileid); modid > 0; | for (modid = kldfirstmod(fileid); modid > 0; modid = modfnext(modid)) | ||||
modid = modfnext(modid)) | |||||
printmod(modid); | printmod(modid); | ||||
} else | } else | ||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
static void | static void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
fprintf(stderr, "usage: kldstat [-d] [-h] [-q] [-v] [-i id] [-n filename]\n"); | fprintf(stderr, "usage: kldstat [-d] [-h] [-q] [-v] [-i id] [-n filename]\n"); | ||||
fprintf(stderr, " kldstat [-d] [-q] [-m modname]\n"); | fprintf(stderr, " kldstat [-d] [-q] [-m modname]\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
int | int | ||||
main(int argc, char** argv) | main(int argc, char** argv) | ||||
{ | { | ||||
int c; | int c; | ||||
int humanized = 0; | int humanized = 0; | ||||
int verbose = 0; | int verbose = 0; | ||||
int fileid = 0; | int fileid = 0; | ||||
int quiet = 0; | int quiet = 0; | ||||
char* filename = NULL; | char* filename = NULL; | ||||
char* modname = NULL; | char* modname = NULL; | ||||
char* p; | char* p; | ||||
while ((c = getopt(argc, argv, "dhi:m:n:qv")) != -1) | while ((c = getopt(argc, argv, "dhi:m:n:qv")) != -1) | ||||
switch (c) { | switch (c) { | ||||
case 'd': | case 'd': | ||||
showdata = 1; | showdata = 1; | ||||
break; | break; | ||||
case 'h': | case 'h': | ||||
humanized = 1; | humanized = 1; | ||||
break; | break; | ||||
case 'i': | case 'i': | ||||
fileid = (int)strtoul(optarg, &p, 10); | fileid = (int)strtoul(optarg, &p, 10); | ||||
if (*p != '\0') | if (*p != '\0') | ||||
usage(); | usage(); | ||||
break; | break; | ||||
case 'm': | case 'm': | ||||
modname = optarg; | modname = optarg; | ||||
break; | break; | ||||
case 'n': | case 'n': | ||||
filename = optarg; | filename = optarg; | ||||
break; | break; | ||||
case 'q': | case 'q': | ||||
quiet = 1; | quiet = 1; | ||||
break; | break; | ||||
case 'v': | case 'v': | ||||
verbose = 1; | verbose = 1; | ||||
break; | break; | ||||
default: | default: | ||||
usage(); | usage(); | ||||
} | } | ||||
argc -= optind; | argc -= optind; | ||||
argv += optind; | argv += optind; | ||||
if (argc != 0) | if (argc != 0) | ||||
usage(); | usage(); | ||||
if (modname != NULL) { | if (modname != NULL) { | ||||
int modid; | int modid; | ||||
struct module_stat stat; | struct module_stat stat; | ||||
if ((modid = modfind(modname)) < 0) { | if ((modid = modfind(modname)) < 0) { | ||||
if (!quiet) | if (!quiet) | ||||
warn("can't find module %s", modname); | warn("can't find module %s", modname); | ||||
return 1; | return 1; | ||||
} else if (quiet) { | } else if (quiet) { | ||||
return 0; | return 0; | ||||
} | } | ||||
stat.version = sizeof(struct module_stat); | stat.version = sizeof(struct module_stat); | ||||
if (modstat(modid, &stat) < 0) | if (modstat(modid, &stat) < 0) | ||||
warn("can't stat module id %d", modid); | warn("can't stat module id %d", modid); | ||||
else { | else { | ||||
if (showdata) { | if (showdata) { | ||||
printf("Id Refs Name data..(int, uint, ulong)\n"); | printf("Id Refs Name data..(int, uint, ulong)\n"); | ||||
printf("%3d %4d %s (%d, %u, 0x%lx)\n", stat.id, stat.refs, stat.name, | printf("%3d %4d %s (%d, %u, 0x%lx)\n", | ||||
stat.data.intval, stat.data.uintval, stat.data.ulongval); | stat.id, stat.refs, stat.name, | ||||
stat.data.intval, stat.data.uintval, | |||||
stat.data.ulongval); | |||||
} else { | } else { | ||||
printf("Id Refs Name\n"); | printf("Id Refs Name\n"); | ||||
printf("%3d %4d %s\n", stat.id, stat.refs, stat.name); | printf("%3d %4d %s\n", stat.id, stat.refs, | ||||
stat.name); | |||||
} | } | ||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
if (filename != NULL) { | if (filename != NULL) { | ||||
if ((fileid = kldfind(filename)) < 0) { | if ((fileid = kldfind(filename)) < 0) { | ||||
if (!quiet) | if (!quiet) | ||||
warn("can't find file %s", filename); | warn("can't find file %s", filename); | ||||
return 1; | return 1; | ||||
} else if (quiet) { | } else if (quiet) { | ||||
return 0; | return 0; | ||||
} | } | ||||
} | } | ||||
if (humanized) | if (humanized) | ||||
printf("Id Refs Address%*c %5s Name\n", POINTER_WIDTH - 7, ' ', "Size"); | printf("Id Refs Address%*c %5s Name\n", POINTER_WIDTH - 7, | ||||
' ', "Size"); | |||||
else | else | ||||
printf("Id Refs Address%*c %8s Name\n", POINTER_WIDTH - 7, ' ', "Size"); | printf("Id Refs Address%*c %8s Name\n", POINTER_WIDTH - 7, | ||||
' ', "Size"); | |||||
if (fileid != 0) | if (fileid != 0) | ||||
printfile(fileid, verbose, humanized); | printfile(fileid, verbose, humanized); | ||||
else | else | ||||
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) | for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) | ||||
printfile(fileid, verbose, humanized); | printfile(fileid, verbose, humanized); | ||||
return 0; | return 0; | ||||
} | } |