xref: /titanic_54/usr/src/cmd/sbdadm/sbdadm.c (revision 8fe960854f0d52e2e8a80ba68e8621a5ac6a866d)
1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte  * CDDL HEADER START
3fcf3ce44SJohn Forte  *
4fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte  *
8fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte  * and limitations under the License.
12fcf3ce44SJohn Forte  *
13fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte  *
19fcf3ce44SJohn Forte  * CDDL HEADER END
20fcf3ce44SJohn Forte  */
21fcf3ce44SJohn Forte /*
22*8fe96085Stim szeto  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23fcf3ce44SJohn Forte  * Use is subject to license terms.
24fcf3ce44SJohn Forte  */
25fcf3ce44SJohn Forte #include <stdlib.h>
26fcf3ce44SJohn Forte #include <stdio.h>
27fcf3ce44SJohn Forte #include <sys/types.h>
28fcf3ce44SJohn Forte #include <sys/stat.h>
29fcf3ce44SJohn Forte #include <fcntl.h>
30fcf3ce44SJohn Forte #include <unistd.h>
31fcf3ce44SJohn Forte #include <libintl.h>
32fcf3ce44SJohn Forte #include <errno.h>
33fcf3ce44SJohn Forte #include <string.h>
34fcf3ce44SJohn Forte #include <assert.h>
35fcf3ce44SJohn Forte #include <getopt.h>
36fcf3ce44SJohn Forte #include <strings.h>
37fcf3ce44SJohn Forte #include <ctype.h>
38fcf3ce44SJohn Forte #include <libnvpair.h>
39*8fe96085Stim szeto #include <locale.h>
40fcf3ce44SJohn Forte 
41fcf3ce44SJohn Forte #include <cmdparse.h>
42fcf3ce44SJohn Forte #include <sys/stmf_defines.h>
43fcf3ce44SJohn Forte #include <libstmf.h>
44fcf3ce44SJohn Forte #include <sys/stmf_sbd_ioctl.h>
45fcf3ce44SJohn Forte 
46fcf3ce44SJohn Forte #define	MAX_LU_LIST	8192
47fcf3ce44SJohn Forte #define	LU_LIST_MAX_RETRIES 3
48*8fe96085Stim szeto #define	GUID_INPUT  32
49fcf3ce44SJohn Forte 
50*8fe96085Stim szeto #define	VERSION_STRING_MAJOR	    "1"
51*8fe96085Stim szeto #define	VERSION_STRING_MINOR	    "0"
52*8fe96085Stim szeto #define	VERSION_STRING_MAX_LEN	    10
53fcf3ce44SJohn Forte 
54*8fe96085Stim szeto 
55*8fe96085Stim szeto char *cmdName;
56*8fe96085Stim szeto 
57*8fe96085Stim szeto static char *getExecBasename(char *);
58fcf3ce44SJohn Forte int delete_lu(int argc, char *argv[], cmdOptions_t *options,
59fcf3ce44SJohn Forte     void *callData);
60fcf3ce44SJohn Forte int create_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
61fcf3ce44SJohn Forte int list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData);
62fcf3ce44SJohn Forte int modify_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
63*8fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
64*8fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *);
65*8fe96085Stim szeto int print_lu_attr(stmfGuid *);
66fcf3ce44SJohn Forte void print_guid(uint8_t *g, FILE *f);
67fcf3ce44SJohn Forte void print_attr_header();
68fcf3ce44SJohn Forte 
69fcf3ce44SJohn Forte optionTbl_t options[] = {
70fcf3ce44SJohn Forte 	{ "disk-size", required_argument, 's',
71fcf3ce44SJohn Forte 			"Size with <none>/k/m/g/t/p/e modifier" },
72fcf3ce44SJohn Forte 	{ "keep-views", no_arg, 'k',
73fcf3ce44SJohn Forte 			"Dont delete view entries related to the LU" },
74fcf3ce44SJohn Forte 	{ NULL, 0, 0 }
75fcf3ce44SJohn Forte };
76fcf3ce44SJohn Forte 
77fcf3ce44SJohn Forte subCommandProps_t subCommands[] = {
78fcf3ce44SJohn Forte 	{ "create-lu", create_lu, "s", NULL, NULL,
79fcf3ce44SJohn Forte 		OPERAND_MANDATORY_SINGLE,
80fcf3ce44SJohn Forte 		"Full path of the file to initialize" },
81fcf3ce44SJohn Forte 	{ "delete-lu", delete_lu, "k", NULL, NULL,
82fcf3ce44SJohn Forte 		OPERAND_MANDATORY_SINGLE, "GUID of the LU to deregister" },
83fcf3ce44SJohn Forte 	{ "import-lu", import_lu, NULL, NULL, NULL,
84fcf3ce44SJohn Forte 		OPERAND_MANDATORY_SINGLE, "filename of the LU to import" },
85fcf3ce44SJohn Forte 	{ "list-lu", list_lus, NULL, NULL, NULL,
86fcf3ce44SJohn Forte 		OPERAND_NONE, "List all the exported LUs" },
87fcf3ce44SJohn Forte 	{ "modify-lu", modify_lu, "s", "s", NULL,
88fcf3ce44SJohn Forte 		OPERAND_MANDATORY_SINGLE,
89fcf3ce44SJohn Forte 		"Full path of the LU or GUID of a registered LU" },
90fcf3ce44SJohn Forte 	{ NULL, 0, 0, NULL, 0, NULL}
91fcf3ce44SJohn Forte };
92fcf3ce44SJohn Forte 
93*8fe96085Stim szeto /*ARGSUSED*/
94fcf3ce44SJohn Forte int
95*8fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
96fcf3ce44SJohn Forte {
97*8fe96085Stim szeto 	luResource hdl = NULL;
98fcf3ce44SJohn Forte 	int ret = 0;
99*8fe96085Stim szeto 	stmfGuid createdGuid;
100fcf3ce44SJohn Forte 
101*8fe96085Stim szeto 	ret = stmfCreateLuResource(STMF_DISK, &hdl);
102*8fe96085Stim szeto 
103fcf3ce44SJohn Forte 	if (ret != STMF_STATUS_SUCCESS) {
104*8fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
105*8fe96085Stim szeto 		    cmdName, gettext("Failure to create lu resource\n"));
106fcf3ce44SJohn Forte 		return (1);
107fcf3ce44SJohn Forte 	}
108fcf3ce44SJohn Forte 
109fcf3ce44SJohn Forte 	for (; options->optval; options++) {
110fcf3ce44SJohn Forte 		switch (options->optval) {
111*8fe96085Stim szeto 			case 's':
112*8fe96085Stim szeto 				ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE,
113*8fe96085Stim szeto 				    options->optarg);
114*8fe96085Stim szeto 				if (ret != STMF_STATUS_SUCCESS) {
115*8fe96085Stim szeto 					(void) fprintf(stderr, "%s: %c: %s\n",
116*8fe96085Stim szeto 					    cmdName, options->optval,
117*8fe96085Stim szeto 					    gettext("size param invalid"));
118*8fe96085Stim szeto 					(void) stmfFreeLuResource(hdl);
119*8fe96085Stim szeto 					return (1);
120*8fe96085Stim szeto 				}
121*8fe96085Stim szeto 				break;
122*8fe96085Stim szeto 			default:
123*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
124*8fe96085Stim szeto 				    cmdName, options->optval,
125*8fe96085Stim szeto 				    gettext("unknown option"));
126*8fe96085Stim szeto 				return (1);
127*8fe96085Stim szeto 		}
128*8fe96085Stim szeto 	}
129*8fe96085Stim szeto 
130*8fe96085Stim szeto 	ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]);
131*8fe96085Stim szeto 
132*8fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
133*8fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
134*8fe96085Stim szeto 		    cmdName, gettext("could not set filename"));
135*8fe96085Stim szeto 		return (1);
136*8fe96085Stim szeto 	}
137*8fe96085Stim szeto 
138*8fe96085Stim szeto 	ret = stmfCreateLu(hdl, &createdGuid);
139*8fe96085Stim szeto 	switch (ret) {
140*8fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
141*8fe96085Stim szeto 			break;
142*8fe96085Stim szeto 		case STMF_ERROR_BUSY:
143*8fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
144*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
145*8fe96085Stim szeto 			    gettext("resource busy"));
146*8fe96085Stim szeto 			ret++;
147*8fe96085Stim szeto 			break;
148*8fe96085Stim szeto 		case STMF_ERROR_PERM:
149*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
150*8fe96085Stim szeto 			    gettext("permission denied"));
151*8fe96085Stim szeto 			ret++;
152*8fe96085Stim szeto 			break;
153*8fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
154*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
155*8fe96085Stim szeto 			    operands[0], gettext("in use"));
156*8fe96085Stim szeto 			ret++;
157*8fe96085Stim szeto 			break;
158*8fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
159*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
160*8fe96085Stim szeto 			    gettext("invalid block size"));
161*8fe96085Stim szeto 			ret++;
162*8fe96085Stim szeto 			break;
163*8fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
164*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
165*8fe96085Stim szeto 			    gettext("guid in use"));
166*8fe96085Stim szeto 			ret++;
167*8fe96085Stim szeto 			break;
168*8fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
169*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
170*8fe96085Stim szeto 			    gettext("meta file error"));
171*8fe96085Stim szeto 			ret++;
172*8fe96085Stim szeto 			break;
173*8fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
174*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
175*8fe96085Stim szeto 			    gettext("data file error"));
176*8fe96085Stim szeto 			ret++;
177*8fe96085Stim szeto 			break;
178*8fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
179*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
180*8fe96085Stim szeto 			    gettext("invalid size"));
181*8fe96085Stim szeto 			ret++;
182*8fe96085Stim szeto 			break;
183*8fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
184*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
185*8fe96085Stim szeto 			    gettext("could not create meta file"));
186*8fe96085Stim szeto 			ret++;
187*8fe96085Stim szeto 			break;
188*8fe96085Stim szeto 		default:
189*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
190*8fe96085Stim szeto 			    gettext("unknown error"));
191*8fe96085Stim szeto 			ret++;
192fcf3ce44SJohn Forte 			break;
193fcf3ce44SJohn Forte 	}
194*8fe96085Stim szeto 
195*8fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
196*8fe96085Stim szeto 		goto done;
197fcf3ce44SJohn Forte 	}
198fcf3ce44SJohn Forte 
199*8fe96085Stim szeto 	(void) printf("Created the following LU:\n");
200*8fe96085Stim szeto 	print_attr_header();
201*8fe96085Stim szeto 	ret = print_lu_attr(&createdGuid);
202fcf3ce44SJohn Forte 
203*8fe96085Stim szeto done:
204*8fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
205fcf3ce44SJohn Forte 	return (ret);
206fcf3ce44SJohn Forte }
207fcf3ce44SJohn Forte 
208fcf3ce44SJohn Forte /*ARGSUSED*/
209fcf3ce44SJohn Forte int
210*8fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
211fcf3ce44SJohn Forte {
212*8fe96085Stim szeto 	int ret = 0;
213*8fe96085Stim szeto 	stmfGuid createdGuid;
214fcf3ce44SJohn Forte 
215*8fe96085Stim szeto 	ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid);
216*8fe96085Stim szeto 	switch (ret) {
217*8fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
218*8fe96085Stim szeto 			break;
219*8fe96085Stim szeto 		case STMF_ERROR_BUSY:
220*8fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
221*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
222*8fe96085Stim szeto 			    gettext("resource busy"));
223*8fe96085Stim szeto 			ret++;
224*8fe96085Stim szeto 			break;
225*8fe96085Stim szeto 		case STMF_ERROR_PERM:
226*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
227*8fe96085Stim szeto 			    gettext("permission denied"));
228*8fe96085Stim szeto 			ret++;
229*8fe96085Stim szeto 			break;
230*8fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
231*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
232*8fe96085Stim szeto 			    operands[0], gettext("in use"));
233*8fe96085Stim szeto 			ret++;
234*8fe96085Stim szeto 			break;
235*8fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
236*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
237*8fe96085Stim szeto 			    gettext("guid in use"));
238*8fe96085Stim szeto 			ret++;
239*8fe96085Stim szeto 			break;
240*8fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
241*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
242*8fe96085Stim szeto 			    gettext("meta file error"));
243*8fe96085Stim szeto 			ret++;
244*8fe96085Stim szeto 			break;
245*8fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
246*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
247*8fe96085Stim szeto 			    gettext("data file error"));
248*8fe96085Stim szeto 			ret++;
249*8fe96085Stim szeto 			break;
250*8fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
251*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
252*8fe96085Stim szeto 			    gettext("invalid size"));
253*8fe96085Stim szeto 			ret++;
254*8fe96085Stim szeto 			break;
255*8fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
256*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
257*8fe96085Stim szeto 			    gettext("could not create meta file"));
258*8fe96085Stim szeto 			ret++;
259*8fe96085Stim szeto 			break;
260*8fe96085Stim szeto 		default:
261*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
262*8fe96085Stim szeto 			    gettext("unknown error"));
263*8fe96085Stim szeto 			ret++;
264*8fe96085Stim szeto 			break;
265fcf3ce44SJohn Forte 	}
266*8fe96085Stim szeto 
267*8fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
268*8fe96085Stim szeto 		goto done;
269*8fe96085Stim szeto 	}
270*8fe96085Stim szeto 
271*8fe96085Stim szeto 	(void) printf("Imported the following LU:\n");
272*8fe96085Stim szeto 	print_attr_header();
273*8fe96085Stim szeto 	ret = print_lu_attr(&createdGuid);
274*8fe96085Stim szeto 
275*8fe96085Stim szeto done:
276*8fe96085Stim szeto 	return (ret);
277*8fe96085Stim szeto }
278*8fe96085Stim szeto 
279*8fe96085Stim szeto /*ARGSUSED*/
280*8fe96085Stim szeto int
281*8fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options,
282*8fe96085Stim szeto     void *callData)
283*8fe96085Stim szeto {
284*8fe96085Stim szeto 	int i, j;
285*8fe96085Stim szeto 	int ret = 0;
286*8fe96085Stim szeto 	int stmfRet;
287*8fe96085Stim szeto 	unsigned int inGuid[sizeof (stmfGuid)];
288*8fe96085Stim szeto 	stmfGuid delGuid;
289*8fe96085Stim szeto 	boolean_t keepViews = B_FALSE;
290*8fe96085Stim szeto 	boolean_t viewEntriesRemoved = B_FALSE;
291*8fe96085Stim szeto 	boolean_t noLunFound = B_FALSE;
292*8fe96085Stim szeto 	boolean_t views = B_FALSE;
293*8fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
294*8fe96085Stim szeto 	stmfViewEntryList *viewEntryList = NULL;
295*8fe96085Stim szeto 
296*8fe96085Stim szeto 	for (; options->optval; options++) {
297*8fe96085Stim szeto 		switch (options->optval) {
298*8fe96085Stim szeto 			/* Keep views for logical unit */
299*8fe96085Stim szeto 			case 'k':
300*8fe96085Stim szeto 				keepViews = B_TRUE;
301*8fe96085Stim szeto 				break;
302*8fe96085Stim szeto 			default:
303*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
304*8fe96085Stim szeto 				    cmdName, options->optval,
305*8fe96085Stim szeto 				    gettext("unknown option"));
306fcf3ce44SJohn Forte 				return (1);
307fcf3ce44SJohn Forte 		}
308*8fe96085Stim szeto 	}
309fcf3ce44SJohn Forte 
310*8fe96085Stim szeto 
311*8fe96085Stim szeto 	for (i = 0; i < operandLen; i++) {
312*8fe96085Stim szeto 		for (j = 0; j < GUID_INPUT; j++) {
313*8fe96085Stim szeto 			if (!isxdigit(operands[i][j])) {
314*8fe96085Stim szeto 				break;
315*8fe96085Stim szeto 			}
316*8fe96085Stim szeto 			sGuid[j] = tolower(operands[i][j]);
317*8fe96085Stim szeto 		}
318*8fe96085Stim szeto 		if (j != GUID_INPUT) {
319*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s%d%s\n",
320*8fe96085Stim szeto 			    cmdName, operands[i], gettext("must be "),
321*8fe96085Stim szeto 			    GUID_INPUT,
322*8fe96085Stim szeto 			    gettext(" hexadecimal digits long"));
323*8fe96085Stim szeto 			ret++;
324*8fe96085Stim szeto 			continue;
325*8fe96085Stim szeto 		}
326*8fe96085Stim szeto 
327*8fe96085Stim szeto 		sGuid[j] = 0;
328*8fe96085Stim szeto 
329*8fe96085Stim szeto 		(void) sscanf(sGuid,
330*8fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
331*8fe96085Stim szeto 		    &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3],
332*8fe96085Stim szeto 		    &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7],
333*8fe96085Stim szeto 		    &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11],
334*8fe96085Stim szeto 		    &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]);
335*8fe96085Stim szeto 
336*8fe96085Stim szeto 		for (j = 0; j < sizeof (stmfGuid); j++) {
337*8fe96085Stim szeto 			delGuid.guid[j] = inGuid[j];
338*8fe96085Stim szeto 		}
339*8fe96085Stim szeto 
340*8fe96085Stim szeto 		stmfRet = stmfDeleteLu(&delGuid);
341*8fe96085Stim szeto 		switch (stmfRet) {
342*8fe96085Stim szeto 			case STMF_STATUS_SUCCESS:
343*8fe96085Stim szeto 				break;
344*8fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
345*8fe96085Stim szeto 				noLunFound = B_TRUE;
346*8fe96085Stim szeto 				break;
347*8fe96085Stim szeto 			case STMF_ERROR_BUSY:
348*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
349*8fe96085Stim szeto 				    gettext("resource busy"));
350*8fe96085Stim szeto 				ret++;
351*8fe96085Stim szeto 				break;
352*8fe96085Stim szeto 			case STMF_ERROR_PERM:
353*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
354*8fe96085Stim szeto 				    gettext("permission denied"));
355*8fe96085Stim szeto 				ret++;
356*8fe96085Stim szeto 				break;
357*8fe96085Stim szeto 			default:
358*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
359*8fe96085Stim szeto 				    gettext("unknown error"));
360*8fe96085Stim szeto 				ret++;
361*8fe96085Stim szeto 				break;
362*8fe96085Stim szeto 		}
363*8fe96085Stim szeto 
364*8fe96085Stim szeto 		if (!keepViews) {
365*8fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
366*8fe96085Stim szeto 			    &viewEntryList);
367*8fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
368*8fe96085Stim szeto 				for (j = 0; j < viewEntryList->cnt; j++) {
369*8fe96085Stim szeto 					(void) stmfRemoveViewEntry(&delGuid,
370*8fe96085Stim szeto 					    viewEntryList->ve[j].veIndex);
371*8fe96085Stim szeto 				}
372*8fe96085Stim szeto 				viewEntriesRemoved = B_TRUE;
373*8fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
374*8fe96085Stim szeto 			} else if (stmfRet != STMF_ERROR_NOT_FOUND) {
375*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
376*8fe96085Stim szeto 				    gettext("unable to remove view entries\n"));
377*8fe96085Stim szeto 				ret++;
378*8fe96085Stim szeto 			} /* No view entries to remove */
379*8fe96085Stim szeto 		}
380*8fe96085Stim szeto 		if (keepViews) {
381*8fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
382*8fe96085Stim szeto 			    &viewEntryList);
383*8fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
384*8fe96085Stim szeto 				views = B_TRUE;
385*8fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
386*8fe96085Stim szeto 			}
387*8fe96085Stim szeto 		}
388*8fe96085Stim szeto 
389*8fe96085Stim szeto 		if ((!viewEntriesRemoved && noLunFound && !views) ||
390*8fe96085Stim szeto 		    (!views && keepViews && noLunFound)) {
391*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s\n",
392*8fe96085Stim szeto 			    cmdName, sGuid,
393*8fe96085Stim szeto 			    gettext("not found"));
394*8fe96085Stim szeto 			ret++;
395*8fe96085Stim szeto 		}
396*8fe96085Stim szeto 		noLunFound = viewEntriesRemoved = views = B_FALSE;
397*8fe96085Stim szeto 	}
398*8fe96085Stim szeto 	return (ret);
399*8fe96085Stim szeto }
400*8fe96085Stim szeto 
401*8fe96085Stim szeto /*ARGSUSED*/
402*8fe96085Stim szeto int
403*8fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options,
404*8fe96085Stim szeto     void *callData)
405*8fe96085Stim szeto {
406*8fe96085Stim szeto 	stmfGuid inGuid;
407*8fe96085Stim szeto 	unsigned int guid[sizeof (stmfGuid)];
408*8fe96085Stim szeto 	int ret = 0;
409*8fe96085Stim szeto 	int i;
410*8fe96085Stim szeto 	char *fname = NULL;
411*8fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
412*8fe96085Stim szeto 	boolean_t fnameUsed = B_FALSE;
413*8fe96085Stim szeto 
414*8fe96085Stim szeto 	if (operands[0][0] == '/') {
415*8fe96085Stim szeto 		fnameUsed = B_TRUE;
416*8fe96085Stim szeto 		fname = operands[0];
417*8fe96085Stim szeto 	}
418*8fe96085Stim szeto 
419*8fe96085Stim szeto 	/* check input length */
420*8fe96085Stim szeto 	if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) {
421*8fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0],
422*8fe96085Stim szeto 		    gettext("must be "), GUID_INPUT,
423*8fe96085Stim szeto 		    gettext(" hexadecimal digits"));
424*8fe96085Stim szeto 		return (1);
425*8fe96085Stim szeto 	}
426*8fe96085Stim szeto 
427*8fe96085Stim szeto 	if (!fnameUsed) {
428*8fe96085Stim szeto 		/* convert to lower case for scan */
429*8fe96085Stim szeto 		for (i = 0; i < 32; i++)
430*8fe96085Stim szeto 			sGuid[i] = tolower(operands[0][i]);
431*8fe96085Stim szeto 		sGuid[i] = 0;
432*8fe96085Stim szeto 		(void) sscanf(sGuid,
433*8fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
434*8fe96085Stim szeto 		    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
435*8fe96085Stim szeto 		    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10],
436*8fe96085Stim szeto 		    &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]);
437*8fe96085Stim szeto 
438*8fe96085Stim szeto 		for (i = 0; i < sizeof (stmfGuid); i++) {
439*8fe96085Stim szeto 			inGuid.guid[i] = guid[i];
440*8fe96085Stim szeto 		}
441*8fe96085Stim szeto 	}
442*8fe96085Stim szeto 
443fcf3ce44SJohn Forte 	for (; options->optval; options++) {
444*8fe96085Stim szeto 		switch (options->optval) {
445*8fe96085Stim szeto 			case 's':
446*8fe96085Stim szeto 				if (callModify(fname, &inGuid,
447*8fe96085Stim szeto 				    STMF_LU_PROP_SIZE, options->optarg,
448*8fe96085Stim szeto 				    "size") != 0) {
449*8fe96085Stim szeto 					return (1);
450fcf3ce44SJohn Forte 				}
451*8fe96085Stim szeto 				break;
452*8fe96085Stim szeto 			default:
453*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
454*8fe96085Stim szeto 				    cmdName, options->optval,
455*8fe96085Stim szeto 				    gettext("unknown option"));
456*8fe96085Stim szeto 				return (1);
457fcf3ce44SJohn Forte 		}
458fcf3ce44SJohn Forte 	}
459*8fe96085Stim szeto 	return (ret);
460fcf3ce44SJohn Forte }
461fcf3ce44SJohn Forte 
462*8fe96085Stim szeto static int
463*8fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal,
464*8fe96085Stim szeto     const char *propString)
465*8fe96085Stim szeto {
466*8fe96085Stim szeto 	int ret = 0;
467*8fe96085Stim szeto 	int stmfRet = 0;
468*8fe96085Stim szeto 
469*8fe96085Stim szeto 	if (!fname) {
470*8fe96085Stim szeto 		stmfRet = stmfModifyLu(luGuid, prop, propVal);
471*8fe96085Stim szeto 	} else {
472*8fe96085Stim szeto 		stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop,
473*8fe96085Stim szeto 		    propVal);
474*8fe96085Stim szeto 	}
475*8fe96085Stim szeto 	switch (stmfRet) {
476*8fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
477*8fe96085Stim szeto 			break;
478*8fe96085Stim szeto 		case STMF_ERROR_BUSY:
479*8fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
480*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
481*8fe96085Stim szeto 			    gettext("resource busy"));
482*8fe96085Stim szeto 			ret++;
483*8fe96085Stim szeto 			break;
484*8fe96085Stim szeto 		case STMF_ERROR_PERM:
485*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
486*8fe96085Stim szeto 			    gettext("permission denied"));
487*8fe96085Stim szeto 			ret++;
488*8fe96085Stim szeto 			break;
489*8fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
490*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
491*8fe96085Stim szeto 			    gettext("invalid block size"));
492*8fe96085Stim szeto 			ret++;
493*8fe96085Stim szeto 			break;
494*8fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
495*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
496*8fe96085Stim szeto 			    gettext("guid in use"));
497*8fe96085Stim szeto 			ret++;
498*8fe96085Stim szeto 			break;
499*8fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
500*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
501*8fe96085Stim szeto 			    gettext("meta file error"));
502*8fe96085Stim szeto 			ret++;
503*8fe96085Stim szeto 			break;
504*8fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
505*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
506*8fe96085Stim szeto 			    gettext("data file error"));
507*8fe96085Stim szeto 			ret++;
508*8fe96085Stim szeto 			break;
509*8fe96085Stim szeto 		case STMF_ERROR_FILE_SIZE_INVALID:
510*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
511*8fe96085Stim szeto 			    gettext("file size invalid"));
512*8fe96085Stim szeto 			ret++;
513*8fe96085Stim szeto 			break;
514*8fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
515*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
516*8fe96085Stim szeto 			    gettext("invalid size"));
517*8fe96085Stim szeto 			ret++;
518*8fe96085Stim szeto 			break;
519*8fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
520*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
521*8fe96085Stim szeto 			    gettext("could not create meta file"));
522*8fe96085Stim szeto 			ret++;
523*8fe96085Stim szeto 			break;
524*8fe96085Stim szeto 		default:
525*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName,
526*8fe96085Stim szeto 			    gettext("could not set property"), propString,
527*8fe96085Stim szeto 			    stmfRet);
528*8fe96085Stim szeto 			ret++;
529*8fe96085Stim szeto 			break;
530*8fe96085Stim szeto 	}
531*8fe96085Stim szeto 
532fcf3ce44SJohn Forte 	return (ret);
533fcf3ce44SJohn Forte }
534fcf3ce44SJohn Forte 
535fcf3ce44SJohn Forte 
536fcf3ce44SJohn Forte /*ARGSUSED*/
537fcf3ce44SJohn Forte int
538fcf3ce44SJohn Forte list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData)
539fcf3ce44SJohn Forte {
540*8fe96085Stim szeto 	int stmfRet;
541*8fe96085Stim szeto 	stmfGuidList *luList;
542*8fe96085Stim szeto 	stmfLogicalUnitProperties luProps;
543*8fe96085Stim szeto 	int sbdLuCnt = 0;
544*8fe96085Stim szeto 	int i;
545fcf3ce44SJohn Forte 
546*8fe96085Stim szeto 	if ((stmfRet = stmfGetLogicalUnitList(&luList))
547*8fe96085Stim szeto 	    != STMF_STATUS_SUCCESS) {
548*8fe96085Stim szeto 		switch (stmfRet) {
549*8fe96085Stim szeto 			case STMF_ERROR_SERVICE_NOT_FOUND:
550*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
551*8fe96085Stim szeto 				    gettext("STMF service not found"));
552*8fe96085Stim szeto 				break;
553*8fe96085Stim szeto 			case STMF_ERROR_BUSY:
554*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
555*8fe96085Stim szeto 				    gettext("resource busy"));
556*8fe96085Stim szeto 				break;
557*8fe96085Stim szeto 			case STMF_ERROR_PERM:
558*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
559*8fe96085Stim szeto 				    gettext("permission denied"));
560*8fe96085Stim szeto 				break;
561*8fe96085Stim szeto 			case STMF_ERROR_SERVICE_DATA_VERSION:
562*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
563*8fe96085Stim szeto 				    gettext("STMF service version incorrect"));
564*8fe96085Stim szeto 				break;
565*8fe96085Stim szeto 			default:
566*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
567*8fe96085Stim szeto 				    gettext("list failed"));
568*8fe96085Stim szeto 				break;
569fcf3ce44SJohn Forte 		}
570fcf3ce44SJohn Forte 		return (1);
571fcf3ce44SJohn Forte 	}
572fcf3ce44SJohn Forte 
573*8fe96085Stim szeto 	for (i = 0; i < luList->cnt; i++) {
574*8fe96085Stim szeto 		stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
575*8fe96085Stim szeto 		    &luProps);
576*8fe96085Stim szeto 		if (stmfRet != STMF_STATUS_SUCCESS) {
577*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
578*8fe96085Stim szeto 			    gettext("list failed"));
579fcf3ce44SJohn Forte 			return (1);
580fcf3ce44SJohn Forte 		}
581*8fe96085Stim szeto 		if (strcmp(luProps.providerName, "sbd") == 0) {
582*8fe96085Stim szeto 			sbdLuCnt++;
583fcf3ce44SJohn Forte 		}
584fcf3ce44SJohn Forte 	}
585fcf3ce44SJohn Forte 
586fcf3ce44SJohn Forte 
587*8fe96085Stim szeto 	if (sbdLuCnt == 0)
588*8fe96085Stim szeto 		return (0);
589*8fe96085Stim szeto 
590*8fe96085Stim szeto 	(void) printf("\nFound %d LU(s)\n", sbdLuCnt);
591fcf3ce44SJohn Forte 	print_attr_header();
592fcf3ce44SJohn Forte 
593*8fe96085Stim szeto 	for (i = 0; i < luList->cnt; i++) {
594*8fe96085Stim szeto 		stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
595*8fe96085Stim szeto 		    &luProps);
596*8fe96085Stim szeto 		if (stmfRet != STMF_STATUS_SUCCESS) {
597*8fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
598*8fe96085Stim szeto 			    gettext("list failed"));
599*8fe96085Stim szeto 			return (1);
600fcf3ce44SJohn Forte 		}
601*8fe96085Stim szeto 		if (strcmp(luProps.providerName, "sbd") == 0) {
602*8fe96085Stim szeto 			(void) print_lu_attr(&luList->guid[i]);
603*8fe96085Stim szeto 		}
604*8fe96085Stim szeto 	}
605fcf3ce44SJohn Forte 	return (0);
606fcf3ce44SJohn Forte }
607fcf3ce44SJohn Forte 
608fcf3ce44SJohn Forte void
609fcf3ce44SJohn Forte print_attr_header()
610fcf3ce44SJohn Forte {
611fcf3ce44SJohn Forte 	(void) printf("\n");
612fcf3ce44SJohn Forte 	(void) printf("	      GUID                    DATA SIZE      "
613fcf3ce44SJohn Forte 	    "     SOURCE\n");
614fcf3ce44SJohn Forte 	(void) printf("--------------------------------  -------------------"
615fcf3ce44SJohn Forte 	    "  ----------------\n");
616fcf3ce44SJohn Forte }
617fcf3ce44SJohn Forte 
618fcf3ce44SJohn Forte void
619fcf3ce44SJohn Forte print_guid(uint8_t *g, FILE *f)
620fcf3ce44SJohn Forte {
621fcf3ce44SJohn Forte 	int i;
622fcf3ce44SJohn Forte 
623fcf3ce44SJohn Forte 	for (i = 0; i < 16; i++) {
624fcf3ce44SJohn Forte 		(void) fprintf(f, "%02x", g[i]);
625fcf3ce44SJohn Forte 	}
626fcf3ce44SJohn Forte }
627fcf3ce44SJohn Forte 
628fcf3ce44SJohn Forte int
629*8fe96085Stim szeto print_lu_attr(stmfGuid *guid)
630fcf3ce44SJohn Forte {
631*8fe96085Stim szeto 	luResource hdl = NULL;
632*8fe96085Stim szeto 	int stmfRet = 0;
633*8fe96085Stim szeto 	int ret = 0;
634*8fe96085Stim szeto 	char propVal[MAXPATHLEN];
635*8fe96085Stim szeto 	size_t propValSize = sizeof (propVal);
636fcf3ce44SJohn Forte 
637*8fe96085Stim szeto 	if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) {
638*8fe96085Stim szeto 		switch (stmfRet) {
639*8fe96085Stim szeto 			case STMF_ERROR_BUSY:
640*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
641*8fe96085Stim szeto 				    gettext("resource busy"));
642*8fe96085Stim szeto 				break;
643*8fe96085Stim szeto 			case STMF_ERROR_PERM:
644*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
645*8fe96085Stim szeto 				    gettext("permission denied"));
646*8fe96085Stim szeto 				break;
647*8fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
648*8fe96085Stim szeto 				/* No error here */
649fcf3ce44SJohn Forte 				return (0);
650*8fe96085Stim szeto 				break;
651*8fe96085Stim szeto 			default:
652*8fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
653*8fe96085Stim szeto 				    gettext("get extended properties failed"));
654*8fe96085Stim szeto 				break;
655fcf3ce44SJohn Forte 		}
656fcf3ce44SJohn Forte 		return (1);
657fcf3ce44SJohn Forte 	}
658*8fe96085Stim szeto 
659*8fe96085Stim szeto 	print_guid((uint8_t *)guid, stdout);
660*8fe96085Stim szeto 
661*8fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal,
662*8fe96085Stim szeto 	    &propValSize);
663*8fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
664*8fe96085Stim szeto 		(void) printf("  %-19s  ", propVal);
665*8fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
666*8fe96085Stim szeto 		(void) printf("not set\n");
667*8fe96085Stim szeto 	} else {
668*8fe96085Stim szeto 		(void) printf("<error retrieving property>");
669*8fe96085Stim szeto 		ret++;
670*8fe96085Stim szeto 	}
671*8fe96085Stim szeto 
672*8fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal,
673*8fe96085Stim szeto 	    &propValSize);
674*8fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
675*8fe96085Stim szeto 		(void) printf("%s\n", propVal);
676*8fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
677*8fe96085Stim szeto 		(void) printf("not set\n");
678*8fe96085Stim szeto 	} else {
679*8fe96085Stim szeto 		(void) printf("<error retrieving property>");
680*8fe96085Stim szeto 		ret++;
681*8fe96085Stim szeto 	}
682*8fe96085Stim szeto 
683*8fe96085Stim szeto 
684*8fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
685*8fe96085Stim szeto 	return (ret);
686*8fe96085Stim szeto }
687*8fe96085Stim szeto 
688*8fe96085Stim szeto /*
689*8fe96085Stim szeto  * input:
690*8fe96085Stim szeto  *  execFullName - exec name of program (argv[0])
691*8fe96085Stim szeto  *
692*8fe96085Stim szeto  *  copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
693*8fe96085Stim szeto  *  (changed name to lowerCamelCase to keep consistent with this file)
694*8fe96085Stim szeto  *
695*8fe96085Stim szeto  * Returns:
696*8fe96085Stim szeto  *  command name portion of execFullName
697*8fe96085Stim szeto  */
698*8fe96085Stim szeto static char *
699*8fe96085Stim szeto getExecBasename(char *execFullname)
700*8fe96085Stim szeto {
701*8fe96085Stim szeto 	char *lastSlash, *execBasename;
702*8fe96085Stim szeto 
703*8fe96085Stim szeto 	/* guard against '/' at end of command invocation */
704*8fe96085Stim szeto 	for (;;) {
705*8fe96085Stim szeto 		lastSlash = strrchr(execFullname, '/');
706*8fe96085Stim szeto 		if (lastSlash == NULL) {
707*8fe96085Stim szeto 			execBasename = execFullname;
708*8fe96085Stim szeto 			break;
709*8fe96085Stim szeto 		} else {
710*8fe96085Stim szeto 			execBasename = lastSlash + 1;
711*8fe96085Stim szeto 			if (*execBasename == '\0') {
712*8fe96085Stim szeto 				*lastSlash = '\0';
713*8fe96085Stim szeto 				continue;
714*8fe96085Stim szeto 			}
715*8fe96085Stim szeto 			break;
716*8fe96085Stim szeto 		}
717*8fe96085Stim szeto 	}
718*8fe96085Stim szeto 	return (execBasename);
719*8fe96085Stim szeto }
720*8fe96085Stim szeto int
721*8fe96085Stim szeto main(int argc, char *argv[])
722*8fe96085Stim szeto {
723*8fe96085Stim szeto 	synTables_t synTables;
724*8fe96085Stim szeto 	char versionString[VERSION_STRING_MAX_LEN];
725*8fe96085Stim szeto 	int ret;
726*8fe96085Stim szeto 	int funcRet;
727*8fe96085Stim szeto 	void *subcommandArgs = NULL;
728*8fe96085Stim szeto 
729*8fe96085Stim szeto 	(void) setlocale(LC_ALL, "");
730*8fe96085Stim szeto 	(void) textdomain(TEXT_DOMAIN);
731*8fe96085Stim szeto 	/* set global command name */
732*8fe96085Stim szeto 	cmdName = getExecBasename(argv[0]);
733*8fe96085Stim szeto 
734*8fe96085Stim szeto 	(void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
735*8fe96085Stim szeto 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
736*8fe96085Stim szeto 	synTables.versionString = versionString;
737*8fe96085Stim szeto 	synTables.longOptionTbl = options;
738*8fe96085Stim szeto 	synTables.subCommandPropsTbl = subCommands;
739*8fe96085Stim szeto 
740*8fe96085Stim szeto 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
741*8fe96085Stim szeto 	if (ret != 0) {
742*8fe96085Stim szeto 		return (ret);
743*8fe96085Stim szeto 	}
744*8fe96085Stim szeto 
745*8fe96085Stim szeto 	return (funcRet);
746*8fe96085Stim szeto } /* end main */
747