version 1.13, 2001/07/18 17:17:39 |
version 1.14, 2001/08/18 22:06:44 |
|
|
usage() |
usage() |
{ |
{ |
|
|
fprintf(stderr, |
fprintf(stderr, "usage: modstat [-i moduleid] [-n modulename]\n"); |
"usage: modstat [-i moduleid] [-n modulename]\n"); |
|
exit(1); |
exit(1); |
} |
} |
|
|
|
|
int modnum; |
int modnum; |
char *modname; |
char *modname; |
{ |
{ |
|
char name[MAXLKMNAME]; |
struct lmc_stat sbuf; |
struct lmc_stat sbuf; |
char name[MAXLKMNAME] = ""; |
|
|
|
|
bzero(&name, sizeof name); |
bzero(&sbuf, sizeof sbuf); |
bzero(&sbuf, sizeof sbuf); |
sbuf.id = modnum; |
sbuf.id = modnum; |
sbuf.name = name; |
sbuf.name = name; |
|
|
if (modname != NULL) { |
if (modname != NULL) { |
if (strlen(modname) >= sizeof(name)) |
if (strlen(modname) >= sizeof(name)) |
return 4; |
return 4; |
strcpy(sbuf.name, modname); |
strlcpy(sbuf.name, modname, sizeof(name)); |
} |
} |
|
|
if (ioctl(devfd, LMSTAT, &sbuf) == -1) { |
if (ioctl(devfd, LMSTAT, &sbuf) == -1) { |
|
|
} |
} |
} |
} |
|
|
/* |
/* Decode this stat buffer... */ |
* Decode this stat buffer... |
|
*/ |
|
printf("%-7s %3d %3ld %08lx %04lx %8lx %3ld %s\n", |
printf("%-7s %3d %3ld %08lx %04lx %8lx %3ld %s\n", |
type_names[sbuf.type], |
type_names[sbuf.type], sbuf.id, sbuf.offset, |
sbuf.id, /* module id */ |
(long)sbuf.area, (long)sbuf.size, (long)sbuf.private, |
sbuf.offset, /* offset into modtype struct */ |
(long)sbuf.ver, sbuf.name); |
(long)sbuf.area, /* address module loaded at */ |
|
(long)sbuf.size, /* size in pages(K) */ |
|
(long)sbuf.private, /* kernel address of private area */ |
|
(long)sbuf.ver, /* Version; always 1 for now */ |
|
sbuf.name /* name from private area */ |
|
); |
|
|
|
/* |
|
* Done (success). |
|
*/ |
|
return 0; |
return 0; |
} |
} |
|
|
int devfd; |
int devfd; |
|
|
void |
|
cleanup() |
|
{ |
|
|
|
close(devfd); |
|
} |
|
|
|
int |
int |
main(argc, argv) |
main(argc, argv) |
int argc; |
int argc; |
char *argv[]; |
char *argv[]; |
{ |
{ |
int c; |
int c, modnum = -1; |
int modnum = -1; |
|
char *modname = NULL; |
char *modname = NULL; |
|
|
while ((c = getopt(argc, argv, "i:n:")) != -1) { |
while ((c = getopt(argc, argv, "i:n:")) != -1) { |
|
|
setegid(getgid()); |
setegid(getgid()); |
setgid(getgid()); |
setgid(getgid()); |
|
|
atexit(cleanup); |
|
|
|
printf("Type Id Off Loadaddr Size Info Rev Module Name\n"); |
printf("Type Id Off Loadaddr Size Info Rev Module Name\n"); |
|
|
/* |
|
* Oneshot? |
|
*/ |
|
if (modnum != -1 || modname != NULL) { |
if (modnum != -1 || modname != NULL) { |
if (dostat(devfd, modnum, modname)) |
if (dostat(devfd, modnum, modname)) |
exit(3); |
exit(3); |
exit(0); |
exit(0); |
} |
} |
|
|
/* |
/* Start at 0 and work up until we receive EINVAL. */ |
* Start at 0 and work up until "EINVAL". |
|
*/ |
|
for (modnum = 0; dostat(devfd, modnum, NULL) < 2; modnum++) |
for (modnum = 0; dostat(devfd, modnum, NULL) < 2; modnum++) |
; |
; |
|
|