summaryrefslogtreecommitdiff
path: root/usr/src/cmd/devprop/devprop.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/devprop/devprop.c')
-rw-r--r--usr/src/cmd/devprop/devprop.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/usr/src/cmd/devprop/devprop.c b/usr/src/cmd/devprop/devprop.c
new file mode 100644
index 0000000000..69306353a7
--- /dev/null
+++ b/usr/src/cmd/devprop/devprop.c
@@ -0,0 +1,158 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <strings.h>
+#include <libdevinfo.h>
+
+static void
+usage(void)
+{
+ (void) fprintf(stderr,
+ "Usage: devprop [-n device-path] "
+ "[-vq] [-{b|i|l|s}] [property [...]]\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ boolean_t verbose = B_FALSE, quote = B_FALSE,
+ error = B_FALSE;
+ int type = DI_PROP_TYPE_UNKNOWN;
+ char *path = "/";
+ di_node_t dn;
+ uchar_t *val_b;
+ int *val_i;
+ int64_t *val_l;
+ char *val_s;
+ int n;
+
+ extern char *optarg;
+ extern int optind;
+
+#define BOOL(ch, var) \
+case ch: \
+ var = B_TRUE; \
+ break
+
+#define PER_OPT(ch, typ) \
+case ch: \
+ if (type != DI_PROP_TYPE_UNKNOWN) { \
+ usage(); \
+ return (1); \
+ } \
+ type = (typ); \
+ break
+
+ while ((c = getopt(argc, argv, ":n:vqbils")) != -1) {
+ switch (c) {
+ case 'n':
+ path = optarg;
+ break;
+ case ':':
+ usage();
+ return (1);
+
+ BOOL('v', verbose);
+ BOOL('q', quote);
+ BOOL('?', error);
+
+ PER_OPT('b', DI_PROP_TYPE_BYTE);
+ PER_OPT('i', DI_PROP_TYPE_INT);
+ PER_OPT('l', DI_PROP_TYPE_INT64);
+ PER_OPT('s', DI_PROP_TYPE_STRING);
+ }
+ }
+
+#undef BOOL
+#undef PER_OPT
+
+ if (error) {
+ usage();
+ return (1);
+ }
+
+ /* default to strings */
+ if (type == DI_PROP_TYPE_UNKNOWN)
+ type = DI_PROP_TYPE_STRING;
+
+ /*
+ * It's convenient to use the filesystem as a source of device
+ * node paths. In that case, the path will be prefixed with
+ * "/devices", which we strip off here as di_init() expects
+ * just the path to the node.
+ */
+ if (strncmp("/devices/", path, strlen("/devices/")) == 0)
+ path += strlen("/devices");
+
+ if ((dn = di_init(path, DINFOPROP)) == DI_NODE_NIL) {
+ perror("di_init");
+ return (1);
+ }
+
+ /* Careful with that axe, Eugene... */
+#define PER_TYPE(typ, func, val, incr, form, pv, sep) \
+case (typ): \
+ n = func(DDI_DEV_T_ANY, \
+ dn, argv[optind], &(val)); \
+ while (n > 0) { \
+ (void) printf((form), pv); \
+ incr; \
+ n--; \
+ if (n > 0) \
+ (void) printf(sep); \
+ } \
+ (void) printf("\n"); \
+ break
+
+ while (optind < argc) {
+ if (verbose)
+ (void) printf("%s=", argv[optind]);
+
+ switch (type) {
+ PER_TYPE(DI_PROP_TYPE_BYTE, di_prop_lookup_bytes,
+ val_b, val_b++, "%2.2x", *val_b, ".");
+ PER_TYPE(DI_PROP_TYPE_INT, di_prop_lookup_ints,
+ val_i, val_i++, "%8.8x", *val_i, ".");
+ PER_TYPE(DI_PROP_TYPE_INT64, di_prop_lookup_int64,
+ val_l, val_l++, "%16.16llx", *val_l, ".");
+ PER_TYPE(DI_PROP_TYPE_STRING, di_prop_lookup_strings,
+ val_s, val_s += strlen(val_s) + 1,
+ (quote ? "\"%s\"" : "%s"), val_s, " + ");
+ }
+
+ optind++;
+ }
+
+#undef PER_TYPE
+
+ di_fini(dn);
+
+ return (0);
+}