xref: /onnv-gate/usr/src/lib/fm/libdiskstatus/common/ds_util.c (revision 4198:6bdfb19526db)
1*4198Seschrock /*
2*4198Seschrock  * CDDL HEADER START
3*4198Seschrock  *
4*4198Seschrock  * The contents of this file are subject to the terms of the
5*4198Seschrock  * Common Development and Distribution License (the "License").
6*4198Seschrock  * You may not use this file except in compliance with the License.
7*4198Seschrock  *
8*4198Seschrock  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*4198Seschrock  * or http://www.opensolaris.org/os/licensing.
10*4198Seschrock  * See the License for the specific language governing permissions
11*4198Seschrock  * and limitations under the License.
12*4198Seschrock  *
13*4198Seschrock  * When distributing Covered Code, include this CDDL HEADER in each
14*4198Seschrock  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*4198Seschrock  * If applicable, add the following below this CDDL HEADER, with the
16*4198Seschrock  * fields enclosed by brackets "[]" replaced with your own identifying
17*4198Seschrock  * information: Portions Copyright [yyyy] [name of copyright owner]
18*4198Seschrock  *
19*4198Seschrock  * CDDL HEADER END
20*4198Seschrock  */
21*4198Seschrock /*
22*4198Seschrock  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*4198Seschrock  * Use is subject to license terms.
24*4198Seschrock  */
25*4198Seschrock 
26*4198Seschrock #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*4198Seschrock 
28*4198Seschrock #include <ctype.h>
29*4198Seschrock #include <libdiskstatus.h>
30*4198Seschrock #include <stdarg.h>
31*4198Seschrock #include <stdlib.h>
32*4198Seschrock #include <string.h>
33*4198Seschrock 
34*4198Seschrock #include "ds_impl.h"
35*4198Seschrock 
36*4198Seschrock boolean_t ds_debug;
37*4198Seschrock 
38*4198Seschrock /*PRINTFLIKE1*/
39*4198Seschrock void
dprintf(const char * fmt,...)40*4198Seschrock dprintf(const char *fmt, ...)
41*4198Seschrock {
42*4198Seschrock 	va_list ap;
43*4198Seschrock 
44*4198Seschrock 	if (!ds_debug)
45*4198Seschrock 		return;
46*4198Seschrock 
47*4198Seschrock 	va_start(ap, fmt);
48*4198Seschrock 	(void) vprintf(fmt, ap);
49*4198Seschrock 	va_end(ap);
50*4198Seschrock }
51*4198Seschrock 
52*4198Seschrock void
ddump(const char * label,const void * data,size_t length)53*4198Seschrock ddump(const char *label, const void *data, size_t length)
54*4198Seschrock {
55*4198Seschrock 	int byte_count;
56*4198Seschrock 	int i;
57*4198Seschrock #define	LINEBUFLEN 128
58*4198Seschrock 	char linebuf[LINEBUFLEN];
59*4198Seschrock 	char *linep;
60*4198Seschrock 	int bufleft, len;
61*4198Seschrock 	const char *start = data;
62*4198Seschrock 
63*4198Seschrock 	if (!ds_debug)
64*4198Seschrock 		return;
65*4198Seschrock 
66*4198Seschrock 	if (label != NULL)
67*4198Seschrock 		dprintf("%s\n", label);
68*4198Seschrock 
69*4198Seschrock 	linep = linebuf;
70*4198Seschrock 	bufleft = LINEBUFLEN;
71*4198Seschrock 
72*4198Seschrock 	for (byte_count = 0; byte_count < length; byte_count += i) {
73*4198Seschrock 
74*4198Seschrock 		(void) snprintf(linep, bufleft, "0x%08x ", byte_count);
75*4198Seschrock 		len = strlen(linep);
76*4198Seschrock 		bufleft -= len;
77*4198Seschrock 		linep += len;
78*4198Seschrock 
79*4198Seschrock 		/*
80*4198Seschrock 		 * Inner loop processes 16 bytes at a time, or less
81*4198Seschrock 		 * if we have less than 16 bytes to go
82*4198Seschrock 		 */
83*4198Seschrock 		for (i = 0; (i < 16) && ((byte_count + i) < length); i++) {
84*4198Seschrock 			(void) snprintf(linep, bufleft, "%02X", (unsigned int)
85*4198Seschrock 			    (unsigned char) start[byte_count + i]);
86*4198Seschrock 
87*4198Seschrock 			len = strlen(linep);
88*4198Seschrock 			bufleft -= len;
89*4198Seschrock 			linep += len;
90*4198Seschrock 
91*4198Seschrock 			if (bufleft >= 2) {
92*4198Seschrock 				if (i == 7)
93*4198Seschrock 					*linep = '-';
94*4198Seschrock 				else
95*4198Seschrock 					*linep = ' ';
96*4198Seschrock 
97*4198Seschrock 				--bufleft;
98*4198Seschrock 				++linep;
99*4198Seschrock 			}
100*4198Seschrock 		}
101*4198Seschrock 
102*4198Seschrock 		/*
103*4198Seschrock 		 * If i is less than 16, then we had less than 16 bytes
104*4198Seschrock 		 * written to the output.  We need to fixup the alignment
105*4198Seschrock 		 * to allow the "text" output to be aligned
106*4198Seschrock 		 */
107*4198Seschrock 		if (i < 16) {
108*4198Seschrock 			int numspaces = (16 - i) * 3;
109*4198Seschrock 			while (numspaces-- > 0) {
110*4198Seschrock 				if (bufleft >= 2) {
111*4198Seschrock 					*linep = ' ';
112*4198Seschrock 					--bufleft;
113*4198Seschrock 					linep++;
114*4198Seschrock 				}
115*4198Seschrock 			}
116*4198Seschrock 		}
117*4198Seschrock 
118*4198Seschrock 		if (bufleft >= 2) {
119*4198Seschrock 			*linep = ' ';
120*4198Seschrock 			--bufleft;
121*4198Seschrock 			++linep;
122*4198Seschrock 		}
123*4198Seschrock 
124*4198Seschrock 		for (i = 0; (i < 16) && ((byte_count + i) < length); i++) {
125*4198Seschrock 			int subscript = byte_count + i;
126*4198Seschrock 			char ch =  (isprint(start[subscript]) ?
127*4198Seschrock 			    start[subscript] : '.');
128*4198Seschrock 
129*4198Seschrock 			if (bufleft >= 2) {
130*4198Seschrock 				*linep = ch;
131*4198Seschrock 				--bufleft;
132*4198Seschrock 				++linep;
133*4198Seschrock 			}
134*4198Seschrock 		}
135*4198Seschrock 
136*4198Seschrock 		linebuf[LINEBUFLEN - bufleft] = 0;
137*4198Seschrock 
138*4198Seschrock 		dprintf("%s\n", linebuf);
139*4198Seschrock 
140*4198Seschrock 		linep = linebuf;
141*4198Seschrock 		bufleft = LINEBUFLEN;
142*4198Seschrock 	}
143*4198Seschrock 
144*4198Seschrock }
145*4198Seschrock 
146*4198Seschrock const char *
disk_status_errmsg(int error)147*4198Seschrock disk_status_errmsg(int error)
148*4198Seschrock {
149*4198Seschrock 	switch (error) {
150*4198Seschrock 	case EDS_NOMEM:
151*4198Seschrock 		return ("memory allocation failure");
152*4198Seschrock 	case EDS_CANT_OPEN:
153*4198Seschrock 		return ("failed to open device");
154*4198Seschrock 	case EDS_NO_TRANSPORT:
155*4198Seschrock 		return ("no supported communication protocol");
156*4198Seschrock 	case EDS_NOT_SUPPORTED:
157*4198Seschrock 		return ("disk status information not supported");
158*4198Seschrock 	case EDS_NOT_SIMULATOR:
159*4198Seschrock 		return ("not a valid simulator file");
160*4198Seschrock 	case EDS_IO:
161*4198Seschrock 		return ("I/O error from device");
162*4198Seschrock 	default:
163*4198Seschrock 		return ("unknown error");
164*4198Seschrock 	}
165*4198Seschrock }
166*4198Seschrock 
167*4198Seschrock int
ds_set_errno(disk_status_t * dsp,int error)168*4198Seschrock ds_set_errno(disk_status_t *dsp, int error)
169*4198Seschrock {
170*4198Seschrock 	dsp->ds_error = error;
171*4198Seschrock 	return (-1);
172*4198Seschrock }
173