xref: /illumos-gate/usr/src/cmd/stmfadm/stmfadm.c (revision 07b415c8)
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 /*
227b506e25Ssrivijitha dugganapalli  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23fcf3ce44SJohn Forte  * Use is subject to license terms.
24439928d9SMilan Jurik  * Copyright 2012 Milan Jurik. All rights reserved.
25fcf3ce44SJohn Forte  */
26fcf3ce44SJohn Forte 
27fcf3ce44SJohn Forte #include <stdlib.h>
28fcf3ce44SJohn Forte #include <stdio.h>
29fcf3ce44SJohn Forte #include <strings.h>
30fcf3ce44SJohn Forte #include <sys/types.h>
31fcf3ce44SJohn Forte #include <unistd.h>
32fcf3ce44SJohn Forte #include <wchar.h>
33fcf3ce44SJohn Forte #include <libintl.h>
34fcf3ce44SJohn Forte #include <errno.h>
35fcf3ce44SJohn Forte #include <time.h>
36fcf3ce44SJohn Forte #include <string.h>
37fcf3ce44SJohn Forte #include <assert.h>
38fcf3ce44SJohn Forte #include <getopt.h>
39fcf3ce44SJohn Forte #include <cmdparse.h>
40fcf3ce44SJohn Forte #include <stmfadm.h>
41fcf3ce44SJohn Forte #include <libstmf.h>
42fcf3ce44SJohn Forte #include <signal.h>
43fcf3ce44SJohn Forte #include <pthread.h>
44fcf3ce44SJohn Forte #include <locale.h>
45fcf3ce44SJohn Forte 
46fcf3ce44SJohn Forte static int addHostGroupMemberFunc(int, char **, cmdOptions_t *, void *);
47fcf3ce44SJohn Forte static int addTargetGroupMemberFunc(int, char **, cmdOptions_t *, void *);
48fcf3ce44SJohn Forte static int addViewFunc(int, char **, cmdOptions_t *, void *);
49fcf3ce44SJohn Forte static int createHostGroupFunc(int, char **, cmdOptions_t *, void *);
508fe96085Stim szeto static int createLuFunc(int, char **, cmdOptions_t *, void *);
518fe96085Stim szeto static int modifyLuFunc(int, char **, cmdOptions_t *, void *);
528fe96085Stim szeto static int importLuFunc(int, char **, cmdOptions_t *, void *);
538fe96085Stim szeto static int deleteLuFunc(int, char **, cmdOptions_t *, void *);
54fcf3ce44SJohn Forte static int createTargetGroupFunc(int, char **, cmdOptions_t *, void *);
55fcf3ce44SJohn Forte static int deleteHostGroupFunc(int, char **, cmdOptions_t *, void *);
56fcf3ce44SJohn Forte static int deleteTargetGroupFunc(int, char **, cmdOptions_t *, void *);
57fcf3ce44SJohn Forte static int listLuFunc(int, char **, cmdOptions_t *, void *);
58fcf3ce44SJohn Forte static int listTargetFunc(int, char **, cmdOptions_t *, void *);
59fcf3ce44SJohn Forte static int listViewFunc(int, char **, cmdOptions_t *, void *);
60fcf3ce44SJohn Forte static int listHostGroupFunc(int, char **, cmdOptions_t *, void *);
61fcf3ce44SJohn Forte static int listStateFunc(int, char **, cmdOptions_t *, void *);
62fcf3ce44SJohn Forte static int listTargetGroupFunc(int, char **, cmdOptions_t *, void *);
63fcf3ce44SJohn Forte static int offlineTargetFunc(int, char **, cmdOptions_t *, void *);
64fcf3ce44SJohn Forte static int offlineLuFunc(int, char **, cmdOptions_t *, void *);
65fcf3ce44SJohn Forte static int onlineTargetFunc(int, char **, cmdOptions_t *, void *);
66fcf3ce44SJohn Forte static int onlineLuFunc(int, char **, cmdOptions_t *, void *);
67fcf3ce44SJohn Forte static int onlineOfflineTarget(char *, int);
68fcf3ce44SJohn Forte static int onlineOfflineLu(char *, int);
69fcf3ce44SJohn Forte static int removeHostGroupMemberFunc(int, char **, cmdOptions_t *, void *);
70fcf3ce44SJohn Forte static int removeTargetGroupMemberFunc(int, char **, cmdOptions_t *, void *);
718fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *);
72fcf3ce44SJohn Forte static int removeViewFunc(int, char **, cmdOptions_t *, void *);
73fcf3ce44SJohn Forte static char *getExecBasename(char *);
74fcf3ce44SJohn Forte static int parseDevid(char *input, stmfDevid *devid);
75fcf3ce44SJohn Forte static void printGroupProps(stmfGroupProperties *groupProps);
76fcf3ce44SJohn Forte static int checkScsiNameString(wchar_t *, stmfDevid *);
77fcf3ce44SJohn Forte static int checkHexUpper(char *);
78fcf3ce44SJohn Forte static int checkIscsiName(wchar_t *);
79fcf3ce44SJohn Forte static void printLuProps(stmfLogicalUnitProperties *luProps);
808fe96085Stim szeto static int printExtLuProps(stmfGuid *guid);
81fcf3ce44SJohn Forte static void printGuid(stmfGuid *guid, FILE *printWhere);
82fcf3ce44SJohn Forte static void printTargetProps(stmfTargetProperties *);
83fcf3ce44SJohn Forte static void printSessionProps(stmfSessionList *);
848fe96085Stim szeto static int setLuPropFromInput(luResource, char *);
858fe96085Stim szeto static int convertCharToPropId(char *, uint32_t *);
86fcf3ce44SJohn Forte 
87fcf3ce44SJohn Forte 
88fcf3ce44SJohn Forte 
89fcf3ce44SJohn Forte /*
90fcf3ce44SJohn Forte  *  MAJOR - This should only change when there is an incompatible change made
91fcf3ce44SJohn Forte  *  to the interfaces or the output.
92fcf3ce44SJohn Forte  *
93fcf3ce44SJohn Forte  *  MINOR - This should change whenever there is a new command or new feature
94fcf3ce44SJohn Forte  *  with no incompatible change.
95fcf3ce44SJohn Forte  */
96fcf3ce44SJohn Forte #define	VERSION_STRING_MAJOR	    "1"
97fcf3ce44SJohn Forte #define	VERSION_STRING_MINOR	    "0"
98fcf3ce44SJohn Forte #define	MAX_DEVID_INPUT		    256
99fcf3ce44SJohn Forte #define	GUID_INPUT		    32
100fcf3ce44SJohn Forte #define	MAX_LU_NBR		    16383
101fcf3ce44SJohn Forte #define	ONLINE_LU		    0
102fcf3ce44SJohn Forte #define	OFFLINE_LU		    1
103fcf3ce44SJohn Forte #define	ONLINE_TARGET		    2
104fcf3ce44SJohn Forte #define	OFFLINE_TARGET		    3
105fcf3ce44SJohn Forte #define	PROPS_FORMAT		    "    %-18s: "
106fcf3ce44SJohn Forte #define	VIEW_FORMAT		    "    %-13s: "
107fcf3ce44SJohn Forte #define	LVL3_FORMAT		    "        %s"
108fcf3ce44SJohn Forte #define	LVL4_FORMAT		    "            %s"
1094f486358SNattuvetty Bhavyan #define	DELAYED_EXEC_WAIT_INTERVAL  300 * 1000 * 1000	/* in nano sec */
1104f486358SNattuvetty Bhavyan #define	DELAYED_EXEC_WAIT_MAX	    30	/* Maximum number of interval times */
111fcf3ce44SJohn Forte 
112fcf3ce44SJohn Forte /* SCSI Name String length definitions */
113fcf3ce44SJohn Forte #define	SNS_EUI_16		    16
114fcf3ce44SJohn Forte #define	SNS_EUI_24		    24
115fcf3ce44SJohn Forte #define	SNS_EUI_32		    32
116fcf3ce44SJohn Forte #define	SNS_NAA_16		    16
117fcf3ce44SJohn Forte #define	SNS_NAA_32		    32
118fcf3ce44SJohn Forte #define	SNS_WWN_16		    16
119fcf3ce44SJohn Forte #define	SNS_IQN_223		    223
120fcf3ce44SJohn Forte 
1218fe96085Stim szeto /* LU Property strings */
1228fe96085Stim szeto #define	GUID			    "GUID"
1238fe96085Stim szeto #define	ALIAS			    "ALIAS"
1248fe96085Stim szeto #define	VID			    "VID"
1258fe96085Stim szeto #define	PID			    "PID"
1268fe96085Stim szeto #define	META_FILE		    "META"
1278fe96085Stim szeto #define	WRITE_PROTECT		    "WP"
1288fe96085Stim szeto #define	WRITEBACK_CACHE_DISABLE	    "WCD"
1298fe96085Stim szeto #define	COMPANY_ID		    "OUI"
1308fe96085Stim szeto #define	BLOCK_SIZE		    "BLK"
1318fe96085Stim szeto #define	SERIAL_NUMBER		    "SERIAL"
1322f624233SNattuvetty Bhavyan #define	MGMT_URL		    "MGMT-URL"
133fdcc480aSJohn Forte #define	HOST_ID			    "HOST-ID"
1348fe96085Stim szeto 
1354f486358SNattuvetty Bhavyan #define	STMFADM_SUCCESS		    0
1364f486358SNattuvetty Bhavyan #define	STMFADM_FAILURE		    1
1374f486358SNattuvetty Bhavyan 
1388fe96085Stim szeto #define	MODIFY_HELP "\n"\
1398fe96085Stim szeto "Description: Modify properties of a logical unit. \n" \
1408fe96085Stim szeto "Valid properties for -p, --lu-prop are: \n" \
1412f624233SNattuvetty Bhavyan "     alias    - alias for logical unit (up to 255 chars)\n" \
1422f624233SNattuvetty Bhavyan "     mgmt-url - Management URL address\n" \
1432f624233SNattuvetty Bhavyan "     wcd      - write cache disabled (true, false)\n" \
1442f624233SNattuvetty Bhavyan "     wp       - write protect (true, false)\n\n" \
1458fe96085Stim szeto "-f alters the meaning of the operand to be a file name\n" \
1468fe96085Stim szeto "rather than a LU name. This allows for modification\n" \
1478fe96085Stim szeto "of a logical unit that is not yet imported into stmf\n"
1488fe96085Stim szeto 
1498fe96085Stim szeto #define	CREATE_HELP "\n"\
1508fe96085Stim szeto "Description: Create a logical unit. \n" \
1518fe96085Stim szeto "Valid properties for -p, --lu-prop are: \n" \
1522f624233SNattuvetty Bhavyan "     alias    - alias for logical unit (up to 255 chars)\n" \
1532f624233SNattuvetty Bhavyan "     blk      - block size in bytes in 2^n\n" \
1542f624233SNattuvetty Bhavyan "     guid     - 32 ascii hex characters in NAA format \n" \
155fdcc480aSJohn Forte "     host-id  - host identifier to be used for GUID generation \n" \
156fdcc480aSJohn Forte "                8 ascii hex characters\n" \
1572f624233SNattuvetty Bhavyan "     meta     - separate meta data file name\n" \
1582f624233SNattuvetty Bhavyan "     mgmt-url - Management URL address\n" \
1592f624233SNattuvetty Bhavyan "     oui      - organizational unique identifier\n" \
1602f624233SNattuvetty Bhavyan "                6 ascii hex characters of valid format\n" \
1612f624233SNattuvetty Bhavyan "     pid      - product identifier (up to 16 chars)\n" \
1622f624233SNattuvetty Bhavyan "     serial   - serial number (up to 252 chars)\n" \
1632f624233SNattuvetty Bhavyan "     vid      - vendor identifier (up to 8 chars)\n" \
1642f624233SNattuvetty Bhavyan "     wcd      - write cache disabled (true, false)\n" \
1652f624233SNattuvetty Bhavyan "     wp       - write protect (true, false)\n"
1668fe96085Stim szeto #define	ADD_VIEW_HELP "\n"\
1678fe96085Stim szeto "Description: Add a view entry to a logical unit. \n" \
1688fe96085Stim szeto "A view entry is comprised of three elements; the \n" \
1698fe96085Stim szeto "logical unit number, the target group name and the\n" \
1708fe96085Stim szeto "host group name. These three elements combine together\n" \
1718fe96085Stim szeto "to form a view for a given COMSTAR logical unit.\n" \
1728fe96085Stim szeto "This view is realized by a client, a SCSI initiator,\n" \
1738fe96085Stim szeto "via a REPORT LUNS command. \n"
1748fe96085Stim szeto 
1758fe96085Stim szeto 
1768fe96085Stim szeto 
177fcf3ce44SJohn Forte /* tables set up based on cmdparse instructions */
178fcf3ce44SJohn Forte 
179fcf3ce44SJohn Forte /* add new options here */
180fcf3ce44SJohn Forte optionTbl_t longOptions[] = {
181fcf3ce44SJohn Forte 	{"all", no_arg, 'a', NULL},
182fcf3ce44SJohn Forte 	{"group-name", required_arg, 'g', "group-name"},
1838fe96085Stim szeto 	{"keep-views", no_arg, 'k', NULL},
184fcf3ce44SJohn Forte 	{"lu-name", required_arg, 'l', "LU-Name"},
185fcf3ce44SJohn Forte 	{"lun", required_arg, 'n', "logical-unit-number"},
1868fe96085Stim szeto 	{"lu-prop", required_arg, 'p', "logical-unit-property=value"},
1878fe96085Stim szeto 	{"file", no_arg, 'f', "filename"},
1888fe96085Stim szeto 	{"size", required_arg, 's', "size K/M/G/T/P"},
189fcf3ce44SJohn Forte 	{"target-group", required_arg, 't', "group-name"},
190fcf3ce44SJohn Forte 	{"host-group", required_arg, 'h', "group-name"},
1918fe96085Stim szeto 	{"verbose", no_arg, 'v', NULL},
192fcf3ce44SJohn Forte 	{NULL, 0, 0, 0}
193fcf3ce44SJohn Forte };
194fcf3ce44SJohn Forte 
195fcf3ce44SJohn Forte /*
196fcf3ce44SJohn Forte  * Add new subcommands here
197fcf3ce44SJohn Forte  */
198fcf3ce44SJohn Forte subCommandProps_t subcommands[] = {
199fcf3ce44SJohn Forte 	{"add-hg-member", addHostGroupMemberFunc, "g", "g", NULL,
2008fe96085Stim szeto 		OPERAND_MANDATORY_MULTIPLE, OPERANDSTRING_GROUP_MEMBER, NULL},
201fcf3ce44SJohn Forte 	{"add-tg-member", addTargetGroupMemberFunc, "g", "g", NULL,
2028fe96085Stim szeto 		OPERAND_MANDATORY_MULTIPLE, OPERANDSTRING_GROUP_MEMBER, NULL},
203fcf3ce44SJohn Forte 	{"add-view", addViewFunc, "nth", NULL, NULL,
2048fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_LU, ADD_VIEW_HELP},
205fcf3ce44SJohn Forte 	{"create-hg", createHostGroupFunc, NULL, NULL, NULL,
2068fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_GROUP_NAME, NULL},
207fcf3ce44SJohn Forte 	{"create-tg", createTargetGroupFunc, NULL, NULL, NULL,
2088fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_GROUP_NAME, NULL},
2098fe96085Stim szeto 	{"create-lu", createLuFunc, "ps", NULL, NULL, OPERAND_MANDATORY_SINGLE,
2108fe96085Stim szeto 		"lu file", CREATE_HELP},
211fcf3ce44SJohn Forte 	{"delete-hg", deleteHostGroupFunc, NULL, NULL, NULL,
2128fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_GROUP_NAME, NULL},
2138fe96085Stim szeto 	{"modify-lu", modifyLuFunc, "psf", NULL, NULL, OPERAND_MANDATORY_SINGLE,
2148fe96085Stim szeto 		OPERANDSTRING_LU, MODIFY_HELP},
2158fe96085Stim szeto 	{"delete-lu", deleteLuFunc, "k", NULL, NULL,
2168fe96085Stim szeto 		OPERAND_MANDATORY_MULTIPLE, OPERANDSTRING_LU, NULL},
217fcf3ce44SJohn Forte 	{"delete-tg", deleteTargetGroupFunc, NULL, NULL, NULL,
2188fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_GROUP_NAME, NULL},
2198fe96085Stim szeto 	{"import-lu", importLuFunc, NULL, NULL, NULL,
2208fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, "file name", NULL},
221fcf3ce44SJohn Forte 	{"list-hg", listHostGroupFunc, "v", NULL, NULL,
2228fe96085Stim szeto 		OPERAND_OPTIONAL_MULTIPLE, OPERANDSTRING_GROUP_NAME, NULL},
223fcf3ce44SJohn Forte 	{"list-lu", listLuFunc, "v", NULL, NULL, OPERAND_OPTIONAL_MULTIPLE,
2248fe96085Stim szeto 		OPERANDSTRING_LU, NULL},
225fcf3ce44SJohn Forte 	{"list-state", listStateFunc, NULL, NULL, NULL, OPERAND_NONE, NULL},
226fcf3ce44SJohn Forte 	{"list-target", listTargetFunc, "v", NULL, NULL,
2278fe96085Stim szeto 		OPERAND_OPTIONAL_MULTIPLE, OPERANDSTRING_TARGET, NULL},
228fcf3ce44SJohn Forte 	{"list-tg", listTargetGroupFunc, "v", NULL, NULL,
2298fe96085Stim szeto 		OPERAND_OPTIONAL_MULTIPLE, OPERANDSTRING_GROUP_NAME, NULL},
230fcf3ce44SJohn Forte 	{"list-view", listViewFunc, "l", "l", NULL,
2318fe96085Stim szeto 		OPERAND_OPTIONAL_MULTIPLE, OPERANDSTRING_VIEW_ENTRY, NULL},
232fcf3ce44SJohn Forte 	{"online-lu", onlineLuFunc, NULL, NULL, NULL,
2338fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_LU, NULL},
234fcf3ce44SJohn Forte 	{"offline-lu", offlineLuFunc, NULL, NULL, NULL,
2358fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_LU, NULL},
236fcf3ce44SJohn Forte 	{"online-target", onlineTargetFunc, NULL, NULL, NULL,
2378fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_TARGET, NULL},
238fcf3ce44SJohn Forte 	{"offline-target", offlineTargetFunc, NULL, NULL, NULL,
2398fe96085Stim szeto 		OPERAND_MANDATORY_SINGLE, OPERANDSTRING_TARGET, NULL},
240fcf3ce44SJohn Forte 	{"remove-hg-member", removeHostGroupMemberFunc, "g", "g", NULL,
2418fe96085Stim szeto 		OPERAND_MANDATORY_MULTIPLE, OPERANDSTRING_GROUP_MEMBER, NULL},
242fcf3ce44SJohn Forte 	{"remove-tg-member", removeTargetGroupMemberFunc, "g", "g", NULL,
2438fe96085Stim szeto 		OPERAND_MANDATORY_MULTIPLE, OPERANDSTRING_GROUP_MEMBER, NULL},
244fcf3ce44SJohn Forte 	{"remove-view", removeViewFunc, "la", "l", NULL,
2458fe96085Stim szeto 		OPERAND_OPTIONAL_MULTIPLE, OPERANDSTRING_VIEW_ENTRY, NULL},
246*07b415c8SToomas Soome 	{NULL, 0, NULL, NULL, 0, 0, 0, NULL, 0}
247fcf3ce44SJohn Forte };
248fcf3ce44SJohn Forte 
249fcf3ce44SJohn Forte /* globals */
250fcf3ce44SJohn Forte char *cmdName;
251fcf3ce44SJohn Forte 
252fcf3ce44SJohn Forte /*
253fcf3ce44SJohn Forte  * addHostGroupMemberFunc
254fcf3ce44SJohn Forte  *
255fcf3ce44SJohn Forte  * Add members to a host group
256fcf3ce44SJohn Forte  *
257fcf3ce44SJohn Forte  */
258fcf3ce44SJohn Forte /*ARGSUSED*/
259fcf3ce44SJohn Forte static int
addHostGroupMemberFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)260fcf3ce44SJohn Forte addHostGroupMemberFunc(int operandLen, char *operands[], cmdOptions_t *options,
261fcf3ce44SJohn Forte     void *args)
262fcf3ce44SJohn Forte {
263fcf3ce44SJohn Forte 	int i;
264fcf3ce44SJohn Forte 	int ret = 0;
265fcf3ce44SJohn Forte 	int stmfRet;
2663e7352aeSJohn Forte 	stmfGroupName groupName = {0};
2673e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
268fcf3ce44SJohn Forte 	stmfDevid devid;
269fcf3ce44SJohn Forte 
270fcf3ce44SJohn Forte 	for (; options->optval; options++) {
271fcf3ce44SJohn Forte 		switch (options->optval) {
272fcf3ce44SJohn Forte 			/* host group name */
273fcf3ce44SJohn Forte 			case 'g':
274fcf3ce44SJohn Forte 				(void) mbstowcs(groupNamePrint, options->optarg,
2753e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
276fcf3ce44SJohn Forte 				bcopy(options->optarg, groupName,
277fcf3ce44SJohn Forte 				    strlen(options->optarg));
278fcf3ce44SJohn Forte 				break;
279fcf3ce44SJohn Forte 			default:
280fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
281fcf3ce44SJohn Forte 				    cmdName, options->optval,
282fcf3ce44SJohn Forte 				    gettext("unknown option"));
283fcf3ce44SJohn Forte 				return (1);
284fcf3ce44SJohn Forte 		}
285fcf3ce44SJohn Forte 	}
286fcf3ce44SJohn Forte 
287fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
288fcf3ce44SJohn Forte 		if (parseDevid(operands[i], &devid) != 0) {
289fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
290fcf3ce44SJohn Forte 			    cmdName, operands[i],
291fcf3ce44SJohn Forte 			    gettext("unrecognized device id"));
292fcf3ce44SJohn Forte 			ret++;
293fcf3ce44SJohn Forte 			continue;
294fcf3ce44SJohn Forte 		}
295fcf3ce44SJohn Forte 		stmfRet = stmfAddToHostGroup(&groupName, &devid);
296fcf3ce44SJohn Forte 		switch (stmfRet) {
297fcf3ce44SJohn Forte 			case STMF_STATUS_SUCCESS:
298fcf3ce44SJohn Forte 				break;
299fcf3ce44SJohn Forte 			case STMF_ERROR_EXISTS:
300fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
301fcf3ce44SJohn Forte 				    operands[i], gettext("already exists"));
302fcf3ce44SJohn Forte 				ret++;
303fcf3ce44SJohn Forte 				break;
304fcf3ce44SJohn Forte 			case STMF_ERROR_GROUP_NOT_FOUND:
305fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
306fcf3ce44SJohn Forte 				    groupNamePrint, gettext("not found"));
307fcf3ce44SJohn Forte 				ret++;
308fcf3ce44SJohn Forte 				break;
309fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
310fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
311fcf3ce44SJohn Forte 				    gettext("permission denied"));
3127b506e25Ssrivijitha dugganapalli 				ret++;
313fcf3ce44SJohn Forte 				break;
314fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
315fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
316fcf3ce44SJohn Forte 				    operands[i], gettext("resource busy"));
317fcf3ce44SJohn Forte 				ret++;
318fcf3ce44SJohn Forte 				break;
319fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
320fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
321fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
322fcf3ce44SJohn Forte 				ret++;
323fcf3ce44SJohn Forte 				break;
324fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
325fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
326fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
327fcf3ce44SJohn Forte 				ret++;
328fcf3ce44SJohn Forte 				break;
329fcf3ce44SJohn Forte 			default:
330fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
331fcf3ce44SJohn Forte 				    operands[i], gettext("unknown error"));
332fcf3ce44SJohn Forte 				ret++;
333fcf3ce44SJohn Forte 				break;
334fcf3ce44SJohn Forte 		}
335fcf3ce44SJohn Forte 	}
336fcf3ce44SJohn Forte 
337fcf3ce44SJohn Forte 	return (ret);
338fcf3ce44SJohn Forte }
339fcf3ce44SJohn Forte 
340fcf3ce44SJohn Forte /*
341fcf3ce44SJohn Forte  * addTargetGroupMemberFunc
342fcf3ce44SJohn Forte  *
343fcf3ce44SJohn Forte  * Add members to a target group
344fcf3ce44SJohn Forte  *
345fcf3ce44SJohn Forte  */
346fcf3ce44SJohn Forte /*ARGSUSED*/
347fcf3ce44SJohn Forte static int
addTargetGroupMemberFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)348fcf3ce44SJohn Forte addTargetGroupMemberFunc(int operandLen, char *operands[],
349fcf3ce44SJohn Forte     cmdOptions_t *options, void *args)
350fcf3ce44SJohn Forte {
351fcf3ce44SJohn Forte 	int i;
352fcf3ce44SJohn Forte 	int ret = 0;
353fcf3ce44SJohn Forte 	int stmfRet;
3543e7352aeSJohn Forte 	stmfGroupName groupName = {0};
3553e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
356fcf3ce44SJohn Forte 	stmfDevid devid;
357fcf3ce44SJohn Forte 
358fcf3ce44SJohn Forte 	for (; options->optval; options++) {
359fcf3ce44SJohn Forte 		switch (options->optval) {
360fcf3ce44SJohn Forte 			/* target group name */
361fcf3ce44SJohn Forte 			case 'g':
362fcf3ce44SJohn Forte 				(void) mbstowcs(groupNamePrint, options->optarg,
3633e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
364fcf3ce44SJohn Forte 				bcopy(options->optarg, groupName,
365fcf3ce44SJohn Forte 				    strlen(options->optarg));
366fcf3ce44SJohn Forte 				break;
367fcf3ce44SJohn Forte 			default:
368fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
369fcf3ce44SJohn Forte 				    cmdName, options->optval,
370fcf3ce44SJohn Forte 				    gettext("unknown option"));
371fcf3ce44SJohn Forte 				return (1);
372fcf3ce44SJohn Forte 		}
373fcf3ce44SJohn Forte 	}
374fcf3ce44SJohn Forte 
375fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
376fcf3ce44SJohn Forte 		if (parseDevid(operands[i], &devid) != 0) {
377fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
378fcf3ce44SJohn Forte 			    cmdName, operands[i],
379fcf3ce44SJohn Forte 			    gettext("unrecognized device id"));
380fcf3ce44SJohn Forte 			ret++;
381fcf3ce44SJohn Forte 			continue;
382fcf3ce44SJohn Forte 		}
383fcf3ce44SJohn Forte 		stmfRet = stmfAddToTargetGroup(&groupName, &devid);
384fcf3ce44SJohn Forte 		switch (stmfRet) {
385fcf3ce44SJohn Forte 			case STMF_STATUS_SUCCESS:
386fcf3ce44SJohn Forte 				break;
387fcf3ce44SJohn Forte 			case STMF_ERROR_EXISTS:
388fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
389fcf3ce44SJohn Forte 				    operands[i], gettext("already exists"));
390fcf3ce44SJohn Forte 				ret++;
391fcf3ce44SJohn Forte 				break;
392fcf3ce44SJohn Forte 			case STMF_ERROR_GROUP_NOT_FOUND:
393fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
394fcf3ce44SJohn Forte 				    groupNamePrint, gettext("not found"));
395fcf3ce44SJohn Forte 				ret++;
396fcf3ce44SJohn Forte 				break;
397fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
398fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
399fcf3ce44SJohn Forte 				    gettext("permission denied"));
4007b506e25Ssrivijitha dugganapalli 				ret++;
401fcf3ce44SJohn Forte 				break;
402fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
403fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
404fcf3ce44SJohn Forte 				    operands[i], gettext("resource busy"));
405fcf3ce44SJohn Forte 				ret++;
406fcf3ce44SJohn Forte 				break;
407fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
408fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
409fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
410fcf3ce44SJohn Forte 				ret++;
411fcf3ce44SJohn Forte 				break;
412fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_ONLINE:
413fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
414fcf3ce44SJohn Forte 				    gettext("STMF service must be offline"));
415fcf3ce44SJohn Forte 				ret++;
416fcf3ce44SJohn Forte 				break;
417fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
418fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
419fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
420fcf3ce44SJohn Forte 				ret++;
421fcf3ce44SJohn Forte 				break;
422f80ea9bbStim szeto 			case STMF_ERROR_TG_ONLINE:
423f80ea9bbStim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
424f80ea9bbStim szeto 				    gettext("STMF target must be offline"));
425f80ea9bbStim szeto 				ret++;
426f80ea9bbStim szeto 				break;
427fcf3ce44SJohn Forte 			default:
428fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
429fcf3ce44SJohn Forte 				    operands[i], gettext("unknown error"));
430fcf3ce44SJohn Forte 				ret++;
431fcf3ce44SJohn Forte 				break;
432fcf3ce44SJohn Forte 		}
433fcf3ce44SJohn Forte 	}
434fcf3ce44SJohn Forte 
435fcf3ce44SJohn Forte 	return (ret);
436fcf3ce44SJohn Forte }
437fcf3ce44SJohn Forte 
438fcf3ce44SJohn Forte /*
439fcf3ce44SJohn Forte  * parseDevid
440fcf3ce44SJohn Forte  *
441fcf3ce44SJohn Forte  * Converts char * input to a stmfDevid
442fcf3ce44SJohn Forte  *
443fcf3ce44SJohn Forte  * input - this should be in the following format with either a
444fcf3ce44SJohn Forte  * wwn. iqn. or eui. representation.
445fcf3ce44SJohn Forte  * A name string of the format:
446fcf3ce44SJohn Forte  *	wwn.<WWN> (FC/SAS address)
447fcf3ce44SJohn Forte  *	iqn.<iSCSI name> (iSCSI iqn)
448fcf3ce44SJohn Forte  *	eui.<WWN> (iSCSI eui name)
449fcf3ce44SJohn Forte  *
450fcf3ce44SJohn Forte  * devid - pointer to stmfDevid structure allocated by the caller.
451fcf3ce44SJohn Forte  *
452fcf3ce44SJohn Forte  * Returns:
453fcf3ce44SJohn Forte  *  0 on success
454fcf3ce44SJohn Forte  *  non-zero on failure
455fcf3ce44SJohn Forte  */
456fcf3ce44SJohn Forte static int
parseDevid(char * input,stmfDevid * devid)457fcf3ce44SJohn Forte parseDevid(char *input, stmfDevid *devid)
458fcf3ce44SJohn Forte {
4593e7352aeSJohn Forte 	wchar_t inputWc[MAX_DEVID_INPUT + 1] = {0};
460fcf3ce44SJohn Forte 
461fcf3ce44SJohn Forte 	/* convert to wcs */
4623e7352aeSJohn Forte 	(void) mbstowcs(inputWc, input, MAX_DEVID_INPUT);
463fcf3ce44SJohn Forte 
464fcf3ce44SJohn Forte 	/*
465fcf3ce44SJohn Forte 	 * Check for known scsi name string formats
466fcf3ce44SJohn Forte 	 * If one is found, we're done
467fcf3ce44SJohn Forte 	 * If not, then it's a failure to parse
468fcf3ce44SJohn Forte 	 */
469fcf3ce44SJohn Forte 	if (checkScsiNameString(inputWc, devid) == 0) {
470fcf3ce44SJohn Forte 		return (0);
471fcf3ce44SJohn Forte 	}
472fcf3ce44SJohn Forte 
473fcf3ce44SJohn Forte 	return (-1);
474fcf3ce44SJohn Forte }
475fcf3ce44SJohn Forte 
476fcf3ce44SJohn Forte /*
477fcf3ce44SJohn Forte  * checkScsiNameString
478fcf3ce44SJohn Forte  *
479fcf3ce44SJohn Forte  * Validates known SCSI name string formats and converts to stmfDevid
480fcf3ce44SJohn Forte  * format
481fcf3ce44SJohn Forte  *
482fcf3ce44SJohn Forte  * input - input SCSI name string
483fcf3ce44SJohn Forte  * devid - pointer to stmfDevid structure allocated by the caller
484fcf3ce44SJohn Forte  *         on successful return, contains the devid based on input
485fcf3ce44SJohn Forte  *
486fcf3ce44SJohn Forte  * returns:
487fcf3ce44SJohn Forte  *         0 on success
488fcf3ce44SJohn Forte  *         -1 on failure
489fcf3ce44SJohn Forte  */
490fcf3ce44SJohn Forte static int
checkScsiNameString(wchar_t * input,stmfDevid * devid)491fcf3ce44SJohn Forte checkScsiNameString(wchar_t *input, stmfDevid *devid)
492fcf3ce44SJohn Forte {
493fcf3ce44SJohn Forte 	char *mbString = NULL;
494fcf3ce44SJohn Forte 	int mbStringLen;
495fcf3ce44SJohn Forte 	int len;
496fcf3ce44SJohn Forte 	int i;
497fcf3ce44SJohn Forte 
498fcf3ce44SJohn Forte 	/*
499fcf3ce44SJohn Forte 	 * Convert to multi-byte string
500fcf3ce44SJohn Forte 	 *
501fcf3ce44SJohn Forte 	 * This is used for either eui or naa formats
502fcf3ce44SJohn Forte 	 */
503fcf3ce44SJohn Forte 	mbString = calloc(1, (mbStringLen = wcstombs(mbString, input, 0)) + 1);
504fcf3ce44SJohn Forte 	if (mbString == NULL) {
505fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
506fcf3ce44SJohn Forte 		    cmdName, "Insufficient memory\n");
507fcf3ce44SJohn Forte 		return (-1);
508fcf3ce44SJohn Forte 	}
509fcf3ce44SJohn Forte 	if (wcstombs(mbString, input, mbStringLen) == (size_t)-1) {
510fcf3ce44SJohn Forte 		return (-1);
511fcf3ce44SJohn Forte 	}
512fcf3ce44SJohn Forte 
513fcf3ce44SJohn Forte 	/*
514fcf3ce44SJohn Forte 	 * check for iqn format
515fcf3ce44SJohn Forte 	 */
516fcf3ce44SJohn Forte 	if (strncmp(mbString, "iqn.", 4) == 0) {
517fcf3ce44SJohn Forte 		if ((len = strlen(mbString)) > (SNS_IQN_223)) {
518fcf3ce44SJohn Forte 			return (-1);
519fcf3ce44SJohn Forte 		}
520fcf3ce44SJohn Forte 		for (i = 0; i < len; i++) {
521fcf3ce44SJohn Forte 			mbString[i] = tolower(mbString[i]);
522fcf3ce44SJohn Forte 		}
523fcf3ce44SJohn Forte 		if (checkIscsiName(input + 4) != 0) {
524fcf3ce44SJohn Forte 			return (-1);
525fcf3ce44SJohn Forte 		}
526fcf3ce44SJohn Forte 	} else if (strncmp(mbString, "wwn.", 4) == 0) {
527fcf3ce44SJohn Forte 		if ((len = strlen(mbString + 4)) != SNS_WWN_16) {
528fcf3ce44SJohn Forte 			return (-1);
529fcf3ce44SJohn Forte 		} else if (checkHexUpper(mbString + 4) != 0) {
530fcf3ce44SJohn Forte 			return (-1);
531fcf3ce44SJohn Forte 		}
532fcf3ce44SJohn Forte 	} else if (strncmp(mbString, "eui.", 4) == 0) {
533fcf3ce44SJohn Forte 		if ((len = strlen(mbString + 4)) != SNS_EUI_16) {
534fcf3ce44SJohn Forte 			return (-1);
535fcf3ce44SJohn Forte 		} else if (checkHexUpper(mbString + 4) != 0) {
536fcf3ce44SJohn Forte 			return (-1);
537fcf3ce44SJohn Forte 		}
538fcf3ce44SJohn Forte 	} else {
539fcf3ce44SJohn Forte 		return (-1);
540fcf3ce44SJohn Forte 	}
541fcf3ce44SJohn Forte 
542fcf3ce44SJohn Forte 	/*
543fcf3ce44SJohn Forte 	 * We have a validated name string.
544fcf3ce44SJohn Forte 	 * Go ahead and set the length and copy it.
545fcf3ce44SJohn Forte 	 */
546fcf3ce44SJohn Forte 	devid->identLength = strlen(mbString);
547fcf3ce44SJohn Forte 	bzero(devid->ident, STMF_IDENT_LENGTH);
548fcf3ce44SJohn Forte 	bcopy(mbString, devid->ident, devid->identLength);
549fcf3ce44SJohn Forte 
550fcf3ce44SJohn Forte 	return (0);
551fcf3ce44SJohn Forte }
552fcf3ce44SJohn Forte 
553fcf3ce44SJohn Forte 
554fcf3ce44SJohn Forte /*
555fcf3ce44SJohn Forte  * Checks whether the entire string is in hex and converts to upper
556fcf3ce44SJohn Forte  */
557fcf3ce44SJohn Forte static int
checkHexUpper(char * input)558fcf3ce44SJohn Forte checkHexUpper(char *input)
559fcf3ce44SJohn Forte {
560fcf3ce44SJohn Forte 	int i;
561fcf3ce44SJohn Forte 
562fcf3ce44SJohn Forte 	for (i = 0; i < strlen(input); i++) {
563fcf3ce44SJohn Forte 		if (isxdigit(input[i])) {
564fcf3ce44SJohn Forte 			input[i] = toupper(input[i]);
565fcf3ce44SJohn Forte 			continue;
566fcf3ce44SJohn Forte 		}
567fcf3ce44SJohn Forte 		return (-1);
568fcf3ce44SJohn Forte 	}
569fcf3ce44SJohn Forte 
570fcf3ce44SJohn Forte 	return (0);
571fcf3ce44SJohn Forte }
572fcf3ce44SJohn Forte 
573fcf3ce44SJohn Forte /*
574fcf3ce44SJohn Forte  * checkIscsiName
575fcf3ce44SJohn Forte  *
576fcf3ce44SJohn Forte  * Purpose: Basic string checking on name
577fcf3ce44SJohn Forte  */
578fcf3ce44SJohn Forte static int
checkIscsiName(wchar_t * input)579fcf3ce44SJohn Forte checkIscsiName(wchar_t *input)
580fcf3ce44SJohn Forte {
581fcf3ce44SJohn Forte 	int i;
582fcf3ce44SJohn Forte 
583fcf3ce44SJohn Forte 	for (i = 0; input[i] != 0; i++) {
584fcf3ce44SJohn Forte 		if (!iswalnum(input[i]) && input[i] != '-' &&
585fcf3ce44SJohn Forte 		    input[i] != '.' && input[i] != ':') {
586fcf3ce44SJohn Forte 			return (-1);
587fcf3ce44SJohn Forte 		}
588fcf3ce44SJohn Forte 	}
589fcf3ce44SJohn Forte 
590fcf3ce44SJohn Forte 	return (0);
591fcf3ce44SJohn Forte }
592fcf3ce44SJohn Forte 
593fcf3ce44SJohn Forte 
594fcf3ce44SJohn Forte /*
595fcf3ce44SJohn Forte  * addViewFunc
596fcf3ce44SJohn Forte  *
597fcf3ce44SJohn Forte  * Adds a view entry to a logical unit
598fcf3ce44SJohn Forte  *
599fcf3ce44SJohn Forte  */
600fcf3ce44SJohn Forte /*ARGSUSED*/
601fcf3ce44SJohn Forte static int
addViewFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)602fcf3ce44SJohn Forte addViewFunc(int operandLen, char *operands[], cmdOptions_t *options,
603fcf3ce44SJohn Forte     void *args)
604fcf3ce44SJohn Forte {
605fcf3ce44SJohn Forte 	stmfViewEntry viewEntry;
606fcf3ce44SJohn Forte 	stmfGuid inGuid;
607fcf3ce44SJohn Forte 	unsigned int guid[sizeof (stmfGuid)];
608fcf3ce44SJohn Forte 	uint16_t inputLuNbr;
609fcf3ce44SJohn Forte 	int ret = 0;
610fcf3ce44SJohn Forte 	int stmfRet;
611fcf3ce44SJohn Forte 	int i;
612fcf3ce44SJohn Forte 	char sGuid[GUID_INPUT + 1];
613fcf3ce44SJohn Forte 
614fcf3ce44SJohn Forte 	bzero(&viewEntry, sizeof (viewEntry));
615fcf3ce44SJohn Forte 	/* init view entry structure */
616fcf3ce44SJohn Forte 	viewEntry.allHosts = B_TRUE;
617fcf3ce44SJohn Forte 	viewEntry.allTargets = B_TRUE;
618fcf3ce44SJohn Forte 	viewEntry.luNbrValid = B_FALSE;
619fcf3ce44SJohn Forte 
620fcf3ce44SJohn Forte 	/* check input length */
621fcf3ce44SJohn Forte 	if (strlen(operands[0]) != GUID_INPUT) {
622fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0],
623fcf3ce44SJohn Forte 		    gettext("must be "), GUID_INPUT,
624fcf3ce44SJohn Forte 		    gettext(" hexadecimal digits"));
625fcf3ce44SJohn Forte 		return (1);
626fcf3ce44SJohn Forte 	}
627fcf3ce44SJohn Forte 
628fcf3ce44SJohn Forte 	for (; options->optval; options++) {
629fcf3ce44SJohn Forte 		switch (options->optval) {
630fcf3ce44SJohn Forte 			/* logical unit number */
631fcf3ce44SJohn Forte 			case 'n':
632fcf3ce44SJohn Forte 				viewEntry.luNbrValid = B_TRUE;
633fcf3ce44SJohn Forte 				inputLuNbr = atoi(options->optarg);
634fcf3ce44SJohn Forte 				if (inputLuNbr > MAX_LU_NBR) {
635fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %d: %s\n",
636fcf3ce44SJohn Forte 					    cmdName, inputLuNbr,
637fcf3ce44SJohn Forte 					    gettext("Logical unit number"
638fcf3ce44SJohn Forte 					    " must be less than 16384"));
639fcf3ce44SJohn Forte 					return (1);
640fcf3ce44SJohn Forte 				}
641fcf3ce44SJohn Forte 				viewEntry.luNbr[0] = inputLuNbr >> 8;
642fcf3ce44SJohn Forte 				viewEntry.luNbr[1] = inputLuNbr & 0xff;
643fcf3ce44SJohn Forte 				break;
644fcf3ce44SJohn Forte 			/* host group */
645fcf3ce44SJohn Forte 			case 'h':
646fcf3ce44SJohn Forte 				viewEntry.allHosts = B_FALSE;
647fcf3ce44SJohn Forte 				bcopy(options->optarg, viewEntry.hostGroup,
648fcf3ce44SJohn Forte 				    strlen(options->optarg));
649fcf3ce44SJohn Forte 				break;
650fcf3ce44SJohn Forte 			/* target group */
651fcf3ce44SJohn Forte 			case 't':
652fcf3ce44SJohn Forte 				viewEntry.allTargets = B_FALSE;
653fcf3ce44SJohn Forte 				bcopy(options->optarg, viewEntry.targetGroup,
654fcf3ce44SJohn Forte 				    strlen(options->optarg));
655fcf3ce44SJohn Forte 				break;
656fcf3ce44SJohn Forte 			default:
657fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
658fcf3ce44SJohn Forte 				    cmdName, options->optval,
659fcf3ce44SJohn Forte 				    gettext("unknown option"));
660fcf3ce44SJohn Forte 				return (1);
661fcf3ce44SJohn Forte 		}
662fcf3ce44SJohn Forte 	}
663fcf3ce44SJohn Forte 
664fcf3ce44SJohn Forte 	/* convert to lower case for scan */
665fcf3ce44SJohn Forte 	for (i = 0; i < 32; i++)
666fcf3ce44SJohn Forte 		sGuid[i] = tolower(operands[0][i]);
667fcf3ce44SJohn Forte 	sGuid[i] = 0;
668fcf3ce44SJohn Forte 
669fcf3ce44SJohn Forte 	(void) sscanf(sGuid, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
670fcf3ce44SJohn Forte 	    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
671fcf3ce44SJohn Forte 	    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], &guid[11],
672fcf3ce44SJohn Forte 	    &guid[12], &guid[13], &guid[14], &guid[15]);
673fcf3ce44SJohn Forte 
674fcf3ce44SJohn Forte 	for (i = 0; i < sizeof (stmfGuid); i++) {
675fcf3ce44SJohn Forte 		inGuid.guid[i] = guid[i];
676fcf3ce44SJohn Forte 	}
677fcf3ce44SJohn Forte 
678fcf3ce44SJohn Forte 	/* add the view entry */
679fcf3ce44SJohn Forte 	stmfRet = stmfAddViewEntry(&inGuid, &viewEntry);
680fcf3ce44SJohn Forte 	switch (stmfRet) {
681fcf3ce44SJohn Forte 		case STMF_STATUS_SUCCESS:
682fcf3ce44SJohn Forte 			break;
683fcf3ce44SJohn Forte 		case STMF_ERROR_EXISTS:
684fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
685fcf3ce44SJohn Forte 			    operands[0], gettext("already exists"));
686fcf3ce44SJohn Forte 			ret++;
687fcf3ce44SJohn Forte 			break;
688fcf3ce44SJohn Forte 		case STMF_ERROR_BUSY:
689fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
690fcf3ce44SJohn Forte 			    operands[0], gettext("resource busy"));
691fcf3ce44SJohn Forte 			ret++;
692fcf3ce44SJohn Forte 			break;
693fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_NOT_FOUND:
694fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
695fcf3ce44SJohn Forte 			    gettext("STMF service not found"));
696fcf3ce44SJohn Forte 			ret++;
697fcf3ce44SJohn Forte 			break;
698fcf3ce44SJohn Forte 		case STMF_ERROR_PERM:
699fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
700fcf3ce44SJohn Forte 			    gettext("permission denied"));
701fcf3ce44SJohn Forte 			ret++;
702fcf3ce44SJohn Forte 			break;
703fcf3ce44SJohn Forte 		case STMF_ERROR_LUN_IN_USE:
704fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
705fcf3ce44SJohn Forte 			    gettext("LUN already in use"));
706fcf3ce44SJohn Forte 			ret++;
707fcf3ce44SJohn Forte 			break;
708fcf3ce44SJohn Forte 		case STMF_ERROR_VE_CONFLICT:
709fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
710fcf3ce44SJohn Forte 			    gettext("view entry exists"));
711fcf3ce44SJohn Forte 			ret++;
712fcf3ce44SJohn Forte 			break;
713fcf3ce44SJohn Forte 		case STMF_ERROR_CONFIG_NONE:
714fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
715fcf3ce44SJohn Forte 			    gettext("STMF service is not initialized"));
716fcf3ce44SJohn Forte 			ret++;
717fcf3ce44SJohn Forte 			break;
718fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_DATA_VERSION:
719fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
720fcf3ce44SJohn Forte 			    gettext("STMF service version incorrect"));
721fcf3ce44SJohn Forte 			ret++;
722fcf3ce44SJohn Forte 			break;
723fcf3ce44SJohn Forte 		case STMF_ERROR_INVALID_HG:
724fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
725fcf3ce44SJohn Forte 			    gettext("invalid host group"));
726fcf3ce44SJohn Forte 			ret++;
727fcf3ce44SJohn Forte 			break;
728fcf3ce44SJohn Forte 		case STMF_ERROR_INVALID_TG:
729fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
730fcf3ce44SJohn Forte 			    gettext("invalid target group"));
731fcf3ce44SJohn Forte 			ret++;
732fcf3ce44SJohn Forte 			break;
733fcf3ce44SJohn Forte 		default:
734fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
735fcf3ce44SJohn Forte 			    operands[0], gettext("unknown error"));
736fcf3ce44SJohn Forte 			ret++;
737fcf3ce44SJohn Forte 			break;
738fcf3ce44SJohn Forte 	}
739fcf3ce44SJohn Forte 
740fcf3ce44SJohn Forte 	return (ret);
741fcf3ce44SJohn Forte }
742fcf3ce44SJohn Forte 
743fcf3ce44SJohn Forte /*
744fcf3ce44SJohn Forte  * createHostGroupFunc
745fcf3ce44SJohn Forte  *
746fcf3ce44SJohn Forte  * Create a host group
747fcf3ce44SJohn Forte  *
748fcf3ce44SJohn Forte  */
749fcf3ce44SJohn Forte /*ARGSUSED*/
750fcf3ce44SJohn Forte static int
createHostGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)751fcf3ce44SJohn Forte createHostGroupFunc(int operandLen, char *operands[],
752fcf3ce44SJohn Forte     cmdOptions_t *options, void *args)
753fcf3ce44SJohn Forte {
754fcf3ce44SJohn Forte 	int ret = 0;
755fcf3ce44SJohn Forte 	int stmfRet;
7563e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
7573e7352aeSJohn Forte 	stmfGroupName groupName = {0};
758fcf3ce44SJohn Forte 
759fcf3ce44SJohn Forte 	(void) strlcpy(groupName, operands[0], sizeof (groupName));
760fcf3ce44SJohn Forte 	(void) mbstowcs(groupNamePrint, (char *)groupName,
7613e7352aeSJohn Forte 	    sizeof (stmfGroupName) - 1);
762fcf3ce44SJohn Forte 	/* call create group */
763fcf3ce44SJohn Forte 	stmfRet = stmfCreateHostGroup(&groupName);
764fcf3ce44SJohn Forte 	switch (stmfRet) {
765fcf3ce44SJohn Forte 		case STMF_STATUS_SUCCESS:
766fcf3ce44SJohn Forte 			break;
767fcf3ce44SJohn Forte 		case STMF_ERROR_EXISTS:
768fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
769fcf3ce44SJohn Forte 			    operands[0], gettext("already exists"));
770fcf3ce44SJohn Forte 			ret++;
771fcf3ce44SJohn Forte 			break;
772fcf3ce44SJohn Forte 		case STMF_ERROR_BUSY:
773439928d9SMilan Jurik 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
774fcf3ce44SJohn Forte 			    operands[0], gettext("resource busy"));
775fcf3ce44SJohn Forte 			ret++;
776fcf3ce44SJohn Forte 			break;
777fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_NOT_FOUND:
778fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
779fcf3ce44SJohn Forte 			    gettext("STMF service not found"));
780fcf3ce44SJohn Forte 			ret++;
781fcf3ce44SJohn Forte 			break;
782fcf3ce44SJohn Forte 		case STMF_ERROR_PERM:
783fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
784fcf3ce44SJohn Forte 			    gettext("permission denied"));
785fcf3ce44SJohn Forte 			ret++;
786fcf3ce44SJohn Forte 			break;
787fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_DATA_VERSION:
788fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
789fcf3ce44SJohn Forte 			    gettext("STMF service version incorrect"));
790fcf3ce44SJohn Forte 			ret++;
791fcf3ce44SJohn Forte 			break;
792fcf3ce44SJohn Forte 		default:
793fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
794fcf3ce44SJohn Forte 			    operands[0], gettext("unknown error"));
795fcf3ce44SJohn Forte 			ret++;
796fcf3ce44SJohn Forte 			break;
797fcf3ce44SJohn Forte 	}
798fcf3ce44SJohn Forte 
799fcf3ce44SJohn Forte 	return (ret);
800fcf3ce44SJohn Forte }
801fcf3ce44SJohn Forte 
8028fe96085Stim szeto /*
8038fe96085Stim szeto  * createLuFunc
8048fe96085Stim szeto  *
8058fe96085Stim szeto  * Create a logical unit
8068fe96085Stim szeto  *
8078fe96085Stim szeto  */
8088fe96085Stim szeto /*ARGSUSED*/
8098fe96085Stim szeto static int
createLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)8108fe96085Stim szeto createLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
8118fe96085Stim szeto     void *args)
8128fe96085Stim szeto {
8138fe96085Stim szeto 	luResource hdl = NULL;
8148fe96085Stim szeto 	int ret = 0;
8158fe96085Stim szeto 	int stmfRet = 0;
8168fe96085Stim szeto 	char guidAsciiBuf[33];
8178fe96085Stim szeto 	stmfGuid createdGuid;
8188fe96085Stim szeto 
8198fe96085Stim szeto 	stmfRet = stmfCreateLuResource(STMF_DISK, &hdl);
8208fe96085Stim szeto 
8218fe96085Stim szeto 	if (stmfRet != STMF_STATUS_SUCCESS) {
8228fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
8238fe96085Stim szeto 		    cmdName, gettext("Failure to create lu resource\n"));
8248fe96085Stim szeto 		return (1);
8258fe96085Stim szeto 	}
8268fe96085Stim szeto 
8278fe96085Stim szeto 	for (; options->optval; options++) {
8288fe96085Stim szeto 		switch (options->optval) {
8298fe96085Stim szeto 			case 'p':
8308fe96085Stim szeto 				ret = setLuPropFromInput(hdl, options->optarg);
8318fe96085Stim szeto 				if (ret != 0) {
8328fe96085Stim szeto 					(void) stmfFreeLuResource(hdl);
8338fe96085Stim szeto 					return (1);
8348fe96085Stim szeto 				}
8358fe96085Stim szeto 				break;
8368fe96085Stim szeto 			case 's':
8378fe96085Stim szeto 				stmfRet = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE,
8388fe96085Stim szeto 				    options->optarg);
8398fe96085Stim szeto 				if (stmfRet != STMF_STATUS_SUCCESS) {
8408fe96085Stim szeto 					(void) fprintf(stderr, "%s: %c: %s\n",
8418fe96085Stim szeto 					    cmdName, options->optval,
8428fe96085Stim szeto 					    gettext("size param invalid"));
8438fe96085Stim szeto 					(void) stmfFreeLuResource(hdl);
8448fe96085Stim szeto 					return (1);
8458fe96085Stim szeto 				}
8468fe96085Stim szeto 				break;
8478fe96085Stim szeto 			default:
8488fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
8498fe96085Stim szeto 				    cmdName, options->optval,
8508fe96085Stim szeto 				    gettext("unknown option"));
8518fe96085Stim szeto 				return (1);
8528fe96085Stim szeto 		}
8538fe96085Stim szeto 	}
8548fe96085Stim szeto 
8558fe96085Stim szeto 	stmfRet = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]);
8568fe96085Stim szeto 
8578fe96085Stim szeto 	if (stmfRet != STMF_STATUS_SUCCESS) {
8588fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s\n",
8598fe96085Stim szeto 		    cmdName, gettext("could not set filename"));
8608fe96085Stim szeto 		return (1);
8618fe96085Stim szeto 	}
8628fe96085Stim szeto 
8638fe96085Stim szeto 	stmfRet = stmfCreateLu(hdl, &createdGuid);
8648fe96085Stim szeto 	switch (stmfRet) {
8658fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
8668fe96085Stim szeto 			break;
8678fe96085Stim szeto 		case STMF_ERROR_BUSY:
8688fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
8698fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
8708fe96085Stim szeto 			    gettext("resource busy"));
8718fe96085Stim szeto 			ret++;
8728fe96085Stim szeto 			break;
8738fe96085Stim szeto 		case STMF_ERROR_PERM:
8748fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
8758fe96085Stim szeto 			    gettext("permission denied"));
8768fe96085Stim szeto 			ret++;
8778fe96085Stim szeto 			break;
8788fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
8798fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
8808fe96085Stim szeto 			    operands[0], gettext("in use"));
8818fe96085Stim szeto 			ret++;
8828fe96085Stim szeto 			break;
8838fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
8848fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
8858fe96085Stim szeto 			    gettext("invalid block size"));
8868fe96085Stim szeto 			ret++;
8878fe96085Stim szeto 			break;
8888fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
8898fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
8908fe96085Stim szeto 			    gettext("guid in use"));
8918fe96085Stim szeto 			ret++;
8928fe96085Stim szeto 			break;
8938fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
8948fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
8958fe96085Stim szeto 			    gettext("meta file error"));
8968fe96085Stim szeto 			ret++;
8978fe96085Stim szeto 			break;
8988fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
8998fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9008fe96085Stim szeto 			    gettext("data file error"));
9018fe96085Stim szeto 			ret++;
9028fe96085Stim szeto 			break;
9038fe96085Stim szeto 		case STMF_ERROR_FILE_SIZE_INVALID:
9048fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9058fe96085Stim szeto 			    gettext("file size invalid"));
9068fe96085Stim szeto 			ret++;
9078fe96085Stim szeto 			break;
9088fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
9098fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9108fe96085Stim szeto 			    gettext("invalid size"));
9118fe96085Stim szeto 			ret++;
9128fe96085Stim szeto 			break;
9138fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
9148fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9158fe96085Stim szeto 			    gettext("could not create meta file"));
9168fe96085Stim szeto 			ret++;
9178fe96085Stim szeto 			break;
9188fe96085Stim szeto 		case STMF_ERROR_WRITE_CACHE_SET:
9198fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9208fe96085Stim szeto 			    gettext("could not set write cache"));
9218fe96085Stim szeto 			ret++;
9228fe96085Stim szeto 			break;
9238fe96085Stim szeto 		default:
9248fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
9258fe96085Stim szeto 			    gettext("unknown error"));
9268fe96085Stim szeto 			ret++;
9278fe96085Stim szeto 			break;
9288fe96085Stim szeto 	}
9298fe96085Stim szeto 
9308fe96085Stim szeto 	if (ret != 0) {
9318fe96085Stim szeto 		goto done;
9328fe96085Stim szeto 	}
9338fe96085Stim szeto 
9348fe96085Stim szeto 	(void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf),
9358fe96085Stim szeto 	    "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"
9368fe96085Stim szeto 	    "%02X%02X%02X%02X%02X%02X",
9378fe96085Stim szeto 	    createdGuid.guid[0], createdGuid.guid[1], createdGuid.guid[2],
9388fe96085Stim szeto 	    createdGuid.guid[3], createdGuid.guid[4], createdGuid.guid[5],
9398fe96085Stim szeto 	    createdGuid.guid[6], createdGuid.guid[7], createdGuid.guid[8],
9408fe96085Stim szeto 	    createdGuid.guid[9], createdGuid.guid[10], createdGuid.guid[11],
9418fe96085Stim szeto 	    createdGuid.guid[12], createdGuid.guid[13], createdGuid.guid[14],
9428fe96085Stim szeto 	    createdGuid.guid[15]);
9438fe96085Stim szeto 	(void) printf("Logical unit created: %s\n", guidAsciiBuf);
9448fe96085Stim szeto 
9458fe96085Stim szeto done:
9468fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
9478fe96085Stim szeto 	return (ret);
9488fe96085Stim szeto }
9498fe96085Stim szeto 
9508fe96085Stim szeto /*
9518fe96085Stim szeto  * createLuFunc
9528fe96085Stim szeto  *
9538fe96085Stim szeto  * Create a logical unit
9548fe96085Stim szeto  *
9558fe96085Stim szeto  */
9568fe96085Stim szeto /*ARGSUSED*/
9578fe96085Stim szeto static int
modifyLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)9588fe96085Stim szeto modifyLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
9598fe96085Stim szeto     void *args)
9608fe96085Stim szeto {
9618fe96085Stim szeto 	stmfGuid inGuid;
9628fe96085Stim szeto 	unsigned int guid[sizeof (stmfGuid)];
9638fe96085Stim szeto 	int ret = 0;
9648fe96085Stim szeto 	int i;
9658fe96085Stim szeto 	char *fname = NULL;
9668fe96085Stim szeto 	char *lasts = NULL;
9678fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
9688fe96085Stim szeto 	char *prop = NULL;
9698fe96085Stim szeto 	char *propVal = NULL;
9708fe96085Stim szeto 	boolean_t fnameUsed = B_FALSE;
9718fe96085Stim szeto 	uint32_t propId;
9728fe96085Stim szeto 	cmdOptions_t *optionStart = options;
9738fe96085Stim szeto 
9748fe96085Stim szeto 
9758fe96085Stim szeto 	for (; options->optval; options++) {
9768fe96085Stim szeto 		switch (options->optval) {
9778fe96085Stim szeto 			case 'f':
9788fe96085Stim szeto 				fnameUsed = B_TRUE;
9798fe96085Stim szeto 				fname = operands[0];
9808fe96085Stim szeto 				break;
9818fe96085Stim szeto 		}
9828fe96085Stim szeto 	}
9838fe96085Stim szeto 	options = optionStart;
9848fe96085Stim szeto 
9858fe96085Stim szeto 	/* check input length */
9868fe96085Stim szeto 	if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) {
9878fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0],
9888fe96085Stim szeto 		    gettext("must be "), GUID_INPUT,
9898fe96085Stim szeto 		    gettext(" hexadecimal digits"));
9908fe96085Stim szeto 		return (1);
9918fe96085Stim szeto 	}
9928fe96085Stim szeto 
9938fe96085Stim szeto 	if (!fnameUsed) {
9948fe96085Stim szeto 		/* convert to lower case for scan */
9958fe96085Stim szeto 		for (i = 0; i < 32; i++)
9968fe96085Stim szeto 			sGuid[i] = tolower(operands[0][i]);
9978fe96085Stim szeto 		sGuid[i] = 0;
9988fe96085Stim szeto 		(void) sscanf(sGuid,
9998fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
10008fe96085Stim szeto 		    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
10018fe96085Stim szeto 		    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10],
10028fe96085Stim szeto 		    &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]);
10038fe96085Stim szeto 
10048fe96085Stim szeto 		for (i = 0; i < sizeof (stmfGuid); i++) {
10058fe96085Stim szeto 			inGuid.guid[i] = guid[i];
10068fe96085Stim szeto 		}
10078fe96085Stim szeto 	}
10088fe96085Stim szeto 
10098fe96085Stim szeto 	for (; options->optval; options++) {
10108fe96085Stim szeto 		switch (options->optval) {
10118fe96085Stim szeto 			case 'p':
10128fe96085Stim szeto 				prop = strtok_r(options->optarg, "=", &lasts);
10132f624233SNattuvetty Bhavyan 				propVal = strtok_r(NULL, "=", &lasts);
10148fe96085Stim szeto 				ret = convertCharToPropId(prop, &propId);
10158fe96085Stim szeto 				if (ret != 0) {
10168fe96085Stim szeto 					(void) fprintf(stderr, "%s: %s: %s\n",
10178fe96085Stim szeto 					    cmdName,
10188fe96085Stim szeto 					gettext("invalid property specified"),
10198fe96085Stim szeto 					    prop);
10208fe96085Stim szeto 					return (1);
10218fe96085Stim szeto 				}
10222f624233SNattuvetty Bhavyan 				if (propVal ==  NULL &&
10232f624233SNattuvetty Bhavyan 				    propId != STMF_LU_PROP_MGMT_URL) {
10242f624233SNattuvetty Bhavyan 					(void) fprintf(stderr, "%s: %s: %s\n",
10252f624233SNattuvetty Bhavyan 					    cmdName, options->optarg,
10262f624233SNattuvetty Bhavyan 					    gettext("invalid property specifier"
10272f624233SNattuvetty Bhavyan 					    "- prop=val\n"));
10282f624233SNattuvetty Bhavyan 					return (1);
10292f624233SNattuvetty Bhavyan 				}
10302f624233SNattuvetty Bhavyan 				if (propVal ==  NULL) {
10312f624233SNattuvetty Bhavyan 					ret = callModify(fname, &inGuid, propId,
10322f624233SNattuvetty Bhavyan 					    "", prop);
10332f624233SNattuvetty Bhavyan 				} else {
10342f624233SNattuvetty Bhavyan 					ret = callModify(fname, &inGuid, propId,
10352f624233SNattuvetty Bhavyan 					    propVal, prop);
10362f624233SNattuvetty Bhavyan 				}
10372f624233SNattuvetty Bhavyan 				if (ret != 0) {
10388fe96085Stim szeto 					return (1);
10398fe96085Stim szeto 				}
10408fe96085Stim szeto 				break;
10418fe96085Stim szeto 			case 's':
10428fe96085Stim szeto 				if (callModify(fname, &inGuid,
10438fe96085Stim szeto 				    STMF_LU_PROP_SIZE, options->optarg,
10448fe96085Stim szeto 				    "size") != 0) {
10458fe96085Stim szeto 					return (1);
10468fe96085Stim szeto 				}
10478fe96085Stim szeto 				break;
10488fe96085Stim szeto 			case 'f':
10498fe96085Stim szeto 				break;
10508fe96085Stim szeto 			default:
10518fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
10528fe96085Stim szeto 				    cmdName, options->optval,
10538fe96085Stim szeto 				    gettext("unknown option"));
10548fe96085Stim szeto 				return (1);
10558fe96085Stim szeto 		}
10568fe96085Stim szeto 	}
10578fe96085Stim szeto 	return (ret);
10588fe96085Stim szeto }
10598fe96085Stim szeto 
10608fe96085Stim szeto static int
callModify(char * fname,stmfGuid * luGuid,uint32_t prop,const char * propVal,const char * propString)10618fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal,
10628fe96085Stim szeto     const char *propString)
10638fe96085Stim szeto {
10648fe96085Stim szeto 	int ret = 0;
10658fe96085Stim szeto 	int stmfRet = 0;
10668fe96085Stim szeto 
10678fe96085Stim szeto 	if (!fname) {
10688fe96085Stim szeto 		stmfRet = stmfModifyLu(luGuid, prop, propVal);
10698fe96085Stim szeto 	} else {
10708fe96085Stim szeto 		stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop,
10718fe96085Stim szeto 		    propVal);
10728fe96085Stim szeto 	}
10738fe96085Stim szeto 	switch (stmfRet) {
10748fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
10758fe96085Stim szeto 			break;
10768fe96085Stim szeto 		case STMF_ERROR_BUSY:
10778fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
10788fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
10798fe96085Stim szeto 			    gettext("resource busy"));
10808fe96085Stim szeto 			ret++;
10818fe96085Stim szeto 			break;
10828fe96085Stim szeto 		case STMF_ERROR_PERM:
10838fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
10848fe96085Stim szeto 			    gettext("permission denied"));
10858fe96085Stim szeto 			ret++;
10868fe96085Stim szeto 			break;
10878fe96085Stim szeto 		case STMF_ERROR_INVALID_BLKSIZE:
10888fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
10898fe96085Stim szeto 			    gettext("invalid block size"));
10908fe96085Stim szeto 			ret++;
10918fe96085Stim szeto 			break;
10928fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
10938fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
10948fe96085Stim szeto 			    gettext("guid in use"));
10958fe96085Stim szeto 			ret++;
10968fe96085Stim szeto 			break;
10978fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
10988fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
10998fe96085Stim szeto 			    gettext("meta file error"));
11008fe96085Stim szeto 			ret++;
11018fe96085Stim szeto 			break;
11028fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
11038fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11048fe96085Stim szeto 			    gettext("data file error"));
11058fe96085Stim szeto 			ret++;
11068fe96085Stim szeto 			break;
11078fe96085Stim szeto 		case STMF_ERROR_FILE_SIZE_INVALID:
11088fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11098fe96085Stim szeto 			    gettext("file size invalid"));
11108fe96085Stim szeto 			ret++;
11118fe96085Stim szeto 			break;
11128fe96085Stim szeto 		case STMF_ERROR_SIZE_OUT_OF_RANGE:
11138fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11148fe96085Stim szeto 			    gettext("invalid size"));
11158fe96085Stim szeto 			ret++;
11168fe96085Stim szeto 			break;
11178fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
11188fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11198fe96085Stim szeto 			    gettext("could not create meta file"));
11208fe96085Stim szeto 			ret++;
11218fe96085Stim szeto 			break;
11228fe96085Stim szeto 		case STMF_ERROR_INVALID_PROP:
11238fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11248fe96085Stim szeto 			    gettext("invalid property for modify"));
11258fe96085Stim szeto 			ret++;
11268fe96085Stim szeto 			break;
11278fe96085Stim szeto 		case STMF_ERROR_WRITE_CACHE_SET:
11288fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11298fe96085Stim szeto 			    gettext("could not set write cache"));
11308fe96085Stim szeto 			ret++;
11318fe96085Stim szeto 			break;
113245039663SJohn Forte 		case STMF_ERROR_ACCESS_STATE_SET:
113345039663SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
113445039663SJohn Forte 			    gettext("cannot modify while in standby mode"));
113545039663SJohn Forte 			ret++;
113645039663SJohn Forte 			break;
11378fe96085Stim szeto 		default:
11388fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName,
11398fe96085Stim szeto 			    gettext("could not set property"), propString,
11408fe96085Stim szeto 			    stmfRet);
11418fe96085Stim szeto 			ret++;
11428fe96085Stim szeto 			break;
11438fe96085Stim szeto 	}
11448fe96085Stim szeto 
11458fe96085Stim szeto 	return (ret);
11468fe96085Stim szeto }
11478fe96085Stim szeto 
11488fe96085Stim szeto 
11498fe96085Stim szeto /*
11508fe96085Stim szeto  * importLuFunc
11518fe96085Stim szeto  *
11528fe96085Stim szeto  * Create a logical unit
11538fe96085Stim szeto  *
11548fe96085Stim szeto  */
11558fe96085Stim szeto /*ARGSUSED*/
11568fe96085Stim szeto static int
importLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)11578fe96085Stim szeto importLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
11588fe96085Stim szeto     void *args)
11598fe96085Stim szeto {
11608fe96085Stim szeto 	int stmfRet = 0;
11618fe96085Stim szeto 	int ret = 0;
11628fe96085Stim szeto 	char guidAsciiBuf[33];
11638fe96085Stim szeto 	stmfGuid createdGuid;
11648fe96085Stim szeto 
11658fe96085Stim szeto 	stmfRet = stmfImportLu(STMF_DISK, operands[0], &createdGuid);
11668fe96085Stim szeto 	switch (stmfRet) {
11678fe96085Stim szeto 		case STMF_STATUS_SUCCESS:
11688fe96085Stim szeto 			break;
11698fe96085Stim szeto 		case STMF_ERROR_BUSY:
11708fe96085Stim szeto 		case STMF_ERROR_LU_BUSY:
11718fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11728fe96085Stim szeto 			    gettext("resource busy"));
11738fe96085Stim szeto 			ret++;
11748fe96085Stim szeto 			break;
11758fe96085Stim szeto 		case STMF_ERROR_PERM:
11768fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11778fe96085Stim szeto 			    gettext("permission denied"));
11788fe96085Stim szeto 			ret++;
11798fe96085Stim szeto 			break;
11808fe96085Stim szeto 		case STMF_ERROR_FILE_IN_USE:
11818fe96085Stim szeto 			(void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
11828fe96085Stim szeto 			    operands[0], gettext("in use"));
11838fe96085Stim szeto 			ret++;
11848fe96085Stim szeto 			break;
11858fe96085Stim szeto 		case STMF_ERROR_GUID_IN_USE:
11868fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11878fe96085Stim szeto 			    gettext("guid in use"));
11888fe96085Stim szeto 			ret++;
11898fe96085Stim szeto 			break;
11908fe96085Stim szeto 		case STMF_ERROR_META_FILE_NAME:
11918fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11928fe96085Stim szeto 			    gettext("meta file error"));
11938fe96085Stim szeto 			ret++;
11948fe96085Stim szeto 			break;
11958fe96085Stim szeto 		case STMF_ERROR_DATA_FILE_NAME:
11968fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
11978fe96085Stim szeto 			    gettext("data file error"));
11988fe96085Stim szeto 			ret++;
11998fe96085Stim szeto 			break;
12008fe96085Stim szeto 		case STMF_ERROR_META_CREATION:
12018fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
12028fe96085Stim szeto 			    gettext("could not create meta file"));
12038fe96085Stim szeto 			ret++;
12048fe96085Stim szeto 			break;
12058fe96085Stim szeto 		case STMF_ERROR_WRITE_CACHE_SET:
12068fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
12078fe96085Stim szeto 			    gettext("could not set write cache"));
12088fe96085Stim szeto 			ret++;
12098fe96085Stim szeto 			break;
12108fe96085Stim szeto 		default:
12118fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
12128fe96085Stim szeto 			    gettext("unknown error"));
12138fe96085Stim szeto 			ret++;
12148fe96085Stim szeto 			break;
12158fe96085Stim szeto 	}
12168fe96085Stim szeto 
12178fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
12188fe96085Stim szeto 		goto done;
12198fe96085Stim szeto 	}
12208fe96085Stim szeto 
12218fe96085Stim szeto 	(void) snprintf(guidAsciiBuf, sizeof (guidAsciiBuf),
12228fe96085Stim szeto 	    "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"
12238fe96085Stim szeto 	    "%02X%02X%02X%02X%02X%02X",
12248fe96085Stim szeto 	    createdGuid.guid[0], createdGuid.guid[1], createdGuid.guid[2],
12258fe96085Stim szeto 	    createdGuid.guid[3], createdGuid.guid[4], createdGuid.guid[5],
12268fe96085Stim szeto 	    createdGuid.guid[6], createdGuid.guid[7], createdGuid.guid[8],
12278fe96085Stim szeto 	    createdGuid.guid[9], createdGuid.guid[10], createdGuid.guid[11],
12288fe96085Stim szeto 	    createdGuid.guid[12], createdGuid.guid[13], createdGuid.guid[14],
12298fe96085Stim szeto 	    createdGuid.guid[15]);
12308fe96085Stim szeto 	(void) printf("Logical unit imported: %s\n", guidAsciiBuf);
12318fe96085Stim szeto 
12328fe96085Stim szeto done:
12338fe96085Stim szeto 	return (ret);
12348fe96085Stim szeto }
12358fe96085Stim szeto 
12368fe96085Stim szeto static int
setLuPropFromInput(luResource hdl,char * optarg)12378fe96085Stim szeto setLuPropFromInput(luResource hdl, char *optarg)
12388fe96085Stim szeto {
12398fe96085Stim szeto 	char *prop = NULL;
12408fe96085Stim szeto 	char *propVal = NULL;
12418fe96085Stim szeto 	char *lasts = NULL;
12428fe96085Stim szeto 	uint32_t propId;
12438fe96085Stim szeto 	int ret = 0;
12448fe96085Stim szeto 
12458fe96085Stim szeto 	prop = strtok_r(optarg, "=", &lasts);
12468fe96085Stim szeto 	if ((propVal = strtok_r(NULL, "=", &lasts)) == NULL) {
12478fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s: %s\n",
12488fe96085Stim szeto 		    cmdName, optarg,
12498fe96085Stim szeto 		    gettext("invalid property specifier - prop=val\n"));
12508fe96085Stim szeto 		return (1);
12518fe96085Stim szeto 	}
12528fe96085Stim szeto 
12538fe96085Stim szeto 	ret = convertCharToPropId(prop, &propId);
12548fe96085Stim szeto 	if (ret != 0) {
12558fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s: %s\n",
12568fe96085Stim szeto 		    cmdName, gettext("invalid property specified"), prop);
12578fe96085Stim szeto 		return (1);
12588fe96085Stim szeto 	}
12598fe96085Stim szeto 
12608fe96085Stim szeto 	ret = stmfSetLuProp(hdl, propId, propVal);
12618fe96085Stim szeto 	if (ret != STMF_STATUS_SUCCESS) {
12628fe96085Stim szeto 		(void) fprintf(stderr, "%s: %s %s: ",
12638fe96085Stim szeto 		    cmdName, gettext("unable to set"), prop);
12648fe96085Stim szeto 		switch (ret) {
12658fe96085Stim szeto 			case STMF_ERROR_INVALID_PROPSIZE:
12668fe96085Stim szeto 				(void) fprintf(stderr, "invalid length\n");
12678fe96085Stim szeto 				break;
12688fe96085Stim szeto 			case STMF_ERROR_INVALID_ARG:
12698fe96085Stim szeto 				(void) fprintf(stderr, "bad format\n");
12708fe96085Stim szeto 				break;
12718fe96085Stim szeto 			default:
12728fe96085Stim szeto 				(void) fprintf(stderr, "\n");
12738fe96085Stim szeto 				break;
12748fe96085Stim szeto 		}
12758fe96085Stim szeto 		return (1);
12768fe96085Stim szeto 	}
12778fe96085Stim szeto 
12788fe96085Stim szeto 	return (0);
12798fe96085Stim szeto }
12808fe96085Stim szeto 
12818fe96085Stim szeto static int
convertCharToPropId(char * prop,uint32_t * propId)12828fe96085Stim szeto convertCharToPropId(char *prop, uint32_t *propId)
12838fe96085Stim szeto {
12848fe96085Stim szeto 	if (strcasecmp(prop, GUID) == 0) {
12858fe96085Stim szeto 		*propId = STMF_LU_PROP_GUID;
12868fe96085Stim szeto 	} else if (strcasecmp(prop, ALIAS) == 0) {
12878fe96085Stim szeto 		*propId = STMF_LU_PROP_ALIAS;
12888fe96085Stim szeto 	} else if (strcasecmp(prop, VID) == 0) {
12898fe96085Stim szeto 		*propId = STMF_LU_PROP_VID;
12908fe96085Stim szeto 	} else if (strcasecmp(prop, PID) == 0) {
12918fe96085Stim szeto 		*propId = STMF_LU_PROP_PID;
12928fe96085Stim szeto 	} else if (strcasecmp(prop, WRITE_PROTECT) == 0) {
12938fe96085Stim szeto 		*propId = STMF_LU_PROP_WRITE_PROTECT;
12948fe96085Stim szeto 	} else if (strcasecmp(prop, WRITEBACK_CACHE_DISABLE) == 0) {
12958fe96085Stim szeto 		*propId = STMF_LU_PROP_WRITE_CACHE_DISABLE;
12968fe96085Stim szeto 	} else if (strcasecmp(prop, BLOCK_SIZE) == 0) {
12978fe96085Stim szeto 		*propId = STMF_LU_PROP_BLOCK_SIZE;
12988fe96085Stim szeto 	} else if (strcasecmp(prop, SERIAL_NUMBER) == 0) {
12998fe96085Stim szeto 		*propId = STMF_LU_PROP_SERIAL_NUM;
13008fe96085Stim szeto 	} else if (strcasecmp(prop, COMPANY_ID) == 0) {
13018fe96085Stim szeto 		*propId = STMF_LU_PROP_COMPANY_ID;
13028fe96085Stim szeto 	} else if (strcasecmp(prop, META_FILE) == 0) {
13038fe96085Stim szeto 		*propId = STMF_LU_PROP_META_FILENAME;
13042f624233SNattuvetty Bhavyan 	} else if (strcasecmp(prop, MGMT_URL) == 0) {
13052f624233SNattuvetty Bhavyan 		*propId = STMF_LU_PROP_MGMT_URL;
1306fdcc480aSJohn Forte 	} else if (strcasecmp(prop, HOST_ID) == 0) {
1307fdcc480aSJohn Forte 		*propId = STMF_LU_PROP_HOST_ID;
13088fe96085Stim szeto 	} else {
13098fe96085Stim szeto 		return (1);
13108fe96085Stim szeto 	}
13118fe96085Stim szeto 	return (0);
13128fe96085Stim szeto }
13138fe96085Stim szeto 
13148fe96085Stim szeto /*
13158fe96085Stim szeto  * deleteLuFunc
13168fe96085Stim szeto  *
13178fe96085Stim szeto  * Delete a logical unit
13188fe96085Stim szeto  *
13198fe96085Stim szeto  */
13208fe96085Stim szeto /*ARGSUSED*/
13218fe96085Stim szeto static int
deleteLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)13228fe96085Stim szeto deleteLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
13238fe96085Stim szeto     void *args)
13248fe96085Stim szeto {
13258fe96085Stim szeto 	int i, j;
13268fe96085Stim szeto 	int ret = 0;
13278fe96085Stim szeto 	int stmfRet;
13288fe96085Stim szeto 	unsigned int inGuid[sizeof (stmfGuid)];
13298fe96085Stim szeto 	stmfGuid delGuid;
13308fe96085Stim szeto 	boolean_t keepViews = B_FALSE;
13318fe96085Stim szeto 	boolean_t viewEntriesRemoved = B_FALSE;
13328fe96085Stim szeto 	boolean_t noLunFound = B_FALSE;
13338fe96085Stim szeto 	boolean_t views = B_FALSE;
13347b506e25Ssrivijitha dugganapalli 	boolean_t notValidHexNumber = B_FALSE;
13358fe96085Stim szeto 	char sGuid[GUID_INPUT + 1];
13368fe96085Stim szeto 	stmfViewEntryList *viewEntryList = NULL;
13378fe96085Stim szeto 
13388fe96085Stim szeto 	for (; options->optval; options++) {
13398fe96085Stim szeto 		switch (options->optval) {
13408fe96085Stim szeto 			/* Keep views for logical unit */
13418fe96085Stim szeto 			case 'k':
13428fe96085Stim szeto 				keepViews = B_TRUE;
13438fe96085Stim szeto 				break;
13448fe96085Stim szeto 			default:
13458fe96085Stim szeto 				(void) fprintf(stderr, "%s: %c: %s\n",
13468fe96085Stim szeto 				    cmdName, options->optval,
13478fe96085Stim szeto 				    gettext("unknown option"));
13488fe96085Stim szeto 				return (1);
13498fe96085Stim szeto 		}
13508fe96085Stim szeto 	}
13518fe96085Stim szeto 
13528fe96085Stim szeto 
13538fe96085Stim szeto 	for (i = 0; i < operandLen; i++) {
13548fe96085Stim szeto 		for (j = 0; j < GUID_INPUT; j++) {
13558fe96085Stim szeto 			if (!isxdigit(operands[i][j])) {
13567b506e25Ssrivijitha dugganapalli 				notValidHexNumber = B_TRUE;
13578fe96085Stim szeto 				break;
13588fe96085Stim szeto 			}
13598fe96085Stim szeto 			sGuid[j] = tolower(operands[i][j]);
13608fe96085Stim szeto 		}
13617b506e25Ssrivijitha dugganapalli 		if ((notValidHexNumber == B_TRUE) ||
13627b506e25Ssrivijitha dugganapalli 		    (strlen(operands[i]) != GUID_INPUT)) {
13638fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s%d%s\n",
13648fe96085Stim szeto 			    cmdName, operands[i], gettext("must be "),
13658fe96085Stim szeto 			    GUID_INPUT,
13668fe96085Stim szeto 			    gettext(" hexadecimal digits long"));
13677b506e25Ssrivijitha dugganapalli 			notValidHexNumber = B_FALSE;
13687b506e25Ssrivijitha dugganapalli 			ret++;
13698fe96085Stim szeto 			continue;
13708fe96085Stim szeto 		}
13718fe96085Stim szeto 
13728fe96085Stim szeto 		sGuid[j] = 0;
13738fe96085Stim szeto 
13748fe96085Stim szeto 		(void) sscanf(sGuid,
13758fe96085Stim szeto 		    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
13768fe96085Stim szeto 		    &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3],
13778fe96085Stim szeto 		    &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7],
13788fe96085Stim szeto 		    &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11],
13798fe96085Stim szeto 		    &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]);
13808fe96085Stim szeto 
13818fe96085Stim szeto 		for (j = 0; j < sizeof (stmfGuid); j++) {
13828fe96085Stim szeto 			delGuid.guid[j] = inGuid[j];
13838fe96085Stim szeto 		}
13848fe96085Stim szeto 
13858fe96085Stim szeto 		stmfRet = stmfDeleteLu(&delGuid);
13868fe96085Stim szeto 		switch (stmfRet) {
13878fe96085Stim szeto 			case STMF_STATUS_SUCCESS:
13888fe96085Stim szeto 				break;
13898fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
13908fe96085Stim szeto 				noLunFound = B_TRUE;
13918fe96085Stim szeto 				break;
13928fe96085Stim szeto 			case STMF_ERROR_BUSY:
13938fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
13948fe96085Stim szeto 				    gettext("resource busy"));
13958fe96085Stim szeto 				ret++;
13968fe96085Stim szeto 				break;
13978fe96085Stim szeto 			case STMF_ERROR_PERM:
13988fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
13998fe96085Stim szeto 				    gettext("permission denied"));
14008fe96085Stim szeto 				ret++;
14018fe96085Stim szeto 				break;
14028fe96085Stim szeto 			default:
14038fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
14048fe96085Stim szeto 				    gettext("unknown error"));
14058fe96085Stim szeto 				ret++;
14068fe96085Stim szeto 				break;
14078fe96085Stim szeto 		}
14088fe96085Stim szeto 
14098fe96085Stim szeto 		if (!keepViews) {
14108fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
14118fe96085Stim szeto 			    &viewEntryList);
14128fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
14138fe96085Stim szeto 				for (j = 0; j < viewEntryList->cnt; j++) {
14148fe96085Stim szeto 					(void) stmfRemoveViewEntry(&delGuid,
14158fe96085Stim szeto 					    viewEntryList->ve[j].veIndex);
14168fe96085Stim szeto 				}
14177b506e25Ssrivijitha dugganapalli 				/* check if viewEntryList is empty */
14187b506e25Ssrivijitha dugganapalli 				if (viewEntryList->cnt != 0)
14197b506e25Ssrivijitha dugganapalli 					viewEntriesRemoved = B_TRUE;
14208fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
14217b506e25Ssrivijitha dugganapalli 			} else {
14228fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
14238fe96085Stim szeto 				    gettext("unable to remove view entries\n"));
14248fe96085Stim szeto 				ret++;
14257b506e25Ssrivijitha dugganapalli 			}
14267b506e25Ssrivijitha dugganapalli 
14278fe96085Stim szeto 		}
14288fe96085Stim szeto 		if (keepViews) {
14298fe96085Stim szeto 			stmfRet = stmfGetViewEntryList(&delGuid,
14308fe96085Stim szeto 			    &viewEntryList);
14318fe96085Stim szeto 			if (stmfRet == STMF_STATUS_SUCCESS) {
14328fe96085Stim szeto 				views = B_TRUE;
14338fe96085Stim szeto 				stmfFreeMemory(viewEntryList);
14348fe96085Stim szeto 			}
14358fe96085Stim szeto 		}
14368fe96085Stim szeto 
14378fe96085Stim szeto 		if ((!viewEntriesRemoved && noLunFound && !views) ||
14388fe96085Stim szeto 		    (!views && keepViews && noLunFound)) {
14398fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %s\n",
14408fe96085Stim szeto 			    cmdName, sGuid,
14418fe96085Stim szeto 			    gettext("not found"));
14428fe96085Stim szeto 			ret++;
14438fe96085Stim szeto 		}
14448fe96085Stim szeto 		noLunFound = viewEntriesRemoved = views = B_FALSE;
14458fe96085Stim szeto 	}
14468fe96085Stim szeto 	return (ret);
14478fe96085Stim szeto }
14488fe96085Stim szeto 
14498fe96085Stim szeto 
1450fcf3ce44SJohn Forte /*
1451fcf3ce44SJohn Forte  * createTargetGroupFunc
1452fcf3ce44SJohn Forte  *
1453fcf3ce44SJohn Forte  * Create a target group
1454fcf3ce44SJohn Forte  *
1455fcf3ce44SJohn Forte  */
1456fcf3ce44SJohn Forte /*ARGSUSED*/
1457fcf3ce44SJohn Forte static int
createTargetGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1458fcf3ce44SJohn Forte createTargetGroupFunc(int operandLen, char *operands[], cmdOptions_t *options,
1459fcf3ce44SJohn Forte     void *args)
1460fcf3ce44SJohn Forte {
1461fcf3ce44SJohn Forte 	int ret = 0;
1462fcf3ce44SJohn Forte 	int stmfRet;
14633e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
14643e7352aeSJohn Forte 	stmfGroupName groupName = {0};
1465fcf3ce44SJohn Forte 
1466fcf3ce44SJohn Forte 	(void) strlcpy(groupName, operands[0], sizeof (groupName));
1467fcf3ce44SJohn Forte 	(void) mbstowcs(groupNamePrint, (char *)groupName,
14683e7352aeSJohn Forte 	    sizeof (stmfGroupName) - 1);
1469fcf3ce44SJohn Forte 	/* call create group */
1470fcf3ce44SJohn Forte 	stmfRet = stmfCreateTargetGroup(&groupName);
1471fcf3ce44SJohn Forte 	switch (stmfRet) {
1472fcf3ce44SJohn Forte 		case STMF_STATUS_SUCCESS:
1473fcf3ce44SJohn Forte 			break;
1474fcf3ce44SJohn Forte 		case STMF_ERROR_EXISTS:
1475fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1476fcf3ce44SJohn Forte 			    groupNamePrint, gettext("already exists"));
1477fcf3ce44SJohn Forte 			ret++;
1478fcf3ce44SJohn Forte 			break;
1479fcf3ce44SJohn Forte 		case STMF_ERROR_BUSY:
1480fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1481fcf3ce44SJohn Forte 			    groupNamePrint, gettext("resource busy"));
1482fcf3ce44SJohn Forte 			ret++;
1483fcf3ce44SJohn Forte 			break;
1484fcf3ce44SJohn Forte 		case STMF_ERROR_PERM:
1485fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1486fcf3ce44SJohn Forte 			    gettext("permission denied"));
1487fcf3ce44SJohn Forte 			ret++;
1488fcf3ce44SJohn Forte 			break;
1489fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_NOT_FOUND:
1490fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1491fcf3ce44SJohn Forte 			    gettext("STMF service not found"));
1492fcf3ce44SJohn Forte 			ret++;
1493fcf3ce44SJohn Forte 			break;
1494fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_DATA_VERSION:
1495fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1496fcf3ce44SJohn Forte 			    gettext("STMF service version incorrect"));
1497fcf3ce44SJohn Forte 			ret++;
1498fcf3ce44SJohn Forte 			break;
1499fcf3ce44SJohn Forte 		default:
1500fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1501fcf3ce44SJohn Forte 			    groupNamePrint, gettext("unknown error"));
1502fcf3ce44SJohn Forte 			ret++;
1503fcf3ce44SJohn Forte 			break;
1504fcf3ce44SJohn Forte 	}
1505fcf3ce44SJohn Forte 
1506fcf3ce44SJohn Forte 	return (ret);
1507fcf3ce44SJohn Forte }
1508fcf3ce44SJohn Forte 
1509fcf3ce44SJohn Forte /*
1510fcf3ce44SJohn Forte  * deleteHostGroupFunc
1511fcf3ce44SJohn Forte  *
1512fcf3ce44SJohn Forte  * Delete a host group
1513fcf3ce44SJohn Forte  *
1514fcf3ce44SJohn Forte  */
1515fcf3ce44SJohn Forte /*ARGSUSED*/
1516fcf3ce44SJohn Forte static int
deleteHostGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1517fcf3ce44SJohn Forte deleteHostGroupFunc(int operandLen, char *operands[],
1518fcf3ce44SJohn Forte     cmdOptions_t *options, void *args)
1519fcf3ce44SJohn Forte {
1520fcf3ce44SJohn Forte 	int ret = 0;
1521fcf3ce44SJohn Forte 	int stmfRet;
15223e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
15233e7352aeSJohn Forte 	stmfGroupName groupName = {0};
1524fcf3ce44SJohn Forte 
1525fcf3ce44SJohn Forte 	(void) strlcpy(groupName, operands[0], sizeof (groupName));
1526fcf3ce44SJohn Forte 	(void) mbstowcs(groupNamePrint, (char *)groupName,
15273e7352aeSJohn Forte 	    sizeof (stmfGroupName) - 1);
1528fcf3ce44SJohn Forte 	/* call delete group */
1529fcf3ce44SJohn Forte 	stmfRet = stmfDeleteHostGroup(&groupName);
1530fcf3ce44SJohn Forte 	switch (stmfRet) {
1531fcf3ce44SJohn Forte 		case STMF_STATUS_SUCCESS:
1532fcf3ce44SJohn Forte 			break;
1533fcf3ce44SJohn Forte 		case STMF_ERROR_NOT_FOUND:
1534fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1535fcf3ce44SJohn Forte 			    groupNamePrint, gettext("not found"));
1536fcf3ce44SJohn Forte 			ret++;
1537fcf3ce44SJohn Forte 			break;
1538fcf3ce44SJohn Forte 		case STMF_ERROR_BUSY:
1539fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1540fcf3ce44SJohn Forte 			    groupNamePrint, gettext("resource busy"));
1541fcf3ce44SJohn Forte 			ret++;
1542fcf3ce44SJohn Forte 			break;
1543fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_NOT_FOUND:
1544fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1545fcf3ce44SJohn Forte 			    gettext("STMF service not found"));
1546fcf3ce44SJohn Forte 			ret++;
1547fcf3ce44SJohn Forte 			break;
1548fcf3ce44SJohn Forte 		case STMF_ERROR_PERM:
1549fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1550fcf3ce44SJohn Forte 			    gettext("permission denied"));
1551fcf3ce44SJohn Forte 			ret++;
1552fcf3ce44SJohn Forte 			break;
1553fcf3ce44SJohn Forte 		case STMF_ERROR_GROUP_IN_USE:
1554fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1555fcf3ce44SJohn Forte 			    groupNamePrint,
1556fcf3ce44SJohn Forte 			    gettext("group is in use by existing view entry"));
1557fcf3ce44SJohn Forte 			ret++;
1558fcf3ce44SJohn Forte 			break;
1559fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_DATA_VERSION:
1560fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1561fcf3ce44SJohn Forte 			    gettext("STMF service version incorrect"));
1562fcf3ce44SJohn Forte 			ret++;
1563fcf3ce44SJohn Forte 			break;
1564fcf3ce44SJohn Forte 		default:
1565fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1566fcf3ce44SJohn Forte 			    groupNamePrint, gettext("unknown error"));
1567fcf3ce44SJohn Forte 			ret++;
1568fcf3ce44SJohn Forte 			break;
1569fcf3ce44SJohn Forte 	}
1570fcf3ce44SJohn Forte 
1571fcf3ce44SJohn Forte 	return (ret);
1572fcf3ce44SJohn Forte }
1573fcf3ce44SJohn Forte 
1574fcf3ce44SJohn Forte /*
1575fcf3ce44SJohn Forte  * deleteTargetGroupFunc
1576fcf3ce44SJohn Forte  *
1577fcf3ce44SJohn Forte  * Delete a target group
1578fcf3ce44SJohn Forte  *
1579fcf3ce44SJohn Forte  */
1580fcf3ce44SJohn Forte /*ARGSUSED*/
1581fcf3ce44SJohn Forte static int
deleteTargetGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1582fcf3ce44SJohn Forte deleteTargetGroupFunc(int operandLen, char *operands[], cmdOptions_t *options,
1583fcf3ce44SJohn Forte     void *args)
1584fcf3ce44SJohn Forte {
1585fcf3ce44SJohn Forte 	int ret = 0;
1586fcf3ce44SJohn Forte 	int stmfRet;
15873e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
15883e7352aeSJohn Forte 	stmfGroupName groupName = {0};
1589fcf3ce44SJohn Forte 
1590fcf3ce44SJohn Forte 	(void) strlcpy(groupName, operands[0], sizeof (groupName));
1591fcf3ce44SJohn Forte 	(void) mbstowcs(groupNamePrint, (char *)groupName,
15923e7352aeSJohn Forte 	    sizeof (stmfGroupName) - 1);
1593fcf3ce44SJohn Forte 	/* call delete group */
1594fcf3ce44SJohn Forte 	stmfRet = stmfDeleteTargetGroup(&groupName);
1595fcf3ce44SJohn Forte 	switch (stmfRet) {
1596fcf3ce44SJohn Forte 		case STMF_STATUS_SUCCESS:
1597fcf3ce44SJohn Forte 			break;
1598fcf3ce44SJohn Forte 		case STMF_ERROR_NOT_FOUND:
1599fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1600fcf3ce44SJohn Forte 			    groupNamePrint, gettext("not found"));
1601fcf3ce44SJohn Forte 			ret++;
1602fcf3ce44SJohn Forte 			break;
1603fcf3ce44SJohn Forte 		case STMF_ERROR_BUSY:
1604fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1605fcf3ce44SJohn Forte 			    groupNamePrint, gettext("resource busy"));
1606fcf3ce44SJohn Forte 			ret++;
1607fcf3ce44SJohn Forte 			break;
1608fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_NOT_FOUND:
1609fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1610fcf3ce44SJohn Forte 			    gettext("STMF service not found"));
1611fcf3ce44SJohn Forte 			ret++;
1612fcf3ce44SJohn Forte 			break;
1613fcf3ce44SJohn Forte 		case STMF_ERROR_PERM:
1614fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1615fcf3ce44SJohn Forte 			    gettext("permission denied"));
1616fcf3ce44SJohn Forte 			ret++;
1617fcf3ce44SJohn Forte 			break;
1618fcf3ce44SJohn Forte 		case STMF_ERROR_GROUP_IN_USE:
1619fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1620fcf3ce44SJohn Forte 			    groupNamePrint,
1621fcf3ce44SJohn Forte 			    gettext("group is in use by existing view entry"));
1622fcf3ce44SJohn Forte 			ret++;
1623fcf3ce44SJohn Forte 			break;
1624fcf3ce44SJohn Forte 		case STMF_ERROR_SERVICE_DATA_VERSION:
1625fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1626fcf3ce44SJohn Forte 			    gettext("STMF service version incorrect"));
1627fcf3ce44SJohn Forte 			ret++;
1628fcf3ce44SJohn Forte 			break;
1629fcf3ce44SJohn Forte 		default:
1630fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
1631fcf3ce44SJohn Forte 			    groupNamePrint, gettext("unknown error"));
1632fcf3ce44SJohn Forte 			ret++;
1633fcf3ce44SJohn Forte 			break;
1634fcf3ce44SJohn Forte 	}
1635fcf3ce44SJohn Forte 
1636fcf3ce44SJohn Forte 	return (ret);
1637fcf3ce44SJohn Forte }
1638fcf3ce44SJohn Forte 
1639fcf3ce44SJohn Forte /*
1640fcf3ce44SJohn Forte  * listHostGroupFunc
1641fcf3ce44SJohn Forte  *
1642fcf3ce44SJohn Forte  * Lists the specified host groups or all if none are specified
1643fcf3ce44SJohn Forte  *
1644fcf3ce44SJohn Forte  */
1645fcf3ce44SJohn Forte /*ARGSUSED*/
1646fcf3ce44SJohn Forte static int
listHostGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1647fcf3ce44SJohn Forte listHostGroupFunc(int operandLen, char *operands[], cmdOptions_t *options,
1648fcf3ce44SJohn Forte     void *args)
1649fcf3ce44SJohn Forte {
1650fcf3ce44SJohn Forte 	int ret = 0;
1651fcf3ce44SJohn Forte 	int stmfRet;
1652fcf3ce44SJohn Forte 	int i, j, outerLoop;
1653fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
1654fcf3ce44SJohn Forte 	boolean_t found = B_TRUE;
1655fcf3ce44SJohn Forte 	boolean_t operandEntered;
1656fcf3ce44SJohn Forte 	stmfGroupList *groupList;
1657fcf3ce44SJohn Forte 	stmfGroupProperties *groupProps;
1658fcf3ce44SJohn Forte 	wchar_t operandName[sizeof (stmfGroupName)];
1659fcf3ce44SJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)];
1660fcf3ce44SJohn Forte 
1661fcf3ce44SJohn Forte 	for (; options->optval; options++) {
1662fcf3ce44SJohn Forte 		switch (options->optval) {
1663fcf3ce44SJohn Forte 			case 'v':
1664fcf3ce44SJohn Forte 				verbose = B_TRUE;
1665fcf3ce44SJohn Forte 				break;
1666fcf3ce44SJohn Forte 			default:
1667fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
1668fcf3ce44SJohn Forte 				    cmdName, options->optval,
1669fcf3ce44SJohn Forte 				    gettext("unknown option"));
1670fcf3ce44SJohn Forte 				return (1);
1671fcf3ce44SJohn Forte 		}
1672fcf3ce44SJohn Forte 	}
1673fcf3ce44SJohn Forte 
1674fcf3ce44SJohn Forte 	if (operandLen > 0) {
1675fcf3ce44SJohn Forte 		outerLoop = operandLen;
1676fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
1677fcf3ce44SJohn Forte 	} else {
1678fcf3ce44SJohn Forte 		outerLoop = 1;
1679fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
1680fcf3ce44SJohn Forte 	}
1681fcf3ce44SJohn Forte 
1682fcf3ce44SJohn Forte 	stmfRet = stmfGetHostGroupList(&groupList);
1683fcf3ce44SJohn Forte 	if (stmfRet != STMF_STATUS_SUCCESS) {
1684fcf3ce44SJohn Forte 		switch (stmfRet) {
1685fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
1686fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1687fcf3ce44SJohn Forte 				    gettext("resource busy"));
1688fcf3ce44SJohn Forte 				break;
1689fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
1690fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1691fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
1692fcf3ce44SJohn Forte 				break;
1693fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
1694fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1695fcf3ce44SJohn Forte 				    gettext("permission denied"));
1696fcf3ce44SJohn Forte 				break;
1697fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
1698fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1699fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
1700fcf3ce44SJohn Forte 				break;
1701fcf3ce44SJohn Forte 			default:
1702fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1703fcf3ce44SJohn Forte 				    gettext("unknown error"));
1704fcf3ce44SJohn Forte 				break;
1705fcf3ce44SJohn Forte 		}
1706fcf3ce44SJohn Forte 		return (1);
1707fcf3ce44SJohn Forte 	}
1708fcf3ce44SJohn Forte 
1709fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
1710fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < groupList->cnt; j++) {
1711fcf3ce44SJohn Forte 			(void) mbstowcs(groupNamePrint,
1712fcf3ce44SJohn Forte 			    (char *)groupList->name[j],
17133e7352aeSJohn Forte 			    sizeof (stmfGroupName) - 1);
17143e7352aeSJohn Forte 			groupNamePrint[sizeof (stmfGroupName) - 1] = 0;
1715fcf3ce44SJohn Forte 			if (operandEntered) {
1716fcf3ce44SJohn Forte 				(void) mbstowcs(operandName, operands[i],
17173e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
17183e7352aeSJohn Forte 				operandName[sizeof (stmfGroupName) - 1] = 0;
1719fcf3ce44SJohn Forte 				if (wcscmp(operandName, groupNamePrint)
1720fcf3ce44SJohn Forte 				    == 0) {
1721fcf3ce44SJohn Forte 					found = B_TRUE;
1722fcf3ce44SJohn Forte 				}
1723fcf3ce44SJohn Forte 			}
1724fcf3ce44SJohn Forte 			if ((found && operandEntered) || !operandEntered) {
1725fcf3ce44SJohn Forte 				(void) printf("Host Group: %ws\n",
1726fcf3ce44SJohn Forte 				    groupNamePrint);
1727fcf3ce44SJohn Forte 				if (verbose) {
1728fcf3ce44SJohn Forte 					stmfRet = stmfGetHostGroupMembers(
1729fcf3ce44SJohn Forte 					    &(groupList->name[j]), &groupProps);
1730fcf3ce44SJohn Forte 					if (stmfRet != STMF_STATUS_SUCCESS) {
1731fcf3ce44SJohn Forte 						return (1);
1732fcf3ce44SJohn Forte 					}
1733fcf3ce44SJohn Forte 					printGroupProps(groupProps);
1734fcf3ce44SJohn Forte 				}
1735fcf3ce44SJohn Forte 				if (found && operandEntered) {
1736fcf3ce44SJohn Forte 					break;
1737fcf3ce44SJohn Forte 				}
1738fcf3ce44SJohn Forte 			}
1739fcf3ce44SJohn Forte 
1740fcf3ce44SJohn Forte 		}
1741fcf3ce44SJohn Forte 		if (operandEntered && !found) {
1742fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
1743fcf3ce44SJohn Forte 			    operands[i], gettext("not found"));
1744fcf3ce44SJohn Forte 			ret = 1;
1745fcf3ce44SJohn Forte 		}
1746fcf3ce44SJohn Forte 	}
1747fcf3ce44SJohn Forte 	return (ret);
1748fcf3ce44SJohn Forte }
1749fcf3ce44SJohn Forte 
1750fcf3ce44SJohn Forte /*
1751fcf3ce44SJohn Forte  * printGroupProps
1752fcf3ce44SJohn Forte  *
1753fcf3ce44SJohn Forte  * Prints group members for target or host groups
1754fcf3ce44SJohn Forte  *
1755fcf3ce44SJohn Forte  */
1756fcf3ce44SJohn Forte static void
printGroupProps(stmfGroupProperties * groupProps)1757fcf3ce44SJohn Forte printGroupProps(stmfGroupProperties *groupProps)
1758fcf3ce44SJohn Forte {
1759fcf3ce44SJohn Forte 	int i;
17603e7352aeSJohn Forte 	wchar_t memberIdent[sizeof (groupProps->name[0].ident) + 1] = {0};
1761fcf3ce44SJohn Forte 
1762fcf3ce44SJohn Forte 
1763fcf3ce44SJohn Forte 	for (i = 0; i < groupProps->cnt; i++) {
1764fcf3ce44SJohn Forte 		(void) mbstowcs(memberIdent, (char *)groupProps->name[i].ident,
17653e7352aeSJohn Forte 		    sizeof (groupProps->name[0].ident));
1766fcf3ce44SJohn Forte 		(void) printf("\tMember: %ws\n", memberIdent);
1767fcf3ce44SJohn Forte 	}
1768fcf3ce44SJohn Forte }
1769fcf3ce44SJohn Forte 
1770fcf3ce44SJohn Forte /*
1771fcf3ce44SJohn Forte  * listTargetGroupFunc
1772fcf3ce44SJohn Forte  *
1773fcf3ce44SJohn Forte  * Lists the specified target groups or all if none are specified
1774fcf3ce44SJohn Forte  *
1775fcf3ce44SJohn Forte  */
1776fcf3ce44SJohn Forte /*ARGSUSED*/
1777fcf3ce44SJohn Forte static int
listTargetGroupFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1778fcf3ce44SJohn Forte listTargetGroupFunc(int operandLen, char *operands[], cmdOptions_t *options,
1779fcf3ce44SJohn Forte     void *args)
1780fcf3ce44SJohn Forte {
1781fcf3ce44SJohn Forte 	int ret = 0;
1782fcf3ce44SJohn Forte 	int stmfRet;
1783fcf3ce44SJohn Forte 	int i, j, outerLoop;
1784fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
1785fcf3ce44SJohn Forte 	boolean_t found = B_TRUE;
1786fcf3ce44SJohn Forte 	boolean_t operandEntered;
1787fcf3ce44SJohn Forte 	stmfGroupList *groupList;
1788fcf3ce44SJohn Forte 	stmfGroupProperties *groupProps;
1789fcf3ce44SJohn Forte 	wchar_t operandName[sizeof (stmfGroupName)];
1790fcf3ce44SJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)];
1791fcf3ce44SJohn Forte 
1792fcf3ce44SJohn Forte 	for (; options->optval; options++) {
1793fcf3ce44SJohn Forte 		switch (options->optval) {
1794fcf3ce44SJohn Forte 			case 'v':
1795fcf3ce44SJohn Forte 				verbose = B_TRUE;
1796fcf3ce44SJohn Forte 				break;
1797fcf3ce44SJohn Forte 			default:
1798fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
1799fcf3ce44SJohn Forte 				    cmdName, options->optval,
1800fcf3ce44SJohn Forte 				    gettext("unknown option"));
1801fcf3ce44SJohn Forte 				return (1);
1802fcf3ce44SJohn Forte 		}
1803fcf3ce44SJohn Forte 	}
1804fcf3ce44SJohn Forte 
1805fcf3ce44SJohn Forte 	if (operandLen > 0) {
1806fcf3ce44SJohn Forte 		outerLoop = operandLen;
1807fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
1808fcf3ce44SJohn Forte 	} else {
1809fcf3ce44SJohn Forte 		outerLoop = 1;
1810fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
1811fcf3ce44SJohn Forte 	}
1812fcf3ce44SJohn Forte 
1813fcf3ce44SJohn Forte 	stmfRet = stmfGetTargetGroupList(&groupList);
1814fcf3ce44SJohn Forte 	if (stmfRet != STMF_STATUS_SUCCESS) {
1815fcf3ce44SJohn Forte 		switch (stmfRet) {
1816fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
1817fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1818fcf3ce44SJohn Forte 				    gettext("resource busy"));
1819fcf3ce44SJohn Forte 				break;
1820fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
1821fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1822fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
1823fcf3ce44SJohn Forte 				break;
1824fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
1825fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1826fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
1827fcf3ce44SJohn Forte 				break;
1828fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
1829fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1830fcf3ce44SJohn Forte 				    gettext("permission denied"));
1831fcf3ce44SJohn Forte 				break;
1832fcf3ce44SJohn Forte 			default:
1833fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1834fcf3ce44SJohn Forte 				    gettext("unknown error"));
1835fcf3ce44SJohn Forte 				break;
1836fcf3ce44SJohn Forte 		}
1837fcf3ce44SJohn Forte 		return (1);
1838fcf3ce44SJohn Forte 	}
1839fcf3ce44SJohn Forte 
1840fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
1841fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < groupList->cnt; j++) {
1842fcf3ce44SJohn Forte 			(void) mbstowcs(groupNamePrint,
1843fcf3ce44SJohn Forte 			    (char *)groupList->name[j],
18443e7352aeSJohn Forte 			    sizeof (stmfGroupName) - 1);
18453e7352aeSJohn Forte 			groupNamePrint[sizeof (stmfGroupName) - 1] = 0;
1846fcf3ce44SJohn Forte 			if (operandEntered) {
1847fcf3ce44SJohn Forte 				(void) mbstowcs(operandName, operands[i],
18483e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
18493e7352aeSJohn Forte 				operandName[sizeof (stmfGroupName) - 1] = 0;
1850fcf3ce44SJohn Forte 				if (wcscmp(operandName, groupNamePrint)
1851fcf3ce44SJohn Forte 				    == 0) {
1852fcf3ce44SJohn Forte 					found = B_TRUE;
1853fcf3ce44SJohn Forte 				}
1854fcf3ce44SJohn Forte 			}
1855fcf3ce44SJohn Forte 			if ((found && operandEntered) || !operandEntered) {
1856fcf3ce44SJohn Forte 				(void) printf("Target Group: %ws\n",
1857fcf3ce44SJohn Forte 				    groupNamePrint);
1858fcf3ce44SJohn Forte 				if (verbose) {
1859fcf3ce44SJohn Forte 					stmfRet = stmfGetTargetGroupMembers(
1860fcf3ce44SJohn Forte 					    &(groupList->name[j]), &groupProps);
1861fcf3ce44SJohn Forte 					if (stmfRet != STMF_STATUS_SUCCESS) {
1862fcf3ce44SJohn Forte 						return (1);
1863fcf3ce44SJohn Forte 					}
1864fcf3ce44SJohn Forte 					printGroupProps(groupProps);
1865fcf3ce44SJohn Forte 				}
1866fcf3ce44SJohn Forte 				if (found && operandEntered) {
1867fcf3ce44SJohn Forte 					break;
1868fcf3ce44SJohn Forte 				}
1869fcf3ce44SJohn Forte 			}
1870fcf3ce44SJohn Forte 
1871fcf3ce44SJohn Forte 		}
1872fcf3ce44SJohn Forte 		if (operandEntered && !found) {
1873fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
1874fcf3ce44SJohn Forte 			    operands[i], gettext("not found"));
1875fcf3ce44SJohn Forte 			ret = 1;
1876fcf3ce44SJohn Forte 		}
1877fcf3ce44SJohn Forte 	}
1878fcf3ce44SJohn Forte 	return (ret);
1879fcf3ce44SJohn Forte }
1880fcf3ce44SJohn Forte 
1881fcf3ce44SJohn Forte /*
1882fcf3ce44SJohn Forte  * listLuFunc
1883fcf3ce44SJohn Forte  *
1884fcf3ce44SJohn Forte  * List the logical units and optionally the properties
1885fcf3ce44SJohn Forte  *
1886fcf3ce44SJohn Forte  */
1887fcf3ce44SJohn Forte /*ARGSUSED*/
1888fcf3ce44SJohn Forte static int
listLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)1889fcf3ce44SJohn Forte listLuFunc(int operandLen, char *operands[], cmdOptions_t *options, void *args)
1890fcf3ce44SJohn Forte {
1891fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
1892fcf3ce44SJohn Forte 	boolean_t operandEntered;
1893fcf3ce44SJohn Forte 	int i, j;
1894fcf3ce44SJohn Forte 	int ret = 0;
1895fcf3ce44SJohn Forte 	int stmfRet;
1896fcf3ce44SJohn Forte 	int outerLoop;
1897fcf3ce44SJohn Forte 	unsigned int inGuid[sizeof (stmfGuid)];
1898fcf3ce44SJohn Forte 	stmfGuid cmpGuid;
1899fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
1900fcf3ce44SJohn Forte 	boolean_t found;
1901fcf3ce44SJohn Forte 	char sGuid[GUID_INPUT + 1];
1902fcf3ce44SJohn Forte 	stmfGuidList *luList;
1903fcf3ce44SJohn Forte 	stmfLogicalUnitProperties luProps;
1904fcf3ce44SJohn Forte 	boolean_t invalidInput = B_FALSE;
1905fcf3ce44SJohn Forte 	stmfViewEntryList *viewEntryList;
1906fcf3ce44SJohn Forte 
1907fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
1908fcf3ce44SJohn Forte 		switch (optionList->optval) {
1909fcf3ce44SJohn Forte 			case 'v':
1910fcf3ce44SJohn Forte 				verbose = B_TRUE;
1911fcf3ce44SJohn Forte 				break;
1912fcf3ce44SJohn Forte 		}
1913fcf3ce44SJohn Forte 	}
1914fcf3ce44SJohn Forte 
1915fcf3ce44SJohn Forte 	if ((stmfRet = stmfGetLogicalUnitList(&luList))
1916fcf3ce44SJohn Forte 	    != STMF_STATUS_SUCCESS) {
1917fcf3ce44SJohn Forte 		switch (stmfRet) {
1918fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
1919fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1920fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
1921fcf3ce44SJohn Forte 				break;
1922fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
1923fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1924fcf3ce44SJohn Forte 				    gettext("resource busy"));
1925fcf3ce44SJohn Forte 				break;
1926fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
1927fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1928fcf3ce44SJohn Forte 				    gettext("permission denied"));
1929fcf3ce44SJohn Forte 				break;
1930fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
1931fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1932fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
1933fcf3ce44SJohn Forte 				break;
1934fcf3ce44SJohn Forte 			default:
1935fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
1936fcf3ce44SJohn Forte 				    gettext("list failed"));
1937fcf3ce44SJohn Forte 				break;
1938fcf3ce44SJohn Forte 		}
1939fcf3ce44SJohn Forte 		return (1);
1940fcf3ce44SJohn Forte 	}
1941fcf3ce44SJohn Forte 
1942fcf3ce44SJohn Forte 	if (operandLen > 0) {
1943fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
1944fcf3ce44SJohn Forte 		outerLoop = operandLen;
1945fcf3ce44SJohn Forte 	} else {
1946fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
1947fcf3ce44SJohn Forte 		outerLoop = 1;
1948fcf3ce44SJohn Forte 	}
1949fcf3ce44SJohn Forte 
1950fcf3ce44SJohn Forte 
1951fcf3ce44SJohn Forte 	for (invalidInput = B_FALSE, i = 0; i < outerLoop; i++) {
1952fcf3ce44SJohn Forte 		if (operandEntered) {
1953fcf3ce44SJohn Forte 			if (strlen(operands[i]) != GUID_INPUT) {
1954fcf3ce44SJohn Forte 				invalidInput = B_TRUE;
1955fcf3ce44SJohn Forte 			} else {
1956fcf3ce44SJohn Forte 				for (j = 0; j < GUID_INPUT; j++) {
1957fcf3ce44SJohn Forte 					if (!isxdigit(operands[i][j])) {
1958fcf3ce44SJohn Forte 						invalidInput = B_TRUE;
1959fcf3ce44SJohn Forte 						break;
1960fcf3ce44SJohn Forte 					}
1961fcf3ce44SJohn Forte 				}
1962fcf3ce44SJohn Forte 			}
1963fcf3ce44SJohn Forte 			if (invalidInput) {
1964fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s%d%s\n",
1965fcf3ce44SJohn Forte 				    cmdName, operands[i], gettext("must be "),
1966fcf3ce44SJohn Forte 				    GUID_INPUT,
1967fcf3ce44SJohn Forte 				    gettext(" hexadecimal digits long"));
19688fe96085Stim szeto 				invalidInput = B_FALSE;
1969fcf3ce44SJohn Forte 				continue;
1970fcf3ce44SJohn Forte 			}
1971fcf3ce44SJohn Forte 
1972fcf3ce44SJohn Forte 			for (j = 0; j < GUID_INPUT; j++) {
1973fcf3ce44SJohn Forte 				sGuid[j] = tolower(operands[i][j]);
1974fcf3ce44SJohn Forte 			}
1975fcf3ce44SJohn Forte 			sGuid[j] = 0;
1976fcf3ce44SJohn Forte 
1977fcf3ce44SJohn Forte 			(void) sscanf(sGuid,
1978fcf3ce44SJohn Forte 			    "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
1979fcf3ce44SJohn Forte 			    &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3],
1980fcf3ce44SJohn Forte 			    &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7],
1981fcf3ce44SJohn Forte 			    &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11],
1982fcf3ce44SJohn Forte 			    &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]);
1983fcf3ce44SJohn Forte 
1984fcf3ce44SJohn Forte 			for (j = 0; j < sizeof (stmfGuid); j++) {
1985fcf3ce44SJohn Forte 				cmpGuid.guid[j] = inGuid[j];
1986fcf3ce44SJohn Forte 			}
1987fcf3ce44SJohn Forte 		}
1988fcf3ce44SJohn Forte 
1989fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < luList->cnt; j++) {
1990fcf3ce44SJohn Forte 			if (operandEntered) {
1991fcf3ce44SJohn Forte 				if (bcmp(luList->guid[j].guid, cmpGuid.guid,
1992fcf3ce44SJohn Forte 				    sizeof (stmfGuid)) == 0) {
1993fcf3ce44SJohn Forte 					found = B_TRUE;
1994fcf3ce44SJohn Forte 				}
1995fcf3ce44SJohn Forte 			}
1996fcf3ce44SJohn Forte 			if ((found && operandEntered) || !operandEntered) {
1997fcf3ce44SJohn Forte 				(void) printf("LU Name: ");
1998fcf3ce44SJohn Forte 				printGuid(&luList->guid[j], stdout);
1999fcf3ce44SJohn Forte 				(void) printf("\n");
2000fcf3ce44SJohn Forte 
2001fcf3ce44SJohn Forte 				if (verbose) {
2002fcf3ce44SJohn Forte 					stmfRet = stmfGetLogicalUnitProperties(
2003fcf3ce44SJohn Forte 					    &(luList->guid[j]), &luProps);
2004fcf3ce44SJohn Forte 					if (stmfRet == STMF_STATUS_SUCCESS) {
2005fcf3ce44SJohn Forte 						printLuProps(&luProps);
2006fcf3ce44SJohn Forte 					} else {
2007fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s:",
2008fcf3ce44SJohn Forte 						    cmdName);
2009fcf3ce44SJohn Forte 						printGuid(&luList->guid[j],
2010fcf3ce44SJohn Forte 						    stderr);
2011fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s\n",
2012fcf3ce44SJohn Forte 						    gettext(" get properties "
2013fcf3ce44SJohn Forte 						    "failed"));
2014fcf3ce44SJohn Forte 					}
2015fcf3ce44SJohn Forte 					stmfRet = stmfGetViewEntryList(
2016fcf3ce44SJohn Forte 					    &(luList->guid[j]),
2017fcf3ce44SJohn Forte 					    &viewEntryList);
2018fcf3ce44SJohn Forte 					(void) printf(PROPS_FORMAT,
2019fcf3ce44SJohn Forte 					    "View Entry Count");
2020fcf3ce44SJohn Forte 					if (stmfRet == STMF_STATUS_SUCCESS) {
2021fcf3ce44SJohn Forte 						(void) printf("%d",
2022fcf3ce44SJohn Forte 						    viewEntryList->cnt);
2023fcf3ce44SJohn Forte 					} else {
2024fcf3ce44SJohn Forte 						(void) printf("unknown");
2025fcf3ce44SJohn Forte 					}
2026fcf3ce44SJohn Forte 					(void) printf("\n");
20278fe96085Stim szeto 					ret = printExtLuProps(
20288fe96085Stim szeto 					    &(luList->guid[j]));
2029fcf3ce44SJohn Forte 				}
2030fcf3ce44SJohn Forte 				if (found && operandEntered) {
2031fcf3ce44SJohn Forte 					break;
2032fcf3ce44SJohn Forte 				}
2033fcf3ce44SJohn Forte 			}
2034fcf3ce44SJohn Forte 
2035fcf3ce44SJohn Forte 		}
2036fcf3ce44SJohn Forte 		if (operandEntered && !found) {
2037fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
2038fcf3ce44SJohn Forte 			    operands[i], gettext("not found"));
2039fcf3ce44SJohn Forte 			ret = 1;
2040fcf3ce44SJohn Forte 		}
2041fcf3ce44SJohn Forte 	}
2042fcf3ce44SJohn Forte 
2043fcf3ce44SJohn Forte 	return (ret);
2044fcf3ce44SJohn Forte }
2045fcf3ce44SJohn Forte 
2046fcf3ce44SJohn Forte static void
printGuid(stmfGuid * guid,FILE * stream)2047fcf3ce44SJohn Forte printGuid(stmfGuid *guid, FILE *stream)
2048fcf3ce44SJohn Forte {
2049fcf3ce44SJohn Forte 	int i;
2050fcf3ce44SJohn Forte 	for (i = 0; i < 16; i++) {
2051fcf3ce44SJohn Forte 		(void) fprintf(stream, "%02X", guid->guid[i]);
2052fcf3ce44SJohn Forte 	}
2053fcf3ce44SJohn Forte }
2054fcf3ce44SJohn Forte 
20558fe96085Stim szeto static int
printExtLuProps(stmfGuid * guid)20568fe96085Stim szeto printExtLuProps(stmfGuid *guid)
20578fe96085Stim szeto {
20588fe96085Stim szeto 	int stmfRet;
20598fe96085Stim szeto 	luResource hdl = NULL;
20608fe96085Stim szeto 	int ret = 0;
20618fe96085Stim szeto 	char propVal[MAXNAMELEN];
20628fe96085Stim szeto 	size_t propValSize = sizeof (propVal);
20638fe96085Stim szeto 
20648fe96085Stim szeto 	if ((stmfRet = stmfGetLuResource(guid, &hdl))
20658fe96085Stim szeto 	    != STMF_STATUS_SUCCESS) {
20668fe96085Stim szeto 		switch (stmfRet) {
20678fe96085Stim szeto 			case STMF_ERROR_BUSY:
20688fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
20698fe96085Stim szeto 				    gettext("resource busy"));
20708fe96085Stim szeto 				break;
20718fe96085Stim szeto 			case STMF_ERROR_PERM:
20728fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
20738fe96085Stim szeto 				    gettext("permission denied"));
20748fe96085Stim szeto 				break;
20758fe96085Stim szeto 			case STMF_ERROR_NOT_FOUND:
20768fe96085Stim szeto 				/* No error here */
20778fe96085Stim szeto 				return (0);
20788fe96085Stim szeto 			default:
20798fe96085Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
20808fe96085Stim szeto 				    gettext("get extended properties failed"));
20818fe96085Stim szeto 				break;
20828fe96085Stim szeto 		}
20838fe96085Stim szeto 		return (1);
20848fe96085Stim szeto 	}
20858fe96085Stim szeto 
20868fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal,
20878fe96085Stim szeto 	    &propValSize);
20888fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Data File");
20898fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
20908fe96085Stim szeto 		(void) printf("%s\n", propVal);
20918fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
20928fe96085Stim szeto 		(void) printf("not set\n");
209345039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
209445039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
20958fe96085Stim szeto 	} else {
20968fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
20978fe96085Stim szeto 		ret++;
20988fe96085Stim szeto 	}
20998fe96085Stim szeto 
21008fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_META_FILENAME, propVal,
21018fe96085Stim szeto 	    &propValSize);
21028fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Meta File");
21038fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21048fe96085Stim szeto 		(void) printf("%s\n", propVal);
21058fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21068fe96085Stim szeto 		(void) printf("not set\n");
210745039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
210845039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21098fe96085Stim szeto 	} else {
21108fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21118fe96085Stim szeto 		ret++;
21128fe96085Stim szeto 	}
21138fe96085Stim szeto 
21148fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal,
21158fe96085Stim szeto 	    &propValSize);
21168fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Size");
21178fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21188fe96085Stim szeto 		(void) printf("%s\n", propVal);
21198fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21208fe96085Stim szeto 		(void) printf("not set\n");
212145039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
212245039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21238fe96085Stim szeto 	} else {
21248fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21258fe96085Stim szeto 		ret++;
21268fe96085Stim szeto 	}
21278fe96085Stim szeto 
21288fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_BLOCK_SIZE, propVal,
21298fe96085Stim szeto 	    &propValSize);
21308fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Block Size");
21318fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21328fe96085Stim szeto 		(void) printf("%s\n", propVal);
21338fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21348fe96085Stim szeto 		(void) printf("not set\n");
213545039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
213645039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21378fe96085Stim szeto 	} else {
21388fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21398fe96085Stim szeto 		ret++;
21402f624233SNattuvetty Bhavyan 	}
21412f624233SNattuvetty Bhavyan 
21422f624233SNattuvetty Bhavyan 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_MGMT_URL, propVal,
21432f624233SNattuvetty Bhavyan 	    &propValSize);
21442f624233SNattuvetty Bhavyan 	(void) printf(PROPS_FORMAT, "Management URL");
21452f624233SNattuvetty Bhavyan 	if (stmfRet == STMF_STATUS_SUCCESS) {
21462f624233SNattuvetty Bhavyan 		(void) printf("%s\n", propVal);
21472f624233SNattuvetty Bhavyan 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21482f624233SNattuvetty Bhavyan 		(void) printf("not set\n");
214945039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
215045039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21512f624233SNattuvetty Bhavyan 	} else {
21522f624233SNattuvetty Bhavyan 		(void) printf("<error retrieving property>\n");
21532f624233SNattuvetty Bhavyan 		ret++;
21548fe96085Stim szeto 	}
21558fe96085Stim szeto 
21568fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_VID, propVal,
21578fe96085Stim szeto 	    &propValSize);
21588fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Vendor ID");
21598fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21608fe96085Stim szeto 		(void) printf("%s\n", propVal);
21618fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21628fe96085Stim szeto 		(void) printf("not set\n");
216345039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
216445039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21658fe96085Stim szeto 	} else {
21668fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21678fe96085Stim szeto 		ret++;
21688fe96085Stim szeto 	}
21698fe96085Stim szeto 
21708fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_PID, propVal,
21718fe96085Stim szeto 	    &propValSize);
21728fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Product ID");
21738fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21748fe96085Stim szeto 		(void) printf("%s\n", propVal);
21758fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21768fe96085Stim szeto 		(void) printf("not set\n");
217745039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
217845039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21798fe96085Stim szeto 	} else {
21808fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21818fe96085Stim szeto 		ret++;
21828fe96085Stim szeto 	}
21838fe96085Stim szeto 
21848fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SERIAL_NUM, propVal,
21858fe96085Stim szeto 	    &propValSize);
21868fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Serial Num");
21878fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
21888fe96085Stim szeto 		(void) printf("%s\n", propVal);
21898fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
21908fe96085Stim szeto 		(void) printf("not set\n");
219145039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
219245039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
21938fe96085Stim szeto 	} else {
21948fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
21958fe96085Stim szeto 		ret++;
21968fe96085Stim szeto 	}
21978fe96085Stim szeto 
21988fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_WRITE_PROTECT, propVal,
21998fe96085Stim szeto 	    &propValSize);
22008fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Write Protect");
22018fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
22028fe96085Stim szeto 		(void) printf("%s\n",
22038fe96085Stim szeto 		    strcasecmp(propVal, "true") ? "Disabled" : "Enabled");
22048fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
22058fe96085Stim szeto 		(void) printf("not set\n");
220645039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
220745039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
22088fe96085Stim szeto 	} else {
22098fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
22108fe96085Stim szeto 		ret++;
22118fe96085Stim szeto 	}
22128fe96085Stim szeto 
22138fe96085Stim szeto 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_WRITE_CACHE_DISABLE, propVal,
22148fe96085Stim szeto 	    &propValSize);
22158fe96085Stim szeto 	(void) printf(PROPS_FORMAT, "Writeback Cache");
22168fe96085Stim szeto 	if (stmfRet == STMF_STATUS_SUCCESS) {
22178fe96085Stim szeto 		(void) printf("%s\n",
22188fe96085Stim szeto 		    strcasecmp(propVal, "true") ? "Enabled" : "Disabled");
22198fe96085Stim szeto 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
22208fe96085Stim szeto 		(void) printf("not set\n");
222145039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
222245039663SJohn Forte 		(void) printf("prop unavailable in standby\n");
22238fe96085Stim szeto 	} else {
22248fe96085Stim szeto 		(void) printf("<error retrieving property>\n");
22258fe96085Stim szeto 		ret++;
22268fe96085Stim szeto 	}
22278fe96085Stim szeto 
222845039663SJohn Forte 	stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_ACCESS_STATE, propVal,
222945039663SJohn Forte 	    &propValSize);
223045039663SJohn Forte 	(void) printf(PROPS_FORMAT, "Access State");
223145039663SJohn Forte 	if (stmfRet == STMF_STATUS_SUCCESS) {
223245039663SJohn Forte 		if (strcmp(propVal, STMF_ACCESS_ACTIVE) == 0) {
223345039663SJohn Forte 			(void) printf("%s\n", "Active");
223445039663SJohn Forte 		} else if (strcmp(propVal,
223545039663SJohn Forte 		    STMF_ACCESS_ACTIVE_TO_STANDBY) == 0) {
223645039663SJohn Forte 			(void) printf("%s\n", "Active->Standby");
223745039663SJohn Forte 		} else if (strcmp(propVal, STMF_ACCESS_STANDBY) == 0) {
223845039663SJohn Forte 			(void) printf("%s\n", "Standby");
223945039663SJohn Forte 		} else if (strcmp(propVal,
224045039663SJohn Forte 		    STMF_ACCESS_STANDBY_TO_ACTIVE) == 0) {
224145039663SJohn Forte 			(void) printf("%s\n", "Standby->Active");
224245039663SJohn Forte 		} else {
224345039663SJohn Forte 			(void) printf("%s\n", "Unknown");
224445039663SJohn Forte 		}
224545039663SJohn Forte 	} else if (stmfRet == STMF_ERROR_NO_PROP) {
224645039663SJohn Forte 		(void) printf("not set\n");
224745039663SJohn Forte 	} else {
224845039663SJohn Forte 		(void) printf("<error retrieving property>\n");
224945039663SJohn Forte 		ret++;
225045039663SJohn Forte 	}
22518fe96085Stim szeto 
225245039663SJohn Forte done:
22538fe96085Stim szeto 	(void) stmfFreeLuResource(hdl);
22548fe96085Stim szeto 	return (ret);
22558fe96085Stim szeto 
22568fe96085Stim szeto }
22578fe96085Stim szeto 
2258fcf3ce44SJohn Forte 
2259fcf3ce44SJohn Forte /*
2260fcf3ce44SJohn Forte  * printLuProps
2261fcf3ce44SJohn Forte  *
2262fcf3ce44SJohn Forte  * Prints the properties for a logical unit
2263fcf3ce44SJohn Forte  *
2264fcf3ce44SJohn Forte  */
2265fcf3ce44SJohn Forte static void
printLuProps(stmfLogicalUnitProperties * luProps)2266fcf3ce44SJohn Forte printLuProps(stmfLogicalUnitProperties *luProps)
2267fcf3ce44SJohn Forte {
2268fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Operational Status");
2269fcf3ce44SJohn Forte 	switch (luProps->status) {
2270fcf3ce44SJohn Forte 		case STMF_LOGICAL_UNIT_ONLINE:
2271fcf3ce44SJohn Forte 			(void) printf("Online");
2272fcf3ce44SJohn Forte 			break;
2273fcf3ce44SJohn Forte 		case STMF_LOGICAL_UNIT_OFFLINE:
2274fcf3ce44SJohn Forte 			(void) printf("Offline");
2275fcf3ce44SJohn Forte 			break;
2276fcf3ce44SJohn Forte 		case STMF_LOGICAL_UNIT_ONLINING:
2277fcf3ce44SJohn Forte 			(void) printf("Onlining");
2278fcf3ce44SJohn Forte 			break;
2279fcf3ce44SJohn Forte 		case STMF_LOGICAL_UNIT_OFFLINING:
2280fcf3ce44SJohn Forte 			(void) printf("Offlining");
2281fcf3ce44SJohn Forte 			break;
2282fcf3ce44SJohn Forte 		case STMF_LOGICAL_UNIT_UNREGISTERED:
2283fcf3ce44SJohn Forte 			(void) printf("unregistered");
2284fcf3ce44SJohn Forte 			(void) strncpy(luProps->providerName, "unregistered",
2285fcf3ce44SJohn Forte 			    sizeof (luProps->providerName));
2286fcf3ce44SJohn Forte 			break;
2287fcf3ce44SJohn Forte 		default:
2288fcf3ce44SJohn Forte 			(void) printf("unknown");
2289fcf3ce44SJohn Forte 			break;
2290fcf3ce44SJohn Forte 	}
2291fcf3ce44SJohn Forte 	(void) printf("\n");
2292fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Provider Name");
2293fcf3ce44SJohn Forte 	if (luProps->providerName[0] != 0) {
2294fcf3ce44SJohn Forte 		(void) printf("%s", luProps->providerName);
2295fcf3ce44SJohn Forte 	} else {
2296fcf3ce44SJohn Forte 		(void) printf("unknown");
2297fcf3ce44SJohn Forte 	}
2298fcf3ce44SJohn Forte 	(void) printf("\n");
2299fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Alias");
2300fcf3ce44SJohn Forte 	if (luProps->alias[0] != 0) {
2301fcf3ce44SJohn Forte 		(void) printf("%s", luProps->alias);
2302fcf3ce44SJohn Forte 	} else {
2303fcf3ce44SJohn Forte 		(void) printf("-");
2304fcf3ce44SJohn Forte 	}
2305fcf3ce44SJohn Forte 	(void) printf("\n");
2306fcf3ce44SJohn Forte }
2307fcf3ce44SJohn Forte 
2308fcf3ce44SJohn Forte /*
2309fcf3ce44SJohn Forte  * printTargetProps
2310fcf3ce44SJohn Forte  *
2311fcf3ce44SJohn Forte  * Prints the properties for a target
2312fcf3ce44SJohn Forte  *
2313fcf3ce44SJohn Forte  */
2314fcf3ce44SJohn Forte static void
printTargetProps(stmfTargetProperties * targetProps)2315fcf3ce44SJohn Forte printTargetProps(stmfTargetProperties *targetProps)
2316fcf3ce44SJohn Forte {
2317fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Operational Status");
2318fcf3ce44SJohn Forte 	switch (targetProps->status) {
2319fcf3ce44SJohn Forte 		case STMF_TARGET_PORT_ONLINE:
2320fcf3ce44SJohn Forte 			(void) printf("Online");
2321fcf3ce44SJohn Forte 			break;
2322fcf3ce44SJohn Forte 		case STMF_TARGET_PORT_OFFLINE:
2323fcf3ce44SJohn Forte 			(void) printf("Offline");
2324fcf3ce44SJohn Forte 			break;
2325fcf3ce44SJohn Forte 		case STMF_TARGET_PORT_ONLINING:
2326fcf3ce44SJohn Forte 			(void) printf("Onlining");
2327fcf3ce44SJohn Forte 			break;
2328fcf3ce44SJohn Forte 		case STMF_TARGET_PORT_OFFLINING:
2329fcf3ce44SJohn Forte 			(void) printf("Offlining");
2330fcf3ce44SJohn Forte 			break;
2331fcf3ce44SJohn Forte 		default:
2332fcf3ce44SJohn Forte 			(void) printf("unknown");
2333fcf3ce44SJohn Forte 			break;
2334fcf3ce44SJohn Forte 	}
2335fcf3ce44SJohn Forte 	(void) printf("\n");
2336fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Provider Name");
2337fcf3ce44SJohn Forte 	if (targetProps->providerName[0] != 0) {
2338fcf3ce44SJohn Forte 		(void) printf("%s", targetProps->providerName);
2339fcf3ce44SJohn Forte 	}
2340fcf3ce44SJohn Forte 	(void) printf("\n");
2341fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Alias");
2342fcf3ce44SJohn Forte 	if (targetProps->alias[0] != 0) {
2343fcf3ce44SJohn Forte 		(void) printf("%s", targetProps->alias);
2344fcf3ce44SJohn Forte 	} else {
2345fcf3ce44SJohn Forte 		(void) printf("-");
2346fcf3ce44SJohn Forte 	}
2347fcf3ce44SJohn Forte 	(void) printf("\n");
234845039663SJohn Forte 	(void) printf(PROPS_FORMAT, "Protocol");
234945039663SJohn Forte 	switch (targetProps->protocol) {
235045039663SJohn Forte 		case STMF_PROTOCOL_FIBRE_CHANNEL:
235145039663SJohn Forte 			(void) printf("%s", "Fibre Channel");
235245039663SJohn Forte 			break;
235345039663SJohn Forte 		case STMF_PROTOCOL_ISCSI:
235445039663SJohn Forte 			(void) printf("%s", "iSCSI");
235545039663SJohn Forte 			break;
235645039663SJohn Forte 		case STMF_PROTOCOL_SRP:
235745039663SJohn Forte 			(void) printf("%s", "SRP");
235845039663SJohn Forte 			break;
235945039663SJohn Forte 		case STMF_PROTOCOL_SAS:
236045039663SJohn Forte 			(void) printf("%s", "SAS");
236145039663SJohn Forte 			break;
236245039663SJohn Forte 		default:
236345039663SJohn Forte 			(void) printf("%s", "unknown");
236445039663SJohn Forte 			break;
236545039663SJohn Forte 	}
236645039663SJohn Forte 
236745039663SJohn Forte 	(void) printf("\n");
2368fcf3ce44SJohn Forte }
2369fcf3ce44SJohn Forte 
2370fcf3ce44SJohn Forte /*
2371fcf3ce44SJohn Forte  * printSessionProps
2372fcf3ce44SJohn Forte  *
2373fcf3ce44SJohn Forte  * Prints the session data
2374fcf3ce44SJohn Forte  *
2375fcf3ce44SJohn Forte  */
2376fcf3ce44SJohn Forte static void
printSessionProps(stmfSessionList * sessionList)2377fcf3ce44SJohn Forte printSessionProps(stmfSessionList *sessionList)
2378fcf3ce44SJohn Forte {
2379fcf3ce44SJohn Forte 	int i;
2380fcf3ce44SJohn Forte 	char *cTime;
2381fcf3ce44SJohn Forte 	wchar_t initiator[STMF_IDENT_LENGTH + 1];
2382fcf3ce44SJohn Forte 
2383fcf3ce44SJohn Forte 	(void) printf(PROPS_FORMAT, "Sessions");
2384fcf3ce44SJohn Forte 	(void) printf("%d\n", sessionList->cnt);
2385fcf3ce44SJohn Forte 	for (i = 0; i < sessionList->cnt; i++) {
2386fcf3ce44SJohn Forte 		(void) mbstowcs(initiator,
2387fcf3ce44SJohn Forte 		    (char *)sessionList->session[i].initiator.ident,
23883e7352aeSJohn Forte 		    STMF_IDENT_LENGTH);
23893e7352aeSJohn Forte 		initiator[STMF_IDENT_LENGTH] = 0;
2390fcf3ce44SJohn Forte 		(void) printf(LVL3_FORMAT, "Initiator: ");
2391fcf3ce44SJohn Forte 		(void) printf("%ws\n", initiator);
2392fcf3ce44SJohn Forte 		(void) printf(LVL4_FORMAT, "Alias: ");
2393fcf3ce44SJohn Forte 		if (sessionList->session[i].alias[0] != 0) {
2394fcf3ce44SJohn Forte 			(void) printf("%s", sessionList->session[i].alias);
2395fcf3ce44SJohn Forte 		} else {
2396fcf3ce44SJohn Forte 			(void) printf("-");
2397fcf3ce44SJohn Forte 		}
2398fcf3ce44SJohn Forte 		(void) printf("\n");
2399fcf3ce44SJohn Forte 		(void) printf(LVL4_FORMAT, "Logged in since: ");
2400fcf3ce44SJohn Forte 		cTime = ctime(&(sessionList->session[i].creationTime));
2401fcf3ce44SJohn Forte 		if (cTime != NULL) {
2402fcf3ce44SJohn Forte 			(void) printf("%s", cTime);
2403fcf3ce44SJohn Forte 		} else {
2404fcf3ce44SJohn Forte 			(void) printf("unknown\n");
2405fcf3ce44SJohn Forte 		}
2406fcf3ce44SJohn Forte 	}
2407fcf3ce44SJohn Forte }
2408fcf3ce44SJohn Forte 
2409e17f3b22Stim szeto static int
getStmfState(stmfState * state)2410e17f3b22Stim szeto getStmfState(stmfState *state)
2411e17f3b22Stim szeto {
2412e17f3b22Stim szeto 	int ret;
2413e17f3b22Stim szeto 
2414e17f3b22Stim szeto 	ret = stmfGetState(state);
2415e17f3b22Stim szeto 	switch (ret) {
2416e17f3b22Stim szeto 		case STMF_STATUS_SUCCESS:
2417e17f3b22Stim szeto 			break;
2418e17f3b22Stim szeto 		case STMF_ERROR_PERM:
2419e17f3b22Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2420e17f3b22Stim szeto 			    gettext("permission denied"));
2421e17f3b22Stim szeto 			break;
2422e17f3b22Stim szeto 		case STMF_ERROR_SERVICE_NOT_FOUND:
2423e17f3b22Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2424e17f3b22Stim szeto 			    gettext("STMF service not found"));
2425e17f3b22Stim szeto 			break;
2426e17f3b22Stim szeto 		case STMF_ERROR_BUSY:
2427e17f3b22Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2428e17f3b22Stim szeto 			    gettext("resource busy"));
2429e17f3b22Stim szeto 			break;
2430e17f3b22Stim szeto 		case STMF_ERROR_SERVICE_DATA_VERSION:
2431e17f3b22Stim szeto 			(void) fprintf(stderr, "%s: %s\n", cmdName,
2432e17f3b22Stim szeto 			    gettext("STMF service version incorrect"));
2433e17f3b22Stim szeto 			break;
2434e17f3b22Stim szeto 		default:
24358fe96085Stim szeto 			(void) fprintf(stderr, "%s: %s: %d\n", cmdName,
24368fe96085Stim szeto 			    gettext("unknown error"), ret);
2437e17f3b22Stim szeto 			break;
2438e17f3b22Stim szeto 	}
2439e17f3b22Stim szeto 	return (ret);
2440e17f3b22Stim szeto }
2441e17f3b22Stim szeto 
2442fcf3ce44SJohn Forte /*
2443fcf3ce44SJohn Forte  * listStateFunc
2444fcf3ce44SJohn Forte  *
2445fcf3ce44SJohn Forte  * List the operational and config state of the stmf service
2446fcf3ce44SJohn Forte  *
2447fcf3ce44SJohn Forte  */
2448fcf3ce44SJohn Forte /*ARGSUSED*/
2449fcf3ce44SJohn Forte static int
listStateFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)2450fcf3ce44SJohn Forte listStateFunc(int operandLen, char *operands[], cmdOptions_t *options,
2451fcf3ce44SJohn Forte     void *args)
2452fcf3ce44SJohn Forte {
2453fcf3ce44SJohn Forte 	int ret;
2454fcf3ce44SJohn Forte 	stmfState state;
245545039663SJohn Forte 	boolean_t aluaEnabled;
245645039663SJohn Forte 	uint32_t node;
2457fcf3ce44SJohn Forte 
2458e17f3b22Stim szeto 	if ((ret = getStmfState(&state)) != STMF_STATUS_SUCCESS)
2459e17f3b22Stim szeto 		return (ret);
2460fcf3ce44SJohn Forte 
2461fcf3ce44SJohn Forte 	(void) printf("%-18s: ", "Operational Status");
2462fcf3ce44SJohn Forte 	switch (state.operationalState) {
2463fcf3ce44SJohn Forte 		case STMF_SERVICE_STATE_ONLINE:
2464fcf3ce44SJohn Forte 			(void) printf("online");
2465fcf3ce44SJohn Forte 			break;
2466fcf3ce44SJohn Forte 		case STMF_SERVICE_STATE_OFFLINE:
2467fcf3ce44SJohn Forte 			(void) printf("offline");
2468fcf3ce44SJohn Forte 			break;
2469fcf3ce44SJohn Forte 		case STMF_SERVICE_STATE_ONLINING:
2470fcf3ce44SJohn Forte 			(void) printf("onlining");
2471fcf3ce44SJohn Forte 			break;
2472fcf3ce44SJohn Forte 		case STMF_SERVICE_STATE_OFFLINING:
2473fcf3ce44SJohn Forte 			(void) printf("offlining");
2474fcf3ce44SJohn Forte 			break;
2475fcf3ce44SJohn Forte 		default:
2476fcf3ce44SJohn Forte 			(void) printf("unknown");
2477fcf3ce44SJohn Forte 			break;
2478fcf3ce44SJohn Forte 	}
2479fcf3ce44SJohn Forte 	(void) printf("\n");
2480fcf3ce44SJohn Forte 	(void) printf("%-18s: ", "Config Status");
2481fcf3ce44SJohn Forte 	switch (state.configState) {
2482fcf3ce44SJohn Forte 		case STMF_CONFIG_STATE_NONE:
2483fcf3ce44SJohn Forte 			(void) printf("uninitialized");
2484fcf3ce44SJohn Forte 			break;
2485fcf3ce44SJohn Forte 		case STMF_CONFIG_STATE_INIT:
2486fcf3ce44SJohn Forte 			(void) printf("initializing");
2487fcf3ce44SJohn Forte 			break;
2488fcf3ce44SJohn Forte 		case STMF_CONFIG_STATE_INIT_DONE:
2489fcf3ce44SJohn Forte 			(void) printf("initialized");
2490fcf3ce44SJohn Forte 			break;
2491fcf3ce44SJohn Forte 		default:
2492fcf3ce44SJohn Forte 			(void) printf("unknown");
2493fcf3ce44SJohn Forte 			break;
2494fcf3ce44SJohn Forte 	}
2495fcf3ce44SJohn Forte 	(void) printf("\n");
249645039663SJohn Forte 	ret = stmfGetAluaState(&aluaEnabled, &node);
249745039663SJohn Forte 	switch (ret) {
249845039663SJohn Forte 		case STMF_STATUS_SUCCESS:
249945039663SJohn Forte 			break;
250045039663SJohn Forte 		case STMF_ERROR_PERM:
250145039663SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
250245039663SJohn Forte 			    gettext("permission denied"));
250345039663SJohn Forte 			break;
250445039663SJohn Forte 		case STMF_ERROR_BUSY:
250545039663SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
250645039663SJohn Forte 			    gettext("resource busy"));
250745039663SJohn Forte 			break;
250845039663SJohn Forte 		default:
250945039663SJohn Forte 			(void) fprintf(stderr, "%s: %s: %d\n", cmdName,
251045039663SJohn Forte 			    gettext("unknown error"), ret);
251145039663SJohn Forte 			break;
251245039663SJohn Forte 	}
251345039663SJohn Forte 	(void) printf("%-18s: ", "ALUA Status");
251445039663SJohn Forte 	if (ret == STMF_STATUS_SUCCESS) {
251545039663SJohn Forte 		if (aluaEnabled == B_TRUE) {
251645039663SJohn Forte 			(void) printf("enabled");
251745039663SJohn Forte 		} else {
251845039663SJohn Forte 			(void) printf("disabled");
251945039663SJohn Forte 		}
252045039663SJohn Forte 	} else {
252145039663SJohn Forte 		(void) printf("unknown");
252245039663SJohn Forte 	}
252345039663SJohn Forte 
252445039663SJohn Forte 	(void) printf("\n");
252545039663SJohn Forte 	(void) printf("%-18s: ", "ALUA Node");
252645039663SJohn Forte 	if (ret == STMF_STATUS_SUCCESS) {
252745039663SJohn Forte 		(void) printf("%d", node);
252845039663SJohn Forte 	} else {
252945039663SJohn Forte 		(void) printf("unknown");
253045039663SJohn Forte 	}
253145039663SJohn Forte 	(void) printf("\n");
253245039663SJohn Forte 	return (ret);
2533fcf3ce44SJohn Forte }
2534fcf3ce44SJohn Forte 
2535fcf3ce44SJohn Forte /*
2536fcf3ce44SJohn Forte  * listTargetFunc
2537fcf3ce44SJohn Forte  *
2538fcf3ce44SJohn Forte  * list the targets and optionally their properties
2539fcf3ce44SJohn Forte  *
2540fcf3ce44SJohn Forte  */
2541fcf3ce44SJohn Forte /*ARGSUSED*/
2542fcf3ce44SJohn Forte static int
listTargetFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)2543fcf3ce44SJohn Forte listTargetFunc(int operandLen, char *operands[], cmdOptions_t *options,
2544fcf3ce44SJohn Forte     void *args)
2545fcf3ce44SJohn Forte {
2546fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
2547fcf3ce44SJohn Forte 	int ret = 0;
2548fcf3ce44SJohn Forte 	int stmfRet;
2549fcf3ce44SJohn Forte 	int i, j;
2550fcf3ce44SJohn Forte 	int outerLoop;
2551fcf3ce44SJohn Forte 	stmfSessionList *sessionList;
2552fcf3ce44SJohn Forte 	stmfDevid devid;
2553fcf3ce44SJohn Forte 	boolean_t operandEntered, found, verbose = B_FALSE;
2554fcf3ce44SJohn Forte 	stmfDevidList *targetList;
2555fcf3ce44SJohn Forte 	wchar_t targetIdent[STMF_IDENT_LENGTH + 1];
2556fcf3ce44SJohn Forte 	stmfTargetProperties targetProps;
2557fcf3ce44SJohn Forte 
2558fcf3ce44SJohn Forte 	if ((stmfRet = stmfGetTargetList(&targetList)) != STMF_STATUS_SUCCESS) {
2559fcf3ce44SJohn Forte 		switch (stmfRet) {
2560fcf3ce44SJohn Forte 			case STMF_ERROR_NOT_FOUND:
2561fcf3ce44SJohn Forte 				ret = 0;
2562fcf3ce44SJohn Forte 				break;
2563fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_OFFLINE:
2564fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2565fcf3ce44SJohn Forte 				    gettext("STMF service offline"));
2566fcf3ce44SJohn Forte 				break;
2567fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
2568fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2569fcf3ce44SJohn Forte 				    gettext("resource busy"));
2570fcf3ce44SJohn Forte 				break;
2571fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
2572fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2573fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
2574fcf3ce44SJohn Forte 				break;
2575fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
2576fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2577fcf3ce44SJohn Forte 				    gettext("permission denied"));
2578fcf3ce44SJohn Forte 				break;
2579fcf3ce44SJohn Forte 			default:
2580fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2581fcf3ce44SJohn Forte 				    gettext("unknown error"));
2582fcf3ce44SJohn Forte 				break;
2583fcf3ce44SJohn Forte 		}
2584fcf3ce44SJohn Forte 		return (1);
2585fcf3ce44SJohn Forte 	}
2586fcf3ce44SJohn Forte 
2587fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
2588fcf3ce44SJohn Forte 		switch (optionList->optval) {
2589fcf3ce44SJohn Forte 			case 'v':
2590fcf3ce44SJohn Forte 				verbose = B_TRUE;
2591fcf3ce44SJohn Forte 				break;
2592fcf3ce44SJohn Forte 		}
2593fcf3ce44SJohn Forte 	}
2594fcf3ce44SJohn Forte 
2595fcf3ce44SJohn Forte 	if (operandLen > 0) {
2596fcf3ce44SJohn Forte 		outerLoop = operandLen;
2597fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
2598fcf3ce44SJohn Forte 	} else {
2599fcf3ce44SJohn Forte 		outerLoop = 1;
2600fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
2601fcf3ce44SJohn Forte 	}
2602fcf3ce44SJohn Forte 
2603fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
2604fcf3ce44SJohn Forte 		if (operandEntered) {
2605fcf3ce44SJohn Forte 			bzero(&devid, sizeof (devid));
2606fcf3ce44SJohn Forte 			(void) parseDevid(operands[i], &devid);
2607fcf3ce44SJohn Forte 		}
2608fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < targetList->cnt; j++) {
2609fcf3ce44SJohn Forte 			if (operandEntered) {
2610fcf3ce44SJohn Forte 				if (bcmp(&devid, &(targetList->devid[j]),
2611fcf3ce44SJohn Forte 				    sizeof (devid)) == 0) {
2612fcf3ce44SJohn Forte 					found = B_TRUE;
2613fcf3ce44SJohn Forte 				}
2614fcf3ce44SJohn Forte 			}
2615fcf3ce44SJohn Forte 			if ((found && operandEntered) || !operandEntered) {
2616fcf3ce44SJohn Forte 				(void) mbstowcs(targetIdent,
2617fcf3ce44SJohn Forte 				    (char *)targetList->devid[j].ident,
26183e7352aeSJohn Forte 				    STMF_IDENT_LENGTH);
26193e7352aeSJohn Forte 				targetIdent[STMF_IDENT_LENGTH] = 0;
2620fcf3ce44SJohn Forte 				(void) printf("Target: %ws\n", targetIdent);
2621fcf3ce44SJohn Forte 				if (verbose) {
2622fcf3ce44SJohn Forte 					stmfRet = stmfGetTargetProperties(
2623fcf3ce44SJohn Forte 					    &(targetList->devid[j]),
2624fcf3ce44SJohn Forte 					    &targetProps);
2625fcf3ce44SJohn Forte 					if (stmfRet == STMF_STATUS_SUCCESS) {
2626fcf3ce44SJohn Forte 						printTargetProps(&targetProps);
2627fcf3ce44SJohn Forte 					} else {
2628fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s:",
2629fcf3ce44SJohn Forte 						    cmdName);
2630fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s\n",
2631fcf3ce44SJohn Forte 						    gettext(" get properties"
2632fcf3ce44SJohn Forte 						    " failed"));
2633fcf3ce44SJohn Forte 					}
2634fcf3ce44SJohn Forte 					stmfRet = stmfGetSessionList(
2635fcf3ce44SJohn Forte 					    &(targetList->devid[j]),
2636fcf3ce44SJohn Forte 					    &sessionList);
2637fcf3ce44SJohn Forte 					if (stmfRet == STMF_STATUS_SUCCESS) {
2638fcf3ce44SJohn Forte 						printSessionProps(sessionList);
2639fcf3ce44SJohn Forte 					} else {
2640fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s:",
2641fcf3ce44SJohn Forte 						    cmdName);
2642fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s\n",
2643fcf3ce44SJohn Forte 						    gettext(" get session info"
2644fcf3ce44SJohn Forte 						    " failed"));
2645fcf3ce44SJohn Forte 					}
2646fcf3ce44SJohn Forte 				}
2647fcf3ce44SJohn Forte 				if (found && operandEntered) {
2648fcf3ce44SJohn Forte 					break;
2649fcf3ce44SJohn Forte 				}
2650fcf3ce44SJohn Forte 			}
2651fcf3ce44SJohn Forte 
2652fcf3ce44SJohn Forte 		}
2653fcf3ce44SJohn Forte 		if (operandEntered && !found) {
2654fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
2655fcf3ce44SJohn Forte 			    operands[i], "not found");
2656fcf3ce44SJohn Forte 			ret = 1;
2657fcf3ce44SJohn Forte 		}
2658fcf3ce44SJohn Forte 	}
2659fcf3ce44SJohn Forte 	return (ret);
2660fcf3ce44SJohn Forte }
2661fcf3ce44SJohn Forte 
2662fcf3ce44SJohn Forte /*
2663fcf3ce44SJohn Forte  * listViewFunc
2664fcf3ce44SJohn Forte  *
2665fcf3ce44SJohn Forte  * list the view entries for the specified logical unit
2666fcf3ce44SJohn Forte  *
2667fcf3ce44SJohn Forte  */
2668fcf3ce44SJohn Forte /*ARGSUSED*/
2669fcf3ce44SJohn Forte static int
listViewFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)2670fcf3ce44SJohn Forte listViewFunc(int operandLen, char *operands[], cmdOptions_t *options,
2671fcf3ce44SJohn Forte     void *args)
2672fcf3ce44SJohn Forte {
2673fcf3ce44SJohn Forte 	stmfViewEntryList *viewEntryList;
2674fcf3ce44SJohn Forte 	stmfGuid inGuid;
2675fcf3ce44SJohn Forte 	unsigned int guid[sizeof (stmfGuid)];
2676fcf3ce44SJohn Forte 	int ret = 0;
2677fcf3ce44SJohn Forte 	int stmfRet;
2678fcf3ce44SJohn Forte 	int i, j, outerLoop;
2679fcf3ce44SJohn Forte 	boolean_t found = B_TRUE;
2680fcf3ce44SJohn Forte 	boolean_t operandEntered;
2681fcf3ce44SJohn Forte 	uint16_t outputLuNbr;
2682fcf3ce44SJohn Forte 	wchar_t groupName[sizeof (stmfGroupName)];
2683fcf3ce44SJohn Forte 	char sGuid[GUID_INPUT + 1];
2684fcf3ce44SJohn Forte 
2685fcf3ce44SJohn Forte 
2686fcf3ce44SJohn Forte 	for (; options->optval; options++) {
2687fcf3ce44SJohn Forte 		switch (options->optval) {
2688fcf3ce44SJohn Forte 			case 'l':
2689fcf3ce44SJohn Forte 				if (strlen(options->optarg) != GUID_INPUT) {
2690fcf3ce44SJohn Forte 					(void) fprintf(stderr,
2691fcf3ce44SJohn Forte 					    "%s: %s: %s%d%s\n",
2692fcf3ce44SJohn Forte 					    cmdName, options->optarg,
2693fcf3ce44SJohn Forte 					    gettext("must be "), GUID_INPUT,
2694fcf3ce44SJohn Forte 					    gettext(" hexadecimal digits"
2695fcf3ce44SJohn Forte 					    " long"));
2696fcf3ce44SJohn Forte 					return (1);
2697fcf3ce44SJohn Forte 				}
2698fcf3ce44SJohn Forte 				bcopy(options->optarg, sGuid, GUID_INPUT);
2699fcf3ce44SJohn Forte 				break;
2700fcf3ce44SJohn Forte 			default:
2701fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
2702fcf3ce44SJohn Forte 				    cmdName, options->optval,
2703fcf3ce44SJohn Forte 				    gettext("unknown option"));
2704fcf3ce44SJohn Forte 				return (1);
2705fcf3ce44SJohn Forte 		}
2706fcf3ce44SJohn Forte 	}
2707fcf3ce44SJohn Forte 
2708fcf3ce44SJohn Forte 	if (operandLen > 0) {
2709fcf3ce44SJohn Forte 		outerLoop = operandLen;
2710fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
2711fcf3ce44SJohn Forte 	} else {
2712fcf3ce44SJohn Forte 		outerLoop = 1;
2713fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
2714fcf3ce44SJohn Forte 	}
2715fcf3ce44SJohn Forte 
2716fcf3ce44SJohn Forte 	for (i = 0; i < 32; i++)
2717fcf3ce44SJohn Forte 		sGuid[i] = tolower(sGuid[i]);
2718fcf3ce44SJohn Forte 	sGuid[i] = 0;
2719fcf3ce44SJohn Forte 
2720fcf3ce44SJohn Forte 	(void) sscanf(sGuid, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
2721fcf3ce44SJohn Forte 	    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
2722fcf3ce44SJohn Forte 	    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], &guid[11],
2723fcf3ce44SJohn Forte 	    &guid[12], &guid[13], &guid[14], &guid[15]);
2724fcf3ce44SJohn Forte 
2725fcf3ce44SJohn Forte 	for (i = 0; i < sizeof (stmfGuid); i++) {
2726fcf3ce44SJohn Forte 		inGuid.guid[i] = guid[i];
2727fcf3ce44SJohn Forte 	}
2728fcf3ce44SJohn Forte 
2729fcf3ce44SJohn Forte 	if ((stmfRet = stmfGetViewEntryList(&inGuid, &viewEntryList))
2730fcf3ce44SJohn Forte 	    != STMF_STATUS_SUCCESS) {
2731fcf3ce44SJohn Forte 
2732fcf3ce44SJohn Forte 		switch (stmfRet) {
2733fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
2734fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
2735fcf3ce44SJohn Forte 				    sGuid, gettext("resource busy"));
2736fcf3ce44SJohn Forte 				break;
2737fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
2738fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2739fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
2740fcf3ce44SJohn Forte 				break;
2741fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
2742fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2743fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
2744fcf3ce44SJohn Forte 				break;
2745fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
2746fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2747fcf3ce44SJohn Forte 				    gettext("permission denied"));
2748fcf3ce44SJohn Forte 				break;
2749fcf3ce44SJohn Forte 			default:
2750fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
2751fcf3ce44SJohn Forte 				    sGuid, gettext("unknown error"));
2752fcf3ce44SJohn Forte 				break;
2753fcf3ce44SJohn Forte 		}
2754fcf3ce44SJohn Forte 		return (1);
2755fcf3ce44SJohn Forte 	}
2756fcf3ce44SJohn Forte 
27577b506e25Ssrivijitha dugganapalli 	if (viewEntryList->cnt == 0) {
27587b506e25Ssrivijitha dugganapalli 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
27597b506e25Ssrivijitha dugganapalli 		    sGuid, gettext("no views found"));
27607b506e25Ssrivijitha dugganapalli 		return (1);
27617b506e25Ssrivijitha dugganapalli 	}
27627b506e25Ssrivijitha dugganapalli 
2763fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
2764fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < viewEntryList->cnt; j++) {
2765fcf3ce44SJohn Forte 			if (operandEntered) {
2766fcf3ce44SJohn Forte 				if (atoi(operands[i]) ==
2767fcf3ce44SJohn Forte 				    viewEntryList->ve[j].veIndex) {
2768fcf3ce44SJohn Forte 					found = B_TRUE;
2769fcf3ce44SJohn Forte 				}
2770fcf3ce44SJohn Forte 			}
2771fcf3ce44SJohn Forte 			if ((found && operandEntered) || !operandEntered) {
2772fcf3ce44SJohn Forte 				(void) printf("View Entry: %d\n",
2773fcf3ce44SJohn Forte 				    viewEntryList->ve[j].veIndex);
2774fcf3ce44SJohn Forte 				(void) printf(VIEW_FORMAT, "Host group");
2775fcf3ce44SJohn Forte 				if (viewEntryList->ve[j].allHosts) {
2776fcf3ce44SJohn Forte 					(void) printf("All\n");
2777fcf3ce44SJohn Forte 				} else {
2778fcf3ce44SJohn Forte 					(void) mbstowcs(groupName,
2779fcf3ce44SJohn Forte 					    viewEntryList->ve[j].hostGroup,
27803e7352aeSJohn Forte 					    sizeof (stmfGroupName) - 1);
27813e7352aeSJohn Forte 					groupName[sizeof (stmfGroupName) - 1]
27823e7352aeSJohn Forte 					    = 0;
2783fcf3ce44SJohn Forte 					(void) printf("%ws\n", groupName);
2784fcf3ce44SJohn Forte 				}
2785fcf3ce44SJohn Forte 				(void) printf(VIEW_FORMAT, "Target group");
2786fcf3ce44SJohn Forte 				if (viewEntryList->ve[j].allTargets) {
2787fcf3ce44SJohn Forte 					(void) printf("All\n");
2788fcf3ce44SJohn Forte 				} else {
2789fcf3ce44SJohn Forte 					(void) mbstowcs(groupName,
2790fcf3ce44SJohn Forte 					    viewEntryList->ve[j].targetGroup,
27913e7352aeSJohn Forte 					    sizeof (stmfGroupName) - 1);
27923e7352aeSJohn Forte 					groupName[sizeof (stmfGroupName) - 1]
27933e7352aeSJohn Forte 					    = 0;
2794fcf3ce44SJohn Forte 					(void) printf("%ws\n", groupName);
2795fcf3ce44SJohn Forte 				}
2796fcf3ce44SJohn Forte 				outputLuNbr = ((viewEntryList->ve[j].luNbr[0] &
2797fcf3ce44SJohn Forte 				    0x3F) << 8) | viewEntryList->ve[j].luNbr[1];
2798fcf3ce44SJohn Forte 				(void) printf(VIEW_FORMAT, "LUN");
2799fcf3ce44SJohn Forte 				(void) printf("%d\n", outputLuNbr);
2800fcf3ce44SJohn Forte 				if (found && operandEntered) {
2801fcf3ce44SJohn Forte 					break;
2802fcf3ce44SJohn Forte 				}
2803fcf3ce44SJohn Forte 			}
2804fcf3ce44SJohn Forte 		}
2805fcf3ce44SJohn Forte 		if (operandEntered && !found) {
2806fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s, %s: %s\n", cmdName,
2807fcf3ce44SJohn Forte 			    sGuid, operands[i], gettext("not found"));
2808fcf3ce44SJohn Forte 			ret = 1;
2809fcf3ce44SJohn Forte 		}
2810fcf3ce44SJohn Forte 	}
2811fcf3ce44SJohn Forte 
2812fcf3ce44SJohn Forte 	return (ret);
2813fcf3ce44SJohn Forte }
2814fcf3ce44SJohn Forte 
2815fcf3ce44SJohn Forte 
2816fcf3ce44SJohn Forte /*
2817fcf3ce44SJohn Forte  * onlineOfflineLu
2818fcf3ce44SJohn Forte  *
2819fcf3ce44SJohn Forte  * Purpose: Online or offline a logical unit
2820fcf3ce44SJohn Forte  *
2821fcf3ce44SJohn Forte  * lu - logical unit to online or offline
2822fcf3ce44SJohn Forte  *
2823fcf3ce44SJohn Forte  * state - ONLINE_LU
2824fcf3ce44SJohn Forte  *         OFFLINE_LU
2825fcf3ce44SJohn Forte  */
2826fcf3ce44SJohn Forte static int
onlineOfflineLu(char * lu,int state)2827fcf3ce44SJohn Forte onlineOfflineLu(char *lu, int state)
2828fcf3ce44SJohn Forte {
2829fcf3ce44SJohn Forte 	char sGuid[GUID_INPUT + 1];
2830fcf3ce44SJohn Forte 	stmfGuid inGuid;
2831fcf3ce44SJohn Forte 	unsigned int guid[sizeof (stmfGuid)];
2832fcf3ce44SJohn Forte 	int i;
28334f486358SNattuvetty Bhavyan 	int ret = 0, stmfRet;
28344f486358SNattuvetty Bhavyan 	stmfLogicalUnitProperties luProps;
2835fcf3ce44SJohn Forte 
2836fcf3ce44SJohn Forte 	if (strlen(lu) != GUID_INPUT) {
2837fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s: %s %d %s\n", cmdName, lu,
2838fcf3ce44SJohn Forte 		    gettext("must be"), GUID_INPUT,
2839fcf3ce44SJohn Forte 		    gettext("hexadecimal digits long"));
2840fcf3ce44SJohn Forte 		return (1);
2841fcf3ce44SJohn Forte 	}
2842fcf3ce44SJohn Forte 
2843fcf3ce44SJohn Forte 	bcopy(lu, sGuid, GUID_INPUT);
2844fcf3ce44SJohn Forte 
2845fcf3ce44SJohn Forte 	for (i = 0; i < 32; i++)
2846fcf3ce44SJohn Forte 		sGuid[i] = tolower(sGuid[i]);
2847fcf3ce44SJohn Forte 	sGuid[i] = 0;
2848fcf3ce44SJohn Forte 
2849fcf3ce44SJohn Forte 	(void) sscanf(sGuid, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
2850fcf3ce44SJohn Forte 	    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
2851fcf3ce44SJohn Forte 	    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], &guid[11],
2852fcf3ce44SJohn Forte 	    &guid[12], &guid[13], &guid[14], &guid[15]);
2853fcf3ce44SJohn Forte 
2854fcf3ce44SJohn Forte 	for (i = 0; i < sizeof (stmfGuid); i++) {
2855fcf3ce44SJohn Forte 		inGuid.guid[i] = guid[i];
2856fcf3ce44SJohn Forte 	}
2857fcf3ce44SJohn Forte 
2858fcf3ce44SJohn Forte 	if (state == ONLINE_LU) {
2859fcf3ce44SJohn Forte 		ret = stmfOnlineLogicalUnit(&inGuid);
2860fcf3ce44SJohn Forte 	} else if (state == OFFLINE_LU) {
2861fcf3ce44SJohn Forte 		ret = stmfOfflineLogicalUnit(&inGuid);
28624f486358SNattuvetty Bhavyan 	} else {
28634f486358SNattuvetty Bhavyan 		return (STMFADM_FAILURE);
2864fcf3ce44SJohn Forte 	}
2865fcf3ce44SJohn Forte 	if (ret != STMF_STATUS_SUCCESS) {
2866fcf3ce44SJohn Forte 		switch (ret) {
2867fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
2868fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2869fcf3ce44SJohn Forte 				    gettext("permission denied"));
2870fcf3ce44SJohn Forte 				break;
2871fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
2872fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2873fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
2874fcf3ce44SJohn Forte 				break;
28754f486358SNattuvetty Bhavyan 			case STMF_ERROR_BUSY:
28764f486358SNattuvetty Bhavyan 				(void) fprintf(stderr, "%s: %s\n", cmdName,
28774f486358SNattuvetty Bhavyan 				    gettext("resource busy"));
28784f486358SNattuvetty Bhavyan 				break;
2879fcf3ce44SJohn Forte 			case STMF_ERROR_NOT_FOUND:
2880fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
2881fcf3ce44SJohn Forte 				    lu, gettext("not found"));
2882fcf3ce44SJohn Forte 				break;
2883fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
2884fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2885fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
2886fcf3ce44SJohn Forte 				break;
2887fcf3ce44SJohn Forte 			default:
2888fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
2889fcf3ce44SJohn Forte 				    gettext("unknown error"));
2890fcf3ce44SJohn Forte 				break;
2891fcf3ce44SJohn Forte 		}
28924f486358SNattuvetty Bhavyan 	} else {
28934f486358SNattuvetty Bhavyan 		struct timespec	ts = {0};
28944f486358SNattuvetty Bhavyan 		unsigned int	count = 0;
28954f486358SNattuvetty Bhavyan 		uint32_t	ret_state;
28964f486358SNattuvetty Bhavyan 
28974f486358SNattuvetty Bhavyan 		ret_state = (state == ONLINE_LU) ?
28984f486358SNattuvetty Bhavyan 		    STMF_LOGICAL_UNIT_ONLINING : STMF_LOGICAL_UNIT_OFFLINING;
28994f486358SNattuvetty Bhavyan 		ts.tv_nsec = DELAYED_EXEC_WAIT_INTERVAL;
29004f486358SNattuvetty Bhavyan 
29014f486358SNattuvetty Bhavyan 		/* CONSTCOND */
29024f486358SNattuvetty Bhavyan 		while (1) {
29034f486358SNattuvetty Bhavyan 			stmfRet = stmfGetLogicalUnitProperties(&inGuid,
29044f486358SNattuvetty Bhavyan 			    &luProps);
29054f486358SNattuvetty Bhavyan 			if (stmfRet == STMF_STATUS_SUCCESS)
29064f486358SNattuvetty Bhavyan 				ret_state = luProps.status;
29074f486358SNattuvetty Bhavyan 
29084f486358SNattuvetty Bhavyan 			if ((state == ONLINE_LU &&
29094f486358SNattuvetty Bhavyan 			    ret_state == STMF_LOGICAL_UNIT_ONLINE) ||
29104f486358SNattuvetty Bhavyan 			    (state == OFFLINE_LU &&
29114f486358SNattuvetty Bhavyan 			    ret_state == STMF_LOGICAL_UNIT_OFFLINE))
29124f486358SNattuvetty Bhavyan 				return (STMFADM_SUCCESS);
29134f486358SNattuvetty Bhavyan 
29144f486358SNattuvetty Bhavyan 			if ((state == ONLINE_LU &&
29154f486358SNattuvetty Bhavyan 			    ret_state == STMF_LOGICAL_UNIT_OFFLINE) ||
29164f486358SNattuvetty Bhavyan 			    (state == OFFLINE_LU &&
29174f486358SNattuvetty Bhavyan 			    ret_state == STMF_LOGICAL_UNIT_ONLINE))
29184f486358SNattuvetty Bhavyan 				return (STMFADM_FAILURE);
29194f486358SNattuvetty Bhavyan 
29204f486358SNattuvetty Bhavyan 			if (++count ==  DELAYED_EXEC_WAIT_MAX) {
29214f486358SNattuvetty Bhavyan 				(void) fprintf(stderr, "%s: %s\n", cmdName,
29224f486358SNattuvetty Bhavyan 				    gettext("Logical Unit state change request "
29234f486358SNattuvetty Bhavyan 				    "submitted. Waiting for completion "
29244f486358SNattuvetty Bhavyan 				    "timed out"));
29254f486358SNattuvetty Bhavyan 				return (STMFADM_FAILURE);
29264f486358SNattuvetty Bhavyan 			}
29274f486358SNattuvetty Bhavyan 			(void) nanosleep(&ts, NULL);
29284f486358SNattuvetty Bhavyan 		}
2929fcf3ce44SJohn Forte 	}
29304f486358SNattuvetty Bhavyan 	return (STMFADM_FAILURE);
2931fcf3ce44SJohn Forte }
2932fcf3ce44SJohn Forte 
2933fcf3ce44SJohn Forte /*
2934fcf3ce44SJohn Forte  * onlineLuFunc
2935fcf3ce44SJohn Forte  *
2936fcf3ce44SJohn Forte  * Purpose: Online a logical unit
2937fcf3ce44SJohn Forte  *
2938fcf3ce44SJohn Forte  */
2939fcf3ce44SJohn Forte /*ARGSUSED*/
2940fcf3ce44SJohn Forte static int
onlineLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)2941fcf3ce44SJohn Forte onlineLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
2942fcf3ce44SJohn Forte     void *args)
2943fcf3ce44SJohn Forte {
2944e17f3b22Stim szeto 	int ret;
2945e17f3b22Stim szeto 	stmfState state;
2946e17f3b22Stim szeto 
2947e17f3b22Stim szeto 	ret = getStmfState(&state);
2948e17f3b22Stim szeto 	if (ret != STMF_STATUS_SUCCESS)
2949e17f3b22Stim szeto 		return (ret);
2950e17f3b22Stim szeto 	if (state.operationalState == STMF_SERVICE_STATE_OFFLINE ||
2951e17f3b22Stim szeto 	    state.operationalState == STMF_SERVICE_STATE_OFFLINING) {
2952e17f3b22Stim szeto 		(void) fprintf(stderr, "%s: %s\n", cmdName,
2953e17f3b22Stim szeto 		    gettext("STMF service is offline"));
2954e17f3b22Stim szeto 		return (1);
2955e17f3b22Stim szeto 	}
2956fcf3ce44SJohn Forte 	return (onlineOfflineLu(operands[0], ONLINE_LU));
2957fcf3ce44SJohn Forte }
2958fcf3ce44SJohn Forte 
2959fcf3ce44SJohn Forte /*
2960fcf3ce44SJohn Forte  * offlineLuFunc
2961fcf3ce44SJohn Forte  *
2962fcf3ce44SJohn Forte  * Purpose: Offline a logical unit
2963fcf3ce44SJohn Forte  *
2964fcf3ce44SJohn Forte  */
2965fcf3ce44SJohn Forte /*ARGSUSED*/
2966fcf3ce44SJohn Forte static int
offlineLuFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)2967fcf3ce44SJohn Forte offlineLuFunc(int operandLen, char *operands[], cmdOptions_t *options,
2968fcf3ce44SJohn Forte     void *args)
2969fcf3ce44SJohn Forte {
2970fcf3ce44SJohn Forte 	return (onlineOfflineLu(operands[0], OFFLINE_LU));
2971fcf3ce44SJohn Forte }
2972fcf3ce44SJohn Forte 
2973fcf3ce44SJohn Forte /*
2974fcf3ce44SJohn Forte  * onlineOfflineTarget
2975fcf3ce44SJohn Forte  *
2976fcf3ce44SJohn Forte  * Purpose: Online or offline a target
2977fcf3ce44SJohn Forte  *
2978fcf3ce44SJohn Forte  * target - target to online or offline
2979fcf3ce44SJohn Forte  *
2980fcf3ce44SJohn Forte  * state - ONLINE_TARGET
2981fcf3ce44SJohn Forte  *         OFFLINE_TARGET
2982fcf3ce44SJohn Forte  */
2983fcf3ce44SJohn Forte static int
onlineOfflineTarget(char * target,int state)2984fcf3ce44SJohn Forte onlineOfflineTarget(char *target, int state)
2985fcf3ce44SJohn Forte {
29864f486358SNattuvetty Bhavyan 	int ret = 0, stmfRet = 0;
2987fcf3ce44SJohn Forte 	stmfDevid devid;
29884f486358SNattuvetty Bhavyan 	stmfTargetProperties targetProps;
2989fcf3ce44SJohn Forte 
2990fcf3ce44SJohn Forte 	if (parseDevid(target, &devid) != 0) {
2991fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s: %s\n",
2992fcf3ce44SJohn Forte 		    cmdName, target, gettext("unrecognized device id"));
2993fcf3ce44SJohn Forte 		return (1);
2994fcf3ce44SJohn Forte 	}
2995fcf3ce44SJohn Forte 	if (state == ONLINE_TARGET) {
2996fcf3ce44SJohn Forte 		ret = stmfOnlineTarget(&devid);
2997fcf3ce44SJohn Forte 	} else if (state == OFFLINE_TARGET) {
2998fcf3ce44SJohn Forte 		ret = stmfOfflineTarget(&devid);
29994f486358SNattuvetty Bhavyan 	} else {
30004f486358SNattuvetty Bhavyan 		return (STMFADM_FAILURE);
3001fcf3ce44SJohn Forte 	}
3002fcf3ce44SJohn Forte 	if (ret != STMF_STATUS_SUCCESS) {
3003fcf3ce44SJohn Forte 		switch (ret) {
3004fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
3005fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3006fcf3ce44SJohn Forte 				    gettext("permission denied"));
3007fcf3ce44SJohn Forte 				break;
3008fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
3009fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3010fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
3011fcf3ce44SJohn Forte 				break;
30124f486358SNattuvetty Bhavyan 			case STMF_ERROR_BUSY:
30134f486358SNattuvetty Bhavyan 				(void) fprintf(stderr, "%s: %s\n", cmdName,
30144f486358SNattuvetty Bhavyan 				    gettext("resource busy"));
30154f486358SNattuvetty Bhavyan 				break;
3016fcf3ce44SJohn Forte 			case STMF_ERROR_NOT_FOUND:
3017fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3018fcf3ce44SJohn Forte 				    target, gettext("not found"));
3019fcf3ce44SJohn Forte 				break;
3020fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
3021fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3022fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
3023fcf3ce44SJohn Forte 				break;
3024fcf3ce44SJohn Forte 			default:
3025fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3026fcf3ce44SJohn Forte 				    gettext("unknown error"));
3027fcf3ce44SJohn Forte 				break;
3028fcf3ce44SJohn Forte 		}
30294f486358SNattuvetty Bhavyan 	} else {
30304f486358SNattuvetty Bhavyan 		struct timespec  ts = {0};
30314f486358SNattuvetty Bhavyan 		unsigned int count = 0;
30324f486358SNattuvetty Bhavyan 		uint32_t	ret_state;
30334f486358SNattuvetty Bhavyan 
30344f486358SNattuvetty Bhavyan 		ret_state = (state == ONLINE_TARGET) ?
30354f486358SNattuvetty Bhavyan 		    STMF_TARGET_PORT_ONLINING : STMF_TARGET_PORT_OFFLINING;
30364f486358SNattuvetty Bhavyan 		ts.tv_nsec = DELAYED_EXEC_WAIT_INTERVAL;
30374f486358SNattuvetty Bhavyan 
30384f486358SNattuvetty Bhavyan 		/* CONSTCOND */
30394f486358SNattuvetty Bhavyan 		while (1) {
30404f486358SNattuvetty Bhavyan 			stmfRet = stmfGetTargetProperties(&devid, &targetProps);
30414f486358SNattuvetty Bhavyan 			if (stmfRet == STMF_STATUS_SUCCESS)
30424f486358SNattuvetty Bhavyan 				ret_state = targetProps.status;
30434f486358SNattuvetty Bhavyan 
30444f486358SNattuvetty Bhavyan 			if ((state == ONLINE_TARGET &&
30454f486358SNattuvetty Bhavyan 			    ret_state == STMF_TARGET_PORT_ONLINE) ||
30464f486358SNattuvetty Bhavyan 			    (state == OFFLINE_TARGET &&
30474f486358SNattuvetty Bhavyan 			    ret_state == STMF_TARGET_PORT_OFFLINE)) {
30484f486358SNattuvetty Bhavyan 				return (STMFADM_SUCCESS);
30494f486358SNattuvetty Bhavyan 			}
30504f486358SNattuvetty Bhavyan 
30514f486358SNattuvetty Bhavyan 			if ((state == ONLINE_TARGET &&
30524f486358SNattuvetty Bhavyan 			    ret_state == STMF_TARGET_PORT_OFFLINE) ||
30534f486358SNattuvetty Bhavyan 			    (state == OFFLINE_TARGET &&
30544f486358SNattuvetty Bhavyan 			    ret_state == STMF_TARGET_PORT_ONLINE)) {
30554f486358SNattuvetty Bhavyan 				return (STMFADM_FAILURE);
30564f486358SNattuvetty Bhavyan 			}
30574f486358SNattuvetty Bhavyan 
30584f486358SNattuvetty Bhavyan 			if (++count ==  DELAYED_EXEC_WAIT_MAX) {
30594f486358SNattuvetty Bhavyan 				(void) fprintf(stderr, "%s: %s\n", cmdName,
30604f486358SNattuvetty Bhavyan 				    gettext("Target state change request "
30614f486358SNattuvetty Bhavyan 				    "submitted. Waiting for completion "
30624f486358SNattuvetty Bhavyan 				    "timed out."));
30634f486358SNattuvetty Bhavyan 				return (STMFADM_FAILURE);
30644f486358SNattuvetty Bhavyan 			}
30654f486358SNattuvetty Bhavyan 			(void) nanosleep(&ts, NULL);
30664f486358SNattuvetty Bhavyan 		}
3067fcf3ce44SJohn Forte 	}
30684f486358SNattuvetty Bhavyan 	return (STMFADM_FAILURE);
3069fcf3ce44SJohn Forte }
3070fcf3ce44SJohn Forte 
3071fcf3ce44SJohn Forte /*
3072fcf3ce44SJohn Forte  * onlineTargetFunc
3073fcf3ce44SJohn Forte  *
3074fcf3ce44SJohn Forte  * Purpose: Online a target
3075fcf3ce44SJohn Forte  *
3076fcf3ce44SJohn Forte  */
3077fcf3ce44SJohn Forte /*ARGSUSED*/
3078fcf3ce44SJohn Forte static int
onlineTargetFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)3079fcf3ce44SJohn Forte onlineTargetFunc(int operandLen, char *operands[], cmdOptions_t *options,
3080fcf3ce44SJohn Forte     void *args)
3081fcf3ce44SJohn Forte {
3082e17f3b22Stim szeto 	int ret;
3083e17f3b22Stim szeto 	stmfState state;
3084e17f3b22Stim szeto 
3085e17f3b22Stim szeto 	ret = getStmfState(&state);
3086e17f3b22Stim szeto 	if (ret != STMF_STATUS_SUCCESS)
3087e17f3b22Stim szeto 		return (ret);
3088e17f3b22Stim szeto 	if (state.operationalState == STMF_SERVICE_STATE_OFFLINE ||
3089e17f3b22Stim szeto 	    state.operationalState == STMF_SERVICE_STATE_OFFLINING) {
3090e17f3b22Stim szeto 		(void) fprintf(stderr, "%s: %s\n", cmdName,
3091e17f3b22Stim szeto 		    gettext("STMF service is offline"));
3092e17f3b22Stim szeto 		return (1);
3093e17f3b22Stim szeto 	}
3094fcf3ce44SJohn Forte 	return (onlineOfflineTarget(operands[0], ONLINE_TARGET));
3095fcf3ce44SJohn Forte }
3096fcf3ce44SJohn Forte 
3097fcf3ce44SJohn Forte /*
3098fcf3ce44SJohn Forte  * offlineTargetFunc
3099fcf3ce44SJohn Forte  *
3100fcf3ce44SJohn Forte  * Purpose: Offline a target
3101fcf3ce44SJohn Forte  *
3102fcf3ce44SJohn Forte  */
3103fcf3ce44SJohn Forte /*ARGSUSED*/
3104fcf3ce44SJohn Forte static int
offlineTargetFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)3105fcf3ce44SJohn Forte offlineTargetFunc(int operandLen, char *operands[], cmdOptions_t *options,
3106fcf3ce44SJohn Forte     void *args)
3107fcf3ce44SJohn Forte {
3108fcf3ce44SJohn Forte 	return (onlineOfflineTarget(operands[0], OFFLINE_TARGET));
3109fcf3ce44SJohn Forte }
3110fcf3ce44SJohn Forte 
3111fcf3ce44SJohn Forte 
3112fcf3ce44SJohn Forte /*ARGSUSED*/
3113fcf3ce44SJohn Forte static int
removeHostGroupMemberFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)3114fcf3ce44SJohn Forte removeHostGroupMemberFunc(int operandLen, char *operands[],
3115fcf3ce44SJohn Forte     cmdOptions_t *options, void *args)
3116fcf3ce44SJohn Forte {
3117fcf3ce44SJohn Forte 	int i;
3118fcf3ce44SJohn Forte 	int ret = 0;
3119fcf3ce44SJohn Forte 	int stmfRet;
31203e7352aeSJohn Forte 	stmfGroupName groupName = {0};
3121fcf3ce44SJohn Forte 	stmfDevid devid;
31223e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
3123fcf3ce44SJohn Forte 
3124fcf3ce44SJohn Forte 	for (; options->optval; options++) {
3125fcf3ce44SJohn Forte 		switch (options->optval) {
3126fcf3ce44SJohn Forte 			case 'g':
3127fcf3ce44SJohn Forte 				(void) mbstowcs(groupNamePrint, options->optarg,
31283e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
3129fcf3ce44SJohn Forte 				bcopy(options->optarg, groupName,
3130fcf3ce44SJohn Forte 				    strlen(options->optarg));
3131fcf3ce44SJohn Forte 				break;
3132fcf3ce44SJohn Forte 			default:
3133fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
3134fcf3ce44SJohn Forte 				    cmdName, options->optval,
3135fcf3ce44SJohn Forte 				    gettext("unknown option"));
3136fcf3ce44SJohn Forte 				return (1);
3137fcf3ce44SJohn Forte 		}
3138fcf3ce44SJohn Forte 	}
3139fcf3ce44SJohn Forte 
3140fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
3141fcf3ce44SJohn Forte 		if (parseDevid(operands[i], &devid) != 0) {
3142fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
3143fcf3ce44SJohn Forte 			    cmdName, operands[i],
3144fcf3ce44SJohn Forte 			    gettext("unrecognized device id"));
3145fcf3ce44SJohn Forte 			ret++;
3146fcf3ce44SJohn Forte 			continue;
3147fcf3ce44SJohn Forte 		}
3148fcf3ce44SJohn Forte 		stmfRet = stmfRemoveFromHostGroup(&groupName, &devid);
3149fcf3ce44SJohn Forte 		switch (stmfRet) {
3150fcf3ce44SJohn Forte 			case STMF_STATUS_SUCCESS:
3151fcf3ce44SJohn Forte 				break;
3152fcf3ce44SJohn Forte 			case STMF_ERROR_MEMBER_NOT_FOUND:
3153fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3154fcf3ce44SJohn Forte 				    operands[i], gettext("not found"));
3155fcf3ce44SJohn Forte 				ret++;
3156fcf3ce44SJohn Forte 				break;
3157fcf3ce44SJohn Forte 			case STMF_ERROR_GROUP_NOT_FOUND:
3158fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
3159fcf3ce44SJohn Forte 				    groupNamePrint, gettext("not found"));
3160fcf3ce44SJohn Forte 				ret++;
3161fcf3ce44SJohn Forte 				break;
3162fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
3163fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3164fcf3ce44SJohn Forte 				    operands[i], "resource busy");
3165fcf3ce44SJohn Forte 				ret++;
3166fcf3ce44SJohn Forte 				break;
3167fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
3168fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3169fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
3170fcf3ce44SJohn Forte 				ret++;
3171fcf3ce44SJohn Forte 				break;
3172fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
3173fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3174fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
3175fcf3ce44SJohn Forte 				ret++;
3176fcf3ce44SJohn Forte 				break;
3177fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
3178fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3179fcf3ce44SJohn Forte 				    gettext("permission denied"));
3180fcf3ce44SJohn Forte 				ret++;
3181fcf3ce44SJohn Forte 				break;
3182fcf3ce44SJohn Forte 			default:
3183fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3184fcf3ce44SJohn Forte 				    operands[i], gettext("unknown error"));
3185fcf3ce44SJohn Forte 				ret++;
3186fcf3ce44SJohn Forte 				break;
3187fcf3ce44SJohn Forte 		}
3188fcf3ce44SJohn Forte 	}
3189fcf3ce44SJohn Forte 
3190fcf3ce44SJohn Forte 	return (ret);
3191fcf3ce44SJohn Forte }
3192fcf3ce44SJohn Forte 
3193fcf3ce44SJohn Forte /*
3194fcf3ce44SJohn Forte  * removeTargetGroupMemberFunc
3195fcf3ce44SJohn Forte  *
3196fcf3ce44SJohn Forte  * Removes one or more members from a target group
3197fcf3ce44SJohn Forte  *
3198fcf3ce44SJohn Forte  */
3199fcf3ce44SJohn Forte /*ARGSUSED*/
3200fcf3ce44SJohn Forte static int
removeTargetGroupMemberFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)3201fcf3ce44SJohn Forte removeTargetGroupMemberFunc(int operandLen, char *operands[],
3202fcf3ce44SJohn Forte     cmdOptions_t *options, void *args)
3203fcf3ce44SJohn Forte {
3204fcf3ce44SJohn Forte 	int i;
3205fcf3ce44SJohn Forte 	int ret = 0;
3206fcf3ce44SJohn Forte 	int stmfRet;
32073e7352aeSJohn Forte 	stmfGroupName groupName = {0};
3208fcf3ce44SJohn Forte 	stmfDevid devid;
32093e7352aeSJohn Forte 	wchar_t groupNamePrint[sizeof (stmfGroupName)] = {0};
3210fcf3ce44SJohn Forte 
3211fcf3ce44SJohn Forte 	for (; options->optval; options++) {
3212fcf3ce44SJohn Forte 		switch (options->optval) {
3213fcf3ce44SJohn Forte 			case 'g':
3214fcf3ce44SJohn Forte 				(void) mbstowcs(groupNamePrint, options->optarg,
32153e7352aeSJohn Forte 				    sizeof (stmfGroupName) - 1);
3216fcf3ce44SJohn Forte 				bcopy(options->optarg, groupName,
3217fcf3ce44SJohn Forte 				    strlen(options->optarg));
3218fcf3ce44SJohn Forte 				break;
3219fcf3ce44SJohn Forte 			default:
3220fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
3221fcf3ce44SJohn Forte 				    cmdName, options->optval,
3222fcf3ce44SJohn Forte 				    gettext("unknown option"));
3223fcf3ce44SJohn Forte 				return (1);
3224fcf3ce44SJohn Forte 		}
3225fcf3ce44SJohn Forte 	}
3226fcf3ce44SJohn Forte 
3227fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
3228fcf3ce44SJohn Forte 		if (parseDevid(operands[i], &devid) != 0) {
3229fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
3230fcf3ce44SJohn Forte 			    cmdName, operands[i],
3231fcf3ce44SJohn Forte 			    gettext("unrecognized device id"));
3232fcf3ce44SJohn Forte 			ret++;
3233fcf3ce44SJohn Forte 			continue;
3234fcf3ce44SJohn Forte 		}
3235fcf3ce44SJohn Forte 		stmfRet = stmfRemoveFromTargetGroup(&groupName, &devid);
3236fcf3ce44SJohn Forte 		switch (stmfRet) {
3237fcf3ce44SJohn Forte 			case STMF_STATUS_SUCCESS:
3238fcf3ce44SJohn Forte 				break;
3239fcf3ce44SJohn Forte 			case STMF_ERROR_MEMBER_NOT_FOUND:
3240fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3241fcf3ce44SJohn Forte 				    operands[i], gettext("not found"));
3242fcf3ce44SJohn Forte 				ret++;
3243fcf3ce44SJohn Forte 				break;
3244fcf3ce44SJohn Forte 			case STMF_ERROR_GROUP_NOT_FOUND:
3245fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %ws: %s\n", cmdName,
3246fcf3ce44SJohn Forte 				    groupNamePrint, gettext("not found"));
3247fcf3ce44SJohn Forte 				ret++;
3248fcf3ce44SJohn Forte 				break;
3249fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
3250fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3251fcf3ce44SJohn Forte 				    operands[i], gettext("resource busy"));
3252fcf3ce44SJohn Forte 				ret++;
3253fcf3ce44SJohn Forte 				break;
3254fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
3255fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3256fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
3257fcf3ce44SJohn Forte 				ret++;
3258fcf3ce44SJohn Forte 				break;
3259fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
3260fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3261fcf3ce44SJohn Forte 				    gettext("permission denied"));
3262fcf3ce44SJohn Forte 				ret++;
3263fcf3ce44SJohn Forte 				break;
3264fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
3265fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3266fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
3267fcf3ce44SJohn Forte 				ret++;
3268fcf3ce44SJohn Forte 				break;
32695c8cac22Stim szeto 			case STMF_ERROR_TG_ONLINE:
32705c8cac22Stim szeto 				(void) fprintf(stderr, "%s: %s\n", cmdName,
32715c8cac22Stim szeto 				    gettext("STMF target must be offline"));
32725c8cac22Stim szeto 				ret++;
32735c8cac22Stim szeto 				break;
3274fcf3ce44SJohn Forte 			default:
3275fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3276fcf3ce44SJohn Forte 				    operands[i], gettext("unknown error"));
3277fcf3ce44SJohn Forte 				ret++;
3278fcf3ce44SJohn Forte 				break;
3279fcf3ce44SJohn Forte 		}
3280fcf3ce44SJohn Forte 	}
3281fcf3ce44SJohn Forte 
3282fcf3ce44SJohn Forte 	return (ret);
3283fcf3ce44SJohn Forte }
3284fcf3ce44SJohn Forte 
3285fcf3ce44SJohn Forte /*
3286fcf3ce44SJohn Forte  * removeViewFunc
3287fcf3ce44SJohn Forte  *
3288fcf3ce44SJohn Forte  * Removes one or more view entries from a logical unit
3289fcf3ce44SJohn Forte  *
3290fcf3ce44SJohn Forte  */
3291fcf3ce44SJohn Forte /*ARGSUSED*/
3292fcf3ce44SJohn Forte static int
removeViewFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)3293fcf3ce44SJohn Forte removeViewFunc(int operandLen, char *operands[], cmdOptions_t *options,
3294fcf3ce44SJohn Forte     void *args)
3295fcf3ce44SJohn Forte {
3296fcf3ce44SJohn Forte 	char sGuid[GUID_INPUT + 1];
3297fcf3ce44SJohn Forte 	stmfViewEntryList *viewEntryList;
3298fcf3ce44SJohn Forte 	stmfGuid inGuid;
3299fcf3ce44SJohn Forte 	uint32_t count;
3300fcf3ce44SJohn Forte 	unsigned int guid[sizeof (stmfGuid)];
3301fcf3ce44SJohn Forte 	char *endPtr;
3302fcf3ce44SJohn Forte 	uint32_t veNbr;
3303fcf3ce44SJohn Forte 	int i;
3304fcf3ce44SJohn Forte 	boolean_t all = B_FALSE;
3305fcf3ce44SJohn Forte 	boolean_t luInput = B_FALSE;
3306fcf3ce44SJohn Forte 	int ret = 0;
3307fcf3ce44SJohn Forte 	int stmfRet;
3308fcf3ce44SJohn Forte 
3309fcf3ce44SJohn Forte 	/* Note: 'l' is required */
3310fcf3ce44SJohn Forte 	for (; options->optval; options++) {
3311fcf3ce44SJohn Forte 		switch (options->optval) {
3312fcf3ce44SJohn Forte 			case 'l':
3313fcf3ce44SJohn Forte 				if (strlen(options->optarg) != GUID_INPUT) {
3314fcf3ce44SJohn Forte 					(void) fprintf(stderr,
3315fcf3ce44SJohn Forte 					    "%s: %s: %s %d %s\n",
3316fcf3ce44SJohn Forte 					    cmdName, options->optarg,
3317fcf3ce44SJohn Forte 					    gettext("must be"), GUID_INPUT,
3318fcf3ce44SJohn Forte 					    gettext("hexadecimal digits long"));
3319fcf3ce44SJohn Forte 					return (1);
3320fcf3ce44SJohn Forte 				}
3321fcf3ce44SJohn Forte 				bcopy(options->optarg, sGuid, GUID_INPUT);
3322fcf3ce44SJohn Forte 				luInput = B_TRUE;
3323fcf3ce44SJohn Forte 				break;
3324fcf3ce44SJohn Forte 			case 'a':
3325fcf3ce44SJohn Forte 				/* removing all view entries for this GUID */
3326fcf3ce44SJohn Forte 				all = B_TRUE;
3327fcf3ce44SJohn Forte 				break;
3328fcf3ce44SJohn Forte 			default:
3329fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
3330fcf3ce44SJohn Forte 				    cmdName, options->optval,
3331fcf3ce44SJohn Forte 				    "unknown option");
3332fcf3ce44SJohn Forte 				return (1);
3333fcf3ce44SJohn Forte 		}
3334fcf3ce44SJohn Forte 	}
3335fcf3ce44SJohn Forte 
3336fcf3ce44SJohn Forte 	if (!all && operandLen == 0) {
3337fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n", cmdName,
3338fcf3ce44SJohn Forte 		    gettext("no view entries specified"));
3339fcf3ce44SJohn Forte 		return (1);
3340fcf3ce44SJohn Forte 	}
3341fcf3ce44SJohn Forte 
3342fcf3ce44SJohn Forte 	if (!luInput) {
3343fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n", cmdName,
3344fcf3ce44SJohn Forte 		    gettext("logical unit (-l) not specified"));
3345fcf3ce44SJohn Forte 		return (1);
3346fcf3ce44SJohn Forte 	}
3347fcf3ce44SJohn Forte 
3348fcf3ce44SJohn Forte 	for (i = 0; i < 32; i++)
3349fcf3ce44SJohn Forte 		sGuid[i] = tolower(sGuid[i]);
3350fcf3ce44SJohn Forte 	sGuid[i] = 0;
3351fcf3ce44SJohn Forte 
3352fcf3ce44SJohn Forte 	(void) sscanf(sGuid, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
3353fcf3ce44SJohn Forte 	    &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
3354fcf3ce44SJohn Forte 	    &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], &guid[11],
3355fcf3ce44SJohn Forte 	    &guid[12], &guid[13], &guid[14], &guid[15]);
3356fcf3ce44SJohn Forte 
3357fcf3ce44SJohn Forte 	for (i = 0; i < sizeof (stmfGuid); i++) {
3358fcf3ce44SJohn Forte 		inGuid.guid[i] = guid[i];
3359fcf3ce44SJohn Forte 	}
3360fcf3ce44SJohn Forte 
3361fcf3ce44SJohn Forte 	if ((stmfRet = stmfGetViewEntryList(&inGuid, &viewEntryList))
3362fcf3ce44SJohn Forte 	    != STMF_STATUS_SUCCESS) {
3363fcf3ce44SJohn Forte 
3364fcf3ce44SJohn Forte 		switch (stmfRet) {
3365fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
3366fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3367fcf3ce44SJohn Forte 				    sGuid, gettext("resource busy"));
3368fcf3ce44SJohn Forte 				break;
3369fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
3370fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3371fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
3372fcf3ce44SJohn Forte 				break;
3373fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
3374fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3375fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
3376fcf3ce44SJohn Forte 				break;
3377fcf3ce44SJohn Forte 			case STMF_ERROR_PERM:
3378fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3379fcf3ce44SJohn Forte 				    gettext("permission denied"));
3380fcf3ce44SJohn Forte 				break;
3381fcf3ce44SJohn Forte 			default:
3382fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3383fcf3ce44SJohn Forte 				    sGuid, gettext("unknown error"));
3384fcf3ce44SJohn Forte 				break;
3385fcf3ce44SJohn Forte 		}
3386fcf3ce44SJohn Forte 		return (1);
3387fcf3ce44SJohn Forte 	}
3388fcf3ce44SJohn Forte 
33897b506e25Ssrivijitha dugganapalli 	if (viewEntryList->cnt == 0) {
33907b506e25Ssrivijitha dugganapalli 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
33917b506e25Ssrivijitha dugganapalli 		    sGuid, gettext("no views found"));
33927b506e25Ssrivijitha dugganapalli 		return (1);
33937b506e25Ssrivijitha dugganapalli 	}
33947b506e25Ssrivijitha dugganapalli 
3395fcf3ce44SJohn Forte 	if (all) {
3396fcf3ce44SJohn Forte 		count = viewEntryList->cnt;
3397fcf3ce44SJohn Forte 	} else {
3398fcf3ce44SJohn Forte 		count = operandLen;
3399fcf3ce44SJohn Forte 	}
3400fcf3ce44SJohn Forte 
3401fcf3ce44SJohn Forte 	for (i = 0; i < count; i++) {
3402fcf3ce44SJohn Forte 		if (all) {
3403fcf3ce44SJohn Forte 			veNbr = viewEntryList->ve[i].veIndex;
3404fcf3ce44SJohn Forte 		} else {
3405fcf3ce44SJohn Forte 			endPtr = NULL;
3406fcf3ce44SJohn Forte 			veNbr = strtol(operands[i], &endPtr, 10);
3407fcf3ce44SJohn Forte 			if (endPtr && *endPtr != 0) {
3408fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3409fcf3ce44SJohn Forte 				    operands[i], gettext("invalid input"));
3410fcf3ce44SJohn Forte 				continue;
3411fcf3ce44SJohn Forte 			}
3412fcf3ce44SJohn Forte 		}
3413fcf3ce44SJohn Forte 		stmfRet = stmfRemoveViewEntry(&inGuid, veNbr);
3414fcf3ce44SJohn Forte 		switch (stmfRet) {
3415fcf3ce44SJohn Forte 			case STMF_STATUS_SUCCESS:
3416fcf3ce44SJohn Forte 				break;
3417fcf3ce44SJohn Forte 			case STMF_ERROR_NOT_FOUND:
3418fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %d: %s\n",
3419fcf3ce44SJohn Forte 				    cmdName, sGuid, veNbr,
3420fcf3ce44SJohn Forte 				    gettext("not found"));
3421fcf3ce44SJohn Forte 				ret++;
3422fcf3ce44SJohn Forte 				break;
3423fcf3ce44SJohn Forte 			case STMF_ERROR_BUSY:
3424fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
3425fcf3ce44SJohn Forte 				    sGuid, gettext("resource busy"));
3426fcf3ce44SJohn Forte 				ret++;
3427fcf3ce44SJohn Forte 				break;
3428fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_NOT_FOUND:
3429fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3430fcf3ce44SJohn Forte 				    gettext("STMF service not found"));
3431fcf3ce44SJohn Forte 				ret++;
3432fcf3ce44SJohn Forte 				break;
3433fcf3ce44SJohn Forte 			case STMF_ERROR_CONFIG_NONE:
3434fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3435fcf3ce44SJohn Forte 				    gettext("STMF service is not initialized"));
3436fcf3ce44SJohn Forte 				ret++;
3437fcf3ce44SJohn Forte 				break;
3438fcf3ce44SJohn Forte 			case STMF_ERROR_SERVICE_DATA_VERSION:
3439fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n", cmdName,
3440fcf3ce44SJohn Forte 				    gettext("STMF service version incorrect"));
3441fcf3ce44SJohn Forte 				ret++;
3442fcf3ce44SJohn Forte 				break;
3443fcf3ce44SJohn Forte 			default:
3444fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s, %d: %s",
3445fcf3ce44SJohn Forte 				    cmdName, sGuid, veNbr,
3446fcf3ce44SJohn Forte 				    gettext("unknown error"));
3447fcf3ce44SJohn Forte 				ret++;
3448fcf3ce44SJohn Forte 				break;
3449fcf3ce44SJohn Forte 		}
3450fcf3ce44SJohn Forte 	}
3451fcf3ce44SJohn Forte 
3452fcf3ce44SJohn Forte 	return (ret);
3453fcf3ce44SJohn Forte }
3454fcf3ce44SJohn Forte 
3455fcf3ce44SJohn Forte /*
3456fcf3ce44SJohn Forte  * input:
3457fcf3ce44SJohn Forte  *  execFullName - exec name of program (argv[0])
3458fcf3ce44SJohn Forte  *
3459fcf3ce44SJohn Forte  *  copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
3460fcf3ce44SJohn Forte  *  (changed name to lowerCamelCase to keep consistent with this file)
3461fcf3ce44SJohn Forte  *
3462fcf3ce44SJohn Forte  * Returns:
3463fcf3ce44SJohn Forte  *  command name portion of execFullName
3464fcf3ce44SJohn Forte  */
3465fcf3ce44SJohn Forte static char *
getExecBasename(char * execFullname)3466fcf3ce44SJohn Forte getExecBasename(char *execFullname)
3467fcf3ce44SJohn Forte {
3468fcf3ce44SJohn Forte 	char *lastSlash, *execBasename;
3469fcf3ce44SJohn Forte 
3470fcf3ce44SJohn Forte 	/* guard against '/' at end of command invocation */
3471fcf3ce44SJohn Forte 	for (;;) {
3472fcf3ce44SJohn Forte 		lastSlash = strrchr(execFullname, '/');
3473fcf3ce44SJohn Forte 		if (lastSlash == NULL) {
3474fcf3ce44SJohn Forte 			execBasename = execFullname;
3475fcf3ce44SJohn Forte 			break;
3476fcf3ce44SJohn Forte 		} else {
3477fcf3ce44SJohn Forte 			execBasename = lastSlash + 1;
3478fcf3ce44SJohn Forte 			if (*execBasename == '\0') {
3479fcf3ce44SJohn Forte 				*lastSlash = '\0';
3480fcf3ce44SJohn Forte 				continue;
3481fcf3ce44SJohn Forte 			}
3482fcf3ce44SJohn Forte 			break;
3483fcf3ce44SJohn Forte 		}
3484fcf3ce44SJohn Forte 	}
3485fcf3ce44SJohn Forte 	return (execBasename);
3486fcf3ce44SJohn Forte }
3487fcf3ce44SJohn Forte 
3488fcf3ce44SJohn Forte int
main(int argc,char * argv[])3489fcf3ce44SJohn Forte main(int argc, char *argv[])
3490fcf3ce44SJohn Forte {
3491fcf3ce44SJohn Forte 	synTables_t synTables;
3492fcf3ce44SJohn Forte 	char versionString[VERSION_STRING_MAX_LEN];
3493fcf3ce44SJohn Forte 	int ret;
3494fcf3ce44SJohn Forte 	int funcRet;
3495fcf3ce44SJohn Forte 	void *subcommandArgs = NULL;
3496fcf3ce44SJohn Forte 
3497fcf3ce44SJohn Forte 	(void) setlocale(LC_ALL, "");
3498fcf3ce44SJohn Forte 	(void) textdomain(TEXT_DOMAIN);
3499fcf3ce44SJohn Forte 	/* set global command name */
3500fcf3ce44SJohn Forte 	cmdName = getExecBasename(argv[0]);
3501fcf3ce44SJohn Forte 
3502fcf3ce44SJohn Forte 	(void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
3503fcf3ce44SJohn Forte 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
3504fcf3ce44SJohn Forte 	synTables.versionString = versionString;
3505fcf3ce44SJohn Forte 	synTables.longOptionTbl = &longOptions[0];
3506fcf3ce44SJohn Forte 	synTables.subCommandPropsTbl = &subcommands[0];
3507fcf3ce44SJohn Forte 
3508fcf3ce44SJohn Forte 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
3509fcf3ce44SJohn Forte 	if (ret != 0) {
3510fcf3ce44SJohn Forte 		return (ret);
3511fcf3ce44SJohn Forte 	}
3512fcf3ce44SJohn Forte 
3513fcf3ce44SJohn Forte 	return (funcRet);
3514fcf3ce44SJohn Forte } /* end main */
3515