Changeset View
Changeset View
Standalone View
Standalone View
sbin/kldstat/kldstat.c
Context not available. | |||||
#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 | else { | ||||
if (showdata) { | if (showdata) | ||||
printf("\t\t%3d %s (%d, %u, 0x%lx)\n", stat.id, stat.name, | printf("\t\t%3d %s (%d, %u, 0x%lx)\n", stat.id, | ||||
stat.data.intval, stat.data.uintval, stat.data.ulongval); | stat.name, stat.data.intval, stat.data.uintval, | ||||
} else { | stat.data.ulongval); | ||||
printf("\t\t%3d %s\n", stat.id, stat.name); | else | ||||
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 { | |||||
if (humanized) { | |||||
humanize_number(buf, sizeof(buf), stat.size, | |||||
"", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE); | |||||
printf("%2d %4d %*p %5s %s", | |||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, buf, | |||||
stat.name); | |||||
} else { | } else { | ||||
printf("%2d %4d %*p %8zx %s", | if (humanized) { | ||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, stat.size, | humanize_number(buf, sizeof(buf), stat.size, | ||||
stat.name); | "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE); | ||||
printf("%2d %4d %*p %5s %s", | |||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, | |||||
buf, stat.name); | |||||
} else { | |||||
printf("%2d %4d %*p %8zx %s", | |||||
stat.id, stat.refs, POINTER_WIDTH, stat.address, | |||||
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; modid = modfnext(modid)) | ||||
for (modid = kldfirstmod(fileid); modid > 0; | printmod(modid); | ||||
modid = modfnext(modid)) | } else | ||||
printmod(modid); | printf("\n"); | ||||
} else | |||||
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(); | |||||
break; | |||||
case 'm': | |||||
modname = optarg; | |||||
break; | |||||
case 'n': | |||||
filename = optarg; | |||||
break; | |||||
case 'q': | |||||
quiet = 1; | |||||
break; | |||||
case 'v': | |||||
verbose = 1; | |||||
break; | |||||
default: | |||||
usage(); | |||||
} | |||||
argc -= optind; | |||||
argv += optind; | |||||
if (argc != 0) | |||||
usage(); | usage(); | ||||
break; | |||||
case 'm': | |||||
modname = optarg; | |||||
break; | |||||
case 'n': | |||||
filename = optarg; | |||||
break; | |||||
case 'q': | |||||
quiet = 1; | |||||
break; | |||||
case 'v': | |||||
verbose = 1; | |||||
break; | |||||
default: | |||||
usage(); | |||||
} | |||||
argc -= optind; | |||||
argv += optind; | |||||
if (argc != 0) | if (modname != NULL) { | ||||
usage(); | int modid; | ||||
struct module_stat stat; | |||||
if (modname != NULL) { | if ((modid = modfind(modname)) < 0) { | ||||
int modid; | if (!quiet) | ||||
struct module_stat stat; | warn("can't find module %s", modname); | ||||
return 1; | |||||
} else if (quiet) { | |||||
return 0; | |||||
} | |||||
stat.version = sizeof(struct module_stat); | |||||
if (modstat(modid, &stat) < 0) | |||||
warn("can't stat module id %d", modid); | |||||
else { | |||||
if (showdata) { | |||||
printf("Id Refs Name data..(int, uint, ulong)\n"); | |||||
printf("%3d %4d %s (%d, %u, 0x%lx)\n", | |||||
stat.id, stat.refs, stat.name, | |||||
stat.data.intval, stat.data.uintval, | |||||
stat.data.ulongval); | |||||
} else { | |||||
printf("Id Refs Name\n"); | |||||
printf("%3d %4d %s\n", stat.id, stat.refs, | |||||
stat.name); | |||||
} | |||||
} | |||||
if ((modid = modfind(modname)) < 0) { | return 0; | ||||
if (!quiet) | |||||
warn("can't find module %s", modname); | |||||
return 1; | |||||
} else if (quiet) { | |||||
return 0; | |||||
} | } | ||||
stat.version = sizeof(struct module_stat); | if (filename != NULL) { | ||||
if (modstat(modid, &stat) < 0) | if ((fileid = kldfind(filename)) < 0) { | ||||
warn("can't stat module id %d", modid); | if (!quiet) | ||||
else { | warn("can't find file %s", filename); | ||||
if (showdata) { | return 1; | ||||
printf("Id Refs Name data..(int, uint, ulong)\n"); | } else if (quiet) { | ||||
printf("%3d %4d %s (%d, %u, 0x%lx)\n", stat.id, stat.refs, stat.name, | return 0; | ||||
stat.data.intval, stat.data.uintval, stat.data.ulongval); | |||||
} else { | |||||
printf("Id Refs Name\n"); | |||||
printf("%3d %4d %s\n", stat.id, stat.refs, stat.name); | |||||
} | } | ||||
} | } | ||||
if (humanized) | |||||
printf("Id Refs Address%*c %5s Name\n", POINTER_WIDTH - 7, | |||||
' ', "Size"); | |||||
else | |||||
printf("Id Refs Address%*c %8s Name\n", POINTER_WIDTH - 7, | |||||
' ', "Size"); | |||||
if (fileid != 0) | |||||
printfile(fileid, verbose, humanized); | |||||
else | |||||
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) | |||||
printfile(fileid, verbose, humanized); | |||||
return 0; | return 0; | ||||
} | |||||
if (filename != NULL) { | |||||
if ((fileid = kldfind(filename)) < 0) { | |||||
if (!quiet) | |||||
warn("can't find file %s", filename); | |||||
return 1; | |||||
} else if (quiet) { | |||||
return 0; | |||||
} | |||||
} | |||||
if (humanized) | |||||
printf("Id Refs Address%*c %5s Name\n", POINTER_WIDTH - 7, ' ', "Size"); | |||||
else | |||||
printf("Id Refs Address%*c %8s Name\n", POINTER_WIDTH - 7, ' ', "Size"); | |||||
if (fileid != 0) | |||||
printfile(fileid, verbose, humanized); | |||||
else | |||||
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) | |||||
printfile(fileid, verbose, humanized); | |||||
return 0; | |||||
} | } | ||||
Context not available. |