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
56char *
57volmgt_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
104dun:
105	return (res);
106}
107
108
109char *
110volmgt_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("");
160dun:
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
177int	debug_level = 0;
178
179
180static void
181derrprint(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 */
204void
205denter(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 */
218void
219dexit(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 */
234void
235dprintf(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