1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * routines in this module are meant to be called by other libvolmgt
30  * routines only
31  */
32 
33 #include	<stdio.h>
34 #include	<string.h>
35 #include	<dirent.h>
36 #include	<string.h>
37 #include	<libintl.h>
38 #include	<limits.h>
39 #include	<unistd.h>
40 #include	<stdlib.h>
41 #include	<sys/types.h>
42 #include	<sys/stat.h>
43 #include	<sys/param.h>
44 #include	<sys/varargs.h>
45 #include	"volmgt_private.h"
46 
47 
48 /*
49  * fix the getfull{raw,blk}name problem for the fd and diskette case
50  *
51  * return value is malloc'ed, and must be free'd
52  *
53  * no match gets a malloc'ed null string
54  */
55 
56 char *
57 volmgt_getfullblkname(char *n)
58 {
59 	extern char	*getfullblkname(char *);
60 	char		*rval;
61 	char		namebuf[MAXPATHLEN+1];
62 	char		*s;
63 	char		c;
64 	char		*res;
65 
66 
67 
68 	/* try to get full block-spcl device name */
69 	rval = getfullblkname(n);
70 	if ((rval != NULL) && (*rval != NULLC)) {
71 		/* found it */
72 		res = rval;
73 		goto dun;
74 	}
75 
76 	/* we have a null-string result */
77 	if (rval != NULL) {
78 		/* free null string */
79 		free(rval);
80 	}
81 
82 	/* ok, so we either have a bad device or a floppy */
83 
84 	/* try the rfd# or rdiskette forms */
85 	if (((s = strstr(n, "/rfd")) != NULL) ||
86 	    ((s = strstr(n, "/rdiskette")) != NULL) ||
87 	    ((s = strstr(n, "/rdsk/")) != NULL)) {
88 		/*
89 		 * we do not have to check for room here, since we will
90 		 * be making the string one shorter
91 		 */
92 		c = *++s;			/* save the first char */
93 		*s = NULLC;			/* replace it with a null */
94 		(void) strcpy(namebuf, n);	/* save first part of it */
95 		*s++ = c;			/* give the first char back */
96 		(void) strcat(namebuf, s);	/* copy the rest */
97 		res = strdup(namebuf);
98 		goto dun;
99 	}
100 
101 	/* no match found */
102 	res = strdup("");
103 
104 dun:
105 	return (res);
106 }
107 
108 
109 char *
110 volmgt_getfullrawname(char *n)
111 {
112 	extern char	*getfullrawname(char *);
113 	char		*rval;
114 	char		namebuf[MAXPATHLEN+1];
115 	char		*s;
116 	char		c;
117 	char		*res;
118 
119 
120 #ifdef	DEBUG
121 	denter("volmgt_getfullrawname(%s): entering\n", n);
122 #endif
123 	/* try to get full char-spcl device name */
124 	rval = getfullrawname(n);
125 	if ((rval != NULL) && (*rval != NULLC)) {
126 		/* found it */
127 		res = rval;
128 		goto dun;
129 	}
130 
131 	/* we have a null-string result */
132 	if (rval != NULL) {
133 		/* free null string */
134 		free(rval);
135 	}
136 
137 	/* ok, so we either have a bad device or a floppy */
138 
139 	/* try the "fd", "diskette", and the "dsk" form */
140 	if (((s = strstr(n, "/fd")) != NULL) ||
141 	    ((s = strstr(n, "/diskette")) != NULL) ||
142 	    ((s = strstr(n, "/dsk/")) != NULL)) {
143 		/*
144 		 * ensure we have room to add one more char
145 		 */
146 		if (strlen(n) < (MAXPATHLEN - 1)) {
147 			c = *++s;		/* save the first char */
148 			*s = NULLC;		/* replace it with a null */
149 			(void) strcpy(namebuf, n); /* save first part of str */
150 			*s = c;			/* put first charback */
151 			(void) strcat(namebuf, "r"); /* insert an 'r' */
152 			(void) strcat(namebuf, s); /* copy rest of str */
153 			res = strdup(namebuf);
154 			goto dun;
155 		}
156 	}
157 
158 	/* no match found */
159 	res = strdup("");
160 dun:
161 #ifdef	DEBUG
162 	dexit("volmgt_getfullrawname: returning %s\n",
163 	    res ? res : "<null ptr>");
164 #endif
165 	return (res);
166 }
167 
168 
169 #ifdef	DEBUG
170 
171 /*
172  * debug print routines -- private to libvolmgt
173  */
174 
175 #define	DEBUG_INDENT_SPACES	"  "
176 
177 int	debug_level = 0;
178 
179 
180 static void
181 derrprint(char *fmt, va_list ap)
182 {
183 	int		i;
184 	int		j;
185 	char		date_buf[256];
186 	time_t		t;
187 	struct tm	*tm;
188 
189 
190 	(void) time(&t);
191 	tm = localtime(&t);
192 	(void) fprintf(stderr, "%02d/%02d/%02d %02d:%02d:%02d ",
193 	    tm->tm_mon+1, tm->tm_mday, tm->tm_year % 100,
194 	    tm->tm_hour, tm->tm_min, tm->tm_sec);
195 	for (i = 0; i < debug_level; i++) {
196 		(void) fprintf(stderr, DEBUG_INDENT_SPACES);
197 	}
198 	(void) vfprintf(stderr, fmt, ap);
199 }
200 
201 /*
202  * denter -- do a derrprint(), then increment debug level
203  */
204 void
205 denter(char *fmt, ...)
206 {
207 	va_list		ap;
208 
209 	va_start(ap, fmt);
210 	derrprint(fmt, ap);
211 	va_end(ap);
212 	debug_level++;
213 }
214 
215 /*
216  * dexit -- decrement debug level then do a derrprint()
217  */
218 void
219 dexit(char *fmt, ...)
220 {
221 	va_list		ap;
222 
223 	if (--debug_level < 0) {
224 		debug_level = 0;
225 	}
226 	va_start(ap, fmt);
227 	derrprint(fmt, ap);
228 	va_end(ap);
229 }
230 
231 /*
232  * dprintf -- print debug info, indenting based on debug level
233  */
234 void
235 dprintf(char *fmt, ...)
236 {
237 	va_list		ap;
238 
239 	va_start(ap, fmt);
240 	derrprint(fmt, ap);
241 	va_end(ap);
242 }
243 
244 #endif	/* DEBUG */
245