summaryrefslogtreecommitdiff
path: root/usr/src/lib/fm/libdiskstatus/common/ds_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/fm/libdiskstatus/common/ds_util.c')
-rw-r--r--usr/src/lib/fm/libdiskstatus/common/ds_util.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/usr/src/lib/fm/libdiskstatus/common/ds_util.c b/usr/src/lib/fm/libdiskstatus/common/ds_util.c
new file mode 100644
index 0000000000..fe59b12801
--- /dev/null
+++ b/usr/src/lib/fm/libdiskstatus/common/ds_util.c
@@ -0,0 +1,172 @@
+/*
+ * 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 <ctype.h>
+#include <libdiskstatus.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ds_impl.h"
+
+boolean_t ds_debug;
+
+/*PRINTFLIKE1*/
+void
+dprintf(const char *fmt, ...)
+{
+ va_list ap;
+
+ if (!ds_debug)
+ return;
+
+ va_start(ap, fmt);
+ (void) vprintf(fmt, ap);
+ va_end(ap);
+}
+
+void
+ddump(const char *label, const void *data, size_t length)
+{
+ int byte_count;
+ int i;
+#define LINEBUFLEN 128
+ char linebuf[LINEBUFLEN];
+ char *linep;
+ int bufleft, len;
+ const char *start = data;
+
+ if (!ds_debug)
+ return;
+
+ if (label != NULL)
+ dprintf("%s\n", label);
+
+ linep = linebuf;
+ bufleft = LINEBUFLEN;
+
+ for (byte_count = 0; byte_count < length; byte_count += i) {
+
+ (void) snprintf(linep, bufleft, "0x%08x ", byte_count);
+ len = strlen(linep);
+ bufleft -= len;
+ linep += len;
+
+ /*
+ * Inner loop processes 16 bytes at a time, or less
+ * if we have less than 16 bytes to go
+ */
+ for (i = 0; (i < 16) && ((byte_count + i) < length); i++) {
+ (void) snprintf(linep, bufleft, "%02X", (unsigned int)
+ (unsigned char) start[byte_count + i]);
+
+ len = strlen(linep);
+ bufleft -= len;
+ linep += len;
+
+ if (bufleft >= 2) {
+ if (i == 7)
+ *linep = '-';
+ else
+ *linep = ' ';
+
+ --bufleft;
+ ++linep;
+ }
+ }
+
+ /*
+ * If i is less than 16, then we had less than 16 bytes
+ * written to the output. We need to fixup the alignment
+ * to allow the "text" output to be aligned
+ */
+ if (i < 16) {
+ int numspaces = (16 - i) * 3;
+ while (numspaces-- > 0) {
+ if (bufleft >= 2) {
+ *linep = ' ';
+ --bufleft;
+ linep++;
+ }
+ }
+ }
+
+ if (bufleft >= 2) {
+ *linep = ' ';
+ --bufleft;
+ ++linep;
+ }
+
+ for (i = 0; (i < 16) && ((byte_count + i) < length); i++) {
+ int subscript = byte_count + i;
+ char ch = (isprint(start[subscript]) ?
+ start[subscript] : '.');
+
+ if (bufleft >= 2) {
+ *linep = ch;
+ --bufleft;
+ ++linep;
+ }
+ }
+
+ linebuf[LINEBUFLEN - bufleft] = 0;
+
+ dprintf("%s\n", linebuf);
+
+ linep = linebuf;
+ bufleft = LINEBUFLEN;
+ }
+
+}
+
+const char *
+disk_status_errmsg(int error)
+{
+ switch (error) {
+ case EDS_NOMEM:
+ return ("memory allocation failure");
+ case EDS_CANT_OPEN:
+ return ("failed to open device");
+ case EDS_NO_TRANSPORT:
+ return ("no supported communication protocol");
+ case EDS_NOT_SUPPORTED:
+ return ("disk status information not supported");
+ case EDS_NOT_SIMULATOR:
+ return ("not a valid simulator file");
+ case EDS_IO:
+ return ("I/O error from device");
+ default:
+ return ("unknown error");
+ }
+}
+
+int
+ds_set_errno(disk_status_t *dsp, int error)
+{
+ dsp->ds_error = error;
+ return (-1);
+}