summaryrefslogtreecommitdiff
path: root/usr.sbin/lsdev/lsdev.c
diff options
context:
space:
mode:
authorGarrett Wollman <wollman@FreeBSD.org>1994-10-17 23:26:10 +0000
committerGarrett Wollman <wollman@FreeBSD.org>1994-10-17 23:26:10 +0000
commit0ed1ac8d353d53223258be7911e55c812ca8662f (patch)
tree086d4c0ed874ac0defca7fa51d123efe4b9d5225 /usr.sbin/lsdev/lsdev.c
parente33700d2b0e83d8ce1836ffcc82b65b7bc4ae5aa (diff)
Notes
Diffstat (limited to 'usr.sbin/lsdev/lsdev.c')
-rw-r--r--usr.sbin/lsdev/lsdev.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/usr.sbin/lsdev/lsdev.c b/usr.sbin/lsdev/lsdev.c
new file mode 100644
index 000000000000..168d76fff6b3
--- /dev/null
+++ b/usr.sbin/lsdev/lsdev.c
@@ -0,0 +1,155 @@
+#include "lsdev.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <err.h>
+#include <ctype.h>
+#include <string.h>
+
+const char *const devtypes[] = DEVTYPENAMES;
+int vflag = 0;
+const char *whoami;
+
+static void usage(void);
+static void badtype(const char *);
+static void badname(const char *);
+
+int
+main(int argc, char **argv)
+{
+ struct devconf *dc = 0;
+ size_t size, osize;
+ int ndevs, i;
+ int mib[8];
+ int c;
+ int showonlytype = -1;
+ int showonlydev = 0;
+ char showonlydevclass[MAXDEVNAME];
+ int showonlydevunit = -1;
+
+ whoami = argv[0];
+
+ while((c = getopt(argc, argv, "t:v")) != EOF) {
+ switch(c) {
+ case 't':
+ showonlytype = findtype(optarg);
+ if(showonlytype < 0)
+ badtype(optarg);
+ break;
+ case 'v':
+ vflag++;
+ break;
+ default:
+ usage();
+ break;
+ }
+ }
+
+ if(argc - optind > 1) {
+ usage();
+ }
+
+ if(argv[optind]) {
+ char *s = &argv[optind][strlen(argv[optind])];
+
+ if(s - argv[optind] > MAXDEVNAME)
+ badname(argv[optind]);
+ s--; /* step over null */
+ while(s > argv[optind] && isdigit(*s))
+ s--;
+ s++;
+ if(*s) {
+ showonlydevunit = atoi(s);
+ *s = '\0';
+ } else {
+ showonlydevunit = -1;
+ }
+
+ strcpy(showonlydevclass, argv[optind]);
+ showonlydev = 1;
+ }
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_DEVCONF;
+ mib[2] = DEVCONF_NUMBER;
+
+ size = sizeof ndevs;
+ if(sysctl(mib, 3, &ndevs, &size, 0, 0) < 0) {
+ err(1, "sysctl(hw.devconf.number)");
+ }
+ osize = 0;
+
+ for(i = 1; i <= ndevs; i++) {
+ mib[2] = i;
+ if(sysctl(mib, 3, 0, &size, 0, 0) < 0) {
+ /*
+ * Probably a deleted device; just go on to the next
+ * one.
+ */
+ continue;
+ }
+ if(size > osize) {
+ dc = realloc(dc, size);
+ if(!dc) {
+ err(2, "realloc(%lu)", (unsigned long)size);
+ }
+ }
+ if(sysctl(mib, 3, dc, &size, 0, 0) < 0) {
+ err(1, "sysctl(hw.devconf.%d)", i);
+ }
+ if(!showonlydev && showonlytype < 0) {
+ print(dc);
+ } else if(showonlydev) {
+ if(!strcmp(showonlydevclass, dc->dc_name)
+ && (showonlydevunit < 0 ||
+ showonlydevunit == dc->dc_unit))
+ print(dc);
+ } else if(showonlytype == dc->dc_devtype) {
+ print(dc);
+ }
+ osize = size;
+ }
+ return 0;
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr,
+ "usage:\n"
+ "\t%s [-t type] [-v] [name]\n",
+ whoami);
+ exit(-1);
+}
+
+int
+findtype(const char *name)
+{
+ int i;
+ for(i = 0; devtypes[i]; i++) {
+ if(!strcmp(name, devtypes[i]))
+ return i;
+ }
+ return -1;
+}
+
+static void
+badtype(const char *name)
+{
+ int i;
+
+ fprintf(stderr,
+ "%s: invalid device type `%s'\n", whoami, name);
+ fprintf(stderr,
+ "%s: valid types are: ", whoami);
+ for(i = 0; devtypes[i]; i++) {
+ fprintf(stderr, "%s`%s'", i ? ", " : "", devtypes[i]);
+ }
+ fputs(".\n", stderr);
+ exit(-1);
+}
+
+static void
+badname(const char *name)
+{
+ errx(3, "invalid device name `%s'", name);
+}