xref: /titanic_51/usr/src/cmd/sbdadm/sbdadm.c (revision 450396635f70344c58b6b1e4db38cf17ff34445c)
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 /*
228fe96085Stim 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>
398fe96085Stim 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
488fe96085Stim szeto #define	GUID_INPUT  32
49fcf3ce44SJohn Forte 
508fe96085Stim szeto #define	VERSION_STRING_MAJOR	    "1"
518fe96085Stim szeto #define	VERSION_STRING_MINOR	    "0"
528fe96085Stim szeto #define	VERSION_STRING_MAX_LEN	    10
53fcf3ce44SJohn Forte 
548fe96085Stim szeto 
558fe96085Stim szeto char *cmdName;
568fe96085Stim szeto 
578fe96085Stim 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);
638fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
648fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *);
658fe96085Stim 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 
938fe96085Stim szeto /*ARGSUSED*/
94fcf3ce44SJohn Forte int
958fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
96fcf3ce44SJohn Forte {
978fe96085Stim szeto 	luResource hdl = NULL;
98fcf3ce44SJohn Forte 	int ret = 0;
998fe96085Stim szeto 	stmfGuid createdGuid;
100fcf3ce44SJohn Forte 
1018fe96085Stim szeto 	ret = stmfCreateLuResource(STMF_DISK, &hdl);
1028fe96085Stim szeto 
103fcf3ce44SJohn Forte 	if (ret != STMF_STATUS_SUCCESS) {
1048fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
1058fe96085Stim 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) {
1118fe96085Stim szeto 			case 's':
1128fe96085Stim szeto 				ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE,
1138fe96085Stim szeto 				    options->optarg);
1148fe96085Stim szeto 				if (ret != STMF_STATUS_SUCCESS) {
1158fe96085Stim szeto 					(void) fprintf(stderr, "%s: %c: %s\n",
1168fe96085Stim szeto 					    cmdName, options->optval,
1178fe96085Stim szeto 					    gettext("size param invalid"));
1188fe96085Stim szeto 					(void) stmfFreeLuResource(hdl);
1198fe96085Stim szeto 					return (1);
1208fe96085Stim szeto 				}
1218fe96085Stim szeto 				break;
1228fe96085Stim szeto 			default:
1238fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
1248fe96085Stim szeto 				    cmdName, options->optval,
1258fe96085Stim szeto 				    gettext("unknown option"));
1268fe96085Stim szeto 				return (1);
1278fe96085Stim szeto 		}
1288fe96085Stim szeto 	}
1298fe96085Stim szeto 
1308fe96085Stim szeto 	ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]);
1318fe96085Stim szeto 
1328fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
1338fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
1348fe96085Stim szeto 		    cmdName, gettext("could not set filename"));
1358fe96085Stim szeto 		return (1);
1368fe96085Stim szeto 	}
1378fe96085Stim szeto 
1388fe96085Stim szeto 	ret = stmfCreateLu(hdl, &createdGuid);
1398fe96085Stim szeto 	switch (ret) {
1408fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
1418fe96085Stim szeto 			break;
1428fe96085Stim szeto 		case STMF_ERROR_BUSY:
1438fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
1448fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1458fe96085Stim szeto 			    gettext("resource busy"));
1468fe96085Stim szeto 			ret++;
1478fe96085Stim szeto 			break;
1488fe96085Stim szeto 		case STMF_ERROR_PERM:
1498fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1508fe96085Stim szeto 			    gettext("permission denied"));
1518fe96085Stim szeto 			ret++;
1528fe96085Stim szeto 			break;
1538fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
1548fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
1558fe96085Stim szeto 			    operands[0], gettext("in use"));
1568fe96085Stim szeto 			ret++;
1578fe96085Stim szeto 			break;
1588fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
1598fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1608fe96085Stim szeto 			    gettext("invalid block size"));
1618fe96085Stim szeto 			ret++;
1628fe96085Stim szeto 			break;
1638fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
1648fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1658fe96085Stim szeto 			    gettext("guid in use"));
1668fe96085Stim szeto 			ret++;
1678fe96085Stim szeto 			break;
1688fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
1698fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1708fe96085Stim szeto 			    gettext("meta file error"));
1718fe96085Stim szeto 			ret++;
1728fe96085Stim szeto 			break;
1738fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
1748fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1758fe96085Stim szeto 			    gettext("data file error"));
1768fe96085Stim szeto 			ret++;
1778fe96085Stim szeto 			break;
1788fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
1798fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1808fe96085Stim szeto 			    gettext("invalid size"));
1818fe96085Stim szeto 			ret++;
1828fe96085Stim szeto 			break;
1838fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
1848fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1858fe96085Stim szeto 			    gettext("could not create meta file"));
1868fe96085Stim szeto 			ret++;
1878fe96085Stim szeto 			break;
1888fe96085Stim szeto 		default:
1898fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1908fe96085Stim szeto 			    gettext("unknown error"));
1918fe96085Stim szeto 			ret++;
192fcf3ce44SJohn Forte 			break;
193fcf3ce44SJohn Forte 	}
1948fe96085Stim szeto 
1958fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
1968fe96085Stim szeto 		goto done;
197fcf3ce44SJohn Forte 	}
198fcf3ce44SJohn Forte 
1998fe96085Stim szeto 	(void) printf("Created the following LU:\n");
2008fe96085Stim szeto 	print_attr_header();
2018fe96085Stim szeto 	ret = print_lu_attr(&createdGuid);
202fcf3ce44SJohn Forte 
2038fe96085Stim szeto done:
2048fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
205fcf3ce44SJohn Forte 	return (ret);
206fcf3ce44SJohn Forte }
207fcf3ce44SJohn Forte 
208fcf3ce44SJohn Forte /*ARGSUSED*/
209fcf3ce44SJohn Forte int
2108fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
211fcf3ce44SJohn Forte {
2128fe96085Stim szeto 	int ret = 0;
2138fe96085Stim szeto 	stmfGuid createdGuid;
214fcf3ce44SJohn Forte 
2158fe96085Stim szeto 	ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid);
2168fe96085Stim szeto 	switch (ret) {
2178fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
2188fe96085Stim szeto 			break;
2198fe96085Stim szeto 		case STMF_ERROR_BUSY:
2208fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
2218fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2228fe96085Stim szeto 			    gettext("resource busy"));
2238fe96085Stim szeto 			ret++;
2248fe96085Stim szeto 			break;
2258fe96085Stim szeto 		case STMF_ERROR_PERM:
2268fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2278fe96085Stim szeto 			    gettext("permission denied"));
2288fe96085Stim szeto 			ret++;
2298fe96085Stim szeto 			break;
2308fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
2318fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
2328fe96085Stim szeto 			    operands[0], gettext("in use"));
2338fe96085Stim szeto 			ret++;
2348fe96085Stim szeto 			break;
2358fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
2368fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2378fe96085Stim szeto 			    gettext("guid in use"));
2388fe96085Stim szeto 			ret++;
2398fe96085Stim szeto 			break;
2408fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
2418fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2428fe96085Stim szeto 			    gettext("meta file error"));
2438fe96085Stim szeto 			ret++;
2448fe96085Stim szeto 			break;
2458fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
2468fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2478fe96085Stim szeto 			    gettext("data file error"));
2488fe96085Stim szeto 			ret++;
2498fe96085Stim szeto 			break;
2508fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
2518fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2528fe96085Stim szeto 			    gettext("invalid size"));
2538fe96085Stim szeto 			ret++;
2548fe96085Stim szeto 			break;
2558fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
2568fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2578fe96085Stim szeto 			    gettext("could not create meta file"));
2588fe96085Stim szeto 			ret++;
2598fe96085Stim szeto 			break;
2608fe96085Stim szeto 		default:
2618fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2628fe96085Stim szeto 			    gettext("unknown error"));
2638fe96085Stim szeto 			ret++;
2648fe96085Stim szeto 			break;
265fcf3ce44SJohn Forte 	}
2668fe96085Stim szeto 
2678fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
2688fe96085Stim szeto 		goto done;
2698fe96085Stim szeto 	}
2708fe96085Stim szeto 
2718fe96085Stim szeto 	(void) printf("Imported the following LU:\n");
2728fe96085Stim szeto 	print_attr_header();
2738fe96085Stim szeto 	ret = print_lu_attr(&createdGuid);
2748fe96085Stim szeto 
2758fe96085Stim szeto done:
2768fe96085Stim szeto 	return (ret);
2778fe96085Stim szeto }
2788fe96085Stim szeto 
2798fe96085Stim szeto /*ARGSUSED*/
2808fe96085Stim szeto int
2818fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options,
2828fe96085Stim szeto     void *callData)
2838fe96085Stim szeto {
2848fe96085Stim szeto 	int i, j;
2858fe96085Stim szeto 	int ret = 0;
2868fe96085Stim szeto 	int stmfRet;
2878fe96085Stim szeto 	unsigned int inGuid[sizeof (stmfGuid)];
2888fe96085Stim szeto 	stmfGuid delGuid;
2898fe96085Stim szeto 	boolean_t keepViews = B_FALSE;
2908fe96085Stim szeto 	boolean_t viewEntriesRemoved = B_FALSE;
2918fe96085Stim szeto 	boolean_t noLunFound = B_FALSE;
2928fe96085Stim szeto 	boolean_t views = B_FALSE;
2938fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
2948fe96085Stim szeto 	stmfViewEntryList *viewEntryList = NULL;
2958fe96085Stim szeto 
2968fe96085Stim szeto 	for (; options->optval; options++) {
2978fe96085Stim szeto 		switch (options->optval) {
2988fe96085Stim szeto 			/* Keep views for logical unit */
2998fe96085Stim szeto 			case 'k':
3008fe96085Stim szeto 				keepViews = B_TRUE;
3018fe96085Stim szeto 				break;
3028fe96085Stim szeto 			default:
3038fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
3048fe96085Stim szeto 				    cmdName, options->optval,
3058fe96085Stim szeto 				    gettext("unknown option"));
306fcf3ce44SJohn Forte 				return (1);
307fcf3ce44SJohn Forte 		}
3088fe96085Stim szeto 	}
309fcf3ce44SJohn Forte 
3108fe96085Stim szeto 
3118fe96085Stim szeto 	for (i = 0; i < operandLen; i++) {
3128fe96085Stim szeto 		for (j = 0; j < GUID_INPUT; j++) {
3138fe96085Stim szeto 			if (!isxdigit(operands[i][j])) {
3148fe96085Stim szeto 				break;
3158fe96085Stim szeto 			}
3168fe96085Stim szeto 			sGuid[j] = tolower(operands[i][j]);
3178fe96085Stim szeto 		}
3188fe96085Stim szeto 		if (j != GUID_INPUT) {
3198fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s%d%s\n",
3208fe96085Stim szeto 			    cmdName, operands[i], gettext("must be "),
3218fe96085Stim szeto 			    GUID_INPUT,
3228fe96085Stim szeto 			    gettext(" hexadecimal digits long"));
3238fe96085Stim szeto 			ret++;
3248fe96085Stim szeto 			continue;
3258fe96085Stim szeto 		}
3268fe96085Stim szeto 
3278fe96085Stim szeto 		sGuid[j] = 0;
3288fe96085Stim szeto 
3298fe96085Stim szeto 		(void) sscanf(sGuid,
3308fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
3318fe96085Stim szeto 		    &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3],
3328fe96085Stim szeto 		    &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7],
3338fe96085Stim szeto 		    &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11],
3348fe96085Stim szeto 		    &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]);
3358fe96085Stim szeto 
3368fe96085Stim szeto 		for (j = 0; j < sizeof (stmfGuid); j++) {
3378fe96085Stim szeto 			delGuid.guid[j] = inGuid[j];
3388fe96085Stim szeto 		}
3398fe96085Stim szeto 
3408fe96085Stim szeto 		stmfRet = stmfDeleteLu(&delGuid);
3418fe96085Stim szeto 		switch (stmfRet) {
3428fe96085Stim szeto 			case STMF_STATUS_SUCCESS:
3438fe96085Stim szeto 				break;
3448fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
3458fe96085Stim szeto 				noLunFound = B_TRUE;
3468fe96085Stim szeto 				break;
3478fe96085Stim szeto 			case STMF_ERROR_BUSY:
3488fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3498fe96085Stim szeto 				    gettext("resource busy"));
3508fe96085Stim szeto 				ret++;
3518fe96085Stim szeto 				break;
3528fe96085Stim szeto 			case STMF_ERROR_PERM:
3538fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3548fe96085Stim szeto 				    gettext("permission denied"));
3558fe96085Stim szeto 				ret++;
3568fe96085Stim szeto 				break;
3578fe96085Stim szeto 			default:
3588fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3598fe96085Stim szeto 				    gettext("unknown error"));
3608fe96085Stim szeto 				ret++;
3618fe96085Stim szeto 				break;
3628fe96085Stim szeto 		}
3638fe96085Stim szeto 
3648fe96085Stim szeto 		if (!keepViews) {
3658fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
3668fe96085Stim szeto 			    &viewEntryList);
3678fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
3688fe96085Stim szeto 				for (j = 0; j < viewEntryList->cnt; j++) {
3698fe96085Stim szeto 					(void) stmfRemoveViewEntry(&delGuid,
3708fe96085Stim szeto 					    viewEntryList->ve[j].veIndex);
3718fe96085Stim szeto 				}
3728fe96085Stim szeto 				viewEntriesRemoved = B_TRUE;
3738fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
3748fe96085Stim szeto 			} else if (stmfRet != STMF_ERROR_NOT_FOUND) {
3758fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3768fe96085Stim szeto 				    gettext("unable to remove view entries\n"));
3778fe96085Stim szeto 				ret++;
3788fe96085Stim szeto 			} /* No view entries to remove */
3798fe96085Stim szeto 		}
3808fe96085Stim szeto 		if (keepViews) {
3818fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
3828fe96085Stim szeto 			    &viewEntryList);
3838fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
3848fe96085Stim szeto 				views = B_TRUE;
3858fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
3868fe96085Stim szeto 			}
3878fe96085Stim szeto 		}
3888fe96085Stim szeto 
3898fe96085Stim szeto 		if ((!viewEntriesRemoved && noLunFound && !views) ||
3908fe96085Stim szeto 		    (!views && keepViews && noLunFound)) {
3918fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s\n",
3928fe96085Stim szeto 			    cmdName, sGuid,
3938fe96085Stim szeto 			    gettext("not found"));
3948fe96085Stim szeto 			ret++;
3958fe96085Stim szeto 		}
3968fe96085Stim szeto 		noLunFound = viewEntriesRemoved = views = B_FALSE;
3978fe96085Stim szeto 	}
3988fe96085Stim szeto 	return (ret);
3998fe96085Stim szeto }
4008fe96085Stim szeto 
4018fe96085Stim szeto /*ARGSUSED*/
4028fe96085Stim szeto int
4038fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options,
4048fe96085Stim szeto     void *callData)
4058fe96085Stim szeto {
4068fe96085Stim szeto 	stmfGuid inGuid;
4078fe96085Stim szeto 	unsigned int guid[sizeof (stmfGuid)];
4088fe96085Stim szeto 	int ret = 0;
4098fe96085Stim szeto 	int i;
4108fe96085Stim szeto 	char *fname = NULL;
4118fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
4128fe96085Stim szeto 	boolean_t fnameUsed = B_FALSE;
4138fe96085Stim szeto 
4148fe96085Stim szeto 	if (operands[0][0] == '/') {
4158fe96085Stim szeto 		fnameUsed = B_TRUE;
4168fe96085Stim szeto 		fname = operands[0];
4178fe96085Stim szeto 	}
4188fe96085Stim szeto 
4198fe96085Stim szeto 	/* check input length */
4208fe96085Stim szeto 	if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) {
4218fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0],
4228fe96085Stim szeto 		    gettext("must be "), GUID_INPUT,
4238fe96085Stim szeto 		    gettext(" hexadecimal digits"));
4248fe96085Stim szeto 		return (1);
4258fe96085Stim szeto 	}
4268fe96085Stim szeto 
4278fe96085Stim szeto 	if (!fnameUsed) {
4288fe96085Stim szeto 		/* convert to lower case for scan */
4298fe96085Stim szeto 		for (i = 0; i < 32; i++)
4308fe96085Stim szeto 			sGuid[i] = tolower(operands[0][i]);
4318fe96085Stim szeto 		sGuid[i] = 0;
4328fe96085Stim szeto 		(void) sscanf(sGuid,
4338fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
4348fe96085Stim szeto 		    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
4358fe96085Stim szeto 		    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10],
4368fe96085Stim szeto 		    &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]);
4378fe96085Stim szeto 
4388fe96085Stim szeto 		for (i = 0; i < sizeof (stmfGuid); i++) {
4398fe96085Stim szeto 			inGuid.guid[i] = guid[i];
4408fe96085Stim szeto 		}
4418fe96085Stim szeto 	}
4428fe96085Stim szeto 
443fcf3ce44SJohn Forte 	for (; options->optval; options++) {
4448fe96085Stim szeto 		switch (options->optval) {
4458fe96085Stim szeto 			case 's':
4468fe96085Stim szeto 				if (callModify(fname, &inGuid,
4478fe96085Stim szeto 				    STMF_LU_PROP_SIZE, options->optarg,
4488fe96085Stim szeto 				    "size") != 0) {
4498fe96085Stim szeto 					return (1);
450fcf3ce44SJohn Forte 				}
4518fe96085Stim szeto 				break;
4528fe96085Stim szeto 			default:
4538fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
4548fe96085Stim szeto 				    cmdName, options->optval,
4558fe96085Stim szeto 				    gettext("unknown option"));
4568fe96085Stim szeto 				return (1);
457fcf3ce44SJohn Forte 		}
458fcf3ce44SJohn Forte 	}
4598fe96085Stim szeto 	return (ret);
460fcf3ce44SJohn Forte }
461fcf3ce44SJohn Forte 
4628fe96085Stim szeto static int
4638fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal,
4648fe96085Stim szeto     const char *propString)
4658fe96085Stim szeto {
4668fe96085Stim szeto 	int ret = 0;
4678fe96085Stim szeto 	int stmfRet = 0;
4688fe96085Stim szeto 
4698fe96085Stim szeto 	if (!fname) {
4708fe96085Stim szeto 		stmfRet = stmfModifyLu(luGuid, prop, propVal);
4718fe96085Stim szeto 	} else {
4728fe96085Stim szeto 		stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop,
4738fe96085Stim szeto 		    propVal);
4748fe96085Stim szeto 	}
4758fe96085Stim szeto 	switch (stmfRet) {
4768fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
4778fe96085Stim szeto 			break;
4788fe96085Stim szeto 		case STMF_ERROR_BUSY:
4798fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
4808fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4818fe96085Stim szeto 			    gettext("resource busy"));
4828fe96085Stim szeto 			ret++;
4838fe96085Stim szeto 			break;
4848fe96085Stim szeto 		case STMF_ERROR_PERM:
4858fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4868fe96085Stim szeto 			    gettext("permission denied"));
4878fe96085Stim szeto 			ret++;
4888fe96085Stim szeto 			break;
4898fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
4908fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4918fe96085Stim szeto 			    gettext("invalid block size"));
4928fe96085Stim szeto 			ret++;
4938fe96085Stim szeto 			break;
4948fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
4958fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4968fe96085Stim szeto 			    gettext("guid in use"));
4978fe96085Stim szeto 			ret++;
4988fe96085Stim szeto 			break;
4998fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
5008fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5018fe96085Stim szeto 			    gettext("meta file error"));
5028fe96085Stim szeto 			ret++;
5038fe96085Stim szeto 			break;
5048fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
5058fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5068fe96085Stim szeto 			    gettext("data file error"));
5078fe96085Stim szeto 			ret++;
5088fe96085Stim szeto 			break;
5098fe96085Stim szeto 		case STMF_ERROR_FILE_SIZE_INVALID:
5108fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5118fe96085Stim szeto 			    gettext("file size invalid"));
5128fe96085Stim szeto 			ret++;
5138fe96085Stim szeto 			break;
5148fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
5158fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5168fe96085Stim szeto 			    gettext("invalid size"));
5178fe96085Stim szeto 			ret++;
5188fe96085Stim szeto 			break;
5198fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
5208fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5218fe96085Stim szeto 			    gettext("could not create meta file"));
5228fe96085Stim szeto 			ret++;
5238fe96085Stim szeto 			break;
5248fe96085Stim szeto 		default:
5258fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName,
5268fe96085Stim szeto 			    gettext("could not set property"), propString,
5278fe96085Stim szeto 			    stmfRet);
5288fe96085Stim szeto 			ret++;
5298fe96085Stim szeto 			break;
5308fe96085Stim szeto 	}
5318fe96085Stim 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 {
5408fe96085Stim szeto 	int stmfRet;
5418fe96085Stim szeto 	stmfGuidList *luList;
5428fe96085Stim szeto 	stmfLogicalUnitProperties luProps;
5438fe96085Stim szeto 	int sbdLuCnt = 0;
5448fe96085Stim szeto 	int i;
545fcf3ce44SJohn Forte 
5468fe96085Stim szeto 	if ((stmfRet = stmfGetLogicalUnitList(&luList))
5478fe96085Stim szeto 	    != STMF_STATUS_SUCCESS) {
5488fe96085Stim szeto 		switch (stmfRet) {
5498fe96085Stim szeto 			case STMF_ERROR_SERVICE_NOT_FOUND:
5508fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
5518fe96085Stim szeto 				    gettext("STMF service not found"));
5528fe96085Stim szeto 				break;
5538fe96085Stim szeto 			case STMF_ERROR_BUSY:
5548fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
5558fe96085Stim szeto 				    gettext("resource busy"));
5568fe96085Stim szeto 				break;
5578fe96085Stim szeto 			case STMF_ERROR_PERM:
5588fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
5598fe96085Stim szeto 				    gettext("permission denied"));
5608fe96085Stim szeto 				break;
5618fe96085Stim szeto 			case STMF_ERROR_SERVICE_DATA_VERSION:
5628fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
5638fe96085Stim szeto 				    gettext("STMF service version incorrect"));
5648fe96085Stim szeto 				break;
5658fe96085Stim szeto 			default:
5668fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
5678fe96085Stim szeto 				    gettext("list failed"));
5688fe96085Stim szeto 				break;
569fcf3ce44SJohn Forte 		}
570fcf3ce44SJohn Forte 		return (1);
571fcf3ce44SJohn Forte 	}
572fcf3ce44SJohn Forte 
5738fe96085Stim szeto 	for (i = 0; i < luList->cnt; i++) {
5748fe96085Stim szeto 		stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
5758fe96085Stim szeto 		    &luProps);
5768fe96085Stim szeto 		if (stmfRet != STMF_STATUS_SUCCESS) {
5778fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5788fe96085Stim szeto 			    gettext("list failed"));
579fcf3ce44SJohn Forte 			return (1);
580fcf3ce44SJohn Forte 		}
5818fe96085Stim szeto 		if (strcmp(luProps.providerName, "sbd") == 0) {
5828fe96085Stim szeto 			sbdLuCnt++;
583fcf3ce44SJohn Forte 		}
584fcf3ce44SJohn Forte 	}
585fcf3ce44SJohn Forte 
586fcf3ce44SJohn Forte 
5878fe96085Stim szeto 	if (sbdLuCnt == 0)
5888fe96085Stim szeto 		return (0);
5898fe96085Stim szeto 
5908fe96085Stim szeto 	(void) printf("\nFound %d LU(s)\n", sbdLuCnt);
591fcf3ce44SJohn Forte 	print_attr_header();
592fcf3ce44SJohn Forte 
5938fe96085Stim szeto 	for (i = 0; i < luList->cnt; i++) {
5948fe96085Stim szeto 		stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
5958fe96085Stim szeto 		    &luProps);
5968fe96085Stim szeto 		if (stmfRet != STMF_STATUS_SUCCESS) {
5978fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5988fe96085Stim szeto 			    gettext("list failed"));
5998fe96085Stim szeto 			return (1);
600fcf3ce44SJohn Forte 		}
6018fe96085Stim szeto 		if (strcmp(luProps.providerName, "sbd") == 0) {
6028fe96085Stim szeto 			(void) print_lu_attr(&luList->guid[i]);
6038fe96085Stim szeto 		}
6048fe96085Stim 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
6298fe96085Stim szeto print_lu_attr(stmfGuid *guid)
630fcf3ce44SJohn Forte {
6318fe96085Stim szeto 	luResource hdl = NULL;
6328fe96085Stim szeto 	int stmfRet = 0;
6338fe96085Stim szeto 	int ret = 0;
6348fe96085Stim szeto 	char propVal[MAXPATHLEN];
6358fe96085Stim szeto 	size_t propValSize = sizeof (propVal);
636fcf3ce44SJohn Forte 
6378fe96085Stim szeto 	if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) {
6388fe96085Stim szeto 		switch (stmfRet) {
6398fe96085Stim szeto 			case STMF_ERROR_BUSY:
6408fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
6418fe96085Stim szeto 				    gettext("resource busy"));
6428fe96085Stim szeto 				break;
6438fe96085Stim szeto 			case STMF_ERROR_PERM:
6448fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
6458fe96085Stim szeto 				    gettext("permission denied"));
6468fe96085Stim szeto 				break;
6478fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
6488fe96085Stim szeto 				/* No error here */
649fcf3ce44SJohn Forte 				return (0);
6508fe96085Stim szeto 				break;
6518fe96085Stim szeto 			default:
6528fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
6538fe96085Stim szeto 				    gettext("get extended properties failed"));
6548fe96085Stim szeto 				break;
655fcf3ce44SJohn Forte 		}
656fcf3ce44SJohn Forte 		return (1);
657fcf3ce44SJohn Forte 	}
6588fe96085Stim szeto 
6598fe96085Stim szeto 	print_guid((uint8_t *)guid, stdout);
6608fe96085Stim szeto 
6618fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal,
6628fe96085Stim szeto 	    &propValSize);
6638fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
6648fe96085Stim szeto 		(void) printf("  %-19s  ", propVal);
6658fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
6668fe96085Stim szeto 		(void) printf("not set\n");
6678fe96085Stim szeto 	} else {
668*45039663SJohn Forte 		(void) printf("<error retrieving property>\n");
6698fe96085Stim szeto 		ret++;
6708fe96085Stim szeto 	}
6718fe96085Stim szeto 
6728fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal,
6738fe96085Stim szeto 	    &propValSize);
6748fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
6758fe96085Stim szeto 		(void) printf("%s\n", propVal);
6768fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
6778fe96085Stim szeto 		(void) printf("not set\n");
6788fe96085Stim szeto 	} else {
679*45039663SJohn Forte 		(void) printf("<error retrieving property>\n");
6808fe96085Stim szeto 		ret++;
6818fe96085Stim szeto 	}
6828fe96085Stim szeto 
6838fe96085Stim szeto 
6848fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
6858fe96085Stim szeto 	return (ret);
6868fe96085Stim szeto }
6878fe96085Stim szeto 
6888fe96085Stim szeto /*
6898fe96085Stim szeto  * input:
6908fe96085Stim szeto  *  execFullName - exec name of program (argv[0])
6918fe96085Stim szeto  *
6928fe96085Stim szeto  *  copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
6938fe96085Stim szeto  *  (changed name to lowerCamelCase to keep consistent with this file)
6948fe96085Stim szeto  *
6958fe96085Stim szeto  * Returns:
6968fe96085Stim szeto  *  command name portion of execFullName
6978fe96085Stim szeto  */
6988fe96085Stim szeto static char *
6998fe96085Stim szeto getExecBasename(char *execFullname)
7008fe96085Stim szeto {
7018fe96085Stim szeto 	char *lastSlash, *execBasename;
7028fe96085Stim szeto 
7038fe96085Stim szeto 	/* guard against '/' at end of command invocation */
7048fe96085Stim szeto 	for (;;) {
7058fe96085Stim szeto 		lastSlash = strrchr(execFullname, '/');
7068fe96085Stim szeto 		if (lastSlash == NULL) {
7078fe96085Stim szeto 			execBasename = execFullname;
7088fe96085Stim szeto 			break;
7098fe96085Stim szeto 		} else {
7108fe96085Stim szeto 			execBasename = lastSlash + 1;
7118fe96085Stim szeto 			if (*execBasename == '\0') {
7128fe96085Stim szeto 				*lastSlash = '\0';
7138fe96085Stim szeto 				continue;
7148fe96085Stim szeto 			}
7158fe96085Stim szeto 			break;
7168fe96085Stim szeto 		}
7178fe96085Stim szeto 	}
7188fe96085Stim szeto 	return (execBasename);
7198fe96085Stim szeto }
7208fe96085Stim szeto int
7218fe96085Stim szeto main(int argc, char *argv[])
7228fe96085Stim szeto {
7238fe96085Stim szeto 	synTables_t synTables;
7248fe96085Stim szeto 	char versionString[VERSION_STRING_MAX_LEN];
7258fe96085Stim szeto 	int ret;
7268fe96085Stim szeto 	int funcRet;
7278fe96085Stim szeto 	void *subcommandArgs = NULL;
7288fe96085Stim szeto 
7298fe96085Stim szeto 	(void) setlocale(LC_ALL, "");
7308fe96085Stim szeto 	(void) textdomain(TEXT_DOMAIN);
7318fe96085Stim szeto 	/* set global command name */
7328fe96085Stim szeto 	cmdName = getExecBasename(argv[0]);
7338fe96085Stim szeto 
7348fe96085Stim szeto 	(void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
7358fe96085Stim szeto 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
7368fe96085Stim szeto 	synTables.versionString = versionString;
7378fe96085Stim szeto 	synTables.longOptionTbl = options;
7388fe96085Stim szeto 	synTables.subCommandPropsTbl = subCommands;
7398fe96085Stim szeto 
7408fe96085Stim szeto 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
7418fe96085Stim szeto 	if (ret != 0) {
7428fe96085Stim szeto 		return (ret);
7438fe96085Stim szeto 	}
7448fe96085Stim szeto 
7458fe96085Stim szeto 	return (funcRet);
7468fe96085Stim szeto } /* end main */
747