Annotation of src/usr.bin/modstat/modstat.c, Revision 1.20
1.20 ! deraadt 1: /* $OpenBSD: modstat.c,v 1.19 2002/12/12 00:00:16 deraadt Exp $ */
1.6 deraadt 2:
1.1 deraadt 3: /*
4: * Copyright (c) 1993 Terrence R. Lambert.
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by Terrence R. Lambert.
18: * 4. The name Terrence R. Lambert may not be used to endorse or promote
19: * products derived from this software without specific prior written
20: * permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``AS IS'' AND ANY
23: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: *
34: */
35:
36: #include <sys/param.h>
37: #include <sys/ioctl.h>
38: #include <sys/conf.h>
39: #include <sys/mount.h>
40: #include <sys/lkm.h>
1.20 ! deraadt 41:
! 42: #include <a.out.h>
! 43: #include <err.h>
! 44: #include <errno.h>
! 45: #include <fcntl.h>
1.9 deraadt 46: #include <stdio.h>
47: #include <stdlib.h>
1.20 ! deraadt 48: #include <string.h>
1.9 deraadt 49: #include <unistd.h>
1.20 ! deraadt 50:
1.1 deraadt 51: #include "pathnames.h"
52:
1.15 ericj 53: #define POINTERSIZE ((int)(2 * sizeof(void*)))
1.1 deraadt 54:
55: static char *type_names[] = {
56: "SYSCALL",
57: "VFS",
58: "DEV",
59: "EXEC",
60: "MISC"
61: };
62:
1.15 ericj 63: static void
1.20 ! deraadt 64: usage(void)
1.15 ericj 65: {
66: extern char *__progname;
67:
68: (void)fprintf(stderr, "usage: %s [-i id] [-n name]\n", __progname);
69: exit(1);
70: }
71:
72: static int
73: dostat(int devfd, int modnum, char *modname)
1.1 deraadt 74: {
1.14 deraadt 75: char name[MAXLKMNAME];
1.1 deraadt 76: struct lmc_stat sbuf;
1.2 mickey 77:
1.14 deraadt 78: bzero(&name, sizeof name);
1.8 deraadt 79: bzero(&sbuf, sizeof sbuf);
1.2 mickey 80: sbuf.id = modnum;
81: sbuf.name = name;
1.1 deraadt 82:
1.6 deraadt 83: if (modname != NULL) {
1.10 provos 84: if (strlen(modname) >= sizeof(name))
1.6 deraadt 85: return 4;
1.14 deraadt 86: strlcpy(sbuf.name, modname, sizeof(name));
1.6 deraadt 87: }
1.1 deraadt 88:
89: if (ioctl(devfd, LMSTAT, &sbuf) == -1) {
90: switch (errno) {
91: case EINVAL: /* out of range */
92: return 2;
93: case ENOENT: /* no such entry */
94: return 1;
95: default: /* other error (EFAULT, etc) */
96: warn("LMSTAT");
97: return 4;
98: }
99: }
100:
1.14 deraadt 101: /* Decode this stat buffer... */
1.16 ericj 102: printf("%-7s %3d %3ld %0*lx %04lx %0*lx %3ld %s\n",
1.15 ericj 103: type_names[sbuf.type], sbuf.id, sbuf.offset, POINTERSIZE,
104: (long)sbuf.area, (long)sbuf.size, POINTERSIZE,
105: (long)sbuf.private, (long)sbuf.ver, sbuf.name);
1.1 deraadt 106:
107: return 0;
108: }
109:
110: int
111: main(argc, argv)
112: int argc;
113: char *argv[];
114: {
1.14 deraadt 115: int c, modnum = -1;
1.1 deraadt 116: char *modname = NULL;
1.16 ericj 117: char *endptr;
1.18 ericj 118: int devfd;
1.1 deraadt 119:
1.7 millert 120: while ((c = getopt(argc, argv, "i:n:")) != -1) {
1.1 deraadt 121: switch (c) {
122: case 'i':
1.16 ericj 123: modnum = (int)strtol(optarg, &endptr, 0);
124: if (modnum < 0 || modnum > INT_MAX || *endptr != '\0')
125: errx(1, "%s: not a valid number", optarg);
126: break;
1.1 deraadt 127: case 'n':
128: modname = optarg;
1.16 ericj 129: break;
1.6 deraadt 130: default:
1.1 deraadt 131: usage();
132: break;
133: }
134: }
135: argc -= optind;
136: argv += optind;
137:
138: if (argc != 0)
139: usage();
140:
141: /*
142: * Open the virtual device device driver for exclusive use (needed
143: * to ioctl() to retrive the loaded module(s) status).
144: */
1.12 millert 145: if ((devfd = open(_PATH_LKM, O_RDONLY)) == -1)
1.20 ! deraadt 146: err(2, "%s", _PATH_LKM);
1.11 deraadt 147:
148: setegid(getgid());
149: setgid(getgid());
1.1 deraadt 150:
1.15 ericj 151: printf("Type Id Off %-*s Size %-*s Rev Module Name\n",
1.19 deraadt 152: POINTERSIZE, "Loadaddr", POINTERSIZE, "Info");
1.1 deraadt 153:
154: if (modnum != -1 || modname != NULL) {
155: if (dostat(devfd, modnum, modname))
156: exit(3);
157: exit(0);
158: }
159:
1.14 deraadt 160: /* Start at 0 and work up until we receive EINVAL. */
1.19 deraadt 161: for (modnum = 0; dostat(devfd, modnum, NULL) < 2; modnum++)
162: ;
1.1 deraadt 163:
164: exit(0);
165: }