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