xref: /titanic_50/usr/src/cmd/iscsiadm/iscsiadm_main.c (revision fb2a9bae0030340ad72b9c26ba1ffee2ee3cafec)
1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte  * CDDL HEADER START
3fcf3ce44SJohn Forte  *
4fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte  *
8fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte  * and limitations under the License.
12fcf3ce44SJohn Forte  *
13fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte  *
19fcf3ce44SJohn Forte  * CDDL HEADER END
20fcf3ce44SJohn Forte  */
21fcf3ce44SJohn Forte /*
22*fb2a9baeSyi zhang - Sun Microsystems - Beijing China  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
23fcf3ce44SJohn Forte  */
24fcf3ce44SJohn Forte 
25fcf3ce44SJohn Forte #include <stdlib.h>
26fcf3ce44SJohn Forte #include <stdio.h>
27fcf3ce44SJohn Forte #include <wchar.h>
28fcf3ce44SJohn Forte #include <widec.h>
29fcf3ce44SJohn Forte #include <sys/types.h>
30fcf3ce44SJohn Forte #include <sys/socket.h>
31fcf3ce44SJohn Forte #include <arpa/inet.h>
32fcf3ce44SJohn Forte #include <netdb.h>
33fcf3ce44SJohn Forte #include <unistd.h>
34fcf3ce44SJohn Forte #include <libintl.h>
35fcf3ce44SJohn Forte #include <limits.h>
36fcf3ce44SJohn Forte #include <string.h>
37fcf3ce44SJohn Forte #include <strings.h>
38fcf3ce44SJohn Forte #include <syslog.h>
39fcf3ce44SJohn Forte #include <errno.h>
40fcf3ce44SJohn Forte #include <netinet/in.h>
41fcf3ce44SJohn Forte #include <sys/socket.h>
42fcf3ce44SJohn Forte #include <arpa/inet.h>
43fcf3ce44SJohn Forte #include <wctype.h>
44fcf3ce44SJohn Forte #include <assert.h>
45fcf3ce44SJohn Forte 
46fcf3ce44SJohn Forte #include <ima.h>
47aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <libsun_ima.h>
481a1a84a3SPeter Dunlap #include <sys/iscsi_protocol.h>
49fcf3ce44SJohn Forte #include <sys/scsi/adapters/iscsi_if.h>
50fcf3ce44SJohn Forte 
51fcf3ce44SJohn Forte #include "cmdparse.h"
52fcf3ce44SJohn Forte #include "sun_ima.h"
53fcf3ce44SJohn Forte #include "iscsiadm.h"
54fcf3ce44SJohn Forte 
55fcf3ce44SJohn Forte #define	VERSION_STRING_MAX_LEN	10
56fcf3ce44SJohn Forte #define	MAX_LONG_CHAR_LEN 19
57fcf3ce44SJohn Forte 
58fcf3ce44SJohn Forte #define	MAX_AUTH_METHODS 5
59fcf3ce44SJohn Forte /*
60fcf3ce44SJohn Forte  * Version number:
61fcf3ce44SJohn Forte  *  MAJOR - This should only change when there is an incompatible change made
62fcf3ce44SJohn Forte  *  to the interfaces or the output.
63fcf3ce44SJohn Forte  *
64fcf3ce44SJohn Forte  *  MINOR - This should change whenever there is a new command or new feature
65fcf3ce44SJohn Forte  *  with no incompatible change.
66fcf3ce44SJohn Forte  */
67fcf3ce44SJohn Forte #define	VERSION_STRING_MAJOR	    "1"
68fcf3ce44SJohn Forte #define	VERSION_STRING_MINOR	    "0"
69fcf3ce44SJohn Forte 
70fcf3ce44SJohn Forte #define	OPTIONSTRING1	"yes|no"
71fcf3ce44SJohn Forte #define	OPTIONSTRING2	"initiator node name"
72fcf3ce44SJohn Forte #define	OPTIONSTRING3	"initiator node alias"
73fcf3ce44SJohn Forte #define	OPTIONSTRING4	"enable|disable"
74fcf3ce44SJohn Forte #define	OPTIONSTRING5	"key=value,..."
75fcf3ce44SJohn Forte #define	OPTIONSTRING6	"none|CRC32"
76fcf3ce44SJohn Forte #define	OPTIONSTRING7	"CHAP name"
77fcf3ce44SJohn Forte #define	OPTIONSTRING8	"<# sessions>|<IP Address>[,<IP Address>]*"
78aff4bce5Syi zhang - Sun Microsystems - Beijing China #define	OPTIONSTRING9	"tunable-prop=value"
79fcf3ce44SJohn Forte #define	OPTIONVAL1	"0 to 3600"
80fcf3ce44SJohn Forte #define	OPTIONVAL2	"512 to 2**24 - 1"
81fcf3ce44SJohn Forte #define	OPTIONVAL3	"1 to 65535"
82fcf3ce44SJohn Forte #define	OPTIONVAL4	"<IP address>[:port]"
83fcf3ce44SJohn Forte 
84fcf3ce44SJohn Forte #define	MAX_ISCSI_NAME_LEN	    223
85fcf3ce44SJohn Forte #define	MAX_ADDRESS_LEN		    255
86fcf3ce44SJohn Forte #define	MIN_CHAP_SECRET_LEN	    12
87fcf3ce44SJohn Forte #define	MAX_CHAP_SECRET_LEN	    16
88fcf3ce44SJohn Forte #define	DEFAULT_ISCSI_PORT	    3260
89fcf3ce44SJohn Forte #define	ISNS_DEFAULT_SERVER_PORT    3205
90fcf3ce44SJohn Forte #define	DEFAULT_RADIUS_PORT	    1812
91fcf3ce44SJohn Forte #define	MAX_CHAP_NAME_LEN	    512
92aff4bce5Syi zhang - Sun Microsystems - Beijing China #define	ISCSI_DEFAULT_RX_TIMEOUT_VALUE		"60"
93aff4bce5Syi zhang - Sun Microsystems - Beijing China #define	ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX	"180"
94aff4bce5Syi zhang - Sun Microsystems - Beijing China #define	ISCSI_DEFAULT_LOGIN_POLLING_DELAY	"60"
95fcf3ce44SJohn Forte 
96fcf3ce44SJohn Forte /* For listNode */
97fcf3ce44SJohn Forte #define	INF_ERROR		1
98fcf3ce44SJohn Forte #define	INVALID_NODE_NAME	2
99fcf3ce44SJohn Forte 
100fcf3ce44SJohn Forte #define	IMABOOLPRINT(prop, option)	 \
101fcf3ce44SJohn Forte 	if ((option) == PRINT_CONFIGURED_PARAMS) { \
102fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s/%s\n", \
103fcf3ce44SJohn Forte 		(prop).defaultValue == IMA_TRUE ? gettext("yes") : \
104fcf3ce44SJohn Forte 			gettext("no"), \
105fcf3ce44SJohn Forte 		(prop).currentValueValid == IMA_TRUE ? \
106fcf3ce44SJohn Forte 			((prop).currentValue == IMA_TRUE ? \
107fcf3ce44SJohn Forte 			gettext("yes"): gettext("no")) : "-"); \
108fcf3ce44SJohn Forte 	} else if ((option) == PRINT_NEGOTIATED_PARAMS) { \
109fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s\n", \
110fcf3ce44SJohn Forte 		(prop).currentValueValid == IMA_TRUE ? \
111fcf3ce44SJohn Forte 		(((prop).currentValue == IMA_TRUE) ? gettext("yes") : \
112fcf3ce44SJohn Forte 		gettext("no")) : "-"); \
113fcf3ce44SJohn Forte 	}
114fcf3ce44SJohn Forte 
115fcf3ce44SJohn Forte #define	IMAMINMAXPRINT(prop, option) \
116fcf3ce44SJohn Forte 	if ((option) == PRINT_CONFIGURED_PARAMS) { \
117fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%d/", (prop).defaultValue); \
118fcf3ce44SJohn Forte 		if ((prop).currentValueValid == IMA_TRUE) { \
119fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%d\n", (prop).currentValue); \
120fcf3ce44SJohn Forte 		} else if ((prop).currentValueValid == IMA_FALSE) { \
121fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s\n", "-"); \
122fcf3ce44SJohn Forte 		} \
123fcf3ce44SJohn Forte 	} else if ((option) == PRINT_NEGOTIATED_PARAMS) { \
124fcf3ce44SJohn Forte 		if ((prop).currentValueValid == IMA_TRUE) { \
125fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%d\n", (prop).currentValue); \
126fcf3ce44SJohn Forte 		} else if ((prop).currentValueValid == IMA_FALSE) { \
127fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s\n", "-"); \
128fcf3ce44SJohn Forte 		} \
129fcf3ce44SJohn Forte 	}
130fcf3ce44SJohn Forte 
131fcf3ce44SJohn Forte /* forward declarations */
132fcf3ce44SJohn Forte #define	PARSE_ADDR_OK				0
133fcf3ce44SJohn Forte #define	PARSE_ADDR_MISSING_CLOSING_BRACKET	1
134fcf3ce44SJohn Forte #define	PARSE_ADDR_PORT_OUT_OF_RANGE		2
135fcf3ce44SJohn Forte #define	PARSE_TARGET_OK				0
136fcf3ce44SJohn Forte #define	PARSE_TARGET_INVALID_TPGT		1
137fcf3ce44SJohn Forte #define	PARSE_TARGET_INVALID_ADDR		2
138fcf3ce44SJohn Forte 
139fcf3ce44SJohn Forte #define	PRINT_CONFIGURED_PARAMS			1
140fcf3ce44SJohn Forte #define	PRINT_NEGOTIATED_PARAMS			2
141fcf3ce44SJohn Forte 
142fcf3ce44SJohn Forte typedef enum iSCSINameCheckStatus {
143fcf3ce44SJohn Forte 	iSCSINameCheckOK,
144fcf3ce44SJohn Forte 	iSCSINameLenZero,
145fcf3ce44SJohn Forte 	iSCSINameLenExceededMax,
146fcf3ce44SJohn Forte 	iSCSINameUnknownType,
147fcf3ce44SJohn Forte 	iSCSINameInvalidCharacter,
148fcf3ce44SJohn Forte 	iSCSINameIqnFormatError,
149fcf3ce44SJohn Forte 	iSCSINameEUIFormatError,
150fcf3ce44SJohn Forte 	iSCSINameIqnDateFormatError,
151fcf3ce44SJohn Forte 	iSCSINameIqnSubdomainFormatError,
152fcf3ce44SJohn Forte 	iSCSINameIqnInvalidYearError,
153fcf3ce44SJohn Forte 	iSCSINameIqnInvalidMonthError,
154fcf3ce44SJohn Forte 	iSCSINameIqnFQDNError
155fcf3ce44SJohn Forte } iSCSINameCheckStatusType;
156fcf3ce44SJohn Forte 
157fcf3ce44SJohn Forte /* Utility functions */
158fcf3ce44SJohn Forte iSCSINameCheckStatusType iSCSINameStringProfileCheck(wchar_t *name);
159fcf3ce44SJohn Forte boolean_t isNaturalNumber(char *numberStr, uint32_t upperBound);
160fcf3ce44SJohn Forte static int parseAddress(char *address_port_str, uint16_t defaultPort,
161fcf3ce44SJohn Forte     char *address_str, size_t address_str_len,
162fcf3ce44SJohn Forte     uint16_t *port, boolean_t *isIpv6);
163fcf3ce44SJohn Forte int parseTarget(char *targetStr,
164fcf3ce44SJohn Forte     wchar_t *targetNameStr,
165fcf3ce44SJohn Forte     size_t targetNameStrLen,
166fcf3ce44SJohn Forte     boolean_t *targetAddressSpecified,
167fcf3ce44SJohn Forte     wchar_t *targetAddressStr,
168fcf3ce44SJohn Forte     size_t targetAddressStrLen,
169fcf3ce44SJohn Forte     uint16_t *port,
170fcf3ce44SJohn Forte     boolean_t *tpgtSpecified,
171fcf3ce44SJohn Forte     uint16_t *tpgt,
172fcf3ce44SJohn Forte     boolean_t *isIpv6);
173aff4bce5Syi zhang - Sun Microsystems - Beijing China static int chkConnLoginMaxPollingLoginDelay(IMA_OID oid,
174aff4bce5Syi zhang - Sun Microsystems - Beijing China     int key, int uintValue);
175fcf3ce44SJohn Forte 
176fcf3ce44SJohn Forte /* subcommand functions */
177fcf3ce44SJohn Forte static int addFunc(int, char **, int, cmdOptions_t *, void *, int *);
178fcf3ce44SJohn Forte static int listFunc(int, char **, int, cmdOptions_t *, void *, int *);
179fcf3ce44SJohn Forte static int modifyFunc(int, char **, int, cmdOptions_t *, void *, int *);
180fcf3ce44SJohn Forte static int removeFunc(int, char **, int, cmdOptions_t *, void *, int *);
181fcf3ce44SJohn Forte 
182fcf3ce44SJohn Forte /* helper functions */
183fcf3ce44SJohn Forte static char *getExecBasename(char *);
184fcf3ce44SJohn Forte static int getNodeProps(IMA_NODE_PROPERTIES *);
185fcf3ce44SJohn Forte static int getSecret(char *, int *, int, int);
186fcf3ce44SJohn Forte static int getTargetAddress(int, char *, IMA_TARGET_ADDRESS *);
187fcf3ce44SJohn Forte static int printLoginParameters(char *, IMA_OID, int);
188fcf3ce44SJohn Forte static void printDiscoveryMethod(char *, IMA_UINT32);
189fcf3ce44SJohn Forte static void printTargetLuns(IMA_OID_LIST *);
190fcf3ce44SJohn Forte static void printSendTargets(SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *);
191fcf3ce44SJohn Forte static void printDigestAlgorithm(SUN_IMA_DIGEST_ALGORITHM_VALUE *, int);
192fcf3ce44SJohn Forte static int setLoginParameter(IMA_OID, int, char *);
193fcf3ce44SJohn Forte static int setLoginParameters(IMA_OID, char *);
194aff4bce5Syi zhang - Sun Microsystems - Beijing China static int setTunableParameters(IMA_OID, char *);
195fcf3ce44SJohn Forte static void printLibError(IMA_STATUS);
196fcf3ce44SJohn Forte /* LINTED E_STATIC_UNUSED */
197fcf3ce44SJohn Forte static int sunPluginChk(IMA_OID, boolean_t *);
198fcf3ce44SJohn Forte static int sunInitiatorFind(IMA_OID *);
199fcf3ce44SJohn Forte static int getAuthMethodValue(char *, IMA_AUTHMETHOD *);
200fcf3ce44SJohn Forte static int getLoginParam(char *);
201aff4bce5Syi zhang - Sun Microsystems - Beijing China static int getTunableParam(char *);
202fcf3ce44SJohn Forte static void iSCSINameCheckStatusDisplay(iSCSINameCheckStatusType status);
203fcf3ce44SJohn Forte static int modifyIndividualTargetParam(cmdOptions_t *optionList,
204fcf3ce44SJohn Forte     IMA_OID targetOid, int *);
205fcf3ce44SJohn Forte static void listCHAPName(IMA_OID oid);
206fcf3ce44SJohn Forte static int printConfiguredSessions(IMA_OID);
207aff4bce5Syi zhang - Sun Microsystems - Beijing China static int printTunableParameters(IMA_OID oid);
208fcf3ce44SJohn Forte 
209fcf3ce44SJohn Forte /* object functions per subcommand */
210fcf3ce44SJohn Forte static int addAddress(int, int, char *[], int *);
211fcf3ce44SJohn Forte static int addStaticConfig(int, char *[], int *);
212fcf3ce44SJohn Forte static int listDiscovery(int *);
213fcf3ce44SJohn Forte static int listDiscoveryAddress(int, char *[], cmdOptions_t *, int *);
214fcf3ce44SJohn Forte static int listISNSServerAddress(int, char *[], cmdOptions_t *, int *);
215fcf3ce44SJohn Forte static int listNode(int *);
216fcf3ce44SJohn Forte static int listStaticConfig(int, char *[], int *);
217fcf3ce44SJohn Forte static int listTarget(int, char *[], cmdOptions_t *, int *);
218fcf3ce44SJohn Forte static int listTargetParam(int, char *[], cmdOptions_t *, int *);
219fcf3ce44SJohn Forte static int modifyDiscovery(cmdOptions_t *, int *);
220fcf3ce44SJohn Forte static int modifyNodeAuthMethod(IMA_OID, char *, int *);
221fcf3ce44SJohn Forte static int modifyNodeAuthParam(IMA_OID oid, int, char *, int *);
222fcf3ce44SJohn Forte static int modifyNodeRadiusConfig(IMA_OID, char *, int *);
223fcf3ce44SJohn Forte static int modifyNodeRadiusAccess(IMA_OID, char *, int *);
224fcf3ce44SJohn Forte static int modifyNodeRadiusSharedSecret(IMA_OID, int *);
225fcf3ce44SJohn Forte static int modifyNode(cmdOptions_t *, int *);
226fcf3ce44SJohn Forte static int modifyTargetAuthMethod(IMA_OID, char *, int *);
227fcf3ce44SJohn Forte static int modifyTargetAuthParam(IMA_OID oid, int param, char *chapName, int *);
228fcf3ce44SJohn Forte static int modifyTargetParam(cmdOptions_t *, char *, int *);
229fcf3ce44SJohn Forte static int removeAddress(int, int, char *[], int *);
230fcf3ce44SJohn Forte static int removeStaticConfig(int, char *[], int *);
231fcf3ce44SJohn Forte static int removeTargetParam(int, char *[], int *);
232fcf3ce44SJohn Forte static int modifyTargetBidirAuthFlag(IMA_OID, char *, int *);
233fcf3ce44SJohn Forte static int modifyConfiguredSessions(IMA_OID targetOid, char *optarg);
234fcf3ce44SJohn Forte 
235fcf3ce44SJohn Forte /* LINTED E_STATIC_UNUSED */
236fcf3ce44SJohn Forte static IMA_STATUS getISCSINodeParameter(int paramType,
237fcf3ce44SJohn Forte     IMA_OID *oid,
238fcf3ce44SJohn Forte     void *pProps,
239fcf3ce44SJohn Forte     uint32_t paramIndex);
240fcf3ce44SJohn Forte /* LINTED E_STATIC_UNUSED */
241fcf3ce44SJohn Forte static IMA_STATUS setISCSINodeParameter(int paramType,
242fcf3ce44SJohn Forte     IMA_OID *oid,
243fcf3ce44SJohn Forte     void *pProps,
244fcf3ce44SJohn Forte     uint32_t paramIndex);
245fcf3ce44SJohn Forte /* LINTED E_STATIC_UNUSED */
246fcf3ce44SJohn Forte static IMA_STATUS getDigest(IMA_OID oid, int ioctlCmd,
247fcf3ce44SJohn Forte     SUN_IMA_DIGEST_ALGORITHM_VALUE *algorithm);
248fcf3ce44SJohn Forte 
249fcf3ce44SJohn Forte IMA_STATUS getNegotiatedDigest(int digestType,
250fcf3ce44SJohn Forte 	SUN_IMA_DIGEST_ALGORITHM_VALUE *algorithm,
251fcf3ce44SJohn Forte 	SUN_IMA_CONN_PROPERTIES *connProps);
252fcf3ce44SJohn Forte 
253fcf3ce44SJohn Forte /* globals */
254fcf3ce44SJohn Forte static char *cmdName;
255fcf3ce44SJohn Forte 
256fcf3ce44SJohn Forte /*
257fcf3ce44SJohn Forte  * Available option letters:
258fcf3ce44SJohn Forte  *
259fcf3ce44SJohn Forte  * bcefgijklmnoquwxyz
260fcf3ce44SJohn Forte  *
261aff4bce5Syi zhang - Sun Microsystems - Beijing China  * DEFGHIJKLMOQUVWXYZ
262fcf3ce44SJohn Forte  */
263fcf3ce44SJohn Forte 
264fcf3ce44SJohn Forte /*
265fcf3ce44SJohn Forte  * Add new options here
266fcf3ce44SJohn Forte  */
267fcf3ce44SJohn Forte optionTbl_t longOptions[] = {
268fcf3ce44SJohn Forte 	{"static", required_arg, 's', OPTIONSTRING4},
269fcf3ce44SJohn Forte 	{"sendtargets", required_arg, 't', OPTIONSTRING4},
270fcf3ce44SJohn Forte 	{"iSNS", required_arg, 'i', OPTIONSTRING4},
271fcf3ce44SJohn Forte 	{"headerdigest", required_arg, 'h', OPTIONSTRING6},
272fcf3ce44SJohn Forte 	{"datadigest", required_arg, 'd', OPTIONSTRING6},
273fcf3ce44SJohn Forte 	{"login-param", required_arg, 'p', OPTIONSTRING5},
274fcf3ce44SJohn Forte 	{"authentication", required_arg, 'a', "CHAP|none"},
275fcf3ce44SJohn Forte 	{"bi-directional-authentication", required_arg, 'B', OPTIONSTRING4},
276fcf3ce44SJohn Forte 	{"CHAP-secret", no_arg, 'C', NULL},
277fcf3ce44SJohn Forte 	{"CHAP-name", required_arg, 'H', OPTIONSTRING7},
278fcf3ce44SJohn Forte 	{"node-name", required_arg, 'N', OPTIONSTRING2},
279fcf3ce44SJohn Forte 	{"node-alias", required_arg, 'A', OPTIONSTRING3},
280fcf3ce44SJohn Forte 	{"radius-server", required_arg, 'r', OPTIONVAL4},
281fcf3ce44SJohn Forte 	{"radius-access", required_arg, 'R', OPTIONSTRING4},
282fcf3ce44SJohn Forte 	{"radius-shared-secret", no_arg, 'P', NULL},
283fcf3ce44SJohn Forte 	{"verbose", no_arg, 'v', NULL},
284fcf3ce44SJohn Forte 	{"scsi-target", no_arg, 'S', NULL},
285fcf3ce44SJohn Forte 	{"configured-sessions", required_arg, 'c', OPTIONSTRING8},
286aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{"tunable-param", required_arg, 'T', OPTIONSTRING9},
287fcf3ce44SJohn Forte 	{NULL, 0, 0, 0}
288fcf3ce44SJohn Forte };
289fcf3ce44SJohn Forte 
290fcf3ce44SJohn Forte parameterTbl_t loginParams[] = {
291fcf3ce44SJohn Forte 	{"dataseqinorder", DATA_SEQ_IN_ORDER},
292fcf3ce44SJohn Forte 	{"defaulttime2retain", DEFAULT_TIME_2_RETAIN},
293fcf3ce44SJohn Forte 	{"defaulttime2wait", DEFAULT_TIME_2_WAIT},
294fcf3ce44SJohn Forte 	{"firstburstlength", FIRST_BURST_LENGTH},
295fcf3ce44SJohn Forte 	{"immediatedata", IMMEDIATE_DATA},
296fcf3ce44SJohn Forte 	{"initialr2t", INITIAL_R2T},
297fcf3ce44SJohn Forte 	{"maxburstlength", MAX_BURST_LENGTH},
298fcf3ce44SJohn Forte 	{"datapduinorder", DATA_PDU_IN_ORDER},
299fcf3ce44SJohn Forte 	{"maxoutstandingr2t", MAX_OUTSTANDING_R2T},
300fcf3ce44SJohn Forte 	{"maxrecvdataseglen", MAX_RECV_DATA_SEG_LEN},
301fcf3ce44SJohn Forte 	{"maxconnections", MAX_CONNECTIONS},
302fcf3ce44SJohn Forte 	{"errorrecoverylevel", ERROR_RECOVERY_LEVEL},
303fcf3ce44SJohn Forte 	{NULL, 0}
304fcf3ce44SJohn Forte };
305fcf3ce44SJohn Forte 
306aff4bce5Syi zhang - Sun Microsystems - Beijing China parameterTbl_t tunableParams[] = {
307aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{"recv-login-rsp-timeout", RECV_LOGIN_RSP_TIMEOUT},
308aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{"conn-login-max", CONN_LOGIN_MAX},
309aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{"polling-login-delay", POLLING_LOGIN_DELAY},
310aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{NULL, 0}
311aff4bce5Syi zhang - Sun Microsystems - Beijing China };
312aff4bce5Syi zhang - Sun Microsystems - Beijing China 
313fcf3ce44SJohn Forte /*
314fcf3ce44SJohn Forte  * Add new subcommands here
315fcf3ce44SJohn Forte  */
316fcf3ce44SJohn Forte subcommand_t subcommands[] = {
317fcf3ce44SJohn Forte 	{"add", ADD, addFunc},
318fcf3ce44SJohn Forte 	{"list", LIST, listFunc},
319fcf3ce44SJohn Forte 	{"modify", MODIFY, modifyFunc},
320fcf3ce44SJohn Forte 	{"remove", REMOVE, removeFunc},
321fcf3ce44SJohn Forte 	{NULL, 0, NULL}
322fcf3ce44SJohn Forte };
323fcf3ce44SJohn Forte 
324fcf3ce44SJohn Forte /*
325fcf3ce44SJohn Forte  * Add objects here
326fcf3ce44SJohn Forte  */
327fcf3ce44SJohn Forte object_t objects[] = {
328fcf3ce44SJohn Forte 	{"discovery", DISCOVERY},
329fcf3ce44SJohn Forte 	{"discovery-address", DISCOVERY_ADDRESS},
330fcf3ce44SJohn Forte 	{"isns-server", ISNS_SERVER_ADDRESS},
331fcf3ce44SJohn Forte 	{"initiator-node", NODE},
332fcf3ce44SJohn Forte 	{"static-config", STATIC_CONFIG},
333fcf3ce44SJohn Forte 	{"target", TARGET},
334fcf3ce44SJohn Forte 	{"target-param", TARGET_PARAM},
335fcf3ce44SJohn Forte 	{NULL, 0}
336fcf3ce44SJohn Forte };
337fcf3ce44SJohn Forte 
338fcf3ce44SJohn Forte /*
339fcf3ce44SJohn Forte  * Rules for subcommands and objects
340fcf3ce44SJohn Forte  */
341fcf3ce44SJohn Forte objectRules_t objectRules[] = {
342fcf3ce44SJohn Forte 	{TARGET, 0, LIST, 0, ADD|REMOVE|MODIFY, LIST,
343fcf3ce44SJohn Forte 	"target-name"},
344fcf3ce44SJohn Forte 	{TARGET_PARAM, MODIFY|REMOVE, LIST, 0, ADD, MODIFY,
345fcf3ce44SJohn Forte 	"target-name"},
346fcf3ce44SJohn Forte 	{DISCOVERY, 0, 0, LIST|MODIFY, ADD|REMOVE, 0, NULL},
347fcf3ce44SJohn Forte 	{NODE, 0, 0, MODIFY|LIST, ADD|REMOVE, 0, NULL},
348fcf3ce44SJohn Forte 	{STATIC_CONFIG, ADD|REMOVE, LIST, 0, MODIFY, ADD|REMOVE|LIST,
349fcf3ce44SJohn Forte 	"target-name,target-address[:port-number][,tpgt]"},
350fcf3ce44SJohn Forte 	{DISCOVERY_ADDRESS, ADD|REMOVE, LIST, 0, MODIFY,
351fcf3ce44SJohn Forte 	ADD|REMOVE|LIST, "IP-address[:port-number]"},
352fcf3ce44SJohn Forte 	{ISNS_SERVER_ADDRESS, ADD|REMOVE, LIST, 0, MODIFY,
353fcf3ce44SJohn Forte 	ADD|REMOVE|LIST, "IP-address[:port-number]"},
354fcf3ce44SJohn Forte 	{0, 0, 0, 0, 0, NULL}
355fcf3ce44SJohn Forte };
356fcf3ce44SJohn Forte 
357fcf3ce44SJohn Forte /*
358fcf3ce44SJohn Forte  * list of objects, subcommands, valid short options, required flag and
359fcf3ce44SJohn Forte  * exclusive option string
360fcf3ce44SJohn Forte  *
361fcf3ce44SJohn Forte  * If it's not here, there are no options for that object.
362fcf3ce44SJohn Forte  */
363fcf3ce44SJohn Forte optionRules_t optionRules[] = {
364fcf3ce44SJohn Forte 	{DISCOVERY, MODIFY, "sti", B_TRUE, NULL},
365fcf3ce44SJohn Forte 	{DISCOVERY_ADDRESS, LIST, "v", B_FALSE, NULL},
366fcf3ce44SJohn Forte 	{ISNS_SERVER_ADDRESS, LIST, "v", B_FALSE, NULL},
367fcf3ce44SJohn Forte 	{TARGET, LIST, "vS", B_FALSE, NULL},
368aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{NODE, MODIFY, "NAhdCaRrPHcT", B_TRUE, "CP"},
369aff4bce5Syi zhang - Sun Microsystems - Beijing China 	{TARGET_PARAM, MODIFY, "ahdBCpcHT", B_TRUE, "C"},
370fcf3ce44SJohn Forte 	{TARGET_PARAM, LIST, "v", B_FALSE, NULL},
371fcf3ce44SJohn Forte 	{0, 0, 0, 0, 0}
372fcf3ce44SJohn Forte };
373fcf3ce44SJohn Forte 
374fcf3ce44SJohn Forte 
375fcf3ce44SJohn Forte static boolean_t
376fcf3ce44SJohn Forte targetNamesEqual(wchar_t *name1, wchar_t *name2)
377fcf3ce44SJohn Forte {
378fcf3ce44SJohn Forte 	int i;
379fcf3ce44SJohn Forte 	wchar_t wchar1, wchar2;
380fcf3ce44SJohn Forte 
381fcf3ce44SJohn Forte 	if (name1 == NULL || name2 == NULL) {
382fcf3ce44SJohn Forte 		return (B_FALSE);
383fcf3ce44SJohn Forte 	}
384fcf3ce44SJohn Forte 
385fcf3ce44SJohn Forte 	if (wcslen(name1) != wcslen(name2)) {
386fcf3ce44SJohn Forte 		return (B_FALSE);
387fcf3ce44SJohn Forte 	}
388fcf3ce44SJohn Forte 
389fcf3ce44SJohn Forte 	/*
390fcf3ce44SJohn Forte 	 * Convert names to lower case and compare
391fcf3ce44SJohn Forte 	 */
392fcf3ce44SJohn Forte 	for (i = 0; i < wcslen(name1); i++) {
393fcf3ce44SJohn Forte 		wchar1 = towctrans((wint_t)name1[i], wctrans("tolower"));
394fcf3ce44SJohn Forte 		wchar2 = towctrans((wint_t)name2[i], wctrans("tolower"));
395fcf3ce44SJohn Forte 
396fcf3ce44SJohn Forte 		if (wchar1 != wchar2) {
397fcf3ce44SJohn Forte 			return (B_FALSE);
398fcf3ce44SJohn Forte 		}
399fcf3ce44SJohn Forte 	}
400fcf3ce44SJohn Forte 
401fcf3ce44SJohn Forte 	return (B_TRUE);
402fcf3ce44SJohn Forte }
403fcf3ce44SJohn Forte 
404fcf3ce44SJohn Forte static boolean_t
405fcf3ce44SJohn Forte ipAddressesEqual(IMA_TARGET_ADDRESS addr1, IMA_TARGET_ADDRESS addr2)
406fcf3ce44SJohn Forte {
407fcf3ce44SJohn Forte #define	IPV4_ADDR_BYTES 4
408fcf3ce44SJohn Forte #define	IPV6_ADDR_BYTES 16
409fcf3ce44SJohn Forte 
410fcf3ce44SJohn Forte 	int compSize;
411fcf3ce44SJohn Forte 
412fcf3ce44SJohn Forte 	if (addr1.hostnameIpAddress.id.ipAddress.ipv4Address !=
413fcf3ce44SJohn Forte 	    addr2.hostnameIpAddress.id.ipAddress.ipv4Address) {
414fcf3ce44SJohn Forte 		return (B_FALSE);
415fcf3ce44SJohn Forte 	}
416fcf3ce44SJohn Forte 
417fcf3ce44SJohn Forte 	compSize = IPV6_ADDR_BYTES;
418fcf3ce44SJohn Forte 	if (addr1.hostnameIpAddress.id.ipAddress.ipv4Address) {
419fcf3ce44SJohn Forte 		compSize = IPV4_ADDR_BYTES;
420fcf3ce44SJohn Forte 	}
421fcf3ce44SJohn Forte 
422fcf3ce44SJohn Forte 	if (bcmp(addr1.hostnameIpAddress.id.ipAddress.ipAddress,
423fcf3ce44SJohn Forte 	    addr2.hostnameIpAddress.id.ipAddress.ipAddress, compSize) == 0) {
424fcf3ce44SJohn Forte 		return (B_TRUE);
425fcf3ce44SJohn Forte 	}
426fcf3ce44SJohn Forte 
427fcf3ce44SJohn Forte 	return (B_FALSE);
428fcf3ce44SJohn Forte }
429fcf3ce44SJohn Forte 
430fcf3ce44SJohn Forte static int
431fcf3ce44SJohn Forte getLoginParam(char *arg)
432fcf3ce44SJohn Forte {
433fcf3ce44SJohn Forte 	parameterTbl_t *paramp;
434fcf3ce44SJohn Forte 	int len;
435fcf3ce44SJohn Forte 
436fcf3ce44SJohn Forte 	for (paramp = loginParams; paramp->name; paramp++) {
437fcf3ce44SJohn Forte 		len = strlen(arg);
438fcf3ce44SJohn Forte 		if (len == strlen(paramp->name) &&
439fcf3ce44SJohn Forte 		    strncasecmp(arg, paramp->name, len) == 0) {
440fcf3ce44SJohn Forte 			return (paramp->val);
441fcf3ce44SJohn Forte 		}
442fcf3ce44SJohn Forte 	}
443fcf3ce44SJohn Forte 	return (-1);
444fcf3ce44SJohn Forte }
445fcf3ce44SJohn Forte 
446aff4bce5Syi zhang - Sun Microsystems - Beijing China static int
447aff4bce5Syi zhang - Sun Microsystems - Beijing China getTunableParam(char *arg)
448aff4bce5Syi zhang - Sun Microsystems - Beijing China {
449aff4bce5Syi zhang - Sun Microsystems - Beijing China 	parameterTbl_t *paramp;
450aff4bce5Syi zhang - Sun Microsystems - Beijing China 	int len;
451aff4bce5Syi zhang - Sun Microsystems - Beijing China 
452aff4bce5Syi zhang - Sun Microsystems - Beijing China 	for (paramp = tunableParams; paramp->name != NULL; paramp++) {
453aff4bce5Syi zhang - Sun Microsystems - Beijing China 		len = strlen(arg);
454aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (len == strlen(paramp->name) &&
455aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    strncasecmp(arg, paramp->name, len) == 0) {
456aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (paramp->val);
457aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
458aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
459aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (-1);
460aff4bce5Syi zhang - Sun Microsystems - Beijing China }
461aff4bce5Syi zhang - Sun Microsystems - Beijing China 
462fcf3ce44SJohn Forte static void
463fcf3ce44SJohn Forte printLibError(IMA_STATUS status)
464fcf3ce44SJohn Forte {
465fcf3ce44SJohn Forte 	char *errorString;
466fcf3ce44SJohn Forte 	switch (status) {
467fcf3ce44SJohn Forte 	case IMA_ERROR_NOT_SUPPORTED:
468fcf3ce44SJohn Forte 		errorString =
469fcf3ce44SJohn Forte 		gettext("Operation currently not supported");
470fcf3ce44SJohn Forte 		break;
471fcf3ce44SJohn Forte 	case IMA_ERROR_INSUFFICIENT_MEMORY:
472fcf3ce44SJohn Forte 		errorString = gettext("Insufficient memory");
473fcf3ce44SJohn Forte 		break;
474fcf3ce44SJohn Forte 	case IMA_ERROR_UNEXPECTED_OS_ERROR:
475fcf3ce44SJohn Forte 		errorString = gettext("unexpected OS error");
476fcf3ce44SJohn Forte 		break;
477fcf3ce44SJohn Forte 	case IMA_ERROR_UNKNOWN_ERROR:
478fcf3ce44SJohn Forte 		errorString = gettext("Unknown error");
479fcf3ce44SJohn Forte 		break;
480fcf3ce44SJohn Forte 	case IMA_ERROR_LU_IN_USE:
481fcf3ce44SJohn Forte 		errorString = gettext("Logical unit in use");
482fcf3ce44SJohn Forte 		break;
483fcf3ce44SJohn Forte 	case IMA_ERROR_INVALID_PARAMETER:
484fcf3ce44SJohn Forte 		errorString = gettext("Invalid parameter specified");
485fcf3ce44SJohn Forte 		break;
486fcf3ce44SJohn Forte 	case IMA_ERROR_INVALID_OBJECT_TYPE:
487fcf3ce44SJohn Forte 		errorString =
488fcf3ce44SJohn Forte 		gettext("Internal library error: Invalid oid type specified");
489fcf3ce44SJohn Forte 		break;
490fcf3ce44SJohn Forte 	case IMA_ERROR_INCORRECT_OBJECT_TYPE:
491fcf3ce44SJohn Forte 		errorString =
492fcf3ce44SJohn Forte 		gettext("Internal library error: Incorrect oid type specified");
493fcf3ce44SJohn Forte 		break;
494fcf3ce44SJohn Forte 	case IMA_ERROR_OBJECT_NOT_FOUND:
495fcf3ce44SJohn Forte 		errorString = gettext("Internal library error: Oid not found");
496fcf3ce44SJohn Forte 		break;
497fcf3ce44SJohn Forte 	case IMA_ERROR_NAME_TOO_LONG:
498fcf3ce44SJohn Forte 		errorString = gettext("Name too long");
499fcf3ce44SJohn Forte 		break;
500fcf3ce44SJohn Forte 	default:
501fcf3ce44SJohn Forte 		errorString = gettext("Unknown error");
502fcf3ce44SJohn Forte 	}
503fcf3ce44SJohn Forte 	(void) fprintf(stderr, "%s: %s\n", cmdName, errorString);
504fcf3ce44SJohn Forte }
505fcf3ce44SJohn Forte 
506fcf3ce44SJohn Forte /*
507fcf3ce44SJohn Forte  * input:
508fcf3ce44SJohn Forte  *  execFullName - exec name of program (argv[0])
509fcf3ce44SJohn Forte  *
510fcf3ce44SJohn Forte  * Returns:
511fcf3ce44SJohn Forte  *  command name portion of execFullName
512fcf3ce44SJohn Forte  */
513fcf3ce44SJohn Forte static char *
514fcf3ce44SJohn Forte getExecBasename(char *execFullname)
515fcf3ce44SJohn Forte {
516fcf3ce44SJohn Forte 	char *lastSlash, *execBasename;
517fcf3ce44SJohn Forte 
518fcf3ce44SJohn Forte 	/* guard against '/' at end of command invocation */
519fcf3ce44SJohn Forte 	for (;;) {
520fcf3ce44SJohn Forte 		lastSlash = strrchr(execFullname, '/');
521fcf3ce44SJohn Forte 		if (lastSlash == NULL) {
522fcf3ce44SJohn Forte 			execBasename = execFullname;
523fcf3ce44SJohn Forte 			break;
524fcf3ce44SJohn Forte 		} else {
525fcf3ce44SJohn Forte 			execBasename = lastSlash + 1;
526fcf3ce44SJohn Forte 			if (*execBasename == '\0') {
527fcf3ce44SJohn Forte 				*lastSlash = '\0';
528fcf3ce44SJohn Forte 				continue;
529fcf3ce44SJohn Forte 			}
530fcf3ce44SJohn Forte 			break;
531fcf3ce44SJohn Forte 		}
532fcf3ce44SJohn Forte 	}
533fcf3ce44SJohn Forte 	return (execBasename);
534fcf3ce44SJohn Forte }
535fcf3ce44SJohn Forte 
536fcf3ce44SJohn Forte 
537fcf3ce44SJohn Forte /*
538fcf3ce44SJohn Forte  * input:
539fcf3ce44SJohn Forte  *  nodeProps - pointer to caller allocated IMA_NODE_PROPERTIES
540fcf3ce44SJohn Forte  *
541fcf3ce44SJohn Forte  * returns:
542fcf3ce44SJohn Forte  *  zero on success
543fcf3ce44SJohn Forte  *  non-zero otherwise
544fcf3ce44SJohn Forte  */
545fcf3ce44SJohn Forte static int
546fcf3ce44SJohn Forte getNodeProps(IMA_NODE_PROPERTIES *nodeProps)
547fcf3ce44SJohn Forte {
548fcf3ce44SJohn Forte 	IMA_OID sharedNodeOid;
549fcf3ce44SJohn Forte 
550fcf3ce44SJohn Forte 	IMA_STATUS status = IMA_GetSharedNodeOid(&sharedNodeOid);
551fcf3ce44SJohn Forte 	if (!(IMA_SUCCESS(status))) {
552fcf3ce44SJohn Forte 		printLibError(status);
553fcf3ce44SJohn Forte 		return (INF_ERROR);
554fcf3ce44SJohn Forte 	}
555fcf3ce44SJohn Forte 
556fcf3ce44SJohn Forte 	status = IMA_GetNodeProperties(sharedNodeOid, nodeProps);
557fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
558fcf3ce44SJohn Forte 		printLibError(status);
559fcf3ce44SJohn Forte 		return (INF_ERROR);
560fcf3ce44SJohn Forte 	}
561fcf3ce44SJohn Forte 
562fcf3ce44SJohn Forte 	return (0);
563fcf3ce44SJohn Forte }
564fcf3ce44SJohn Forte 
565fcf3ce44SJohn Forte /*
566fcf3ce44SJohn Forte  * sunInitiatorFind
567fcf3ce44SJohn Forte  * Purpose:
568fcf3ce44SJohn Forte  *  Finds the Sun iSCSI initiator (LHBA). This CLI currently supports only
569fcf3ce44SJohn Forte  *  one initiator.
570fcf3ce44SJohn Forte  *
571fcf3ce44SJohn Forte  * output:
572fcf3ce44SJohn Forte  *  oid of initiator
573fcf3ce44SJohn Forte  *
574fcf3ce44SJohn Forte  * Returns:
575fcf3ce44SJohn Forte  *  zero on success with initiator found
576fcf3ce44SJohn Forte  *  > 0 on success with no initiator found
577fcf3ce44SJohn Forte  *  < 0 on failure
578fcf3ce44SJohn Forte  */
579fcf3ce44SJohn Forte static int
580fcf3ce44SJohn Forte sunInitiatorFind(IMA_OID *oid)
581fcf3ce44SJohn Forte {
582f5fc5c04SJack Meng 	IMA_OID_LIST *lhbaList = NULL;
583fcf3ce44SJohn Forte 
584fcf3ce44SJohn Forte 	IMA_STATUS status = IMA_GetLhbaOidList(&lhbaList);
585fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
586fcf3ce44SJohn Forte 		printLibError(status);
587fcf3ce44SJohn Forte 		return (-1);
588fcf3ce44SJohn Forte 	}
589fcf3ce44SJohn Forte 
590f5fc5c04SJack Meng 	if ((lhbaList == NULL) || (lhbaList->oidCount == 0)) {
591f5fc5c04SJack Meng 		printLibError(IMA_ERROR_OBJECT_NOT_FOUND);
592f5fc5c04SJack Meng 		if (lhbaList != NULL)
593f5fc5c04SJack Meng 			(void) IMA_FreeMemory(lhbaList);
594f5fc5c04SJack Meng 		return (-1);
595f5fc5c04SJack Meng 	}
596f5fc5c04SJack Meng 
597fcf3ce44SJohn Forte 	*oid = lhbaList->oids[0];
598f5fc5c04SJack Meng 	(void) IMA_FreeMemory(lhbaList);
599fcf3ce44SJohn Forte 
600fcf3ce44SJohn Forte 	return (0);
601fcf3ce44SJohn Forte }
602fcf3ce44SJohn Forte 
603fcf3ce44SJohn Forte /*
604fcf3ce44SJohn Forte  * input:
605fcf3ce44SJohn Forte  *  wcInput - wide character string containing discovery address
606fcf3ce44SJohn Forte  * output:
607fcf3ce44SJohn Forte  *  address - IMA_TARGET_ADDRESS structure containing valid
608fcf3ce44SJohn Forte  *	discovery address
609fcf3ce44SJohn Forte  * returns:
610fcf3ce44SJohn Forte  *  zero on success
611fcf3ce44SJohn Forte  *  non-zero on failure
612fcf3ce44SJohn Forte  */
613fcf3ce44SJohn Forte 
614fcf3ce44SJohn Forte static int
615fcf3ce44SJohn Forte getTargetAddress(int addrType, char *ipStr, IMA_TARGET_ADDRESS *address)
616fcf3ce44SJohn Forte {
617fcf3ce44SJohn Forte 	char cCol = ':';
618fcf3ce44SJohn Forte 	char cBracketL = '['; /* Open Bracket '[' */
619fcf3ce44SJohn Forte 	char cBracketR = ']'; /* Close Bracket ']' */
620fcf3ce44SJohn Forte 	char *colPos;
621fcf3ce44SJohn Forte 	char *startPos;
622fcf3ce44SJohn Forte 	unsigned long inputPort;
623fcf3ce44SJohn Forte 	int addressType = AF_INET;
624fcf3ce44SJohn Forte 	char *tmpStrPtr, tmpStr[SUN_IMA_IP_ADDRESS_PORT_LEN];
625fcf3ce44SJohn Forte 	int rval;
626fcf3ce44SJohn Forte 
627fcf3ce44SJohn Forte 	/* Check if this is a ipv6 address */
628fcf3ce44SJohn Forte 	if (ipStr[0] == cBracketL) {
629fcf3ce44SJohn Forte 		addressType = AF_INET6;
630fcf3ce44SJohn Forte 		startPos = strchr(ipStr, cBracketR);
631fcf3ce44SJohn Forte 		if (!startPos) {
632fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: ']' %s\n",
633fcf3ce44SJohn Forte 			    cmdName, ipStr, gettext("missing"));
634fcf3ce44SJohn Forte 			return (1);
635fcf3ce44SJohn Forte 		}
636fcf3ce44SJohn Forte 		(void) strlcpy(tmpStr, ipStr+1, startPos-ipStr);
637fcf3ce44SJohn Forte 		address->hostnameIpAddress.id.ipAddress.ipv4Address = IMA_FALSE;
638fcf3ce44SJohn Forte 		tmpStrPtr = tmpStr;
639fcf3ce44SJohn Forte 	} else {
640fcf3ce44SJohn Forte 		/* set start position to beginning of input object */
641fcf3ce44SJohn Forte 		addressType = AF_INET;
642fcf3ce44SJohn Forte 		startPos = ipStr;
643fcf3ce44SJohn Forte 		address->hostnameIpAddress.id.ipAddress.ipv4Address = IMA_TRUE;
644fcf3ce44SJohn Forte 		tmpStrPtr = ipStr;
645fcf3ce44SJohn Forte 	}
646fcf3ce44SJohn Forte 	/* wcschr for ':'. If not there, use default port */
647fcf3ce44SJohn Forte 	colPos = strchr(startPos, cCol);
648fcf3ce44SJohn Forte 
649fcf3ce44SJohn Forte 	if (!colPos) {
650fcf3ce44SJohn Forte 		if (addrType == DISCOVERY_ADDRESS) {
651fcf3ce44SJohn Forte 			inputPort = DEFAULT_ISCSI_PORT;
652fcf3ce44SJohn Forte 		} else if (addrType == ISNS_SERVER_ADDRESS) {
653fcf3ce44SJohn Forte 			inputPort = ISNS_DEFAULT_SERVER_PORT;
654fcf3ce44SJohn Forte 		} else {
655fcf3ce44SJohn Forte 			*colPos = NULL;
656fcf3ce44SJohn Forte 		}
657fcf3ce44SJohn Forte 	} else {
658fcf3ce44SJohn Forte 		*colPos = NULL;
659fcf3ce44SJohn Forte 	}
660fcf3ce44SJohn Forte 
661fcf3ce44SJohn Forte 	rval = inet_pton(addressType, tmpStrPtr,
662fcf3ce44SJohn Forte 	    address->hostnameIpAddress.id.ipAddress.ipAddress);
663fcf3ce44SJohn Forte 	/* inet_pton returns 1 on success */
664fcf3ce44SJohn Forte 	if (rval != 1) {
665fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName, ipStr,
666fcf3ce44SJohn Forte 		    gettext("invalid IP address"));
667fcf3ce44SJohn Forte 		return (1);
668fcf3ce44SJohn Forte 	}
669fcf3ce44SJohn Forte 
670fcf3ce44SJohn Forte 
671fcf3ce44SJohn Forte 	if (colPos) {
672fcf3ce44SJohn Forte 		char *errchr;
673fcf3ce44SJohn Forte 
674fcf3ce44SJohn Forte 		colPos++;
675fcf3ce44SJohn Forte 		if (*colPos == NULL) {
676fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
677fcf3ce44SJohn Forte 			    cmdName, ipStr,
678fcf3ce44SJohn Forte 			    gettext("port number missing"));
679fcf3ce44SJohn Forte 			return (1);
680fcf3ce44SJohn Forte 		}
681fcf3ce44SJohn Forte 
682fcf3ce44SJohn Forte 		/*
683fcf3ce44SJohn Forte 		 * convert port string to unsigned value
684fcf3ce44SJohn Forte 		 * Note:  Don't remove errno = 0 as you may get false failures.
685fcf3ce44SJohn Forte 		 */
686fcf3ce44SJohn Forte 		errno = 0;
687fcf3ce44SJohn Forte 		inputPort = strtol(colPos, &errchr, 10);
688fcf3ce44SJohn Forte 		if (errno != 0 || inputPort == 0 && errchr != NULL) {
689fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s:%s %s\n",
690fcf3ce44SJohn Forte 			    cmdName, ipStr, colPos,
691fcf3ce44SJohn Forte 			    gettext("port number invalid"));
692fcf3ce44SJohn Forte 			return (1);
693fcf3ce44SJohn Forte 		}
694fcf3ce44SJohn Forte 		/* make sure it's in the range */
695fcf3ce44SJohn Forte 		if (inputPort > USHRT_MAX) {
696fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n",
697fcf3ce44SJohn Forte 			    cmdName, ipStr,
698fcf3ce44SJohn Forte 			    gettext("port number out of range"));
699fcf3ce44SJohn Forte 			return (1);
700fcf3ce44SJohn Forte 		}
701fcf3ce44SJohn Forte 	}
702fcf3ce44SJohn Forte 	address->portNumber  = inputPort;
703fcf3ce44SJohn Forte 
704fcf3ce44SJohn Forte 	return (0);
705fcf3ce44SJohn Forte }
706fcf3ce44SJohn Forte 
707fcf3ce44SJohn Forte /*
708fcf3ce44SJohn Forte  * Print results of send targets command
709fcf3ce44SJohn Forte  */
710fcf3ce44SJohn Forte static void
711fcf3ce44SJohn Forte printSendTargets(SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *pList)
712fcf3ce44SJohn Forte {
713fcf3ce44SJohn Forte 	char outBuf[INET6_ADDRSTRLEN];
714fcf3ce44SJohn Forte 	int inetSize;
715fcf3ce44SJohn Forte 	int af;
716fcf3ce44SJohn Forte 	int i;
717fcf3ce44SJohn Forte 
718fcf3ce44SJohn Forte 	for (i = 0; i < pList->keyCount; i++) {
719fcf3ce44SJohn Forte 		if (pList->keys[i].address.ipAddress.ipv4Address == IMA_TRUE) {
720fcf3ce44SJohn Forte 			af = AF_INET;
721fcf3ce44SJohn Forte 			inetSize = INET_ADDRSTRLEN;
722fcf3ce44SJohn Forte 		} else {
723fcf3ce44SJohn Forte 			af = AF_INET6;
724fcf3ce44SJohn Forte 			inetSize = INET6_ADDRSTRLEN;
725fcf3ce44SJohn Forte 		}
726fcf3ce44SJohn Forte 		(void) fprintf(stdout, gettext("\tTarget name: %ws\n"),
727fcf3ce44SJohn Forte 		    pList->keys[i].name);
728fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\t\t%s: %15s:%d", "Target address",
729fcf3ce44SJohn Forte 		    inet_ntop(af, &(pList->keys[i].address.ipAddress.ipAddress),
730fcf3ce44SJohn Forte 		    outBuf, inetSize), pList->keys[i].address.portNumber);
731fcf3ce44SJohn Forte 		(void) fprintf(stdout, ", %d", pList->keys[i].tpgt);
732fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\n");
733fcf3ce44SJohn Forte 	}
734fcf3ce44SJohn Forte }
735fcf3ce44SJohn Forte 
736fcf3ce44SJohn Forte 
737fcf3ce44SJohn Forte /*
738fcf3ce44SJohn Forte  * Print all login parameters
739fcf3ce44SJohn Forte  */
740fcf3ce44SJohn Forte static int
741fcf3ce44SJohn Forte printLoginParameters(char *prefix, IMA_OID oid, int printOption)
742fcf3ce44SJohn Forte {
743fcf3ce44SJohn Forte 	IMA_STATUS status;
744fcf3ce44SJohn Forte 	IMA_BOOL_VALUE propBool;
745fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE propMinMax;
746fcf3ce44SJohn Forte 	char longString[MAX_LONG_CHAR_LEN + 1];
747fcf3ce44SJohn Forte 	SUN_IMA_CONN_PROPERTIES	*connProps = NULL;
748fcf3ce44SJohn Forte 	IMA_OID_LIST *pConnList;
749fcf3ce44SJohn Forte 
750fcf3ce44SJohn Forte 	(void) memset(longString, 0, sizeof (longString));
751fcf3ce44SJohn Forte 
752fcf3ce44SJohn Forte 	switch (printOption) {
753fcf3ce44SJohn Forte 		case PRINT_CONFIGURED_PARAMS:
754fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s%s:\n",
755fcf3ce44SJohn Forte 			    prefix,
756fcf3ce44SJohn Forte 			    gettext("Login Parameters (Default/Configured)"));
757fcf3ce44SJohn Forte 			break;
758fcf3ce44SJohn Forte 		case PRINT_NEGOTIATED_PARAMS:
759fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s%s:\n",
760fcf3ce44SJohn Forte 			    prefix,
761fcf3ce44SJohn Forte 			    gettext("Login Parameters (Negotiated)"));
762fcf3ce44SJohn Forte 			status = SUN_IMA_GetConnOidList(
763fcf3ce44SJohn Forte 			    &oid,
764fcf3ce44SJohn Forte 			    &pConnList);
765fcf3ce44SJohn Forte 
766fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
767fcf3ce44SJohn Forte 				printLibError(status);
768fcf3ce44SJohn Forte 				return (1);
769fcf3ce44SJohn Forte 			}
770fcf3ce44SJohn Forte 
771fcf3ce44SJohn Forte 			status = SUN_IMA_GetConnProperties(&pConnList->oids[0],
772fcf3ce44SJohn Forte 			    &connProps);
773fcf3ce44SJohn Forte 			propBool.currentValueValid = connProps->valuesValid;
774fcf3ce44SJohn Forte 			propMinMax.currentValueValid = connProps->valuesValid;
775fcf3ce44SJohn Forte 			break;
776fcf3ce44SJohn Forte 		default:
777fcf3ce44SJohn Forte 			return (1);
778fcf3ce44SJohn Forte 	}
779fcf3ce44SJohn Forte 
780fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
781fcf3ce44SJohn Forte 		propBool.currentValue = connProps->dataSequenceInOrder;
782fcf3ce44SJohn Forte 	} else {
783fcf3ce44SJohn Forte 		status = IMA_GetDataSequenceInOrderProperties(oid, &propBool);
784fcf3ce44SJohn Forte 	}
785fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
786fcf3ce44SJohn Forte 		printLibError(status);
787fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
788fcf3ce44SJohn Forte 		return (1);
789fcf3ce44SJohn Forte 	}
790fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
791fcf3ce44SJohn Forte 	    gettext("Data Sequence In Order"));
792fcf3ce44SJohn Forte 	IMABOOLPRINT(propBool, printOption);
793fcf3ce44SJohn Forte 
794fcf3ce44SJohn Forte 
795fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
796fcf3ce44SJohn Forte 		propBool.currentValue = connProps->dataPduInOrder;
797fcf3ce44SJohn Forte 	} else {
798fcf3ce44SJohn Forte 		status = IMA_GetDataPduInOrderProperties(oid, &propBool);
799fcf3ce44SJohn Forte 	}
800fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
801fcf3ce44SJohn Forte 		printLibError(status);
802fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
803fcf3ce44SJohn Forte 		return (1);
804fcf3ce44SJohn Forte 	}
805fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
806fcf3ce44SJohn Forte 	    gettext("Data PDU In Order"));
807fcf3ce44SJohn Forte 	IMABOOLPRINT(propBool, printOption);
808fcf3ce44SJohn Forte 
809fcf3ce44SJohn Forte 
810fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
811fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->defaultTime2Retain;
812fcf3ce44SJohn Forte 	} else {
813fcf3ce44SJohn Forte 		status = IMA_GetDefaultTime2RetainProperties(oid, &propMinMax);
814fcf3ce44SJohn Forte 	}
815fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
816fcf3ce44SJohn Forte 		printLibError(status);
817fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
818fcf3ce44SJohn Forte 		return (1);
819fcf3ce44SJohn Forte 	}
820fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
821fcf3ce44SJohn Forte 	    gettext("Default Time To Retain"));
822fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
823fcf3ce44SJohn Forte 
824fcf3ce44SJohn Forte 
825fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
826fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->defaultTime2Wait;
827fcf3ce44SJohn Forte 	} else {
828fcf3ce44SJohn Forte 		status = IMA_GetDefaultTime2WaitProperties(oid, &propMinMax);
829fcf3ce44SJohn Forte 	}
830fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
831fcf3ce44SJohn Forte 		printLibError(status);
832fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
833fcf3ce44SJohn Forte 		return (1);
834fcf3ce44SJohn Forte 	}
835fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
836fcf3ce44SJohn Forte 	    gettext("Default Time To Wait"));
837fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
838fcf3ce44SJohn Forte 
839fcf3ce44SJohn Forte 
840fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
841fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->errorRecoveryLevel;
842fcf3ce44SJohn Forte 	} else {
843fcf3ce44SJohn Forte 		status = IMA_GetErrorRecoveryLevelProperties(oid, &propMinMax);
844fcf3ce44SJohn Forte 	}
845fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
846fcf3ce44SJohn Forte 		printLibError(status);
847fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
848fcf3ce44SJohn Forte 		return (1);
849fcf3ce44SJohn Forte 	}
850fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
851fcf3ce44SJohn Forte 	    gettext("Error Recovery Level"));
852fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
853fcf3ce44SJohn Forte 
854fcf3ce44SJohn Forte 
855fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
856fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->firstBurstLength;
857fcf3ce44SJohn Forte 	} else {
858fcf3ce44SJohn Forte 		status = IMA_GetFirstBurstLengthProperties(oid,
859fcf3ce44SJohn Forte 		    &propMinMax);
860fcf3ce44SJohn Forte 	}
861fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
862fcf3ce44SJohn Forte 		printLibError(status);
863fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
864fcf3ce44SJohn Forte 		return (1);
865fcf3ce44SJohn Forte 	}
866fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ",
867fcf3ce44SJohn Forte 	    prefix, gettext("First Burst Length"));
868fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
869fcf3ce44SJohn Forte 
870fcf3ce44SJohn Forte 
871fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
872fcf3ce44SJohn Forte 		propBool.currentValue = connProps->immediateData;
873fcf3ce44SJohn Forte 	} else {
874fcf3ce44SJohn Forte 		status = IMA_GetImmediateDataProperties(oid, &propBool);
875fcf3ce44SJohn Forte 	}
876fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
877fcf3ce44SJohn Forte 		printLibError(status);
878fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
879fcf3ce44SJohn Forte 		return (1);
880fcf3ce44SJohn Forte 	}
881fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix, gettext("Immediate Data"));
882fcf3ce44SJohn Forte 	IMABOOLPRINT(propBool, printOption);
883fcf3ce44SJohn Forte 
884fcf3ce44SJohn Forte 
885fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
886fcf3ce44SJohn Forte 		propBool.currentValue = connProps->initialR2T;
887fcf3ce44SJohn Forte 	} else {
888fcf3ce44SJohn Forte 		status = IMA_GetInitialR2TProperties(oid, &propBool);
889fcf3ce44SJohn Forte 	}
890fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
891fcf3ce44SJohn Forte 		printLibError(status);
892fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
893fcf3ce44SJohn Forte 		return (1);
894fcf3ce44SJohn Forte 	}
895fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
896fcf3ce44SJohn Forte 	    gettext("Initial Ready To Transfer (R2T)"));
897fcf3ce44SJohn Forte 	IMABOOLPRINT(propBool, printOption);
898fcf3ce44SJohn Forte 
899fcf3ce44SJohn Forte 
900fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
901fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->maxBurstLength;
902fcf3ce44SJohn Forte 	} else {
903fcf3ce44SJohn Forte 		status = IMA_GetMaxBurstLengthProperties(oid, &propMinMax);
904fcf3ce44SJohn Forte 	}
905fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
906fcf3ce44SJohn Forte 		printLibError(status);
907fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
908fcf3ce44SJohn Forte 		return (1);
909fcf3ce44SJohn Forte 	}
910fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix, gettext("Max Burst Length"));
911fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
912fcf3ce44SJohn Forte 
913fcf3ce44SJohn Forte 
914fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
915fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->maxOutstandingR2T;
916fcf3ce44SJohn Forte 	} else {
917fcf3ce44SJohn Forte 		status = IMA_GetMaxOutstandingR2TProperties(oid, &propMinMax);
918fcf3ce44SJohn Forte 	}
919fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
920fcf3ce44SJohn Forte 		printLibError(status);
921fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
922fcf3ce44SJohn Forte 		return (1);
923fcf3ce44SJohn Forte 	}
924fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
925fcf3ce44SJohn Forte 	    gettext("Max Outstanding R2T"));
926fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
927fcf3ce44SJohn Forte 
928fcf3ce44SJohn Forte 
929fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
930fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->maxRecvDataSegmentLength;
931fcf3ce44SJohn Forte 	} else {
932fcf3ce44SJohn Forte 		status = IMA_GetMaxRecvDataSegmentLengthProperties(oid,
933fcf3ce44SJohn Forte 		    &propMinMax);
934fcf3ce44SJohn Forte 	}
935fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
936fcf3ce44SJohn Forte 		printLibError(status);
937fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
938fcf3ce44SJohn Forte 		return (1);
939fcf3ce44SJohn Forte 	}
940fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix,
941fcf3ce44SJohn Forte 	    gettext("Max Receive Data Segment Length"));
942fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
943fcf3ce44SJohn Forte 
944fcf3ce44SJohn Forte 
945fcf3ce44SJohn Forte 	if (printOption == PRINT_NEGOTIATED_PARAMS) {
946fcf3ce44SJohn Forte 		propMinMax.currentValue = connProps->maxConnections;
947fcf3ce44SJohn Forte 	} else {
948fcf3ce44SJohn Forte 		status = IMA_GetMaxConnectionsProperties(oid, &propMinMax);
949fcf3ce44SJohn Forte 	}
950fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
951fcf3ce44SJohn Forte 		printLibError(status);
952fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
953fcf3ce44SJohn Forte 		return (1);
954fcf3ce44SJohn Forte 	}
955fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s\t%s: ", prefix, gettext("Max Connections"));
956fcf3ce44SJohn Forte 	IMAMINMAXPRINT(propMinMax, printOption);
957fcf3ce44SJohn Forte 
958fcf3ce44SJohn Forte 	(void) IMA_FreeMemory(connProps);
959fcf3ce44SJohn Forte 	return (0);
960fcf3ce44SJohn Forte }
961fcf3ce44SJohn Forte 
962fcf3ce44SJohn Forte /*
963fcf3ce44SJohn Forte  * Print discovery information.
964fcf3ce44SJohn Forte  */
965fcf3ce44SJohn Forte static void
966fcf3ce44SJohn Forte printDiscoveryMethod(char *prefix, IMA_UINT32 discoveryMethodFlags)
967fcf3ce44SJohn Forte {
968fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s%s: ", prefix, gettext("Discovery Method"));
969fcf3ce44SJohn Forte 	if (discoveryMethodFlags == IMA_TARGET_DISCOVERY_METHOD_UNKNOWN) {
970fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s\n", gettext("NA"));
971fcf3ce44SJohn Forte 	} else {
972fcf3ce44SJohn Forte 		if (!((discoveryMethodFlags &
973fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_STATIC) ^
974fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_STATIC)) {
975fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s ", gettext("Static"));
976fcf3ce44SJohn Forte 		}
977fcf3ce44SJohn Forte 		if (!((discoveryMethodFlags &
978fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_SENDTARGETS) ^
979fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_SENDTARGETS)) {
980fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s ", gettext("SendTargets"));
981fcf3ce44SJohn Forte 		}
982fcf3ce44SJohn Forte 		if (!((discoveryMethodFlags &
983fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_ISNS) ^
984fcf3ce44SJohn Forte 		    IMA_TARGET_DISCOVERY_METHOD_ISNS)) {
985fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s ", gettext("iSNS"));
986fcf3ce44SJohn Forte 		}
987fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\n");
988fcf3ce44SJohn Forte 	}
989fcf3ce44SJohn Forte }
990fcf3ce44SJohn Forte 
991fcf3ce44SJohn Forte /*
992fcf3ce44SJohn Forte  * printConnectionList - Prints the conection list provided
993fcf3ce44SJohn Forte  */
994fcf3ce44SJohn Forte static void
995fcf3ce44SJohn Forte printConnectionList(char *prefix, IMA_OID_LIST *pConnList)
996fcf3ce44SJohn Forte {
997fcf3ce44SJohn Forte 	IMA_STATUS		imaStatus;
998fcf3ce44SJohn Forte 	int			i;
999fcf3ce44SJohn Forte 	SUN_IMA_CONN_PROPERTIES	*connProps;
1000fcf3ce44SJohn Forte 	union {
1001fcf3ce44SJohn Forte 		char	ipv4[INET_ADDRSTRLEN+1];
1002fcf3ce44SJohn Forte 		char	ipv6[INET6_ADDRSTRLEN+1];
1003fcf3ce44SJohn Forte 	} tmp;
1004fcf3ce44SJohn Forte 
1005fcf3ce44SJohn Forte 	for (i = 0; i < pConnList->oidCount; i++) {
1006fcf3ce44SJohn Forte 		imaStatus = SUN_IMA_GetConnProperties(&pConnList->oids[i],
1007fcf3ce44SJohn Forte 		    &connProps);
1008fcf3ce44SJohn Forte 
1009fcf3ce44SJohn Forte 		if (imaStatus != IMA_STATUS_SUCCESS) {
1010fcf3ce44SJohn Forte 			continue;
1011fcf3ce44SJohn Forte 		}
1012fcf3ce44SJohn Forte 
1013fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%sCID: %d\n", prefix,
1014fcf3ce44SJohn Forte 		    connProps->connectionID);
1015fcf3ce44SJohn Forte 
1016fcf3ce44SJohn Forte 		(void) memset(&tmp, 0, sizeof (tmp));
1017fcf3ce44SJohn Forte 		if (connProps->local.ipAddress.ipv4Address == IMA_TRUE) {
1018fcf3ce44SJohn Forte 			if (inet_ntop(AF_INET,
1019fcf3ce44SJohn Forte 			    &connProps->local.ipAddress.ipAddress[0],
1020fcf3ce44SJohn Forte 			    &tmp.ipv4[0],
1021fcf3ce44SJohn Forte 			    INET_ADDRSTRLEN)) {
1022fcf3ce44SJohn Forte 				(void) fprintf(stdout,
1023fcf3ce44SJohn Forte 				    "%s  %s: %s:%u\n",
1024fcf3ce44SJohn Forte 				    prefix,
1025fcf3ce44SJohn Forte 				    gettext("IP address (Local)"),
1026fcf3ce44SJohn Forte 				    &tmp.ipv4[0],
1027fcf3ce44SJohn Forte 				    ntohs(connProps->local.portNumber));
1028fcf3ce44SJohn Forte 			}
1029fcf3ce44SJohn Forte 		} else {
1030fcf3ce44SJohn Forte 			if (inet_ntop(AF_INET6,
1031fcf3ce44SJohn Forte 			    &connProps->local.ipAddress.ipAddress[0],
1032fcf3ce44SJohn Forte 			    &tmp.ipv6[0],
1033fcf3ce44SJohn Forte 			    INET6_ADDRSTRLEN)) {
1034fcf3ce44SJohn Forte 				(void) fprintf(stdout,
1035fcf3ce44SJohn Forte 				    "%s  %s: [%s]:%u\n",
1036fcf3ce44SJohn Forte 				    prefix,
1037fcf3ce44SJohn Forte 				    gettext("IP address (Local)"),
1038fcf3ce44SJohn Forte 				    &tmp.ipv6[0],
1039fcf3ce44SJohn Forte 				    ntohs(connProps->local.portNumber));
1040fcf3ce44SJohn Forte 			}
1041fcf3ce44SJohn Forte 		}
1042fcf3ce44SJohn Forte 		if (connProps->peer.ipAddress.ipv4Address == IMA_TRUE) {
1043fcf3ce44SJohn Forte 			if (inet_ntop(AF_INET,
1044fcf3ce44SJohn Forte 			    &connProps->peer.ipAddress.ipAddress[0],
1045fcf3ce44SJohn Forte 			    &tmp.ipv4[0],
1046fcf3ce44SJohn Forte 			    INET_ADDRSTRLEN)) {
1047fcf3ce44SJohn Forte 				(void) fprintf(stdout,
1048fcf3ce44SJohn Forte 				    "%s  %s: %s:%u\n",
1049fcf3ce44SJohn Forte 				    prefix,
1050fcf3ce44SJohn Forte 				    gettext("IP address (Peer)"),
1051fcf3ce44SJohn Forte 				    &tmp.ipv4[0],
1052fcf3ce44SJohn Forte 				    ntohs(connProps->peer.portNumber));
1053fcf3ce44SJohn Forte 			}
1054fcf3ce44SJohn Forte 		} else {
1055fcf3ce44SJohn Forte 			if (inet_ntop(AF_INET6,
1056fcf3ce44SJohn Forte 			    &connProps->peer.ipAddress.ipAddress[0],
1057fcf3ce44SJohn Forte 			    &tmp.ipv6[0],
1058fcf3ce44SJohn Forte 			    INET6_ADDRSTRLEN)) {
1059fcf3ce44SJohn Forte 				(void) fprintf(stdout,
1060fcf3ce44SJohn Forte 				    "%s  %s: [%s]:%u\n",
1061fcf3ce44SJohn Forte 				    prefix,
1062fcf3ce44SJohn Forte 				    gettext("IP address (Peer)"),
1063fcf3ce44SJohn Forte 				    &tmp.ipv6[0],
1064fcf3ce44SJohn Forte 				    ntohs(connProps->peer.portNumber));
1065fcf3ce44SJohn Forte 			}
1066fcf3ce44SJohn Forte 		}
1067fcf3ce44SJohn Forte 
1068fcf3ce44SJohn Forte 		(void) IMA_FreeMemory(connProps);
1069fcf3ce44SJohn Forte 	}
1070fcf3ce44SJohn Forte }
1071fcf3ce44SJohn Forte 
1072fcf3ce44SJohn Forte /*
1073fcf3ce44SJohn Forte  * Set login parameters on a target or initiator
1074fcf3ce44SJohn Forte  */
1075fcf3ce44SJohn Forte static int
1076fcf3ce44SJohn Forte setLoginParameter(IMA_OID oid, int optval, char *optarg)
1077fcf3ce44SJohn Forte {
1078fcf3ce44SJohn Forte 	IMA_STATUS status = IMA_STATUS_SUCCESS;
1079fcf3ce44SJohn Forte 	IMA_UINT uintValue;
1080fcf3ce44SJohn Forte 	IMA_BOOL boolValue;
1081fcf3ce44SJohn Forte 	SUN_IMA_DIGEST_ALGORITHM digestAlgList[1];
1082fcf3ce44SJohn Forte 	IMA_MIN_MAX_VALUE propMinMax;
1083fcf3ce44SJohn Forte 	char *endptr;
1084fcf3ce44SJohn Forte 
1085fcf3ce44SJohn Forte 	/*
1086fcf3ce44SJohn Forte 	 * for clarity, there are two switch statements
1087fcf3ce44SJohn Forte 	 * The first loads the variable and the second
1088fcf3ce44SJohn Forte 	 * calls the appropriate API
1089fcf3ce44SJohn Forte 	 */
1090fcf3ce44SJohn Forte 	switch (optval) {
1091fcf3ce44SJohn Forte 		case DATA_SEQ_IN_ORDER:
1092fcf3ce44SJohn Forte 		case IMMEDIATE_DATA:
1093fcf3ce44SJohn Forte 		case INITIAL_R2T:
1094fcf3ce44SJohn Forte 		case DATA_PDU_IN_ORDER:
1095fcf3ce44SJohn Forte 			/* implement 'default'? */
1096fcf3ce44SJohn Forte 			if (strcasecmp(optarg, "yes") == 0) {
1097fcf3ce44SJohn Forte 				boolValue = IMA_TRUE;
1098fcf3ce44SJohn Forte 			} else if (strcasecmp(optarg, "no") == 0) {
1099fcf3ce44SJohn Forte 				boolValue = IMA_FALSE;
1100fcf3ce44SJohn Forte 			} else {
1101fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1102fcf3ce44SJohn Forte 				    cmdName,
1103fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1104fcf3ce44SJohn Forte 				    optarg);
1105fcf3ce44SJohn Forte 				return (1);
1106fcf3ce44SJohn Forte 			}
1107fcf3ce44SJohn Forte 			break;
1108fcf3ce44SJohn Forte 		case DEFAULT_TIME_2_RETAIN:
1109fcf3ce44SJohn Forte 		case DEFAULT_TIME_2_WAIT:
1110fcf3ce44SJohn Forte 			errno = 0;
1111fcf3ce44SJohn Forte 			uintValue = strtoul(optarg, &endptr, 0);
1112fcf3ce44SJohn Forte 			if (*endptr != '\0' || errno != 0) {
1113fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1114fcf3ce44SJohn Forte 				    cmdName,
1115fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1116fcf3ce44SJohn Forte 				    optarg);
1117fcf3ce44SJohn Forte 				return (1);
1118fcf3ce44SJohn Forte 			}
1119fcf3ce44SJohn Forte 			if (uintValue > 3600) {
1120fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1121fcf3ce44SJohn Forte 				    cmdName,
1122fcf3ce44SJohn Forte gettext("value must be between 0 and 3600"));
1123fcf3ce44SJohn Forte 				return (1);
1124fcf3ce44SJohn Forte 			}
1125fcf3ce44SJohn Forte 			break;
1126fcf3ce44SJohn Forte 		case FIRST_BURST_LENGTH:
1127fcf3ce44SJohn Forte 		case MAX_BURST_LENGTH:
1128fcf3ce44SJohn Forte 		case MAX_RECV_DATA_SEG_LEN:
1129fcf3ce44SJohn Forte 			errno = 0;
1130fcf3ce44SJohn Forte 			/* implement 'default'? */
1131fcf3ce44SJohn Forte 			uintValue = strtoul(optarg, &endptr, 0);
1132fcf3ce44SJohn Forte 			if (*endptr != '\0' || errno != 0) {
1133fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1134fcf3ce44SJohn Forte 				    cmdName,
1135fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1136fcf3ce44SJohn Forte 				    optarg);
1137fcf3ce44SJohn Forte 				return (1);
1138fcf3ce44SJohn Forte 			}
1139fcf3ce44SJohn Forte 			if (uintValue < 512 || uintValue > 16777215) {
1140fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1141fcf3ce44SJohn Forte 				    cmdName,
1142fcf3ce44SJohn Forte gettext("value must be between 512 and 16777215"));
1143fcf3ce44SJohn Forte 				return (1);
1144fcf3ce44SJohn Forte 			}
1145fcf3ce44SJohn Forte 			break;
1146fcf3ce44SJohn Forte 		case MAX_OUTSTANDING_R2T:
1147fcf3ce44SJohn Forte 			errno = 0;
1148fcf3ce44SJohn Forte 			uintValue = strtoul(optarg, &endptr, 0);
1149fcf3ce44SJohn Forte 			if (*endptr != '\0' || errno != 0) {
1150fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1151fcf3ce44SJohn Forte 				    cmdName,
1152fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1153fcf3ce44SJohn Forte 				    optarg);
1154fcf3ce44SJohn Forte 				return (1);
1155fcf3ce44SJohn Forte 			}
1156fcf3ce44SJohn Forte 			if (uintValue < 1 || uintValue > 65535) {
1157fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1158fcf3ce44SJohn Forte 				    cmdName,
1159fcf3ce44SJohn Forte gettext("value must be between 1 and 65535"));
1160fcf3ce44SJohn Forte 				return (1);
1161fcf3ce44SJohn Forte 			}
1162fcf3ce44SJohn Forte 			break;
1163fcf3ce44SJohn Forte 		case HEADER_DIGEST:
1164fcf3ce44SJohn Forte 		case DATA_DIGEST:
1165fcf3ce44SJohn Forte 			if (strcasecmp(optarg, "none") == 0) {
1166fcf3ce44SJohn Forte 				digestAlgList[0] = SUN_IMA_DIGEST_NONE;
1167fcf3ce44SJohn Forte 			} else if (strcasecmp(optarg, "CRC32") == 0) {
1168fcf3ce44SJohn Forte 				digestAlgList[0] = SUN_IMA_DIGEST_CRC32;
1169fcf3ce44SJohn Forte 			} else {
1170fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1171fcf3ce44SJohn Forte 				    cmdName,
1172fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1173fcf3ce44SJohn Forte 				    optarg);
1174fcf3ce44SJohn Forte 				return (1);
1175fcf3ce44SJohn Forte 			}
1176fcf3ce44SJohn Forte 			break;
1177fcf3ce44SJohn Forte 		case MAX_CONNECTIONS:
1178fcf3ce44SJohn Forte 			errno = 0;
1179fcf3ce44SJohn Forte 			uintValue = strtoul(optarg, &endptr, 0);
1180fcf3ce44SJohn Forte 			if (*endptr != '\0' || errno != 0) {
1181fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1182fcf3ce44SJohn Forte 				    cmdName,
1183fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1184fcf3ce44SJohn Forte 				    optarg);
1185fcf3ce44SJohn Forte 				return (1);
1186fcf3ce44SJohn Forte 			}
1187fcf3ce44SJohn Forte 			if (uintValue < 1 || uintValue > 256) {
1188fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1189fcf3ce44SJohn Forte 				    cmdName,
1190fcf3ce44SJohn Forte gettext("value must be between 1 and 256"));
1191fcf3ce44SJohn Forte 				return (1);
1192fcf3ce44SJohn Forte 			}
1193fcf3ce44SJohn Forte 			break;
1194fcf3ce44SJohn Forte 		case ERROR_RECOVERY_LEVEL:
1195fcf3ce44SJohn Forte 			errno = 0;
1196fcf3ce44SJohn Forte 			uintValue = strtoul(optarg, &endptr, 0);
1197fcf3ce44SJohn Forte 			if (*endptr != '\0' || errno != 0) {
1198fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s - %s\n",
1199fcf3ce44SJohn Forte 				    cmdName,
1200fcf3ce44SJohn Forte 				    gettext("invalid option argument"),
1201fcf3ce44SJohn Forte 				    optarg);
1202fcf3ce44SJohn Forte 				return (1);
1203fcf3ce44SJohn Forte 			}
1204fcf3ce44SJohn Forte 			if (uintValue > 2) {
1205fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1206fcf3ce44SJohn Forte 				    cmdName,
1207fcf3ce44SJohn Forte gettext("value must be between 0 and 2"));
1208fcf3ce44SJohn Forte 				return (1);
1209fcf3ce44SJohn Forte 			}
1210fcf3ce44SJohn Forte 			break;
1211fcf3ce44SJohn Forte 		default:
1212fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %c: %s\n",
1213fcf3ce44SJohn Forte 			    cmdName, optval, gettext("unknown option"));
1214fcf3ce44SJohn Forte 			return (1);
1215fcf3ce44SJohn Forte 	}
1216fcf3ce44SJohn Forte 
1217fcf3ce44SJohn Forte 	switch (optval) {
1218fcf3ce44SJohn Forte 		case DATA_PDU_IN_ORDER:
1219fcf3ce44SJohn Forte 			status = IMA_SetDataPduInOrder(oid, boolValue);
1220fcf3ce44SJohn Forte 			break;
1221fcf3ce44SJohn Forte 		case DATA_SEQ_IN_ORDER:
1222fcf3ce44SJohn Forte 			status = IMA_SetDataSequenceInOrder(oid, boolValue);
1223fcf3ce44SJohn Forte 			break;
1224fcf3ce44SJohn Forte 		case DEFAULT_TIME_2_RETAIN:
1225fcf3ce44SJohn Forte 			status = IMA_SetDefaultTime2Retain(oid, uintValue);
1226fcf3ce44SJohn Forte 			break;
1227fcf3ce44SJohn Forte 		case DEFAULT_TIME_2_WAIT:
1228fcf3ce44SJohn Forte 			status = IMA_SetDefaultTime2Wait(oid, uintValue);
1229fcf3ce44SJohn Forte 			break;
1230fcf3ce44SJohn Forte 		case FIRST_BURST_LENGTH:
1231fcf3ce44SJohn Forte 			status = IMA_SetFirstBurstLength(oid, uintValue);
1232fcf3ce44SJohn Forte 
1233fcf3ce44SJohn Forte 			/*
1234fcf3ce44SJohn Forte 			 * If this call fails check to see if it's because
1235fcf3ce44SJohn Forte 			 * the requested value is > than maxBurstLength
1236fcf3ce44SJohn Forte 			 */
1237fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
1238fcf3ce44SJohn Forte 				status = IMA_GetMaxBurstLengthProperties(oid,
1239fcf3ce44SJohn Forte 				    &propMinMax);
1240fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
1241fcf3ce44SJohn Forte 					printLibError(status);
1242fcf3ce44SJohn Forte 					return (1);
1243fcf3ce44SJohn Forte 				}
1244fcf3ce44SJohn Forte 				if (uintValue > propMinMax.currentValue) {
1245fcf3ce44SJohn Forte 					(void) fprintf(stderr,
1246fcf3ce44SJohn Forte 					    "%s: %s\n", cmdName,
1247fcf3ce44SJohn Forte 					    gettext("firstBurstLength must " \
1248fcf3ce44SJohn Forte 					    "be less than or equal to than " \
1249fcf3ce44SJohn Forte 					    "maxBurstLength"));
1250fcf3ce44SJohn Forte 				}
1251fcf3ce44SJohn Forte 				return (1);
1252fcf3ce44SJohn Forte 			}
1253fcf3ce44SJohn Forte 
1254fcf3ce44SJohn Forte 			break;
1255fcf3ce44SJohn Forte 		case IMMEDIATE_DATA:
1256fcf3ce44SJohn Forte 			status = IMA_SetImmediateData(oid, boolValue);
1257fcf3ce44SJohn Forte 			break;
1258fcf3ce44SJohn Forte 		case INITIAL_R2T:
1259fcf3ce44SJohn Forte 			status = IMA_SetInitialR2T(oid, boolValue);
1260fcf3ce44SJohn Forte 			break;
1261fcf3ce44SJohn Forte 		case MAX_BURST_LENGTH:
1262fcf3ce44SJohn Forte 			status = IMA_SetMaxBurstLength(oid, uintValue);
1263fcf3ce44SJohn Forte 			/*
1264fcf3ce44SJohn Forte 			 * If this call fails check to see if it's because
1265fcf3ce44SJohn Forte 			 * the requested value is < than firstBurstLength
1266fcf3ce44SJohn Forte 			 */
1267fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
1268fcf3ce44SJohn Forte 				status = IMA_GetFirstBurstLengthProperties(oid,
1269fcf3ce44SJohn Forte 				    &propMinMax);
1270fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
1271fcf3ce44SJohn Forte 					printLibError(status);
1272fcf3ce44SJohn Forte 					return (1);
1273fcf3ce44SJohn Forte 				}
1274fcf3ce44SJohn Forte 				if (uintValue < propMinMax.currentValue) {
1275fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s\n",
1276fcf3ce44SJohn Forte 					    cmdName,
1277fcf3ce44SJohn Forte 					    gettext("maxBurstLength must be " \
1278fcf3ce44SJohn Forte 					    "greater than or equal to " \
1279fcf3ce44SJohn Forte 					    "firstBurstLength"));
1280fcf3ce44SJohn Forte 				}
1281fcf3ce44SJohn Forte 				return (1);
1282fcf3ce44SJohn Forte 			}
1283fcf3ce44SJohn Forte 			break;
1284fcf3ce44SJohn Forte 
1285fcf3ce44SJohn Forte 		case MAX_OUTSTANDING_R2T:
1286fcf3ce44SJohn Forte 			status = IMA_SetMaxOutstandingR2T(oid, uintValue);
1287fcf3ce44SJohn Forte 			break;
1288fcf3ce44SJohn Forte 		case MAX_RECV_DATA_SEG_LEN:
1289fcf3ce44SJohn Forte 			status = IMA_SetMaxRecvDataSegmentLength(oid,
1290fcf3ce44SJohn Forte 			    uintValue);
1291fcf3ce44SJohn Forte 			break;
1292fcf3ce44SJohn Forte 		case HEADER_DIGEST:
1293fcf3ce44SJohn Forte 			status = SUN_IMA_SetHeaderDigest(oid, 1,
1294fcf3ce44SJohn Forte 			    &digestAlgList[0]);
1295fcf3ce44SJohn Forte 			break;
1296fcf3ce44SJohn Forte 		case DATA_DIGEST:
1297fcf3ce44SJohn Forte 			status = SUN_IMA_SetDataDigest(oid, 1,
1298fcf3ce44SJohn Forte 			    &digestAlgList[0]);
1299fcf3ce44SJohn Forte 			break;
1300fcf3ce44SJohn Forte 		case MAX_CONNECTIONS:
1301fcf3ce44SJohn Forte 			status = IMA_SetMaxConnections(oid, uintValue);
1302fcf3ce44SJohn Forte 			break;
1303fcf3ce44SJohn Forte 		case ERROR_RECOVERY_LEVEL:
1304fcf3ce44SJohn Forte 			status = IMA_SetErrorRecoveryLevel(oid, uintValue);
1305fcf3ce44SJohn Forte 			break;
1306fcf3ce44SJohn Forte 	}
1307fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1308fcf3ce44SJohn Forte 		printLibError(status);
1309fcf3ce44SJohn Forte 		return (1);
1310fcf3ce44SJohn Forte 	}
1311fcf3ce44SJohn Forte 	return (0);
1312fcf3ce44SJohn Forte }
1313fcf3ce44SJohn Forte 
1314fcf3ce44SJohn Forte static void
1315fcf3ce44SJohn Forte printDigestAlgorithm(SUN_IMA_DIGEST_ALGORITHM_VALUE *digestAlgorithms,
1316fcf3ce44SJohn Forte     int printOption)
1317fcf3ce44SJohn Forte {
1318fcf3ce44SJohn Forte 	int i;
1319fcf3ce44SJohn Forte 
1320fcf3ce44SJohn Forte 	if (printOption == PRINT_CONFIGURED_PARAMS) {
1321fcf3ce44SJohn Forte 		for (i = 0; i < digestAlgorithms->defaultAlgorithmCount; i++) {
1322fcf3ce44SJohn Forte 			if (i > 0) {
1323fcf3ce44SJohn Forte 				(void) fprintf(stdout, "|");
1324fcf3ce44SJohn Forte 			}
1325fcf3ce44SJohn Forte 			switch (digestAlgorithms->defaultAlgorithms[i]) {
1326fcf3ce44SJohn Forte 				case SUN_IMA_DIGEST_NONE:
1327fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1328fcf3ce44SJohn Forte 					    gettext("NONE"));
1329fcf3ce44SJohn Forte 					break;
1330fcf3ce44SJohn Forte 				case SUN_IMA_DIGEST_CRC32:
1331fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1332fcf3ce44SJohn Forte 					    gettext("CRC32"));
1333fcf3ce44SJohn Forte 					break;
1334fcf3ce44SJohn Forte 				default:
1335fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1336fcf3ce44SJohn Forte 					    gettext("Unknown"));
1337fcf3ce44SJohn Forte 					break;
1338fcf3ce44SJohn Forte 			}
1339fcf3ce44SJohn Forte 		}
1340fcf3ce44SJohn Forte 		(void) fprintf(stdout, "/");
1341fcf3ce44SJohn Forte 		if (digestAlgorithms->currentValid == IMA_TRUE) {
1342fcf3ce44SJohn Forte 			for (i = 0;
1343fcf3ce44SJohn Forte 			    i < digestAlgorithms->currentAlgorithmCount; i++) {
1344fcf3ce44SJohn Forte 				if (i > 0) {
1345fcf3ce44SJohn Forte 					(void) fprintf(stdout, "|");
1346fcf3ce44SJohn Forte 				}
1347fcf3ce44SJohn Forte 				switch (digestAlgorithms->
1348fcf3ce44SJohn Forte 				    currentAlgorithms[i]) {
1349fcf3ce44SJohn Forte 					case SUN_IMA_DIGEST_NONE:
1350fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1351fcf3ce44SJohn Forte 						    gettext("NONE"));
1352fcf3ce44SJohn Forte 						break;
1353fcf3ce44SJohn Forte 					case SUN_IMA_DIGEST_CRC32:
1354fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1355fcf3ce44SJohn Forte 						    gettext("CRC32"));
1356fcf3ce44SJohn Forte 						break;
1357fcf3ce44SJohn Forte 					default:
1358fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1359fcf3ce44SJohn Forte 						    gettext("Unknown"));
1360fcf3ce44SJohn Forte 						break;
1361fcf3ce44SJohn Forte 				}
1362fcf3ce44SJohn Forte 			}
1363fcf3ce44SJohn Forte 		} else {
1364fcf3ce44SJohn Forte 			(void) fprintf(stdout, "-");
1365fcf3ce44SJohn Forte 		}
1366fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\n");
1367fcf3ce44SJohn Forte 	} else if (printOption == PRINT_NEGOTIATED_PARAMS) {
1368fcf3ce44SJohn Forte 
1369fcf3ce44SJohn Forte 		if (digestAlgorithms->negotiatedValid == IMA_TRUE) {
1370fcf3ce44SJohn Forte 			for (i = 0;
1371fcf3ce44SJohn Forte 			    i < digestAlgorithms->negotiatedAlgorithmCount;
1372fcf3ce44SJohn Forte 			    i++) {
1373fcf3ce44SJohn Forte 				if (i > 0) {
1374fcf3ce44SJohn Forte 					(void) fprintf(stdout, "|");
1375fcf3ce44SJohn Forte 				}
1376fcf3ce44SJohn Forte 				switch (digestAlgorithms->
1377fcf3ce44SJohn Forte 				    negotiatedAlgorithms[i]) {
1378fcf3ce44SJohn Forte 					case SUN_IMA_DIGEST_NONE:
1379fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1380fcf3ce44SJohn Forte 						    gettext("NONE"));
1381fcf3ce44SJohn Forte 						break;
1382fcf3ce44SJohn Forte 					case SUN_IMA_DIGEST_CRC32:
1383fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1384fcf3ce44SJohn Forte 						    gettext("CRC32"));
1385fcf3ce44SJohn Forte 						break;
1386fcf3ce44SJohn Forte 					default:
1387fcf3ce44SJohn Forte 						(void) fprintf(stdout,
1388fcf3ce44SJohn Forte 						    gettext("Unknown"));
1389fcf3ce44SJohn Forte 						break;
1390fcf3ce44SJohn Forte 				}
1391fcf3ce44SJohn Forte 			}
1392fcf3ce44SJohn Forte 		} else {
1393fcf3ce44SJohn Forte 			(void) fprintf(stdout, "-");
1394fcf3ce44SJohn Forte 		}
1395fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\n");
1396fcf3ce44SJohn Forte 	}
1397fcf3ce44SJohn Forte }
1398fcf3ce44SJohn Forte 
1399fcf3ce44SJohn Forte static int
1400fcf3ce44SJohn Forte setLoginParameters(IMA_OID oid, char *optarg)
1401fcf3ce44SJohn Forte {
1402fcf3ce44SJohn Forte 	char keyp[MAXOPTARGLEN];
1403fcf3ce44SJohn Forte 	char valp[MAXOPTARGLEN];
1404fcf3ce44SJohn Forte 	int key;
1405fcf3ce44SJohn Forte 	char *nameValueString, *indexp, *delim = NULL;
1406fcf3ce44SJohn Forte 
1407fcf3ce44SJohn Forte 	if ((nameValueString = strdup(optarg)) == NULL) {
1408fcf3ce44SJohn Forte 		if (errno == ENOMEM) {
1409fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
1410fcf3ce44SJohn Forte 			    cmdName, strerror(errno));
1411fcf3ce44SJohn Forte 		} else {
1412fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
1413fcf3ce44SJohn Forte 			    gettext("unknown error"));
1414fcf3ce44SJohn Forte 		}
1415fcf3ce44SJohn Forte 		return (1);
1416fcf3ce44SJohn Forte 	}
1417fcf3ce44SJohn Forte 
1418fcf3ce44SJohn Forte 	indexp = nameValueString;
1419fcf3ce44SJohn Forte 
1420fcf3ce44SJohn Forte 	/*
1421fcf3ce44SJohn Forte 	 * Retrieve all login params from option argument
1422fcf3ce44SJohn Forte 	 * Syntax <key=value,...>
1423fcf3ce44SJohn Forte 	 */
1424fcf3ce44SJohn Forte 	while (indexp) {
1425fcf3ce44SJohn Forte 		if (delim = strchr(indexp, ',')) {
1426fcf3ce44SJohn Forte 			delim[0] = '\0';
1427fcf3ce44SJohn Forte 		}
1428fcf3ce44SJohn Forte 		(void) memset(keyp, 0, sizeof (keyp));
1429fcf3ce44SJohn Forte 		(void) memset(valp, 0, sizeof (valp));
1430fcf3ce44SJohn Forte 		if (sscanf(indexp, gettext("%[^=]=%s"), keyp, valp) != 2) {
1431fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
1432fcf3ce44SJohn Forte 			    gettext("Unknown param"), indexp);
1433aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
1434aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
1435aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
1436aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
1437fcf3ce44SJohn Forte 			return (1);
1438fcf3ce44SJohn Forte 		}
1439fcf3ce44SJohn Forte 		if ((key = getLoginParam(keyp)) == -1) {
1440fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
1441fcf3ce44SJohn Forte 			    gettext("Unknown key"), keyp);
1442aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
1443aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
1444aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
1445aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
1446fcf3ce44SJohn Forte 			return (1);
1447fcf3ce44SJohn Forte 		}
1448fcf3ce44SJohn Forte 		if (setLoginParameter(oid, key, valp) != 0) {
1449aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
1450aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
1451aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
1452aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
1453fcf3ce44SJohn Forte 			return (1);
1454fcf3ce44SJohn Forte 		}
1455fcf3ce44SJohn Forte 		if (delim) {
1456fcf3ce44SJohn Forte 			indexp = delim + 1;
1457fcf3ce44SJohn Forte 		} else {
1458fcf3ce44SJohn Forte 			indexp = NULL;
1459fcf3ce44SJohn Forte 		}
1460fcf3ce44SJohn Forte 	}
1461fcf3ce44SJohn Forte 
1462aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (nameValueString) {
1463aff4bce5Syi zhang - Sun Microsystems - Beijing China 		free(nameValueString);
1464aff4bce5Syi zhang - Sun Microsystems - Beijing China 		nameValueString = NULL;
1465aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
1466fcf3ce44SJohn Forte 	return (0);
1467fcf3ce44SJohn Forte }
1468fcf3ce44SJohn Forte 
1469fcf3ce44SJohn Forte /*
1470fcf3ce44SJohn Forte  * Print logical unit information for a specific target
1471fcf3ce44SJohn Forte  */
1472fcf3ce44SJohn Forte static void
1473fcf3ce44SJohn Forte printTargetLuns(IMA_OID_LIST * lunList)
1474fcf3ce44SJohn Forte {
1475fcf3ce44SJohn Forte 	int	j;
1476fcf3ce44SJohn Forte 	IMA_STATUS status;
1477fcf3ce44SJohn Forte 	SUN_IMA_LU_PROPERTIES	lunProps;
1478fcf3ce44SJohn Forte 
1479fcf3ce44SJohn Forte 	for (j = 0; j < lunList->oidCount; j++) {
1480fcf3ce44SJohn Forte 		status = SUN_IMA_GetLuProperties(lunList->oids[j],
1481fcf3ce44SJohn Forte 		    &lunProps);
1482fcf3ce44SJohn Forte 		if (!IMA_SUCCESS(status)) {
1483fcf3ce44SJohn Forte 			printLibError(status);
1484fcf3ce44SJohn Forte 			return;
1485fcf3ce44SJohn Forte 		}
1486fcf3ce44SJohn Forte 
1487fcf3ce44SJohn Forte 		if (lunProps.imaProps.osDeviceNameValid == IMA_TRUE) {
1488fcf3ce44SJohn Forte 			(void) fprintf(stdout, "\tLUN: %lld\n",
1489fcf3ce44SJohn Forte 			    lunProps.imaProps.targetLun);
1490fcf3ce44SJohn Forte 			(void) fprintf(stdout, "\t     Vendor:  %s\n",
1491fcf3ce44SJohn Forte 			    lunProps.vendorId);
1492fcf3ce44SJohn Forte 			(void) fprintf(stdout, "\t     Product: %s\n",
1493fcf3ce44SJohn Forte 			    lunProps.productId);
1494fcf3ce44SJohn Forte 			(void) fprintf(stdout,
1495fcf3ce44SJohn Forte 			    gettext("\t     OS Device Name: %ws\n"),
1496fcf3ce44SJohn Forte 			    lunProps.imaProps.osDeviceName);
1497fcf3ce44SJohn Forte 		}
1498fcf3ce44SJohn Forte 	}
1499fcf3ce44SJohn Forte }
1500fcf3ce44SJohn Forte 
1501fcf3ce44SJohn Forte /*
1502fcf3ce44SJohn Forte  * Retrieve CHAP secret from input
1503fcf3ce44SJohn Forte  */
1504fcf3ce44SJohn Forte static int
1505fcf3ce44SJohn Forte getSecret(char *secret, int *secretLen, int minSecretLen, int maxSecretLen)
1506fcf3ce44SJohn Forte {
1507fcf3ce44SJohn Forte 	char *chapSecret;
1508fcf3ce44SJohn Forte 
1509fcf3ce44SJohn Forte 	/* get password */
1510fcf3ce44SJohn Forte 	chapSecret = getpassphrase(gettext("Enter secret:"));
1511fcf3ce44SJohn Forte 
15125279807dSJack Meng 	if (chapSecret == NULL) {
15135279807dSJack Meng 		(void) fprintf(stderr, "%s: %s\n", cmdName,
15145279807dSJack Meng 		    gettext("Unable to get secret"));
15155279807dSJack Meng 		*secret = NULL;
15165279807dSJack Meng 		return (1);
15175279807dSJack Meng 	}
15185279807dSJack Meng 
1519fcf3ce44SJohn Forte 	if (strlen(chapSecret) > maxSecretLen) {
1520fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s %d\n", cmdName,
1521fcf3ce44SJohn Forte 		    gettext("secret too long, maximum length is"),
1522fcf3ce44SJohn Forte 		    maxSecretLen);
1523fcf3ce44SJohn Forte 		*secret = NULL;
1524fcf3ce44SJohn Forte 		return (1);
1525fcf3ce44SJohn Forte 	}
1526fcf3ce44SJohn Forte 
1527fcf3ce44SJohn Forte 	if (strlen(chapSecret) < minSecretLen) {
1528fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s %d\n", cmdName,
1529fcf3ce44SJohn Forte 		    gettext("secret too short, minimum length is"),
1530fcf3ce44SJohn Forte 		    minSecretLen);
1531fcf3ce44SJohn Forte 		*secret = NULL;
1532fcf3ce44SJohn Forte 		return (1);
1533fcf3ce44SJohn Forte 	}
1534fcf3ce44SJohn Forte 
1535fcf3ce44SJohn Forte 	(void) strcpy(secret, chapSecret);
1536fcf3ce44SJohn Forte 
1537fcf3ce44SJohn Forte 	chapSecret = getpassphrase(gettext("Re-enter secret:"));
15385279807dSJack Meng 
15395279807dSJack Meng 	if (chapSecret == NULL) {
15405279807dSJack Meng 		(void) fprintf(stderr, "%s: %s\n", cmdName,
15415279807dSJack Meng 		    gettext("Unable to get secret"));
15425279807dSJack Meng 		*secret = NULL;
15435279807dSJack Meng 		return (1);
15445279807dSJack Meng 	}
15455279807dSJack Meng 
1546fcf3ce44SJohn Forte 	if (strcmp(secret, chapSecret) != 0) {
1547fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n", cmdName,
1548fcf3ce44SJohn Forte 		    gettext("secrets do not match, secret not changed"));
1549fcf3ce44SJohn Forte 		*secret = NULL;
1550fcf3ce44SJohn Forte 		return (1);
1551fcf3ce44SJohn Forte 	}
1552fcf3ce44SJohn Forte 	*secretLen = strlen(chapSecret);
1553fcf3ce44SJohn Forte 	return (0);
1554fcf3ce44SJohn Forte }
1555fcf3ce44SJohn Forte 
1556fcf3ce44SJohn Forte /*
1557fcf3ce44SJohn Forte  * Lists the discovery attributes
1558fcf3ce44SJohn Forte  */
1559fcf3ce44SJohn Forte static int
1560fcf3ce44SJohn Forte listDiscovery(int *funcRet)
1561fcf3ce44SJohn Forte {
1562fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
1563fcf3ce44SJohn Forte 	IMA_DISCOVERY_PROPERTIES discProps;
1564fcf3ce44SJohn Forte 	int ret;
1565fcf3ce44SJohn Forte 	IMA_STATUS status;
1566fcf3ce44SJohn Forte 
1567fcf3ce44SJohn Forte 	assert(funcRet != NULL);
1568fcf3ce44SJohn Forte 
1569fcf3ce44SJohn Forte 
1570fcf3ce44SJohn Forte 	/* Find Sun initiator */
1571fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
1572fcf3ce44SJohn Forte 	if (ret > 0) {
1573fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
1574fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
1575fcf3ce44SJohn Forte 	}
1576fcf3ce44SJohn Forte 
1577fcf3ce44SJohn Forte 	if (ret != 0) {
1578fcf3ce44SJohn Forte 		return (ret);
1579fcf3ce44SJohn Forte 	}
1580fcf3ce44SJohn Forte 
1581fcf3ce44SJohn Forte 	/* Get discovery attributes from IMA */
1582fcf3ce44SJohn Forte 	status = IMA_GetDiscoveryProperties(initiatorOid, &discProps);
1583fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1584fcf3ce44SJohn Forte 		printLibError(status);
1585fcf3ce44SJohn Forte 		*funcRet = 1;
1586fcf3ce44SJohn Forte 		return (ret);
1587fcf3ce44SJohn Forte 	}
1588fcf3ce44SJohn Forte 
1589fcf3ce44SJohn Forte 
1590fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s:\n", "Discovery");
1591fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\tStatic: %s\n",
1592fcf3ce44SJohn Forte 	    discProps.staticDiscoveryEnabled == IMA_TRUE ? \
1593fcf3ce44SJohn Forte 	    gettext("enabled") : gettext("disabled"));
1594fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\tSend Targets: %s\n",
1595fcf3ce44SJohn Forte 	    discProps.sendTargetsDiscoveryEnabled == IMA_TRUE ? \
1596fcf3ce44SJohn Forte 	    gettext("enabled") : gettext("disabled"));
1597fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\tiSNS: %s\n",
1598fcf3ce44SJohn Forte 	    discProps.iSnsDiscoveryEnabled == IMA_TRUE ? \
1599fcf3ce44SJohn Forte 	    gettext("enabled") : gettext("disabled"));
1600fcf3ce44SJohn Forte 
1601fcf3ce44SJohn Forte 	return (0);
1602fcf3ce44SJohn Forte }
1603fcf3ce44SJohn Forte 
1604fcf3ce44SJohn Forte /*
1605fcf3ce44SJohn Forte  * Print all initiator node attributes
1606fcf3ce44SJohn Forte  */
1607fcf3ce44SJohn Forte static int
1608fcf3ce44SJohn Forte listNode(int *funcRet)
1609fcf3ce44SJohn Forte {
1610fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
1611fcf3ce44SJohn Forte 	IMA_NODE_PROPERTIES nodeProps;
1612fcf3ce44SJohn Forte 	IMA_STATUS status;
1613fcf3ce44SJohn Forte 	int ret;
1614fcf3ce44SJohn Forte 	IMA_UINT maxEntries = MAX_AUTH_METHODS;
1615fcf3ce44SJohn Forte 	IMA_AUTHMETHOD	methodList[MAX_AUTH_METHODS];
1616fcf3ce44SJohn Forte 	SUN_IMA_RADIUS_CONFIG radiusConfig;
1617fcf3ce44SJohn Forte 	SUN_IMA_DIGEST_ALGORITHM_VALUE digestAlgorithms;
1618fcf3ce44SJohn Forte 	IMA_BOOL radiusAccess;
1619fcf3ce44SJohn Forte 
1620fcf3ce44SJohn Forte 	int i;
1621fcf3ce44SJohn Forte 
1622fcf3ce44SJohn Forte 	assert(funcRet != NULL);
1623fcf3ce44SJohn Forte 
1624fcf3ce44SJohn Forte 	ret = getNodeProps(&nodeProps);
1625fcf3ce44SJohn Forte 	if (ret != 0) {
1626fcf3ce44SJohn Forte 		return (ret);
1627fcf3ce44SJohn Forte 	}
1628fcf3ce44SJohn Forte 
1629fcf3ce44SJohn Forte 	if (nodeProps.nameValid == IMA_FALSE) {
1630fcf3ce44SJohn Forte 		return (INVALID_NODE_NAME);
1631fcf3ce44SJohn Forte 	}
1632fcf3ce44SJohn Forte 
1633fcf3ce44SJohn Forte 	/* Find Sun initiator */
1634fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
1635fcf3ce44SJohn Forte 	if (ret > 0) {
1636fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
1637fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
1638fcf3ce44SJohn Forte 	}
1639fcf3ce44SJohn Forte 
1640fcf3ce44SJohn Forte 	if (ret != 0) {
1641fcf3ce44SJohn Forte 		return (ret);
1642fcf3ce44SJohn Forte 	}
1643fcf3ce44SJohn Forte 	/* Begin output */
1644fcf3ce44SJohn Forte 	(void) fprintf(stdout, gettext("%s: %ws\n"),
1645fcf3ce44SJohn Forte 	    gettext("Initiator node name"),
1646fcf3ce44SJohn Forte 	    nodeProps.name);
1647fcf3ce44SJohn Forte 	(void) fprintf(stdout, gettext("Initiator node alias: "));
1648fcf3ce44SJohn Forte 	if (nodeProps.aliasValid == IMA_TRUE) {
1649fcf3ce44SJohn Forte 		(void) fprintf(stdout, gettext("%ws\n"), nodeProps.alias);
1650fcf3ce44SJohn Forte 	} else {
1651fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s\n", "-");
1652fcf3ce44SJohn Forte 	}
1653fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\t%s:\n",
1654fcf3ce44SJohn Forte 	    gettext("Login Parameters (Default/Configured)"));
1655fcf3ce44SJohn Forte 
1656fcf3ce44SJohn Forte 	/* Get Digest configuration */
1657fcf3ce44SJohn Forte 	status = SUN_IMA_GetHeaderDigest(initiatorOid, &digestAlgorithms);
1658fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
1659fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\t\t%s: ", gettext("Header Digest"));
1660fcf3ce44SJohn Forte 		printDigestAlgorithm(&digestAlgorithms,
1661fcf3ce44SJohn Forte 		    PRINT_CONFIGURED_PARAMS);
1662fcf3ce44SJohn Forte 	} else {
1663fcf3ce44SJohn Forte 		printLibError(status);
1664fcf3ce44SJohn Forte 		*funcRet = 1;
1665fcf3ce44SJohn Forte 		return (ret);
1666fcf3ce44SJohn Forte 	}
1667fcf3ce44SJohn Forte 
1668fcf3ce44SJohn Forte 	status = SUN_IMA_GetDataDigest(initiatorOid, &digestAlgorithms);
1669fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
1670fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\t\t%s: ", gettext("Data Digest"));
1671fcf3ce44SJohn Forte 		printDigestAlgorithm(&digestAlgorithms,
1672fcf3ce44SJohn Forte 		    PRINT_CONFIGURED_PARAMS);
1673fcf3ce44SJohn Forte 	} else {
1674fcf3ce44SJohn Forte 		printLibError(status);
1675fcf3ce44SJohn Forte 		*funcRet = 1;
1676fcf3ce44SJohn Forte 		return (ret);
1677fcf3ce44SJohn Forte 	}
1678fcf3ce44SJohn Forte 
1679fcf3ce44SJohn Forte 	/* Get authentication type for this lhba */
1680fcf3ce44SJohn Forte 	status = IMA_GetInUseInitiatorAuthMethods(initiatorOid, &maxEntries,
1681fcf3ce44SJohn Forte 	    &methodList[0]);
1682fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\t%s: ", gettext("Authentication Type"));
1683fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1684fcf3ce44SJohn Forte 		/* No authentication method set - default is NONE */
1685fcf3ce44SJohn Forte 		(void) fprintf(stdout, gettext("NONE"));
1686fcf3ce44SJohn Forte 	} else {
1687fcf3ce44SJohn Forte 		for (i = 0; i < maxEntries; i++) {
1688fcf3ce44SJohn Forte 			if (i > 0) {
1689fcf3ce44SJohn Forte 				(void) fprintf(stdout, "|");
1690fcf3ce44SJohn Forte 			}
1691fcf3ce44SJohn Forte 			switch (methodList[i]) {
1692fcf3ce44SJohn Forte 				case IMA_AUTHMETHOD_NONE:
1693fcf3ce44SJohn Forte 					(void) fprintf(stdout, gettext("NONE"));
1694fcf3ce44SJohn Forte 					break;
1695fcf3ce44SJohn Forte 				case IMA_AUTHMETHOD_CHAP:
1696fcf3ce44SJohn Forte 					(void) fprintf(stdout, gettext("CHAP"));
1697fcf3ce44SJohn Forte 					listCHAPName(initiatorOid);
1698fcf3ce44SJohn Forte 					break;
1699fcf3ce44SJohn Forte 				default:
1700fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1701fcf3ce44SJohn Forte 					    gettext("unknown type"));
1702fcf3ce44SJohn Forte 					break;
1703fcf3ce44SJohn Forte 			}
1704fcf3ce44SJohn Forte 		}
1705fcf3ce44SJohn Forte 	}
1706fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\n");
1707fcf3ce44SJohn Forte 
1708fcf3ce44SJohn Forte 
1709fcf3ce44SJohn Forte 	/* Get RADIUS configuration */
1710fcf3ce44SJohn Forte 	status = SUN_IMA_GetInitiatorRadiusConfig(initiatorOid, &radiusConfig);
1711fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\t%s: ", gettext("RADIUS Server"));
1712fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
1713fcf3ce44SJohn Forte 		if (strlen(radiusConfig.hostnameIpAddress) > 0) {
1714fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s:%d",
1715fcf3ce44SJohn Forte 			    radiusConfig.hostnameIpAddress,
1716fcf3ce44SJohn Forte 			    radiusConfig.port);
1717fcf3ce44SJohn Forte 		} else {
1718fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s", gettext("NONE"));
1719fcf3ce44SJohn Forte 		}
1720fcf3ce44SJohn Forte 	} else {
1721fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s", gettext("NONE"));
1722fcf3ce44SJohn Forte 	}
1723fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\n");
1724fcf3ce44SJohn Forte 
1725fcf3ce44SJohn Forte 	status = SUN_IMA_GetInitiatorRadiusAccess(initiatorOid,
1726fcf3ce44SJohn Forte 	    &radiusAccess);
1727fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\t%s: ", gettext("RADIUS Access"));
1728fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
1729fcf3ce44SJohn Forte 		if (radiusAccess == IMA_TRUE) {
1730fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s", gettext("enabled"));
1731fcf3ce44SJohn Forte 		} else {
1732fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s", gettext("disabled"));
1733fcf3ce44SJohn Forte 		}
1734fcf3ce44SJohn Forte 	} else if (status == IMA_ERROR_OBJECT_NOT_FOUND) {
1735fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s", gettext("disabled"));
1736fcf3ce44SJohn Forte 	} else {
1737fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s", gettext("unknown"));
1738fcf3ce44SJohn Forte 	}
1739fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\n");
1740fcf3ce44SJohn Forte 
1741aff4bce5Syi zhang - Sun Microsystems - Beijing China 	/* print tunable parameters information. */
1742aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ret = printTunableParameters(initiatorOid);
1743aff4bce5Syi zhang - Sun Microsystems - Beijing China 
1744fcf3ce44SJohn Forte 	/* print configured session information. */
1745fcf3ce44SJohn Forte 	ret = printConfiguredSessions(initiatorOid);
1746fcf3ce44SJohn Forte 
1747fcf3ce44SJohn Forte 	return (ret);
1748fcf3ce44SJohn Forte }
1749fcf3ce44SJohn Forte 
1750fcf3ce44SJohn Forte /*
1751fcf3ce44SJohn Forte  * Print discovery addresses
1752fcf3ce44SJohn Forte  */
1753fcf3ce44SJohn Forte static int
1754fcf3ce44SJohn Forte listDiscoveryAddress(int objectLen, char *objects[], cmdOptions_t *options,
1755fcf3ce44SJohn Forte     int *funcRet)
1756fcf3ce44SJohn Forte {
1757fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
1758fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDR_PROP_LIST *discoveryAddressPropertiesList;
1759fcf3ce44SJohn Forte 	IMA_DISCOVERY_ADDRESS_PROPERTIES discAddrProps;
1760fcf3ce44SJohn Forte 	IMA_TARGET_ADDRESS address;
1761fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *pList;
1762fcf3ce44SJohn Forte 	IMA_STATUS status;
1763fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ADDRESS_LEN + 1];
1764fcf3ce44SJohn Forte 	int ret;
1765fcf3ce44SJohn Forte 	boolean_t object = B_FALSE;
1766fcf3ce44SJohn Forte 	int outerLoop;
1767fcf3ce44SJohn Forte 	boolean_t found;
1768fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
1769fcf3ce44SJohn Forte 	int i, j;
1770fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
1771fcf3ce44SJohn Forte 	char sAddr[SUN_IMA_IP_ADDRESS_PORT_LEN];
1772fcf3ce44SJohn Forte 
1773fcf3ce44SJohn Forte 	assert(funcRet != NULL);
1774fcf3ce44SJohn Forte 
1775fcf3ce44SJohn Forte 	/* Find Sun initiator */
1776fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
1777fcf3ce44SJohn Forte 	if (ret > 0) {
1778fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
1779fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
1780fcf3ce44SJohn Forte 	}
1781fcf3ce44SJohn Forte 
1782fcf3ce44SJohn Forte 	if (ret != 0) {
1783fcf3ce44SJohn Forte 		return (ret);
1784fcf3ce44SJohn Forte 	}
1785fcf3ce44SJohn Forte 
1786fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
1787fcf3ce44SJohn Forte 		switch (optionList->optval) {
1788fcf3ce44SJohn Forte 			case 'v':
1789fcf3ce44SJohn Forte 				verbose = B_TRUE;
1790fcf3ce44SJohn Forte 				break;
1791fcf3ce44SJohn Forte 			default:
1792fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
1793fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
1794fcf3ce44SJohn Forte 				    gettext("unknown option"));
1795fcf3ce44SJohn Forte 				return (1);
1796fcf3ce44SJohn Forte 		}
1797fcf3ce44SJohn Forte 	}
1798fcf3ce44SJohn Forte 
1799fcf3ce44SJohn Forte 	/*
1800fcf3ce44SJohn Forte 	 * If there are multiple objects, execute outer 'for' loop that
1801fcf3ce44SJohn Forte 	 * many times for each target detail, otherwise, execute it only
1802fcf3ce44SJohn Forte 	 * once with summaries only
1803fcf3ce44SJohn Forte 	 */
1804fcf3ce44SJohn Forte 	if (objectLen > 0) {
1805fcf3ce44SJohn Forte 		object = B_TRUE;
1806fcf3ce44SJohn Forte 		outerLoop = objectLen;
1807fcf3ce44SJohn Forte 	} else {
1808fcf3ce44SJohn Forte 		object = B_FALSE;
1809fcf3ce44SJohn Forte 		outerLoop = 1;
1810fcf3ce44SJohn Forte 	}
1811fcf3ce44SJohn Forte 
1812fcf3ce44SJohn Forte 	status = SUN_IMA_GetDiscoveryAddressPropertiesList(
1813fcf3ce44SJohn Forte 	    &discoveryAddressPropertiesList);
1814fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1815fcf3ce44SJohn Forte 		printLibError(status);
1816fcf3ce44SJohn Forte 		*funcRet = 1;
1817fcf3ce44SJohn Forte 		return (ret);
1818fcf3ce44SJohn Forte 	}
1819fcf3ce44SJohn Forte 
1820fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
1821fcf3ce44SJohn Forte 		if (object) {
1822fcf3ce44SJohn Forte 			/* initialize */
1823fcf3ce44SJohn Forte 			(void) memset(&wcInputObject[0], 0,
1824fcf3ce44SJohn Forte 			    sizeof (wcInputObject));
1825fcf3ce44SJohn Forte 			(void) memset(&address, 0, sizeof (address));
1826fcf3ce44SJohn Forte 			if (mbstowcs(wcInputObject, objects[i],
1827fcf3ce44SJohn Forte 			    (MAX_ADDRESS_LEN + 1)) == (size_t)-1) {
1828fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
1829fcf3ce44SJohn Forte 				    cmdName,
1830fcf3ce44SJohn Forte 				    gettext("conversion error"));
1831fcf3ce44SJohn Forte 				ret = 1;
1832fcf3ce44SJohn Forte 				continue;
1833fcf3ce44SJohn Forte 			}
1834fcf3ce44SJohn Forte 
1835fcf3ce44SJohn Forte 			/*
1836fcf3ce44SJohn Forte 			 * if one or more objects were input,
1837fcf3ce44SJohn Forte 			 * get the values
1838fcf3ce44SJohn Forte 			 */
1839fcf3ce44SJohn Forte 			if (getTargetAddress(DISCOVERY_ADDRESS,
1840fcf3ce44SJohn Forte 			    objects[i], &address) != 0) {
1841fcf3ce44SJohn Forte 				ret = 1;
1842fcf3ce44SJohn Forte 				continue;
1843fcf3ce44SJohn Forte 			}
1844fcf3ce44SJohn Forte 		}
1845fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0;
1846fcf3ce44SJohn Forte 		    j < discoveryAddressPropertiesList->discAddrCount;
1847fcf3ce44SJohn Forte 		    j++) {
1848fcf3ce44SJohn Forte 			discAddrProps =
1849fcf3ce44SJohn Forte 			    discoveryAddressPropertiesList->props[j];
1850fcf3ce44SJohn Forte 
1851fcf3ce44SJohn Forte 			/*
1852fcf3ce44SJohn Forte 			 * Compare the discovery address with the input if
1853fcf3ce44SJohn Forte 			 * one was input
1854fcf3ce44SJohn Forte 			 */
1855fcf3ce44SJohn Forte 			if (object &&
1856fcf3ce44SJohn Forte 			    ipAddressesEqual(discAddrProps.discoveryAddress,
1857fcf3ce44SJohn Forte 			    address) && (discAddrProps.discoveryAddress.
1858fcf3ce44SJohn Forte 			    portNumber == address.portNumber)) {
1859fcf3ce44SJohn Forte 				found = B_TRUE;
1860fcf3ce44SJohn Forte 			}
1861fcf3ce44SJohn Forte 
1862fcf3ce44SJohn Forte 			if (!object || found) {
1863fcf3ce44SJohn Forte 				/* Print summary - always */
1864fcf3ce44SJohn Forte 				if (discAddrProps.discoveryAddress.
1865fcf3ce44SJohn Forte 				    hostnameIpAddress.id.ipAddress.
1866fcf3ce44SJohn Forte 				    ipv4Address) {
1867fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET, discAddrProps.
1868fcf3ce44SJohn Forte 					    discoveryAddress.hostnameIpAddress.
1869fcf3ce44SJohn Forte 					    id.ipAddress.ipAddress, sAddr,
1870fcf3ce44SJohn Forte 					    sizeof (sAddr));
1871fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1872fcf3ce44SJohn Forte 					    "Discovery Address: %s:%u\n",
1873fcf3ce44SJohn Forte 					    sAddr, discAddrProps.
1874fcf3ce44SJohn Forte 					    discoveryAddress.portNumber);
1875fcf3ce44SJohn Forte 				} else {
1876fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET6,
1877fcf3ce44SJohn Forte 					    discAddrProps.
1878fcf3ce44SJohn Forte 					    discoveryAddress.hostnameIpAddress.
1879fcf3ce44SJohn Forte 					    id.ipAddress.ipAddress, sAddr,
1880fcf3ce44SJohn Forte 					    sizeof (sAddr));
1881fcf3ce44SJohn Forte 					(void) fprintf(stdout,
1882fcf3ce44SJohn Forte 					    "DiscoveryAddress: [%s]:%u\n",
1883fcf3ce44SJohn Forte 					    sAddr, discAddrProps.
1884fcf3ce44SJohn Forte 					    discoveryAddress.portNumber);
1885fcf3ce44SJohn Forte 				}
1886fcf3ce44SJohn Forte 			}
1887fcf3ce44SJohn Forte 
1888fcf3ce44SJohn Forte 			if ((!object || found) && verbose) {
1889fcf3ce44SJohn Forte 				IMA_NODE_PROPERTIES nodeProps;
1890fcf3ce44SJohn Forte 
1891fcf3ce44SJohn Forte 				if (getNodeProps(&nodeProps) != 0) {
1892fcf3ce44SJohn Forte 					break;
1893fcf3ce44SJohn Forte 				}
1894fcf3ce44SJohn Forte 
1895fcf3ce44SJohn Forte 				/*
1896fcf3ce44SJohn Forte 				 * Issue sendTargets only when an addr is
1897fcf3ce44SJohn Forte 				 * specified.
1898fcf3ce44SJohn Forte 				 */
1899fcf3ce44SJohn Forte 				status = SUN_IMA_SendTargets(nodeProps.name,
1900fcf3ce44SJohn Forte 				    discAddrProps.discoveryAddress, &pList);
1901fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
1902fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s\n",
1903fcf3ce44SJohn Forte 					    gettext("\tUnable to get "\
1904fcf3ce44SJohn Forte 					    "targets."));
1905fcf3ce44SJohn Forte 					*funcRet = 1;
1906fcf3ce44SJohn Forte 					continue;
1907fcf3ce44SJohn Forte 				}
1908fcf3ce44SJohn Forte 				printSendTargets(pList);
1909fcf3ce44SJohn Forte 			}
1910fcf3ce44SJohn Forte 
1911fcf3ce44SJohn Forte 			if (found) {
1912fcf3ce44SJohn Forte 				/* we found the discovery address - break */
1913fcf3ce44SJohn Forte 				break;
1914fcf3ce44SJohn Forte 			}
1915fcf3ce44SJohn Forte 		}
1916fcf3ce44SJohn Forte 		/*
1917fcf3ce44SJohn Forte 		 * There was an object entered but we didn't
1918fcf3ce44SJohn Forte 		 * find it.
1919fcf3ce44SJohn Forte 		 */
1920fcf3ce44SJohn Forte 		if (object && !found) {
1921fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s: %s\n",
1922fcf3ce44SJohn Forte 			    objects[i], gettext("not found"));
1923fcf3ce44SJohn Forte 		}
1924fcf3ce44SJohn Forte 	}
1925fcf3ce44SJohn Forte 	return (ret);
1926fcf3ce44SJohn Forte }
1927fcf3ce44SJohn Forte 
1928fcf3ce44SJohn Forte /*
1929fcf3ce44SJohn Forte  * Print ISNS Server addresses
1930fcf3ce44SJohn Forte  */
1931fcf3ce44SJohn Forte static int
1932fcf3ce44SJohn Forte listISNSServerAddress(int objectLen, char *objects[], cmdOptions_t *options,
1933fcf3ce44SJohn Forte     int *funcRet)
1934fcf3ce44SJohn Forte {
1935fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
1936fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDR_PROP_LIST	    *discoveryAddressPropertiesList;
1937fcf3ce44SJohn Forte 	IMA_DISCOVERY_ADDRESS_PROPERTIES discAddrProps;
1938fcf3ce44SJohn Forte 	IMA_TARGET_ADDRESS address;
1939fcf3ce44SJohn Forte 	SUN_IMA_DISC_ADDRESS_KEY_PROPERTIES *pList;
1940fcf3ce44SJohn Forte 	IMA_STATUS status;
1941fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ADDRESS_LEN + 1];
1942fcf3ce44SJohn Forte 	int ret;
1943fcf3ce44SJohn Forte 	boolean_t object = B_FALSE;
1944fcf3ce44SJohn Forte 	int outerLoop;
1945fcf3ce44SJohn Forte 	boolean_t found;
1946fcf3ce44SJohn Forte 	boolean_t showTarget = B_FALSE;
1947fcf3ce44SJohn Forte 	int i, j;
1948fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
1949fcf3ce44SJohn Forte 	char sAddr[SUN_IMA_IP_ADDRESS_PORT_LEN];
1950fcf3ce44SJohn Forte 
1951fcf3ce44SJohn Forte 	assert(funcRet != NULL);
1952fcf3ce44SJohn Forte 
1953fcf3ce44SJohn Forte 	/* Find Sun initiator */
1954fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
1955fcf3ce44SJohn Forte 	if (ret > 0) {
1956fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
1957fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
1958fcf3ce44SJohn Forte 	}
1959fcf3ce44SJohn Forte 
1960fcf3ce44SJohn Forte 	if (ret != 0) {
1961fcf3ce44SJohn Forte 		return (ret);
1962fcf3ce44SJohn Forte 	}
1963fcf3ce44SJohn Forte 
1964fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
1965fcf3ce44SJohn Forte 		switch (optionList->optval) {
1966fcf3ce44SJohn Forte 			case 'v':
1967fcf3ce44SJohn Forte 				showTarget = B_TRUE;
1968fcf3ce44SJohn Forte 				break;
1969fcf3ce44SJohn Forte 			default:
1970fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
1971fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
1972fcf3ce44SJohn Forte 				    gettext("unknown option"));
1973fcf3ce44SJohn Forte 				return (1);
1974fcf3ce44SJohn Forte 		}
1975fcf3ce44SJohn Forte 	}
1976fcf3ce44SJohn Forte 
1977fcf3ce44SJohn Forte 	/*
1978fcf3ce44SJohn Forte 	 * If there are multiple objects, execute outer 'for' loop that
1979fcf3ce44SJohn Forte 	 * many times for each target detail, otherwise, execute it only
1980fcf3ce44SJohn Forte 	 * once with summaries only
1981fcf3ce44SJohn Forte 	 */
1982fcf3ce44SJohn Forte 	if (objectLen > 0) {
1983fcf3ce44SJohn Forte 		object = B_TRUE;
1984fcf3ce44SJohn Forte 		outerLoop = objectLen;
1985fcf3ce44SJohn Forte 	} else {
1986fcf3ce44SJohn Forte 		object = B_FALSE;
1987fcf3ce44SJohn Forte 		outerLoop = 1;
1988fcf3ce44SJohn Forte 	}
1989fcf3ce44SJohn Forte 
1990fcf3ce44SJohn Forte 	status = SUN_IMA_GetISNSServerAddressPropertiesList(
1991fcf3ce44SJohn Forte 	    &discoveryAddressPropertiesList);
1992fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
1993fcf3ce44SJohn Forte 		printLibError(status);
1994fcf3ce44SJohn Forte 		*funcRet = 1;
1995fcf3ce44SJohn Forte 		return (ret);
1996fcf3ce44SJohn Forte 	}
1997fcf3ce44SJohn Forte 
1998fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
1999fcf3ce44SJohn Forte 		if (object) {
2000fcf3ce44SJohn Forte 			/* initialize */
2001fcf3ce44SJohn Forte 			(void) memset(&wcInputObject[0], 0,
2002fcf3ce44SJohn Forte 			    sizeof (wcInputObject));
2003fcf3ce44SJohn Forte 			(void) memset(&address, 0, sizeof (address));
2004fcf3ce44SJohn Forte 			if (mbstowcs(wcInputObject, objects[i],
2005fcf3ce44SJohn Forte 			    (MAX_ADDRESS_LEN + 1)) == (size_t)-1) {
2006fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s\n",
2007fcf3ce44SJohn Forte 				    cmdName,
2008fcf3ce44SJohn Forte 				    gettext("conversion error"));
2009fcf3ce44SJohn Forte 				ret = 1;
2010fcf3ce44SJohn Forte 				continue;
2011fcf3ce44SJohn Forte 			}
2012fcf3ce44SJohn Forte 
2013fcf3ce44SJohn Forte 			/*
2014fcf3ce44SJohn Forte 			 * if one or more objects were input,
2015fcf3ce44SJohn Forte 			 * get the values
2016fcf3ce44SJohn Forte 			 */
2017fcf3ce44SJohn Forte 			if (getTargetAddress(ISNS_SERVER_ADDRESS,
2018fcf3ce44SJohn Forte 			    objects[i], &address) != 0) {
2019fcf3ce44SJohn Forte 				ret = 1;
2020fcf3ce44SJohn Forte 				continue;
2021fcf3ce44SJohn Forte 			}
2022fcf3ce44SJohn Forte 		}
2023fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0;
2024fcf3ce44SJohn Forte 		    j < discoveryAddressPropertiesList->discAddrCount;
2025fcf3ce44SJohn Forte 		    j++) {
2026fcf3ce44SJohn Forte 			discAddrProps =
2027fcf3ce44SJohn Forte 			    discoveryAddressPropertiesList->props[j];
2028fcf3ce44SJohn Forte 
2029fcf3ce44SJohn Forte 			/*
2030fcf3ce44SJohn Forte 			 * Compare the discovery address with the input if
2031fcf3ce44SJohn Forte 			 * one was input
2032fcf3ce44SJohn Forte 			 */
2033fcf3ce44SJohn Forte 			if (object &&
2034fcf3ce44SJohn Forte 			    ipAddressesEqual(discAddrProps.discoveryAddress,
2035fcf3ce44SJohn Forte 			    address) &&
2036fcf3ce44SJohn Forte 			    (discAddrProps.discoveryAddress.portNumber ==
2037fcf3ce44SJohn Forte 			    address.portNumber)) {
2038fcf3ce44SJohn Forte 				found = B_TRUE;
2039fcf3ce44SJohn Forte 			}
2040fcf3ce44SJohn Forte 
2041fcf3ce44SJohn Forte 			if (!object || found) {
2042fcf3ce44SJohn Forte 				/* Print summary - always */
2043fcf3ce44SJohn Forte 				if (discAddrProps.discoveryAddress.
2044fcf3ce44SJohn Forte 				    hostnameIpAddress.id.ipAddress.
2045fcf3ce44SJohn Forte 				    ipv4Address) {
2046fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET, discAddrProps.
2047fcf3ce44SJohn Forte 					    discoveryAddress.hostnameIpAddress.
2048fcf3ce44SJohn Forte 					    id.ipAddress.ipAddress, sAddr,
2049fcf3ce44SJohn Forte 					    sizeof (sAddr));
2050fcf3ce44SJohn Forte 				} else {
2051fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET6,
2052fcf3ce44SJohn Forte 					    discAddrProps.
2053fcf3ce44SJohn Forte 					    discoveryAddress.hostnameIpAddress.
2054fcf3ce44SJohn Forte 					    id.ipAddress.ipAddress, sAddr,
2055fcf3ce44SJohn Forte 					    sizeof (sAddr));
2056fcf3ce44SJohn Forte 				}
2057fcf3ce44SJohn Forte 				(void) fprintf(stdout,
2058fcf3ce44SJohn Forte 				    "iSNS Server IP Address: %s:%u\n",
2059fcf3ce44SJohn Forte 				    sAddr,
2060fcf3ce44SJohn Forte 				    discAddrProps.discoveryAddress.portNumber);
2061fcf3ce44SJohn Forte 			}
2062fcf3ce44SJohn Forte 
2063fcf3ce44SJohn Forte 			if ((!object || found) && showTarget) {
2064fcf3ce44SJohn Forte 				IMA_NODE_PROPERTIES nodeProps;
2065fcf3ce44SJohn Forte 
2066fcf3ce44SJohn Forte 				if (getNodeProps(&nodeProps) != 0) {
2067fcf3ce44SJohn Forte 					break;
2068fcf3ce44SJohn Forte 				}
2069fcf3ce44SJohn Forte 
2070fcf3ce44SJohn Forte 				/*
2071fcf3ce44SJohn Forte 				 * Issue sendTargets only when an addr is
2072fcf3ce44SJohn Forte 				 * specified.
2073fcf3ce44SJohn Forte 				 */
2074fcf3ce44SJohn Forte 				status = SUN_IMA_RetrieveISNSServerTargets(
2075fcf3ce44SJohn Forte 				    discAddrProps.discoveryAddress,
2076fcf3ce44SJohn Forte 				    &pList);
2077fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
2078fcf3ce44SJohn Forte 					/*
2079fcf3ce44SJohn Forte 					 * Check if the discovery mode is
2080fcf3ce44SJohn Forte 					 * disabled.
2081fcf3ce44SJohn Forte 					 */
2082fcf3ce44SJohn Forte 					if (status ==
2083fcf3ce44SJohn Forte 					    IMA_ERROR_OBJECT_NOT_FOUND) {
2084fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s\n",
2085fcf3ce44SJohn Forte 						    gettext("\tiSNS "\
2086fcf3ce44SJohn Forte 						    "discovery "\
2087fcf3ce44SJohn Forte 						    "mode "\
2088fcf3ce44SJohn Forte 						    "disabled. "\
2089fcf3ce44SJohn Forte 						    "No targets "\
2090fcf3ce44SJohn Forte 						    "to report."));
2091fcf3ce44SJohn Forte 
2092fcf3ce44SJohn Forte 					} else {
2093fcf3ce44SJohn Forte 						(void) fprintf(stderr, "%s\n",
2094fcf3ce44SJohn Forte 						    gettext("\tUnable "\
2095fcf3ce44SJohn Forte 						    "to get "\
2096fcf3ce44SJohn Forte 						    "targets."));
2097fcf3ce44SJohn Forte 					}
2098fcf3ce44SJohn Forte 					continue;
2099fcf3ce44SJohn Forte 				}
2100fcf3ce44SJohn Forte 				printSendTargets(pList);
2101fcf3ce44SJohn Forte 			}
2102fcf3ce44SJohn Forte 
2103fcf3ce44SJohn Forte 			if (found) {
2104fcf3ce44SJohn Forte 				/* we found the discovery address - break */
2105fcf3ce44SJohn Forte 				break;
2106fcf3ce44SJohn Forte 			}
2107fcf3ce44SJohn Forte 		}
2108fcf3ce44SJohn Forte 		/*
2109fcf3ce44SJohn Forte 		 * There was an object entered but we didn't
2110fcf3ce44SJohn Forte 		 * find it.
2111fcf3ce44SJohn Forte 		 */
2112fcf3ce44SJohn Forte 		if (object && !found) {
2113fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s: %s\n",
2114fcf3ce44SJohn Forte 			    objects[i], gettext("not found"));
2115fcf3ce44SJohn Forte 		}
2116fcf3ce44SJohn Forte 	}
2117fcf3ce44SJohn Forte 	return (ret);
2118fcf3ce44SJohn Forte }
2119fcf3ce44SJohn Forte 
2120fcf3ce44SJohn Forte /*
2121fcf3ce44SJohn Forte  * Print static configuration targets
2122fcf3ce44SJohn Forte  */
2123fcf3ce44SJohn Forte static int
2124fcf3ce44SJohn Forte listStaticConfig(int operandLen, char *operand[], int *funcRet)
2125fcf3ce44SJohn Forte {
2126fcf3ce44SJohn Forte 	IMA_STATUS status;
2127fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
2128fcf3ce44SJohn Forte 	IMA_OID_LIST *staticTargetList;
2129fcf3ce44SJohn Forte 	SUN_IMA_STATIC_TARGET_PROPERTIES staticTargetProps;
2130fcf3ce44SJohn Forte 	wchar_t staticTargetName[MAX_ISCSI_NAME_LEN + 1];
2131fcf3ce44SJohn Forte 	wchar_t staticTargetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
2132fcf3ce44SJohn Forte 	wchar_t wcCol;
2133fcf3ce44SJohn Forte 	char sAddr[SUN_IMA_IP_ADDRESS_PORT_LEN];
2134fcf3ce44SJohn Forte 	int ret;
2135fcf3ce44SJohn Forte 	boolean_t object = B_FALSE;
2136fcf3ce44SJohn Forte 	int outerLoop;
2137fcf3ce44SJohn Forte 	boolean_t found; /* B_TRUE if a target name is found */
2138fcf3ce44SJohn Forte 	boolean_t matched; /* B_TRUE if a specific target is found */
2139fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_FALSE;
2140fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
2141fcf3ce44SJohn Forte 	boolean_t isIpv6;
2142fcf3ce44SJohn Forte 	int i, j;
2143fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
2144fcf3ce44SJohn Forte 	IMA_UINT16 tpgt = 0;
2145fcf3ce44SJohn Forte 	char tmpStr[SUN_IMA_IP_ADDRESS_PORT_LEN];
2146fcf3ce44SJohn Forte 	wchar_t tmpTargetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
2147fcf3ce44SJohn Forte 
2148fcf3ce44SJohn Forte 	assert(funcRet != NULL);
2149fcf3ce44SJohn Forte 
2150fcf3ce44SJohn Forte 	/* Find Sun initiator */
2151fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
2152fcf3ce44SJohn Forte 	if (ret > 0) {
2153fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
2154fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
2155fcf3ce44SJohn Forte 	}
2156fcf3ce44SJohn Forte 
2157fcf3ce44SJohn Forte 	if (ret != 0) {
2158fcf3ce44SJohn Forte 		return (ret);
2159fcf3ce44SJohn Forte 	}
2160fcf3ce44SJohn Forte 
2161fcf3ce44SJohn Forte 	/*
2162fcf3ce44SJohn Forte 	 * If there are multiple objects, execute outer 'for' loop that
2163fcf3ce44SJohn Forte 	 * many times for each static config detail, otherwise, execute it only
2164fcf3ce44SJohn Forte 	 * once with summaries only
2165fcf3ce44SJohn Forte 	 */
2166fcf3ce44SJohn Forte 	if (operandLen > 0) {
2167fcf3ce44SJohn Forte 		object = B_TRUE;
2168fcf3ce44SJohn Forte 		outerLoop = operandLen;
2169fcf3ce44SJohn Forte 	} else {
2170fcf3ce44SJohn Forte 		object = B_FALSE;
2171fcf3ce44SJohn Forte 		outerLoop = 1;
2172fcf3ce44SJohn Forte 	}
2173fcf3ce44SJohn Forte 
2174fcf3ce44SJohn Forte 	/* convert ':' to wide char for wchar string search */
2175fcf3ce44SJohn Forte 	if (mbtowc(&wcCol, ":", sizeof (wcCol)) == -1) {
2176fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
2177fcf3ce44SJohn Forte 		    cmdName, gettext("conversion error"));
2178fcf3ce44SJohn Forte 		return (1);
2179fcf3ce44SJohn Forte 	}
2180fcf3ce44SJohn Forte 
2181fcf3ce44SJohn Forte 	status = IMA_GetStaticDiscoveryTargetOidList(initiatorOid,
2182fcf3ce44SJohn Forte 	    &staticTargetList);
2183fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
2184fcf3ce44SJohn Forte 		printLibError(status);
2185fcf3ce44SJohn Forte 		*funcRet = 1;
2186fcf3ce44SJohn Forte 		return (ret);
2187fcf3ce44SJohn Forte 	}
2188fcf3ce44SJohn Forte 
2189fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
2190fcf3ce44SJohn Forte 		if (object) {
2191fcf3ce44SJohn Forte 			if (parseTarget(operand[i],
2192fcf3ce44SJohn Forte 			    &staticTargetName[0],
2193fcf3ce44SJohn Forte 			    MAX_ISCSI_NAME_LEN + 1,
2194fcf3ce44SJohn Forte 			    &targetAddressSpecified,
2195fcf3ce44SJohn Forte 			    &staticTargetAddress[0],
2196fcf3ce44SJohn Forte 			    SUN_IMA_IP_ADDRESS_PORT_LEN,
2197fcf3ce44SJohn Forte 			    &port,
2198fcf3ce44SJohn Forte 			    &tpgtSpecified,
2199fcf3ce44SJohn Forte 			    &tpgt,
2200fcf3ce44SJohn Forte 			    &isIpv6) != PARSE_TARGET_OK) {
2201fcf3ce44SJohn Forte 				ret = 1;
2202fcf3ce44SJohn Forte 				continue;
2203fcf3ce44SJohn Forte 			}
2204fcf3ce44SJohn Forte 		}
2205fcf3ce44SJohn Forte 
2206fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < staticTargetList->oidCount;
2207fcf3ce44SJohn Forte 		    j++) {
2208fcf3ce44SJohn Forte 			boolean_t isIpv6 = B_FALSE;
2209fcf3ce44SJohn Forte 			IMA_UINT16 stpgt;
2210fcf3ce44SJohn Forte 			IMA_BOOL defaultTpgt;
2211fcf3ce44SJohn Forte 
2212fcf3ce44SJohn Forte 			matched = B_FALSE;
2213fcf3ce44SJohn Forte 			(void) memset(&staticTargetProps, 0,
2214fcf3ce44SJohn Forte 			    sizeof (staticTargetProps));
2215fcf3ce44SJohn Forte 
2216fcf3ce44SJohn Forte 			status = SUN_IMA_GetStaticTargetProperties(
2217fcf3ce44SJohn Forte 			    staticTargetList->oids[j], &staticTargetProps);
2218fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
2219fcf3ce44SJohn Forte 				printLibError(status);
2220fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(staticTargetList);
2221fcf3ce44SJohn Forte 				*funcRet = 1;
2222fcf3ce44SJohn Forte 				return (ret);
2223fcf3ce44SJohn Forte 			}
2224fcf3ce44SJohn Forte 
2225fcf3ce44SJohn Forte 			stpgt = staticTargetProps.staticTarget.targetAddress.
2226fcf3ce44SJohn Forte 			    tpgt;
2227fcf3ce44SJohn Forte 
2228fcf3ce44SJohn Forte 			defaultTpgt = staticTargetProps.staticTarget.
2229fcf3ce44SJohn Forte 			    targetAddress.defaultTpgt;
2230fcf3ce44SJohn Forte 
2231fcf3ce44SJohn Forte 			isIpv6 = !staticTargetProps.staticTarget.targetAddress.
2232fcf3ce44SJohn Forte 			    imaStruct.hostnameIpAddress.id.ipAddress.
2233fcf3ce44SJohn Forte 			    ipv4Address;
2234fcf3ce44SJohn Forte 
2235fcf3ce44SJohn Forte 			/*
2236fcf3ce44SJohn Forte 			 * Compare the static target name with the input if
2237fcf3ce44SJohn Forte 			 * one was input
2238fcf3ce44SJohn Forte 			 */
2239fcf3ce44SJohn Forte 
2240fcf3ce44SJohn Forte 			if (object &&
2241fcf3ce44SJohn Forte 			    (targetNamesEqual(
2242fcf3ce44SJohn Forte 			    staticTargetProps.staticTarget.targetName,
2243fcf3ce44SJohn Forte 			    staticTargetName) == B_TRUE)) {
2244fcf3ce44SJohn Forte 				/* targetName found - found = B_TRUE */
2245fcf3ce44SJohn Forte 				found = B_TRUE;
2246fcf3ce44SJohn Forte 				if (targetAddressSpecified == B_FALSE) {
2247fcf3ce44SJohn Forte 					matched = B_TRUE;
2248fcf3ce44SJohn Forte 				} else {
2249fcf3ce44SJohn Forte 
2250fcf3ce44SJohn Forte 				if (staticTargetProps.staticTarget.
2251fcf3ce44SJohn Forte 				    targetAddress.imaStruct.
2252fcf3ce44SJohn Forte 				    hostnameIpAddress.id.ipAddress.
2253fcf3ce44SJohn Forte 				    ipv4Address == IMA_TRUE) {
2254fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET,
2255fcf3ce44SJohn Forte 					    staticTargetProps.
2256fcf3ce44SJohn Forte 					    staticTarget.targetAddress.
2257fcf3ce44SJohn Forte 					    imaStruct.hostnameIpAddress.id.
2258fcf3ce44SJohn Forte 					    ipAddress.ipAddress, tmpStr,
2259fcf3ce44SJohn Forte 					    sizeof (tmpStr));
2260fcf3ce44SJohn Forte 				} else {
2261fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET6,
2262fcf3ce44SJohn Forte 					    staticTargetProps.
2263fcf3ce44SJohn Forte 					    staticTarget.targetAddress.
2264fcf3ce44SJohn Forte 					    imaStruct.hostnameIpAddress.id.
2265fcf3ce44SJohn Forte 					    ipAddress.ipAddress, tmpStr,
2266fcf3ce44SJohn Forte 					    sizeof (tmpStr));
2267fcf3ce44SJohn Forte 				}
2268fcf3ce44SJohn Forte 
2269fcf3ce44SJohn Forte 				if (mbstowcs(tmpTargetAddress, tmpStr,
2270fcf3ce44SJohn Forte 				    SUN_IMA_IP_ADDRESS_PORT_LEN) ==
2271fcf3ce44SJohn Forte 				    (size_t)-1) {
2272fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s\n",
2273fcf3ce44SJohn Forte 					    cmdName,
2274fcf3ce44SJohn Forte 					gettext("conversion error"));
2275fcf3ce44SJohn Forte 					ret = 1;
2276fcf3ce44SJohn Forte 					continue;
2277fcf3ce44SJohn Forte 				}
2278fcf3ce44SJohn Forte 
2279fcf3ce44SJohn Forte 				if (wcsncmp(tmpTargetAddress,
2280fcf3ce44SJohn Forte 				    staticTargetAddress,
2281fcf3ce44SJohn Forte 				    SUN_IMA_IP_ADDRESS_PORT_LEN)
2282fcf3ce44SJohn Forte 				    == 0 &&
2283fcf3ce44SJohn Forte 				    staticTargetProps.
2284fcf3ce44SJohn Forte 				    staticTarget.targetAddress.
2285fcf3ce44SJohn Forte 				    imaStruct.portNumber == port) {
2286fcf3ce44SJohn Forte 					/*
2287fcf3ce44SJohn Forte 					 * Since an object is
2288fcf3ce44SJohn Forte 					 * specified, it should also
2289fcf3ce44SJohn Forte 					 * have a tpgt specified. If
2290fcf3ce44SJohn Forte 					 * not, that means the object
2291fcf3ce44SJohn Forte 					 * specified is associated with
2292fcf3ce44SJohn Forte 					 * the default tpgt. In
2293fcf3ce44SJohn Forte 					 * either case, a tpgt
2294fcf3ce44SJohn Forte 					 * comparison should be done
2295fcf3ce44SJohn Forte 					 * before claiming that a
2296fcf3ce44SJohn Forte 					 * match is found.
2297fcf3ce44SJohn Forte 					 */
2298fcf3ce44SJohn Forte 					if ((tpgt == stpgt &&
2299fcf3ce44SJohn Forte 					    tpgtSpecified == B_TRUE &&
2300fcf3ce44SJohn Forte 					    defaultTpgt == IMA_FALSE) ||
2301fcf3ce44SJohn Forte 					    (tpgt == stpgt &&
2302fcf3ce44SJohn Forte 					    tpgtSpecified == B_FALSE &&
2303fcf3ce44SJohn Forte 					    defaultTpgt == IMA_TRUE)) {
2304fcf3ce44SJohn Forte 						matched = B_TRUE;
2305fcf3ce44SJohn Forte 					}
2306fcf3ce44SJohn Forte 				}
2307fcf3ce44SJohn Forte 
2308fcf3ce44SJohn Forte 				}
2309fcf3ce44SJohn Forte 			}
2310fcf3ce44SJohn Forte 
2311fcf3ce44SJohn Forte 			if (!object || matched) {
2312fcf3ce44SJohn Forte 				/* print summary - always */
2313fcf3ce44SJohn Forte 				(void) fprintf(stdout, gettext("%s: %ws,"),
2314fcf3ce44SJohn Forte 				    "Static Configuration Target",
2315fcf3ce44SJohn Forte 				    staticTargetProps.staticTarget.targetName);
2316fcf3ce44SJohn Forte 
2317fcf3ce44SJohn Forte 				if (isIpv6 == B_FALSE) {
2318fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET,
2319fcf3ce44SJohn Forte 					    staticTargetProps.
2320fcf3ce44SJohn Forte 					    staticTarget.targetAddress.
2321fcf3ce44SJohn Forte 					    imaStruct.hostnameIpAddress.id.
2322fcf3ce44SJohn Forte 					    ipAddress.ipAddress, sAddr,
2323fcf3ce44SJohn Forte 					    sizeof (sAddr));
2324fcf3ce44SJohn Forte 					(void) fprintf(stdout, "%s:%d",
2325fcf3ce44SJohn Forte 					    sAddr,
2326fcf3ce44SJohn Forte 					    staticTargetProps.staticTarget.
2327fcf3ce44SJohn Forte 					    targetAddress.imaStruct.portNumber);
2328fcf3ce44SJohn Forte 				} else {
2329fcf3ce44SJohn Forte 					(void) inet_ntop(AF_INET6,
2330fcf3ce44SJohn Forte 					    staticTargetProps.
2331fcf3ce44SJohn Forte 					    staticTarget.targetAddress.
2332fcf3ce44SJohn Forte 					    imaStruct.hostnameIpAddress.id.
2333fcf3ce44SJohn Forte 					    ipAddress.ipAddress, sAddr,
2334fcf3ce44SJohn Forte 					    sizeof (sAddr));
2335fcf3ce44SJohn Forte 					(void) fprintf(stdout, "[%s]:%d",
2336fcf3ce44SJohn Forte 					    sAddr,
2337fcf3ce44SJohn Forte 					    staticTargetProps.staticTarget.
2338fcf3ce44SJohn Forte 					    targetAddress.imaStruct.portNumber);
2339fcf3ce44SJohn Forte 				}
2340fcf3ce44SJohn Forte 
2341fcf3ce44SJohn Forte 				if (staticTargetProps.staticTarget.
2342fcf3ce44SJohn Forte 				    targetAddress.
2343fcf3ce44SJohn Forte 				    defaultTpgt == IMA_FALSE) {
2344fcf3ce44SJohn Forte 					(void) fprintf(stdout, ",%d\n",
2345fcf3ce44SJohn Forte 					    staticTargetProps.
2346fcf3ce44SJohn Forte 					    staticTarget.targetAddress.tpgt);
2347fcf3ce44SJohn Forte 				} else {
2348fcf3ce44SJohn Forte 					(void) fprintf(stdout, "\n");
2349fcf3ce44SJohn Forte 				}
2350fcf3ce44SJohn Forte 			}
2351fcf3ce44SJohn Forte 
2352fcf3ce44SJohn Forte 		}
2353fcf3ce44SJohn Forte 		/*
2354fcf3ce44SJohn Forte 		 * No details to display, but if there were:
2355fcf3ce44SJohn Forte 		 *  if (object && found)...
2356fcf3ce44SJohn Forte 		 *
2357fcf3ce44SJohn Forte 		 */
2358fcf3ce44SJohn Forte 
2359fcf3ce44SJohn Forte 		/*
2360fcf3ce44SJohn Forte 		 * There was an object entered but we didn't
2361fcf3ce44SJohn Forte 		 * find it.
2362fcf3ce44SJohn Forte 		 */
2363fcf3ce44SJohn Forte 		if (object && !found) {
2364fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s: %s\n",
2365fcf3ce44SJohn Forte 			    operand[i], gettext("not found"));
2366fcf3ce44SJohn Forte 			ret = 1; /* DIY test fix */
2367fcf3ce44SJohn Forte 		}
2368fcf3ce44SJohn Forte 	}
2369fcf3ce44SJohn Forte 	return (ret);
2370fcf3ce44SJohn Forte }
2371fcf3ce44SJohn Forte 
2372fcf3ce44SJohn Forte /*
2373fcf3ce44SJohn Forte  * Print targets
2374fcf3ce44SJohn Forte  */
2375fcf3ce44SJohn Forte /*ARGSUSED*/
2376fcf3ce44SJohn Forte static int
2377fcf3ce44SJohn Forte listTarget(int objectLen, char *objects[], cmdOptions_t *options, int *funcRet)
2378fcf3ce44SJohn Forte {
2379fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
2380fcf3ce44SJohn Forte 	IMA_OID_LIST *targetList;
2381fcf3ce44SJohn Forte 	IMA_OID_LIST *lunList;
2382fcf3ce44SJohn Forte 	SUN_IMA_TARGET_PROPERTIES targetProps;
2383fcf3ce44SJohn Forte 	IMA_STATUS status;
2384fcf3ce44SJohn Forte 	IMA_OID_LIST *pConnList;
2385fcf3ce44SJohn Forte 	SUN_IMA_CONN_PROPERTIES *connProps;
2386fcf3ce44SJohn Forte 
2387fcf3ce44SJohn Forte 	int ret;
2388fcf3ce44SJohn Forte 	wchar_t targetName[MAX_ISCSI_NAME_LEN + 1];
2389fcf3ce44SJohn Forte 	wchar_t targetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
2390fcf3ce44SJohn Forte 	int outerLoop;
2391fcf3ce44SJohn Forte 	boolean_t found;
2392fcf3ce44SJohn Forte 	boolean_t operandEntered = B_FALSE;
2393fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
2394fcf3ce44SJohn Forte 	boolean_t scsi_target = B_FALSE;
2395fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_FALSE;
2396fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
2397fcf3ce44SJohn Forte 	int i, j;
2398fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
2399fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
2400fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
2401fcf3ce44SJohn Forte 	uint16_t tpgt;
2402fcf3ce44SJohn Forte 
2403fcf3ce44SJohn Forte 	assert(funcRet != NULL);
2404fcf3ce44SJohn Forte 
2405fcf3ce44SJohn Forte 	/* Find Sun initiator */
2406fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
2407fcf3ce44SJohn Forte 	if (ret > 0) {
2408fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
2409fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
2410fcf3ce44SJohn Forte 	}
2411fcf3ce44SJohn Forte 
2412fcf3ce44SJohn Forte 	if (ret != 0) {
2413fcf3ce44SJohn Forte 		return (ret);
2414fcf3ce44SJohn Forte 	}
2415fcf3ce44SJohn Forte 
2416fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
2417fcf3ce44SJohn Forte 		switch (optionList->optval) {
2418fcf3ce44SJohn Forte 			case 'S':
2419fcf3ce44SJohn Forte 				scsi_target = B_TRUE;
2420fcf3ce44SJohn Forte 				break;
2421fcf3ce44SJohn Forte 			case 'v':
2422fcf3ce44SJohn Forte 				verbose = B_TRUE;
2423fcf3ce44SJohn Forte 				break;
2424fcf3ce44SJohn Forte 			default:
2425fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
2426fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
2427fcf3ce44SJohn Forte 				    gettext("unknown option"));
2428fcf3ce44SJohn Forte 				return (1);
2429fcf3ce44SJohn Forte 		}
2430fcf3ce44SJohn Forte 	}
2431fcf3ce44SJohn Forte 
2432fcf3ce44SJohn Forte 	/*
2433fcf3ce44SJohn Forte 	 * If there are multiple objects, execute outer 'for' loop that
2434fcf3ce44SJohn Forte 	 * many times for each target detail, otherwise, execute it only
2435fcf3ce44SJohn Forte 	 * once with summaries only
2436fcf3ce44SJohn Forte 	 */
2437fcf3ce44SJohn Forte 	if (objectLen > 0) {
2438fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
2439fcf3ce44SJohn Forte 		outerLoop = objectLen;
2440fcf3ce44SJohn Forte 	} else {
2441fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
2442fcf3ce44SJohn Forte 		outerLoop = 1;
2443fcf3ce44SJohn Forte 	}
2444fcf3ce44SJohn Forte 
2445fcf3ce44SJohn Forte 	status = SUN_IMA_GetSessionOidList(initiatorOid, &targetList);
2446fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
2447fcf3ce44SJohn Forte 		printLibError(status);
2448fcf3ce44SJohn Forte 		*funcRet = 1;
2449fcf3ce44SJohn Forte 		return (ret);
2450fcf3ce44SJohn Forte 	}
2451fcf3ce44SJohn Forte 
2452fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
2453fcf3ce44SJohn Forte 
2454fcf3ce44SJohn Forte 		tpgtSpecified = B_FALSE;
2455fcf3ce44SJohn Forte 		if (operandEntered) {
2456fcf3ce44SJohn Forte 			if (parseTarget(objects[i],
2457fcf3ce44SJohn Forte 			    &targetName[0],
2458fcf3ce44SJohn Forte 			    MAX_ISCSI_NAME_LEN + 1,
2459fcf3ce44SJohn Forte 			    &targetAddressSpecified,
2460fcf3ce44SJohn Forte 			    &targetAddress[0],
2461fcf3ce44SJohn Forte 			    SUN_IMA_IP_ADDRESS_PORT_LEN,
2462fcf3ce44SJohn Forte 			    &port,
2463fcf3ce44SJohn Forte 			    &tpgtSpecified,
2464fcf3ce44SJohn Forte 			    &tpgt,
2465fcf3ce44SJohn Forte 			    &isIpv6) != PARSE_TARGET_OK) {
2466fcf3ce44SJohn Forte 				ret = 1;
2467fcf3ce44SJohn Forte 				continue;
2468fcf3ce44SJohn Forte 			}
2469fcf3ce44SJohn Forte 		}
2470fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < targetList->oidCount; j++) {
2471fcf3ce44SJohn Forte 			status = SUN_IMA_GetTargetProperties(
2472fcf3ce44SJohn Forte 			    targetList->oids[j],
2473fcf3ce44SJohn Forte 			    &targetProps);
2474fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
2475fcf3ce44SJohn Forte 				printLibError(status);
2476fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(targetList);
2477fcf3ce44SJohn Forte 				*funcRet = 1;
2478fcf3ce44SJohn Forte 				return (ret);
2479fcf3ce44SJohn Forte 			}
2480fcf3ce44SJohn Forte 
2481fcf3ce44SJohn Forte 			/*
2482fcf3ce44SJohn Forte 			 * Compare the target name with the input if
2483fcf3ce44SJohn Forte 			 * one was input, if they match, print the target's info
2484fcf3ce44SJohn Forte 			 *
2485fcf3ce44SJohn Forte 			 * if no target name was input, continue printing this
2486fcf3ce44SJohn Forte 			 * target
2487fcf3ce44SJohn Forte 			 */
2488fcf3ce44SJohn Forte 			if (operandEntered) {
2489fcf3ce44SJohn Forte 				if (targetNamesEqual(targetProps.imaProps.name,
2490fcf3ce44SJohn Forte 				    targetName) == B_TRUE) {
2491fcf3ce44SJohn Forte 					if (tpgtSpecified == B_TRUE) {
2492fcf3ce44SJohn Forte 						if (targetProps.
2493fcf3ce44SJohn Forte 						    defaultTpgtConf ==
2494fcf3ce44SJohn Forte 						    IMA_FALSE &&
2495fcf3ce44SJohn Forte 						    targetProps.
2496fcf3ce44SJohn Forte 						    tpgtConf == tpgt) {
2497fcf3ce44SJohn Forte 							found = B_TRUE;
2498fcf3ce44SJohn Forte 						} else {
2499fcf3ce44SJohn Forte 							/*
2500fcf3ce44SJohn Forte 							 * tpgt does not match,
2501fcf3ce44SJohn Forte 							 * move on to next
2502fcf3ce44SJohn Forte 							 * target
2503fcf3ce44SJohn Forte 							 */
2504fcf3ce44SJohn Forte 							continue;
2505fcf3ce44SJohn Forte 						}
2506fcf3ce44SJohn Forte 					} else {
2507fcf3ce44SJohn Forte 						found = B_TRUE;
2508fcf3ce44SJohn Forte 					}
2509fcf3ce44SJohn Forte 				} else {
2510fcf3ce44SJohn Forte 					/*
2511fcf3ce44SJohn Forte 					 * target name does not match, move on
2512fcf3ce44SJohn Forte 					 * to next target
2513fcf3ce44SJohn Forte 					 */
2514fcf3ce44SJohn Forte 					continue;
2515fcf3ce44SJohn Forte 				}
2516fcf3ce44SJohn Forte 			}
2517fcf3ce44SJohn Forte 
2518fcf3ce44SJohn Forte 			/* print summary - always */
2519fcf3ce44SJohn Forte 			(void) fprintf(stdout, gettext("%s: %ws\n"),
2520fcf3ce44SJohn Forte 			    gettext("Target"), targetProps.imaProps.name);
2521fcf3ce44SJohn Forte 
2522fcf3ce44SJohn Forte 			/* Alias */
2523fcf3ce44SJohn Forte 			(void) fprintf(stdout, "\t%s: ", gettext("Alias"));
2524fcf3ce44SJohn Forte 			if (wslen(targetProps.imaProps.alias) > (size_t)0) {
2525fcf3ce44SJohn Forte 				(void) fprintf(stdout, gettext("%ws\n"),
2526fcf3ce44SJohn Forte 				    targetProps.imaProps.alias);
2527fcf3ce44SJohn Forte 			} else {
2528fcf3ce44SJohn Forte 				(void) fprintf(stdout, "%s\n", "-");
2529fcf3ce44SJohn Forte 			}
2530fcf3ce44SJohn Forte 
2531fcf3ce44SJohn Forte 			if (targetProps.defaultTpgtNego != IMA_TRUE) {
2532fcf3ce44SJohn Forte 				(void) fprintf(stdout, "%s%s: %d\n",
2533fcf3ce44SJohn Forte 				    "\t", gettext("TPGT"),
2534fcf3ce44SJohn Forte 				    targetProps.tpgtNego);
2535fcf3ce44SJohn Forte 			} else if (targetProps.defaultTpgtConf != IMA_TRUE) {
2536fcf3ce44SJohn Forte 				(void) fprintf(stdout, "%s%s: %d\n",
2537fcf3ce44SJohn Forte 				    "\t", gettext("TPGT"),
2538fcf3ce44SJohn Forte 				    targetProps.tpgtConf);
2539fcf3ce44SJohn Forte 			}
2540fcf3ce44SJohn Forte 
2541fcf3ce44SJohn Forte 			(void) fprintf(stdout,
2542fcf3ce44SJohn Forte 			    "%s%s: %02x%02x%02x%02x%02x%02x\n",
2543fcf3ce44SJohn Forte 			    "\t", gettext("ISID"),
2544fcf3ce44SJohn Forte 			    targetProps.isid[0], targetProps.isid[1],
2545fcf3ce44SJohn Forte 			    targetProps.isid[2], targetProps.isid[3],
2546fcf3ce44SJohn Forte 			    targetProps.isid[4], targetProps.isid[5]);
2547fcf3ce44SJohn Forte 
2548fcf3ce44SJohn Forte 			pConnList = NULL;
2549fcf3ce44SJohn Forte 			status = SUN_IMA_GetConnOidList(
2550fcf3ce44SJohn Forte 			    &targetList->oids[j],
2551fcf3ce44SJohn Forte 			    &pConnList);
2552fcf3ce44SJohn Forte 
2553fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
2554fcf3ce44SJohn Forte 				printLibError(status);
2555fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(targetList);
2556fcf3ce44SJohn Forte 				*funcRet = 1;
2557fcf3ce44SJohn Forte 				return (ret);
2558fcf3ce44SJohn Forte 			}
2559fcf3ce44SJohn Forte 
2560fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s%s: %lu\n",
2561fcf3ce44SJohn Forte 			    "\t",
2562fcf3ce44SJohn Forte 			    gettext("Connections"),
2563fcf3ce44SJohn Forte 			    pConnList->oidCount);
2564fcf3ce44SJohn Forte 
2565fcf3ce44SJohn Forte 			if (verbose) {
2566fcf3ce44SJohn Forte 				SUN_IMA_DIGEST_ALGORITHM_VALUE digestAlgorithms;
2567fcf3ce44SJohn Forte 
2568fcf3ce44SJohn Forte 				printConnectionList("\t\t", pConnList);
2569fcf3ce44SJohn Forte 				printDiscoveryMethod(
2570fcf3ce44SJohn Forte 				    "\t\t  ",
2571fcf3ce44SJohn Forte 				    targetProps.imaProps.discoveryMethodFlags);
2572fcf3ce44SJohn Forte 				(void) printLoginParameters(
2573fcf3ce44SJohn Forte 				    "\t\t  ",
2574fcf3ce44SJohn Forte 				    targetList->oids[j],
2575fcf3ce44SJohn Forte 				    PRINT_NEGOTIATED_PARAMS);
2576fcf3ce44SJohn Forte 
2577fcf3ce44SJohn Forte 				/* Get Digest configuration */
2578fcf3ce44SJohn Forte 				status = SUN_IMA_GetConnProperties(
2579fcf3ce44SJohn Forte 				    &pConnList->oids[0], &connProps);
2580fcf3ce44SJohn Forte 
2581fcf3ce44SJohn Forte 				(void) getNegotiatedDigest(
2582fcf3ce44SJohn Forte 				    ISCSI_LOGIN_PARAM_HEADER_DIGEST,
2583fcf3ce44SJohn Forte 				    &digestAlgorithms, connProps);
2584fcf3ce44SJohn Forte 
2585fcf3ce44SJohn Forte 				if (IMA_SUCCESS(status)) {
2586fcf3ce44SJohn Forte 					(void) fprintf(stdout, "\t\t  \t%s: ",
2587fcf3ce44SJohn Forte 					    gettext("Header Digest"));
2588fcf3ce44SJohn Forte 					printDigestAlgorithm(
2589fcf3ce44SJohn Forte 					    &digestAlgorithms,
2590fcf3ce44SJohn Forte 					    PRINT_NEGOTIATED_PARAMS);
2591fcf3ce44SJohn Forte 				} else {
2592fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(pConnList);
2593fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(targetList);
2594fcf3ce44SJohn Forte 					printLibError(status);
2595fcf3ce44SJohn Forte 					*funcRet = 1;
2596fcf3ce44SJohn Forte 					return (ret);
2597fcf3ce44SJohn Forte 				}
2598fcf3ce44SJohn Forte 
2599fcf3ce44SJohn Forte 				(void) getNegotiatedDigest(
2600fcf3ce44SJohn Forte 				    ISCSI_LOGIN_PARAM_DATA_DIGEST,
2601fcf3ce44SJohn Forte 				    &digestAlgorithms, connProps);
2602fcf3ce44SJohn Forte 
2603fcf3ce44SJohn Forte 				if (IMA_SUCCESS(status)) {
2604fcf3ce44SJohn Forte 					(void) fprintf(stdout, "\t\t  \t%s: ",
2605fcf3ce44SJohn Forte 					    gettext("Data Digest"));
2606fcf3ce44SJohn Forte 					printDigestAlgorithm(
2607fcf3ce44SJohn Forte 					    &digestAlgorithms,
2608fcf3ce44SJohn Forte 					    PRINT_NEGOTIATED_PARAMS);
2609fcf3ce44SJohn Forte 				} else {
2610fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(pConnList);
2611fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(targetList);
2612fcf3ce44SJohn Forte 					printLibError(status);
2613fcf3ce44SJohn Forte 					*funcRet = 1;
2614fcf3ce44SJohn Forte 					return (ret);
2615fcf3ce44SJohn Forte 				}
2616fcf3ce44SJohn Forte 
2617fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\n");
2618fcf3ce44SJohn Forte 			}
2619fcf3ce44SJohn Forte 
2620fcf3ce44SJohn Forte 			if (scsi_target) {
2621fcf3ce44SJohn Forte 				status = IMA_GetLuOidList(
2622fcf3ce44SJohn Forte 				    targetList->oids[j],
2623fcf3ce44SJohn Forte 				    &lunList);
2624fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
2625fcf3ce44SJohn Forte 					printLibError(status);
2626fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(targetList);
2627fcf3ce44SJohn Forte 					*funcRet = 1;
2628fcf3ce44SJohn Forte 					return (ret);
2629fcf3ce44SJohn Forte 				}
2630fcf3ce44SJohn Forte 				if (lunList->oidCount != 0) {
2631fcf3ce44SJohn Forte 					printTargetLuns(lunList);
2632fcf3ce44SJohn Forte 				}
2633fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\n");
2634fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(lunList);
2635fcf3ce44SJohn Forte 			}
2636fcf3ce44SJohn Forte 		}
2637fcf3ce44SJohn Forte 		/*
2638fcf3ce44SJohn Forte 		 * did we find the object
2639fcf3ce44SJohn Forte 		 */
2640fcf3ce44SJohn Forte 
2641fcf3ce44SJohn Forte 		if (operandEntered && !found) {
2642fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s: %s\n",
2643fcf3ce44SJohn Forte 			    objects[i], gettext("not found"));
2644fcf3ce44SJohn Forte 		}
2645fcf3ce44SJohn Forte 	}
2646fcf3ce44SJohn Forte 
2647fcf3ce44SJohn Forte 	(void) IMA_FreeMemory(targetList);
2648fcf3ce44SJohn Forte 	return (ret);
2649fcf3ce44SJohn Forte }
2650fcf3ce44SJohn Forte 
2651fcf3ce44SJohn Forte 
2652fcf3ce44SJohn Forte /*
2653fcf3ce44SJohn Forte  * Print configured session information
2654fcf3ce44SJohn Forte  */
2655fcf3ce44SJohn Forte static int
2656fcf3ce44SJohn Forte printConfiguredSessions(IMA_OID oid)
2657fcf3ce44SJohn Forte {
2658fcf3ce44SJohn Forte 	IMA_STATUS		status;
2659fcf3ce44SJohn Forte 	const char		*rtn;
2660fcf3ce44SJohn Forte 	SUN_IMA_CONFIG_SESSIONS	*pConfigSessions;
2661fcf3ce44SJohn Forte 	char			address[MAX_ADDRESS_LEN];
2662fcf3ce44SJohn Forte 	int			out;
2663fcf3ce44SJohn Forte 
2664fcf3ce44SJohn Forte 	/* Get configured session information */
2665fcf3ce44SJohn Forte 	status = SUN_IMA_GetConfigSessions(oid, &pConfigSessions);
2666fcf3ce44SJohn Forte 
2667fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
2668fcf3ce44SJohn Forte 		(void) fprintf(stdout, "\t%s: ",
2669fcf3ce44SJohn Forte 		    gettext("Configured Sessions"));
2670fcf3ce44SJohn Forte 		if (pConfigSessions->bound == IMA_FALSE) {
2671fcf3ce44SJohn Forte 			/* default binding */
2672fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%lu\n", pConfigSessions->out);
2673fcf3ce44SJohn Forte 		} else {
2674fcf3ce44SJohn Forte 			/* hardcoded binding */
2675fcf3ce44SJohn Forte 			for (out = 0;
2676fcf3ce44SJohn Forte 			    out < pConfigSessions->out; out++) {
2677fcf3ce44SJohn Forte 				if (pConfigSessions->bindings[out].
2678fcf3ce44SJohn Forte 				    ipAddress.ipv4Address == IMA_TRUE) {
2679fcf3ce44SJohn Forte 					rtn = inet_ntop(AF_INET,
2680fcf3ce44SJohn Forte 					    pConfigSessions->bindings[out].
2681fcf3ce44SJohn Forte 					    ipAddress.ipAddress, address,
2682fcf3ce44SJohn Forte 					    MAX_ADDRESS_LEN);
2683fcf3ce44SJohn Forte 				} else {
2684fcf3ce44SJohn Forte 					rtn = inet_ntop(AF_INET6,
2685fcf3ce44SJohn Forte 					    pConfigSessions->bindings[out].
2686fcf3ce44SJohn Forte 					    ipAddress.ipAddress, address,
2687fcf3ce44SJohn Forte 					    MAX_ADDRESS_LEN);
2688fcf3ce44SJohn Forte 				}
2689fcf3ce44SJohn Forte 				if (rtn != NULL) {
2690fcf3ce44SJohn Forte 					(void) printf("%s ", address);
2691fcf3ce44SJohn Forte 				}
2692fcf3ce44SJohn Forte 			}
2693fcf3ce44SJohn Forte 			(void) fprintf(stdout, "\n");
2694fcf3ce44SJohn Forte 		}
2695fcf3ce44SJohn Forte 	} else {
2696fcf3ce44SJohn Forte 		free(pConfigSessions);
2697fcf3ce44SJohn Forte 		printLibError(status);
2698fcf3ce44SJohn Forte 		return (1);
2699fcf3ce44SJohn Forte 	}
2700fcf3ce44SJohn Forte 
2701fcf3ce44SJohn Forte 	free(pConfigSessions);
2702fcf3ce44SJohn Forte 	return (0);
2703fcf3ce44SJohn Forte }
2704fcf3ce44SJohn Forte 
2705fcf3ce44SJohn Forte /*
2706fcf3ce44SJohn Forte  * Print target parameters
2707fcf3ce44SJohn Forte  */
2708fcf3ce44SJohn Forte static int
2709fcf3ce44SJohn Forte listTargetParam(int operandLen, char *operand[], cmdOptions_t *options,
2710fcf3ce44SJohn Forte     int *funcRet)
2711fcf3ce44SJohn Forte {
2712fcf3ce44SJohn Forte 	IMA_STATUS status;
2713fcf3ce44SJohn Forte 	IMA_OID	initiatorOid;
2714fcf3ce44SJohn Forte 	IMA_OID_LIST *targetList;
2715fcf3ce44SJohn Forte 	IMA_AUTHMETHOD	methodList[MAX_AUTH_METHODS];
2716fcf3ce44SJohn Forte 	SUN_IMA_TARGET_PROPERTIES targetProps;
2717fcf3ce44SJohn Forte 	IMA_UINT maxEntries = MAX_AUTH_METHODS;
2718fcf3ce44SJohn Forte 	IMA_BOOL bidirAuth;
2719fcf3ce44SJohn Forte 	int ret;
2720fcf3ce44SJohn Forte 	wchar_t targetName[MAX_ISCSI_NAME_LEN + 1];
2721fcf3ce44SJohn Forte 	wchar_t targetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
2722fcf3ce44SJohn Forte 	boolean_t operandEntered = B_FALSE;
2723fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_FALSE;
2724fcf3ce44SJohn Forte 	boolean_t printObject = B_FALSE;
2725fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
2726fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
2727fcf3ce44SJohn Forte 	int outerLoop;
2728fcf3ce44SJohn Forte 	boolean_t found;
2729fcf3ce44SJohn Forte 	int i, j;
2730fcf3ce44SJohn Forte 	SUN_IMA_DIGEST_ALGORITHM_VALUE digestAlgorithms;
2731fcf3ce44SJohn Forte 	boolean_t verbose = B_FALSE;
2732fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
2733fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
2734fcf3ce44SJohn Forte 	IMA_UINT16 tpgt = 0;
2735fcf3ce44SJohn Forte 
2736fcf3ce44SJohn Forte 	assert(funcRet != NULL);
2737fcf3ce44SJohn Forte 
2738fcf3ce44SJohn Forte 	/* Find Sun initiator */
2739fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
2740fcf3ce44SJohn Forte 	if (ret > 0) {
2741fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
2742fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
2743fcf3ce44SJohn Forte 	}
2744fcf3ce44SJohn Forte 
2745fcf3ce44SJohn Forte 	if (ret != 0) {
2746fcf3ce44SJohn Forte 		return (ret);
2747fcf3ce44SJohn Forte 	}
2748fcf3ce44SJohn Forte 
2749fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
2750fcf3ce44SJohn Forte 		switch (optionList->optval) {
2751fcf3ce44SJohn Forte 			case 'v':
2752fcf3ce44SJohn Forte 				verbose = B_TRUE;
2753fcf3ce44SJohn Forte 				break;
2754fcf3ce44SJohn Forte 			default:
2755fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
2756fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
2757fcf3ce44SJohn Forte 				    gettext("unknown option"));
2758fcf3ce44SJohn Forte 				return (1);
2759fcf3ce44SJohn Forte 		}
2760fcf3ce44SJohn Forte 	}
2761fcf3ce44SJohn Forte 
2762fcf3ce44SJohn Forte 	/*
2763fcf3ce44SJohn Forte 	 * If there are multiple operands, execute outer 'for' loop that
2764fcf3ce44SJohn Forte 	 * many times to find each target parameter operand entered, otherwise,
2765fcf3ce44SJohn Forte 	 * execute it only once for all target parameters returned.
2766fcf3ce44SJohn Forte 	 */
2767fcf3ce44SJohn Forte 	if (operandLen > 0) {
2768fcf3ce44SJohn Forte 		operandEntered = B_TRUE;
2769fcf3ce44SJohn Forte 		outerLoop = operandLen;
2770fcf3ce44SJohn Forte 	} else {
2771fcf3ce44SJohn Forte 		operandEntered = B_FALSE;
2772fcf3ce44SJohn Forte 		outerLoop = 1;
2773fcf3ce44SJohn Forte 	}
2774fcf3ce44SJohn Forte 
2775fcf3ce44SJohn Forte 	/*
2776fcf3ce44SJohn Forte 	 * Ideally there should be an interface available for obtaining
2777fcf3ce44SJohn Forte 	 * the list of target-param objects. Since the driver currently
2778fcf3ce44SJohn Forte 	 * creates a target OID and the associated session structure when
2779fcf3ce44SJohn Forte 	 * a target-param object is created, we can leverage the target
2780fcf3ce44SJohn Forte 	 * OID list and use it to manage the target-param objects. When
2781fcf3ce44SJohn Forte 	 * we stop creating a session for target-param object in the
2782fcf3ce44SJohn Forte 	 * driver, we will switch to using a different interface to
2783fcf3ce44SJohn Forte 	 * obtain target-param objects.
2784fcf3ce44SJohn Forte 	 */
2785fcf3ce44SJohn Forte 	status = IMA_GetTargetOidList(initiatorOid, &targetList);
2786fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
2787fcf3ce44SJohn Forte 		printLibError(status);
2788fcf3ce44SJohn Forte 		*funcRet = 1;
2789fcf3ce44SJohn Forte 		return (ret);
2790fcf3ce44SJohn Forte 	}
2791fcf3ce44SJohn Forte 
2792fcf3ce44SJohn Forte 	for (i = 0; i < outerLoop; i++) {
2793fcf3ce44SJohn Forte 		if (operandEntered) {
2794fcf3ce44SJohn Forte 			if (parseTarget(operand[i],
2795fcf3ce44SJohn Forte 			    &targetName[0],
2796fcf3ce44SJohn Forte 			    MAX_ISCSI_NAME_LEN + 1,
2797fcf3ce44SJohn Forte 			    &targetAddressSpecified,
2798fcf3ce44SJohn Forte 			    &targetAddress[0],
2799fcf3ce44SJohn Forte 			    SUN_IMA_IP_ADDRESS_PORT_LEN,
2800fcf3ce44SJohn Forte 			    &port,
2801fcf3ce44SJohn Forte 			    &tpgtSpecified,
2802fcf3ce44SJohn Forte 			    &tpgt,
2803fcf3ce44SJohn Forte 			    &isIpv6) != PARSE_TARGET_OK) {
2804fcf3ce44SJohn Forte 				ret = 1;
2805fcf3ce44SJohn Forte 				continue;
2806fcf3ce44SJohn Forte 			}
2807fcf3ce44SJohn Forte 		}
2808fcf3ce44SJohn Forte 		for (j = 0; j < targetList->oidCount; j++) {
2809fcf3ce44SJohn Forte 			found = B_FALSE;
2810fcf3ce44SJohn Forte 			printObject = B_FALSE;
2811fcf3ce44SJohn Forte 			status = SUN_IMA_GetTargetProperties(
2812fcf3ce44SJohn Forte 			    targetList->oids[j],
2813fcf3ce44SJohn Forte 			    &targetProps);
2814fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
2815fcf3ce44SJohn Forte 				printLibError(status);
2816fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(targetList);
2817fcf3ce44SJohn Forte 				*funcRet = 1;
2818fcf3ce44SJohn Forte 				return (ret);
2819fcf3ce44SJohn Forte 			}
2820fcf3ce44SJohn Forte 
2821fcf3ce44SJohn Forte 			/*
2822fcf3ce44SJohn Forte 			 * Compare the target name with the input if
2823fcf3ce44SJohn Forte 			 * one was input
2824fcf3ce44SJohn Forte 			 */
2825fcf3ce44SJohn Forte 			if (operandEntered &&
2826fcf3ce44SJohn Forte 			    (targetNamesEqual(targetProps.imaProps.name,
2827fcf3ce44SJohn Forte 			    targetName) == B_TRUE)) {
2828fcf3ce44SJohn Forte 				/*
2829fcf3ce44SJohn Forte 				 * For now, regardless of whether a target
2830fcf3ce44SJohn Forte 				 * address is specified, we return B_TRUE
2831fcf3ce44SJohn Forte 				 * because IMA_TARGET_PROPERTIES does not
2832fcf3ce44SJohn Forte 				 * have a field for specifying address.
2833fcf3ce44SJohn Forte 				 */
2834fcf3ce44SJohn Forte 				found = B_TRUE;
2835fcf3ce44SJohn Forte 			}
2836fcf3ce44SJohn Forte 
2837fcf3ce44SJohn Forte 			/*
2838fcf3ce44SJohn Forte 			 * if no operand was entered OR
2839fcf3ce44SJohn Forte 			 * an operand was entered and it was
2840fcf3ce44SJohn Forte 			 * found, we want to print
2841fcf3ce44SJohn Forte 			 */
2842fcf3ce44SJohn Forte 			if (!operandEntered || found) {
2843fcf3ce44SJohn Forte 				printObject = B_TRUE;
2844fcf3ce44SJohn Forte 			}
2845fcf3ce44SJohn Forte 
2846fcf3ce44SJohn Forte 			if (printObject) {
2847fcf3ce44SJohn Forte 				(void) fprintf(stdout, gettext("%s: %ws\n"),
2848fcf3ce44SJohn Forte 				    gettext("Target"),
2849fcf3ce44SJohn Forte 				    targetProps.imaProps.name);
2850fcf3ce44SJohn Forte 
2851fcf3ce44SJohn Forte 				(void) fprintf(stdout,
2852fcf3ce44SJohn Forte 				    "\t%s: ", gettext("Alias"));
2853fcf3ce44SJohn Forte 				if (wslen(targetProps.imaProps.alias) >
2854fcf3ce44SJohn Forte 				    (size_t)0) {
2855fcf3ce44SJohn Forte 					(void) fprintf(stdout,
2856fcf3ce44SJohn Forte 					    gettext("%ws\n"),
2857fcf3ce44SJohn Forte 					    targetProps.imaProps.alias);
2858fcf3ce44SJohn Forte 				} else {
2859fcf3ce44SJohn Forte 					(void) fprintf(stdout, "%s\n", "-");
2860fcf3ce44SJohn Forte 				}
2861fcf3ce44SJohn Forte 			}
2862fcf3ce44SJohn Forte 
2863fcf3ce44SJohn Forte 			if (printObject && verbose) {
2864fcf3ce44SJohn Forte 				/* Get bidirectional authentication flag */
2865fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\t%s: ",
2866fcf3ce44SJohn Forte 				    gettext("Bi-directional Authentication"));
2867fcf3ce44SJohn Forte 				status = SUN_IMA_GetTargetBidirAuthFlag(
2868fcf3ce44SJohn Forte 				    targetList->oids[j],
2869fcf3ce44SJohn Forte 				    &bidirAuth);
2870fcf3ce44SJohn Forte 				if (IMA_SUCCESS(status)) {
2871fcf3ce44SJohn Forte 					if (bidirAuth == IMA_TRUE) {
2872fcf3ce44SJohn Forte 						(void) fprintf(stdout,
2873fcf3ce44SJohn Forte 						    gettext("enabled"));
2874fcf3ce44SJohn Forte 					} else {
2875fcf3ce44SJohn Forte 						(void) fprintf(stdout,
2876fcf3ce44SJohn Forte 						    gettext("disabled"));
2877fcf3ce44SJohn Forte 					}
2878fcf3ce44SJohn Forte 				} else {
2879fcf3ce44SJohn Forte 					(void) fprintf(stdout,
2880fcf3ce44SJohn Forte 					    gettext("disabled"));
2881fcf3ce44SJohn Forte 				}
2882fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\n");
2883fcf3ce44SJohn Forte 
2884fcf3ce44SJohn Forte 				/* Get authentication type for this target */
2885fcf3ce44SJohn Forte 				status = SUN_IMA_GetTargetAuthMethods(
2886fcf3ce44SJohn Forte 				    initiatorOid,
2887fcf3ce44SJohn Forte 				    targetList->oids[j],
2888fcf3ce44SJohn Forte 				    &maxEntries,
2889fcf3ce44SJohn Forte 				    &methodList[0]);
2890fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\t%s: ",
2891fcf3ce44SJohn Forte 				    gettext("Authentication Type"));
2892fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
2893fcf3ce44SJohn Forte 					/*
2894fcf3ce44SJohn Forte 					 * No authentication method define
2895fcf3ce44SJohn Forte 					 * NONE by default.
2896fcf3ce44SJohn Forte 					 */
2897fcf3ce44SJohn Forte 					(void) fprintf(stdout, gettext("NONE"));
2898fcf3ce44SJohn Forte 				} else {
2899fcf3ce44SJohn Forte 					for (i = 0; i < maxEntries; i++) {
2900fcf3ce44SJohn Forte 						if (i > 0) {
2901fcf3ce44SJohn Forte 							(void) fprintf(stdout,
2902fcf3ce44SJohn Forte 							    "|");
2903fcf3ce44SJohn Forte 						}
2904fcf3ce44SJohn Forte 						switch (methodList[i]) {
2905fcf3ce44SJohn Forte 						case IMA_AUTHMETHOD_NONE:
2906fcf3ce44SJohn Forte 							(void) fprintf(stdout,
2907fcf3ce44SJohn Forte 							    gettext("NONE"));
2908fcf3ce44SJohn Forte 							break;
2909fcf3ce44SJohn Forte 
2910fcf3ce44SJohn Forte 						case IMA_AUTHMETHOD_CHAP:
2911fcf3ce44SJohn Forte 							(void) fprintf(stdout,
2912fcf3ce44SJohn Forte 							    gettext("CHAP"));
2913fcf3ce44SJohn Forte 							listCHAPName(
2914fcf3ce44SJohn Forte 							    targetList->
2915fcf3ce44SJohn Forte 							    oids[j]);
2916fcf3ce44SJohn Forte 							break;
2917fcf3ce44SJohn Forte 
2918fcf3ce44SJohn Forte 						default:
2919fcf3ce44SJohn Forte 							(void) fprintf(stdout,
2920fcf3ce44SJohn Forte 							    gettext(
2921fcf3ce44SJohn Forte 							    "unknown "
2922fcf3ce44SJohn Forte 							    "type"));
2923fcf3ce44SJohn Forte 							break;
2924fcf3ce44SJohn Forte 						}
2925fcf3ce44SJohn Forte 					}
2926fcf3ce44SJohn Forte 				}
2927fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\n");
2928fcf3ce44SJohn Forte 				if (printLoginParameters("\t",
2929fcf3ce44SJohn Forte 				    targetList->oids[j],
2930fcf3ce44SJohn Forte 				    PRINT_CONFIGURED_PARAMS)
2931fcf3ce44SJohn Forte 				    != 0) {
2932fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(targetList);
2933fcf3ce44SJohn Forte 					*funcRet = 1;
2934fcf3ce44SJohn Forte 					return (ret);
2935fcf3ce44SJohn Forte 				}
2936fcf3ce44SJohn Forte 
2937fcf3ce44SJohn Forte 				/* Get Digest configuration */
2938fcf3ce44SJohn Forte 				status = SUN_IMA_GetHeaderDigest(
2939fcf3ce44SJohn Forte 				    targetList->oids[j],
2940fcf3ce44SJohn Forte 				    &digestAlgorithms);
2941fcf3ce44SJohn Forte 				if (IMA_SUCCESS(status)) {
2942fcf3ce44SJohn Forte 					(void) fprintf(stdout, "\t\t%s: ",
2943fcf3ce44SJohn Forte 					    gettext("Header Digest"));
2944fcf3ce44SJohn Forte 					printDigestAlgorithm(&digestAlgorithms,
2945fcf3ce44SJohn Forte 					    PRINT_CONFIGURED_PARAMS);
2946fcf3ce44SJohn Forte 				} else {
2947fcf3ce44SJohn Forte 					printLibError(status);
2948fcf3ce44SJohn Forte 					*funcRet = 1;
2949fcf3ce44SJohn Forte 					return (ret);
2950fcf3ce44SJohn Forte 				}
2951fcf3ce44SJohn Forte 
2952fcf3ce44SJohn Forte 				status = SUN_IMA_GetDataDigest(
2953fcf3ce44SJohn Forte 				    targetList->oids[j],
2954fcf3ce44SJohn Forte 				    &digestAlgorithms);
2955fcf3ce44SJohn Forte 				if (IMA_SUCCESS(status)) {
2956fcf3ce44SJohn Forte 					(void) fprintf(stdout, "\t\t%s: ",
2957fcf3ce44SJohn Forte 					    gettext("Data Digest"));
2958fcf3ce44SJohn Forte 					printDigestAlgorithm(&digestAlgorithms,
2959fcf3ce44SJohn Forte 					    PRINT_CONFIGURED_PARAMS);
2960fcf3ce44SJohn Forte 				} else {
2961fcf3ce44SJohn Forte 					printLibError(status);
2962fcf3ce44SJohn Forte 					*funcRet = 1;
2963fcf3ce44SJohn Forte 					return (ret);
2964fcf3ce44SJohn Forte 				}
2965fcf3ce44SJohn Forte 
2966aff4bce5Syi zhang - Sun Microsystems - Beijing China 				/* print tunable parameters infomation */
2967aff4bce5Syi zhang - Sun Microsystems - Beijing China 				if (printTunableParameters(
2968aff4bce5Syi zhang - Sun Microsystems - Beijing China 				    targetList->oids[j]) != 0) {
2969aff4bce5Syi zhang - Sun Microsystems - Beijing China 					*funcRet = 1;
2970aff4bce5Syi zhang - Sun Microsystems - Beijing China 					return (ret);
2971aff4bce5Syi zhang - Sun Microsystems - Beijing China 				}
2972aff4bce5Syi zhang - Sun Microsystems - Beijing China 
2973fcf3ce44SJohn Forte 				/* print configured session information */
2974fcf3ce44SJohn Forte 				if (printConfiguredSessions(
2975fcf3ce44SJohn Forte 				    targetList->oids[j]) != 0) {
2976fcf3ce44SJohn Forte 					*funcRet = 1;
2977fcf3ce44SJohn Forte 					return (ret);
2978fcf3ce44SJohn Forte 				}
2979fcf3ce44SJohn Forte 
2980fcf3ce44SJohn Forte 				(void) fprintf(stdout, "\n");
2981fcf3ce44SJohn Forte 			}
2982fcf3ce44SJohn Forte 
2983fcf3ce44SJohn Forte 			if (found) {
2984fcf3ce44SJohn Forte 				break;
2985fcf3ce44SJohn Forte 			}
2986fcf3ce44SJohn Forte 		}
2987fcf3ce44SJohn Forte 		if (operandEntered && !found) {
2988fcf3ce44SJohn Forte 			*funcRet = 1; /* DIY message fix */
2989fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s: %s\n",
2990fcf3ce44SJohn Forte 			    operand[i], gettext("not found"));
2991fcf3ce44SJohn Forte 		}
2992fcf3ce44SJohn Forte 	}
2993fcf3ce44SJohn Forte 
2994fcf3ce44SJohn Forte 	(void) IMA_FreeMemory(targetList);
2995fcf3ce44SJohn Forte 	return (ret);
2996fcf3ce44SJohn Forte }
2997fcf3ce44SJohn Forte 
2998fcf3ce44SJohn Forte /*
2999fcf3ce44SJohn Forte  * Modify discovery attributes
3000fcf3ce44SJohn Forte  */
3001fcf3ce44SJohn Forte static int
3002fcf3ce44SJohn Forte modifyDiscovery(cmdOptions_t *options, int *funcRet)
3003fcf3ce44SJohn Forte {
3004fcf3ce44SJohn Forte 	IMA_OID oid;
3005fcf3ce44SJohn Forte 	IMA_STATUS status;
3006fcf3ce44SJohn Forte 	IMA_BOOL setDiscovery;
3007fcf3ce44SJohn Forte 	IMA_HOST_ID hostId;
3008fcf3ce44SJohn Forte 
3009fcf3ce44SJohn Forte 	int ret;
3010fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
3011fcf3ce44SJohn Forte 
3012fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3013fcf3ce44SJohn Forte 
3014fcf3ce44SJohn Forte 	/* Find Sun initiator */
3015fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&oid);
3016fcf3ce44SJohn Forte 	if (ret > 0) {
3017fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3018fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
3019fcf3ce44SJohn Forte 	}
3020fcf3ce44SJohn Forte 
3021fcf3ce44SJohn Forte 	if (ret != 0) {
3022fcf3ce44SJohn Forte 		return (ret);
3023fcf3ce44SJohn Forte 	}
3024fcf3ce44SJohn Forte 
3025fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
3026fcf3ce44SJohn Forte 		/* check optarg and set bool accordingly */
3027fcf3ce44SJohn Forte 		if (strcasecmp(optionList->optarg, ISCSIADM_ARG_ENABLE) == 0) {
3028fcf3ce44SJohn Forte 			setDiscovery = IMA_TRUE;
3029fcf3ce44SJohn Forte 		} else if (strcasecmp(optionList->optarg, ISCSIADM_ARG_DISABLE)
3030fcf3ce44SJohn Forte 		    == 0) {
3031fcf3ce44SJohn Forte 			setDiscovery = IMA_FALSE;
3032fcf3ce44SJohn Forte 		} else {
3033fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
3034fcf3ce44SJohn Forte 			    cmdName, gettext("invalid option argument"));
3035fcf3ce44SJohn Forte 			return (1);
3036fcf3ce44SJohn Forte 		}
3037fcf3ce44SJohn Forte 
3038fcf3ce44SJohn Forte 		switch (optionList->optval) {
3039fcf3ce44SJohn Forte 			case 's':
3040fcf3ce44SJohn Forte 				/* Set static discovery */
3041fcf3ce44SJohn Forte 				status = IMA_SetStaticDiscovery(oid,
3042fcf3ce44SJohn Forte 				    setDiscovery);
3043fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3044fcf3ce44SJohn Forte 					printLibError(status);
3045fcf3ce44SJohn Forte 					*funcRet = 1;
3046fcf3ce44SJohn Forte 					return (ret);
3047fcf3ce44SJohn Forte 				}
3048fcf3ce44SJohn Forte 				break;
3049fcf3ce44SJohn Forte 			case 't':
3050fcf3ce44SJohn Forte 				/* Set send targets discovery */
3051fcf3ce44SJohn Forte 				status = IMA_SetSendTargetsDiscovery(oid,
3052fcf3ce44SJohn Forte 				    setDiscovery);
3053fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3054fcf3ce44SJohn Forte 					printLibError(status);
3055fcf3ce44SJohn Forte 					*funcRet = 1;
3056fcf3ce44SJohn Forte 					return (ret);
3057fcf3ce44SJohn Forte 				}
3058fcf3ce44SJohn Forte 				break;
3059fcf3ce44SJohn Forte 			case 'i':
3060fcf3ce44SJohn Forte 				/* Set iSNS discovery */
3061fcf3ce44SJohn Forte 				(void) memset(&hostId, 0, sizeof (hostId));
3062fcf3ce44SJohn Forte 				status = IMA_SetIsnsDiscovery(oid, setDiscovery,
3063fcf3ce44SJohn Forte 				    IMA_ISNS_DISCOVERY_METHOD_STATIC, &hostId);
3064fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3065fcf3ce44SJohn Forte 					printLibError(status);
3066fcf3ce44SJohn Forte 					*funcRet = 1;
3067fcf3ce44SJohn Forte 					return (ret);
3068fcf3ce44SJohn Forte 				}
3069fcf3ce44SJohn Forte 				break;
3070fcf3ce44SJohn Forte 			default:
3071fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
3072fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
3073fcf3ce44SJohn Forte 				    gettext("unknown option"));
3074fcf3ce44SJohn Forte 				return (1);
3075fcf3ce44SJohn Forte 		}
3076fcf3ce44SJohn Forte 	}
3077fcf3ce44SJohn Forte 
3078fcf3ce44SJohn Forte 	return (ret);
3079fcf3ce44SJohn Forte }
3080fcf3ce44SJohn Forte 
3081fcf3ce44SJohn Forte /*
3082fcf3ce44SJohn Forte  * Set the initiator node's authentication method
3083fcf3ce44SJohn Forte  */
3084fcf3ce44SJohn Forte static int
3085fcf3ce44SJohn Forte modifyNodeAuthParam(IMA_OID oid, int param, char *chapName, int *funcRet)
3086fcf3ce44SJohn Forte {
3087fcf3ce44SJohn Forte 	IMA_INITIATOR_AUTHPARMS authParams;
3088fcf3ce44SJohn Forte 	IMA_STATUS status;
3089fcf3ce44SJohn Forte 	int ret;
3090fcf3ce44SJohn Forte 	int secretLen = MAX_CHAP_SECRET_LEN;
3091fcf3ce44SJohn Forte 
3092fcf3ce44SJohn Forte 	IMA_BYTE chapSecret[MAX_CHAP_SECRET_LEN + 1];
3093fcf3ce44SJohn Forte 
3094fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3095fcf3ce44SJohn Forte 
3096fcf3ce44SJohn Forte 	/*
3097fcf3ce44SJohn Forte 	 * Start with existing parameters and modify with the desired change
3098fcf3ce44SJohn Forte 	 * before passing along.  We ignore any failures as they probably
3099fcf3ce44SJohn Forte 	 * are caused by non-existence of auth params for the given node.
3100fcf3ce44SJohn Forte 	 */
3101fcf3ce44SJohn Forte 	status = IMA_GetInitiatorAuthParms(oid, IMA_AUTHMETHOD_CHAP,
3102fcf3ce44SJohn Forte 	    &authParams);
3103fcf3ce44SJohn Forte 
3104fcf3ce44SJohn Forte 	switch (param) {
3105fcf3ce44SJohn Forte 	case AUTH_NAME:
3106fcf3ce44SJohn Forte 		if (chapName == NULL) {
3107fcf3ce44SJohn Forte 			(void) fprintf(stderr, "CHAP name cannot be NULL.\n");
3108fcf3ce44SJohn Forte 			return (1);
3109fcf3ce44SJohn Forte 		}
3110129b3e6cSJack Meng 		if (strlen(chapName) == 0) {
3111129b3e6cSJack Meng 			(void) fprintf(stderr, "CHAP name cannot be empty.\n");
3112129b3e6cSJack Meng 			return (1);
3113129b3e6cSJack Meng 		}
3114fcf3ce44SJohn Forte 		(void) memset(&authParams.chapParms.name, 0,
3115fcf3ce44SJohn Forte 		    sizeof (authParams.chapParms.name));
3116fcf3ce44SJohn Forte 		(void) memcpy(&authParams.chapParms.name,
3117fcf3ce44SJohn Forte 		    &chapName[0], strlen(chapName));
3118fcf3ce44SJohn Forte 		authParams.chapParms.nameLength = strlen(chapName);
3119fcf3ce44SJohn Forte 		break;
3120fcf3ce44SJohn Forte 
3121fcf3ce44SJohn Forte 	case AUTH_PASSWORD :
3122fcf3ce44SJohn Forte 		ret = getSecret((char *)&chapSecret[0], &secretLen,
3123fcf3ce44SJohn Forte 		    MIN_CHAP_SECRET_LEN, MAX_CHAP_SECRET_LEN);
3124fcf3ce44SJohn Forte 
3125fcf3ce44SJohn Forte 		if (ret != 0) {
3126fcf3ce44SJohn Forte 			return (ret);
3127fcf3ce44SJohn Forte 		}
3128fcf3ce44SJohn Forte 
3129fcf3ce44SJohn Forte 		(void) memset(&authParams.chapParms.challengeSecret, 0,
3130fcf3ce44SJohn Forte 		    sizeof (authParams.chapParms.challengeSecret));
3131fcf3ce44SJohn Forte 		(void) memcpy(&authParams.chapParms.challengeSecret,
3132fcf3ce44SJohn Forte 		    &chapSecret[0], secretLen);
3133fcf3ce44SJohn Forte 		authParams.chapParms.challengeSecretLength = secretLen;
3134fcf3ce44SJohn Forte 		break;
3135fcf3ce44SJohn Forte 
3136fcf3ce44SJohn Forte 	default:
3137fcf3ce44SJohn Forte 		(void) fprintf(stderr, "Invalid auth parameter %d\n", param);
3138fcf3ce44SJohn Forte 		return (1);
3139fcf3ce44SJohn Forte 	}
3140fcf3ce44SJohn Forte 
3141fcf3ce44SJohn Forte 	status = IMA_SetInitiatorAuthParms(oid, IMA_AUTHMETHOD_CHAP,
3142fcf3ce44SJohn Forte 	    &authParams);
3143fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3144fcf3ce44SJohn Forte 		printLibError(status);
3145fcf3ce44SJohn Forte 		*funcRet = 1;
3146fcf3ce44SJohn Forte 	}
3147fcf3ce44SJohn Forte 	return (ret);
3148fcf3ce44SJohn Forte }
3149fcf3ce44SJohn Forte 
3150fcf3ce44SJohn Forte /*
3151fcf3ce44SJohn Forte  * Set the target's authentication method
3152fcf3ce44SJohn Forte  */
3153fcf3ce44SJohn Forte static int
3154fcf3ce44SJohn Forte modifyTargetAuthParam(IMA_OID oid, int param, char *chapName, int *funcRet)
3155fcf3ce44SJohn Forte {
3156fcf3ce44SJohn Forte 	IMA_INITIATOR_AUTHPARMS authParams;
3157fcf3ce44SJohn Forte 	IMA_STATUS status;
3158fcf3ce44SJohn Forte 	int ret;
3159fcf3ce44SJohn Forte 	int secretLen = MAX_CHAP_SECRET_LEN;
3160fcf3ce44SJohn Forte 
3161fcf3ce44SJohn Forte 	IMA_BYTE chapSecret[MAX_CHAP_SECRET_LEN + 1];
3162fcf3ce44SJohn Forte 
3163fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3164fcf3ce44SJohn Forte 
3165fcf3ce44SJohn Forte 	/*
3166fcf3ce44SJohn Forte 	 * Start with existing parameters and modify with the desired change
3167fcf3ce44SJohn Forte 	 * before passing along.  We ignore any get failures as they probably
3168fcf3ce44SJohn Forte 	 * are caused by non-existence of auth params for the given target.
3169fcf3ce44SJohn Forte 	 */
3170fcf3ce44SJohn Forte 	status = SUN_IMA_GetTargetAuthParms(oid, IMA_AUTHMETHOD_CHAP,
3171fcf3ce44SJohn Forte 	    &authParams);
3172fcf3ce44SJohn Forte 
3173fcf3ce44SJohn Forte 	switch (param) {
3174fcf3ce44SJohn Forte 	case AUTH_NAME:
3175fcf3ce44SJohn Forte 		if (chapName == NULL) {
3176fcf3ce44SJohn Forte 			(void) fprintf(stderr, "CHAP name cannot be NULL.\n");
3177fcf3ce44SJohn Forte 			return (1);
3178fcf3ce44SJohn Forte 		}
3179129b3e6cSJack Meng 		if (strlen(chapName) == 0) {
3180129b3e6cSJack Meng 			(void) fprintf(stderr, "CHAP name cannot be empty.\n");
3181129b3e6cSJack Meng 			return (1);
3182129b3e6cSJack Meng 		}
3183fcf3ce44SJohn Forte 		(void) memset(&authParams.chapParms.name, 0,
3184fcf3ce44SJohn Forte 		    sizeof (authParams.chapParms.name));
3185fcf3ce44SJohn Forte 		(void) memcpy(&authParams.chapParms.name,
3186fcf3ce44SJohn Forte 		    &chapName[0], strlen(chapName));
3187fcf3ce44SJohn Forte 		authParams.chapParms.nameLength = strlen(chapName);
3188fcf3ce44SJohn Forte 		break;
3189fcf3ce44SJohn Forte 
3190fcf3ce44SJohn Forte 	case AUTH_PASSWORD :
3191fcf3ce44SJohn Forte 		ret = getSecret((char *)&chapSecret[0], &secretLen,
3192fcf3ce44SJohn Forte 		    1, MAX_CHAP_SECRET_LEN);
3193fcf3ce44SJohn Forte 
3194fcf3ce44SJohn Forte 		if (ret != 0) {
3195fcf3ce44SJohn Forte 			return (ret);
3196fcf3ce44SJohn Forte 		}
3197fcf3ce44SJohn Forte 
3198fcf3ce44SJohn Forte 		(void) memset(&authParams.chapParms.challengeSecret, 0,
3199fcf3ce44SJohn Forte 		    sizeof (authParams.chapParms.challengeSecret));
3200fcf3ce44SJohn Forte 		(void) memcpy(&authParams.chapParms.challengeSecret,
3201fcf3ce44SJohn Forte 		    &chapSecret[0], secretLen);
3202fcf3ce44SJohn Forte 		authParams.chapParms.challengeSecretLength = secretLen;
3203fcf3ce44SJohn Forte 		break;
3204fcf3ce44SJohn Forte 
3205fcf3ce44SJohn Forte 	default:
3206fcf3ce44SJohn Forte 		(void) fprintf(stderr, "Invalid auth parameter %d\n", param);
3207fcf3ce44SJohn Forte 		return (1);
3208fcf3ce44SJohn Forte 	}
3209fcf3ce44SJohn Forte 
3210fcf3ce44SJohn Forte 	status = SUN_IMA_SetTargetAuthParams(oid, IMA_AUTHMETHOD_CHAP,
3211fcf3ce44SJohn Forte 	    &authParams);
3212fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3213fcf3ce44SJohn Forte 		printLibError(status);
3214fcf3ce44SJohn Forte 		*funcRet = 1;
3215fcf3ce44SJohn Forte 	}
3216fcf3ce44SJohn Forte 	return (0);
3217fcf3ce44SJohn Forte }
3218fcf3ce44SJohn Forte 
3219fcf3ce44SJohn Forte static int
3220fcf3ce44SJohn Forte modifyTargetBidirAuthFlag(IMA_OID targetOid, char *optarg, int *funcRet)
3221fcf3ce44SJohn Forte {
3222fcf3ce44SJohn Forte 	IMA_BOOL boolValue;
3223fcf3ce44SJohn Forte 	IMA_STATUS status;
3224fcf3ce44SJohn Forte 
3225fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3226fcf3ce44SJohn Forte 
3227fcf3ce44SJohn Forte 	if (strcasecmp(optarg, ISCSIADM_ARG_ENABLE) == 0) {
3228fcf3ce44SJohn Forte 		boolValue = IMA_TRUE;
3229fcf3ce44SJohn Forte 	} else if (strcasecmp(optarg, ISCSIADM_ARG_DISABLE) == 0) {
3230fcf3ce44SJohn Forte 		boolValue = IMA_FALSE;
3231fcf3ce44SJohn Forte 	} else {
3232fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s %s\n",
3233fcf3ce44SJohn Forte 		    cmdName, gettext("invalid option argument"), optarg);
3234fcf3ce44SJohn Forte 		return (1);
3235fcf3ce44SJohn Forte 	}
3236fcf3ce44SJohn Forte 
3237fcf3ce44SJohn Forte 	status = SUN_IMA_SetTargetBidirAuthFlag(targetOid, &boolValue);
3238fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3239fcf3ce44SJohn Forte 		printLibError(status);
3240fcf3ce44SJohn Forte 		*funcRet = 1;
3241fcf3ce44SJohn Forte 	}
3242fcf3ce44SJohn Forte 	return (0);
3243fcf3ce44SJohn Forte }
3244fcf3ce44SJohn Forte 
3245fcf3ce44SJohn Forte static int
3246fcf3ce44SJohn Forte modifyConfiguredSessions(IMA_OID targetOid, char *optarg)
3247fcf3ce44SJohn Forte {
3248fcf3ce44SJohn Forte 	SUN_IMA_CONFIG_SESSIONS *pConfigSessions;
3249fcf3ce44SJohn Forte 	IMA_STATUS		status;
3250fcf3ce44SJohn Forte 	int			sessions;
3251fcf3ce44SJohn Forte 	int			size;
3252fcf3ce44SJohn Forte 	char			tmp[1024];
3253fcf3ce44SJohn Forte 	boolean_t		isIpv6 = B_FALSE;
3254fcf3ce44SJohn Forte 	uint16_t		port;
3255fcf3ce44SJohn Forte 	char			address[MAX_ADDRESS_LEN];
3256fcf3ce44SJohn Forte 	char			*commaPos;
3257fcf3ce44SJohn Forte 	char			*addressPos;
3258fcf3ce44SJohn Forte 	int			rtn;
3259fcf3ce44SJohn Forte 
3260fcf3ce44SJohn Forte 	/*
3261fcf3ce44SJohn Forte 	 * Strip the first int value from the string.  If we sprintf
3262fcf3ce44SJohn Forte 	 * this back to a string and it matches the original string
3263fcf3ce44SJohn Forte 	 * then this command is using default binding.  If not a
3264fcf3ce44SJohn Forte 	 * match we have hard coded binding or a usage error.
3265fcf3ce44SJohn Forte 	 */
3266fcf3ce44SJohn Forte 	sessions = atoi(optarg);
3267fcf3ce44SJohn Forte 	(void) sprintf(tmp, "%d", sessions);
3268fcf3ce44SJohn Forte 	if (strcmp(optarg, tmp) == 0) {
3269fcf3ce44SJohn Forte 		/* default binding */
3270fcf3ce44SJohn Forte 
3271fcf3ce44SJohn Forte 		/* allocate the required pConfigSessions */
3272fcf3ce44SJohn Forte 		size = sizeof (SUN_IMA_CONFIG_SESSIONS);
3273fcf3ce44SJohn Forte 		pConfigSessions = (SUN_IMA_CONFIG_SESSIONS *)calloc(1, size);
3274fcf3ce44SJohn Forte 		if (pConfigSessions == NULL) {
3275fcf3ce44SJohn Forte 			return (1);
3276fcf3ce44SJohn Forte 		}
3277fcf3ce44SJohn Forte 
3278fcf3ce44SJohn Forte 		/* setup pConfigSessions */
3279fcf3ce44SJohn Forte 		pConfigSessions->bound	= IMA_FALSE;
3280fcf3ce44SJohn Forte 		pConfigSessions->in	= sessions;
3281fcf3ce44SJohn Forte 		pConfigSessions->out	= 0;
3282fcf3ce44SJohn Forte 	} else {
3283fcf3ce44SJohn Forte 		/* hardcoded binding */
3284fcf3ce44SJohn Forte 
3285fcf3ce44SJohn Forte 		/*
3286fcf3ce44SJohn Forte 		 * First we need to determine how many bindings
3287fcf3ce44SJohn Forte 		 * are available.  This can be done by scanning
3288fcf3ce44SJohn Forte 		 * for the number of ',' + 1.
3289fcf3ce44SJohn Forte 		 */
3290fcf3ce44SJohn Forte 		sessions = 1;
3291fcf3ce44SJohn Forte 		commaPos = strchr(optarg, ',');
3292fcf3ce44SJohn Forte 		while (commaPos != NULL) {
3293fcf3ce44SJohn Forte 			sessions++;
3294fcf3ce44SJohn Forte 			commaPos = strchr(++commaPos, ',');
3295fcf3ce44SJohn Forte 		}
3296fcf3ce44SJohn Forte 
3297fcf3ce44SJohn Forte 		/* allocate the required pConfigSessions */
3298fcf3ce44SJohn Forte 		size = sizeof (SUN_IMA_CONFIG_SESSIONS) + ((sessions - 1) *
3299fcf3ce44SJohn Forte 		    sizeof (IMA_ADDRESS_KEY));
3300fcf3ce44SJohn Forte 		pConfigSessions = (SUN_IMA_CONFIG_SESSIONS *)calloc(1, size);
3301fcf3ce44SJohn Forte 		if (pConfigSessions == NULL) {
3302fcf3ce44SJohn Forte 			return (1);
3303fcf3ce44SJohn Forte 		}
3304fcf3ce44SJohn Forte 
3305fcf3ce44SJohn Forte 		/* setup pConfigSessions */
3306fcf3ce44SJohn Forte 		pConfigSessions->bound	= IMA_TRUE;
3307fcf3ce44SJohn Forte 		pConfigSessions->in	= sessions;
3308fcf3ce44SJohn Forte 		pConfigSessions->out	= 0;
3309fcf3ce44SJohn Forte 
3310fcf3ce44SJohn Forte 		/* Now fill in the binding information.  */
3311fcf3ce44SJohn Forte 		sessions = 0;
3312fcf3ce44SJohn Forte 		addressPos = optarg;
3313fcf3ce44SJohn Forte 		/*
3314fcf3ce44SJohn Forte 		 * Walk thru possible address strings
3315fcf3ce44SJohn Forte 		 * stop once all strings are processed.
3316fcf3ce44SJohn Forte 		 */
3317fcf3ce44SJohn Forte 		while (addressPos != NULL) {
3318fcf3ce44SJohn Forte 			/*
3319fcf3ce44SJohn Forte 			 * Check if there is another address after this
3320fcf3ce44SJohn Forte 			 * one. If so terminate the current address and
3321fcf3ce44SJohn Forte 			 * keep a pointer to the next one.
3322fcf3ce44SJohn Forte 			 */
3323fcf3ce44SJohn Forte 			commaPos = strchr(addressPos, ',');
3324fcf3ce44SJohn Forte 			if (commaPos != NULL) {
3325fcf3ce44SJohn Forte 				*commaPos++ = 0x00;
3326fcf3ce44SJohn Forte 			}
3327fcf3ce44SJohn Forte 
3328fcf3ce44SJohn Forte 			/*
3329fcf3ce44SJohn Forte 			 * Parse current address.  If invalid abort
3330fcf3ce44SJohn Forte 			 * processing of addresses and free memory.
3331fcf3ce44SJohn Forte 			 */
3332fcf3ce44SJohn Forte 			if (parseAddress(addressPos, 0, address,
3333fcf3ce44SJohn Forte 			    MAX_ADDRESS_LEN, &port, &isIpv6) != PARSE_ADDR_OK) {
3334fcf3ce44SJohn Forte 				free(pConfigSessions);
3335fcf3ce44SJohn Forte 				printLibError(IMA_ERROR_INVALID_PARAMETER);
3336fcf3ce44SJohn Forte 				return (1);
3337fcf3ce44SJohn Forte 			}
3338fcf3ce44SJohn Forte 
3339fcf3ce44SJohn Forte 			/* Convert address into binary form */
3340fcf3ce44SJohn Forte 			if (isIpv6 == B_FALSE) {
3341fcf3ce44SJohn Forte 				pConfigSessions->bindings[sessions].
3342fcf3ce44SJohn Forte 				    ipAddress.ipv4Address = IMA_TRUE;
3343fcf3ce44SJohn Forte 				rtn = inet_pton(AF_INET, address,
3344fcf3ce44SJohn Forte 				    pConfigSessions->bindings[sessions].
3345fcf3ce44SJohn Forte 				    ipAddress.ipAddress);
3346fcf3ce44SJohn Forte 			} else {
3347fcf3ce44SJohn Forte 				pConfigSessions->bindings[sessions].ipAddress.
3348fcf3ce44SJohn Forte 				    ipv4Address =
3349fcf3ce44SJohn Forte 				    IMA_FALSE;
3350fcf3ce44SJohn Forte 				rtn = inet_pton(AF_INET6, address,
3351fcf3ce44SJohn Forte 				    pConfigSessions->bindings[sessions].
3352fcf3ce44SJohn Forte 				    ipAddress.ipAddress);
3353fcf3ce44SJohn Forte 			}
3354fcf3ce44SJohn Forte 			if (rtn == 0) {
3355fcf3ce44SJohn Forte 				/* inet_pton found address invalid */
3356fcf3ce44SJohn Forte 				free(pConfigSessions);
3357fcf3ce44SJohn Forte 				printLibError(IMA_ERROR_INVALID_PARAMETER);
3358fcf3ce44SJohn Forte 				return (1);
3359fcf3ce44SJohn Forte 			}
3360fcf3ce44SJohn Forte 
3361fcf3ce44SJohn Forte 			/* update addressPos to next address */
3362fcf3ce44SJohn Forte 			sessions++;
3363fcf3ce44SJohn Forte 			addressPos = commaPos;
3364fcf3ce44SJohn Forte 		}
3365fcf3ce44SJohn Forte 	}
3366fcf3ce44SJohn Forte 
3367fcf3ce44SJohn Forte 	/* issue SUN_IMA request */
3368fcf3ce44SJohn Forte 	status = SUN_IMA_SetConfigSessions(targetOid,
3369fcf3ce44SJohn Forte 	    pConfigSessions);
3370fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3371fcf3ce44SJohn Forte 		printLibError(status);
3372fcf3ce44SJohn Forte 		free(pConfigSessions);
3373fcf3ce44SJohn Forte 		return (1);
3374fcf3ce44SJohn Forte 	}
3375fcf3ce44SJohn Forte 
3376fcf3ce44SJohn Forte 	free(pConfigSessions);
3377fcf3ce44SJohn Forte 	return (0);
3378fcf3ce44SJohn Forte }
3379fcf3ce44SJohn Forte 
3380fcf3ce44SJohn Forte static int
3381fcf3ce44SJohn Forte getAuthMethodValue(char *method, IMA_AUTHMETHOD *value)
3382fcf3ce44SJohn Forte {
3383fcf3ce44SJohn Forte 	if (strcasecmp(method, "chap") == 0) {
3384fcf3ce44SJohn Forte 		*value = IMA_AUTHMETHOD_CHAP;
3385fcf3ce44SJohn Forte 		return (0);
3386fcf3ce44SJohn Forte 	}
3387fcf3ce44SJohn Forte 
3388fcf3ce44SJohn Forte 	if (strcasecmp(method, "none") == 0) {
3389fcf3ce44SJohn Forte 		*value =  IMA_AUTHMETHOD_NONE;
3390fcf3ce44SJohn Forte 		return (0);
3391fcf3ce44SJohn Forte 	}
3392fcf3ce44SJohn Forte 
3393fcf3ce44SJohn Forte 	return (1);
3394fcf3ce44SJohn Forte }
3395fcf3ce44SJohn Forte 
3396fcf3ce44SJohn Forte 
3397fcf3ce44SJohn Forte /*
3398fcf3ce44SJohn Forte  * Set the authentication method
3399fcf3ce44SJohn Forte  * Currently only supports CHAP and NONE
3400fcf3ce44SJohn Forte  */
3401fcf3ce44SJohn Forte static int
3402fcf3ce44SJohn Forte modifyNodeAuthMethod(IMA_OID oid, char *optarg, int *funcRet)
3403fcf3ce44SJohn Forte {
3404fcf3ce44SJohn Forte 	IMA_AUTHMETHOD methodList[MAX_AUTH_METHODS];
3405fcf3ce44SJohn Forte 	IMA_UINT methodCount = 0;
3406fcf3ce44SJohn Forte 	IMA_STATUS status;
3407fcf3ce44SJohn Forte 	IMA_AUTHMETHOD value;
3408fcf3ce44SJohn Forte 	char *method;
3409fcf3ce44SJohn Forte 	char *commaPos;
3410fcf3ce44SJohn Forte 
3411fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3412fcf3ce44SJohn Forte 
3413fcf3ce44SJohn Forte 	/*
3414fcf3ce44SJohn Forte 	 * optarg will be a , delimited set of auth methods, in order
3415fcf3ce44SJohn Forte 	 * of preference
3416fcf3ce44SJohn Forte 	 * if any values here are incorrect, return without setting
3417fcf3ce44SJohn Forte 	 * anything.
3418fcf3ce44SJohn Forte 	 */
3419fcf3ce44SJohn Forte 	method = optarg;
3420fcf3ce44SJohn Forte 
3421fcf3ce44SJohn Forte 	commaPos = strchr(optarg, ',');
3422fcf3ce44SJohn Forte 
3423fcf3ce44SJohn Forte 	while (commaPos && methodCount < MAX_AUTH_METHODS) {
3424fcf3ce44SJohn Forte 		*commaPos = NULL;
3425fcf3ce44SJohn Forte 		if (getAuthMethodValue(method, &value) != 0) {
3426fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: a: %s\n",
3427fcf3ce44SJohn Forte 			    cmdName, gettext("invalid option argument"));
3428fcf3ce44SJohn Forte 			return (1);
3429fcf3ce44SJohn Forte 		}
3430fcf3ce44SJohn Forte 		methodList[methodCount++] = value;
3431fcf3ce44SJohn Forte 		commaPos++;
3432fcf3ce44SJohn Forte 		method = commaPos;
3433fcf3ce44SJohn Forte 		commaPos = strchr(method, ',');
3434fcf3ce44SJohn Forte 	}
3435fcf3ce44SJohn Forte 	/* Should not find more method specified - if found, error */
3436fcf3ce44SJohn Forte 	if (commaPos) {
3437fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: -a: %s\n",
3438fcf3ce44SJohn Forte 		    cmdName, gettext("invalid option argument"));
3439fcf3ce44SJohn Forte 		return (1);
3440fcf3ce44SJohn Forte 	}
3441fcf3ce44SJohn Forte 	if (getAuthMethodValue(method, &value) != 0) {
3442fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: -a: %s\n",
3443fcf3ce44SJohn Forte 		    cmdName, gettext("invalid option argument"));
3444fcf3ce44SJohn Forte 		return (1);
3445fcf3ce44SJohn Forte 	}
3446fcf3ce44SJohn Forte 	methodList[methodCount++] = value;
3447fcf3ce44SJohn Forte 
3448fcf3ce44SJohn Forte 	status = IMA_SetInitiatorAuthMethods(oid, methodCount, &methodList[0]);
3449fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3450fcf3ce44SJohn Forte 		printLibError(status);
3451fcf3ce44SJohn Forte 		*funcRet = 1;
3452fcf3ce44SJohn Forte 	}
3453fcf3ce44SJohn Forte 	return (0);
3454fcf3ce44SJohn Forte }
3455fcf3ce44SJohn Forte 
3456fcf3ce44SJohn Forte static int
3457fcf3ce44SJohn Forte modifyTargetAuthMethod(IMA_OID oid, char *optarg, int *funcRet)
3458fcf3ce44SJohn Forte {
3459fcf3ce44SJohn Forte 	IMA_AUTHMETHOD methodList[MAX_AUTH_METHODS];
3460fcf3ce44SJohn Forte 	IMA_UINT methodCount = 0;
3461fcf3ce44SJohn Forte 	IMA_STATUS status;
3462fcf3ce44SJohn Forte 	IMA_AUTHMETHOD value;
3463fcf3ce44SJohn Forte 	char *method;
3464fcf3ce44SJohn Forte 	char *commaPos;
3465fcf3ce44SJohn Forte 
3466fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3467fcf3ce44SJohn Forte 
3468fcf3ce44SJohn Forte 	/*
3469fcf3ce44SJohn Forte 	 * optarg will be a , delimited set of auth methods, in order
3470fcf3ce44SJohn Forte 	 * of preference
3471fcf3ce44SJohn Forte 	 * if any values here are incorrect, return without setting
3472fcf3ce44SJohn Forte 	 * anything.
3473fcf3ce44SJohn Forte 	 */
3474fcf3ce44SJohn Forte 	method = optarg;
3475fcf3ce44SJohn Forte 
3476fcf3ce44SJohn Forte 	commaPos = strchr(optarg, ',');
3477fcf3ce44SJohn Forte 
3478fcf3ce44SJohn Forte 	while (commaPos && methodCount < MAX_AUTH_METHODS) {
3479fcf3ce44SJohn Forte 		*commaPos = NULL;
3480fcf3ce44SJohn Forte 		if (getAuthMethodValue(method, &value) != 0) {
3481fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: a: %s\n",
3482fcf3ce44SJohn Forte 			    cmdName, gettext("invalid option argument"));
3483fcf3ce44SJohn Forte 			return (1);
3484fcf3ce44SJohn Forte 		}
3485fcf3ce44SJohn Forte 		methodList[methodCount++] = value;
3486fcf3ce44SJohn Forte 		commaPos++;
3487fcf3ce44SJohn Forte 		method = commaPos;
3488fcf3ce44SJohn Forte 		commaPos = strchr(method, ',');
3489fcf3ce44SJohn Forte 	}
3490fcf3ce44SJohn Forte 	/* Should not find more method specified - if found, error */
3491fcf3ce44SJohn Forte 	if (commaPos) {
3492fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: -a: %s\n",
3493fcf3ce44SJohn Forte 		    cmdName, gettext("invalid option argument"));
3494fcf3ce44SJohn Forte 		return (1);
3495fcf3ce44SJohn Forte 	}
3496fcf3ce44SJohn Forte 	if (getAuthMethodValue(method, &value) != 0) {
3497fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: -a: %s\n",
3498fcf3ce44SJohn Forte 		    cmdName, gettext("invalid option argument"));
3499fcf3ce44SJohn Forte 		return (1);
3500fcf3ce44SJohn Forte 	}
3501fcf3ce44SJohn Forte 	methodList[methodCount++] = value;
3502fcf3ce44SJohn Forte 
3503fcf3ce44SJohn Forte 	status = SUN_IMA_SetTargetAuthMethods(oid, &methodCount,
3504fcf3ce44SJohn Forte 	    &methodList[0]);
3505fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3506fcf3ce44SJohn Forte 		printLibError(status);
3507fcf3ce44SJohn Forte 		*funcRet = 1;
3508fcf3ce44SJohn Forte 	}
3509fcf3ce44SJohn Forte 	return (0);
3510fcf3ce44SJohn Forte }
3511fcf3ce44SJohn Forte 
3512fcf3ce44SJohn Forte /*
3513fcf3ce44SJohn Forte  * Modify the RADIUS configuration of the initiator node.
3514fcf3ce44SJohn Forte  *
3515fcf3ce44SJohn Forte  * Return 0 on success.
3516fcf3ce44SJohn Forte  */
3517fcf3ce44SJohn Forte static int
3518fcf3ce44SJohn Forte modifyNodeRadiusConfig(IMA_OID oid, char *optarg, int *funcRet)
3519fcf3ce44SJohn Forte {
3520fcf3ce44SJohn Forte 	SUN_IMA_RADIUS_CONFIG config;
3521fcf3ce44SJohn Forte 	IMA_STATUS status;
3522fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
3523fcf3ce44SJohn Forte 	uint16_t port;
3524fcf3ce44SJohn Forte 
3525fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3526fcf3ce44SJohn Forte 
3527fcf3ce44SJohn Forte 	(void) memset(&config, 0, sizeof (SUN_IMA_RADIUS_CONFIG));
3528fcf3ce44SJohn Forte 	if (parseAddress(optarg, DEFAULT_RADIUS_PORT,
3529fcf3ce44SJohn Forte 	    &config.hostnameIpAddress[0], SUN_IMA_IP_ADDRESS_PORT_LEN,
3530fcf3ce44SJohn Forte 	    &port, &isIpv6) !=
3531fcf3ce44SJohn Forte 	    PARSE_ADDR_OK) {
3532fcf3ce44SJohn Forte 		return (1);
3533fcf3ce44SJohn Forte 	}
3534fcf3ce44SJohn Forte 	config.port = (IMA_UINT16)port;
3535fcf3ce44SJohn Forte 	config.isIpv6 = (isIpv6 == B_TRUE) ? IMA_TRUE : IMA_FALSE;
3536fcf3ce44SJohn Forte 	/* Not setting shared secret here. */
3537fcf3ce44SJohn Forte 	config.sharedSecretValid = IMA_FALSE;
3538fcf3ce44SJohn Forte 
3539fcf3ce44SJohn Forte 	status = SUN_IMA_SetInitiatorRadiusConfig(oid, &config);
3540fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3541fcf3ce44SJohn Forte 		printLibError(status);
3542fcf3ce44SJohn Forte 		*funcRet = 1;
3543fcf3ce44SJohn Forte 	}
3544fcf3ce44SJohn Forte 
3545fcf3ce44SJohn Forte 	return (0);
3546fcf3ce44SJohn Forte }
3547fcf3ce44SJohn Forte 
3548fcf3ce44SJohn Forte /*
3549fcf3ce44SJohn Forte  * Modify the RADIUS access flag of the initiator node.
3550fcf3ce44SJohn Forte  *
3551fcf3ce44SJohn Forte  * Return 0 on success.
3552fcf3ce44SJohn Forte  */
3553fcf3ce44SJohn Forte static int
3554fcf3ce44SJohn Forte modifyNodeRadiusAccess(IMA_OID oid, char *optarg, int *funcRet)
3555fcf3ce44SJohn Forte {
3556fcf3ce44SJohn Forte 	IMA_BOOL radiusAccess;
3557fcf3ce44SJohn Forte 	IMA_OID initiatorOid;
3558fcf3ce44SJohn Forte 	IMA_STATUS status;
3559fcf3ce44SJohn Forte 	SUN_IMA_RADIUS_CONFIG radiusConfig;
3560fcf3ce44SJohn Forte 	int ret;
3561fcf3ce44SJohn Forte 
3562fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3563fcf3ce44SJohn Forte 
3564fcf3ce44SJohn Forte 	/* Check if Radius Config is there */
3565fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
3566fcf3ce44SJohn Forte 	if (ret != 0) {
3567fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3568fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
3569fcf3ce44SJohn Forte 		return (1);
3570fcf3ce44SJohn Forte 	}
3571fcf3ce44SJohn Forte 	(void) memset(&radiusConfig, 0, sizeof (SUN_IMA_RADIUS_CONFIG));
3572fcf3ce44SJohn Forte 	status = SUN_IMA_GetInitiatorRadiusConfig(initiatorOid, &radiusConfig);
3573fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3574fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3575fcf3ce44SJohn Forte 		    cmdName, gettext("RADIUS server not configured yet"));
3576fcf3ce44SJohn Forte 		*funcRet = 1;
3577fcf3ce44SJohn Forte 		return (ret);
3578fcf3ce44SJohn Forte 	}
3579fcf3ce44SJohn Forte 
3580fcf3ce44SJohn Forte 	/* Check if Radius Shared is set */
3581fcf3ce44SJohn Forte 	if (radiusConfig.sharedSecretValid == IMA_FALSE) {
3582fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n", cmdName,
3583fcf3ce44SJohn Forte 		    gettext("RADIUS server secret not configured yet"));
3584fcf3ce44SJohn Forte 		return (1);
3585fcf3ce44SJohn Forte 	}
3586fcf3ce44SJohn Forte 
3587fcf3ce44SJohn Forte 	if (strcasecmp(optarg, ISCSIADM_ARG_ENABLE) == 0) {
3588fcf3ce44SJohn Forte 		radiusAccess = IMA_TRUE;
3589fcf3ce44SJohn Forte 	} else if (strcasecmp(optarg, ISCSIADM_ARG_DISABLE) == 0) {
3590fcf3ce44SJohn Forte 		radiusAccess = IMA_FALSE;
3591fcf3ce44SJohn Forte 	} else {
3592fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s %s\n",
3593fcf3ce44SJohn Forte 		    cmdName,
3594fcf3ce44SJohn Forte 		    gettext("invalid option argument"),
3595fcf3ce44SJohn Forte 		    optarg);
3596fcf3ce44SJohn Forte 		return (1);
3597fcf3ce44SJohn Forte 	}
3598fcf3ce44SJohn Forte 	status = SUN_IMA_SetInitiatorRadiusAccess(oid, radiusAccess);
3599fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3600fcf3ce44SJohn Forte 		printLibError(status);
3601fcf3ce44SJohn Forte 		*funcRet = 1;
3602fcf3ce44SJohn Forte 	}
3603fcf3ce44SJohn Forte 
3604fcf3ce44SJohn Forte 	return (ret);
3605fcf3ce44SJohn Forte }
3606fcf3ce44SJohn Forte 
3607fcf3ce44SJohn Forte /*
3608fcf3ce44SJohn Forte  * Modify the RADIUS shared secret.
3609fcf3ce44SJohn Forte  *
3610fcf3ce44SJohn Forte  * Returns:
3611fcf3ce44SJohn Forte  *  zero on success.
3612fcf3ce44SJohn Forte  *  > 0 on failure.
3613fcf3ce44SJohn Forte  */
3614fcf3ce44SJohn Forte static int
3615fcf3ce44SJohn Forte modifyNodeRadiusSharedSecret(IMA_OID oid, int *funcRet)
3616fcf3ce44SJohn Forte {
3617fcf3ce44SJohn Forte 	IMA_BYTE radiusSharedSecret[SUN_IMA_MAX_RADIUS_SECRET_LEN + 1];
3618fcf3ce44SJohn Forte 	IMA_OID initiatorOid;
3619fcf3ce44SJohn Forte 	IMA_STATUS status;
3620fcf3ce44SJohn Forte 	SUN_IMA_RADIUS_CONFIG radiusConfig;
3621fcf3ce44SJohn Forte 	int ret;
3622fcf3ce44SJohn Forte 	int secretLen = SUN_IMA_MAX_RADIUS_SECRET_LEN;
3623fcf3ce44SJohn Forte 
3624fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3625fcf3ce44SJohn Forte 
3626fcf3ce44SJohn Forte 	ret = getSecret((char *)&radiusSharedSecret[0], &secretLen,
3627fcf3ce44SJohn Forte 	    0, SUN_IMA_MAX_RADIUS_SECRET_LEN);
3628fcf3ce44SJohn Forte 	if (ret != 0) {
3629fcf3ce44SJohn Forte 		return (1);
3630fcf3ce44SJohn Forte 	}
3631fcf3ce44SJohn Forte 
3632fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
3633fcf3ce44SJohn Forte 	if (ret > 0) {
3634fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3635fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
3636fcf3ce44SJohn Forte 	}
3637fcf3ce44SJohn Forte 	if (ret != 0) {
3638fcf3ce44SJohn Forte 		return (1);
3639fcf3ce44SJohn Forte 	}
3640fcf3ce44SJohn Forte 	/* First obtain existing RADIUS configuration (if any) */
3641fcf3ce44SJohn Forte 	(void) memset(&radiusConfig, 0, sizeof (SUN_IMA_RADIUS_CONFIG));
3642fcf3ce44SJohn Forte 	status = SUN_IMA_GetInitiatorRadiusConfig(initiatorOid, &radiusConfig);
3643fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3644fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3645fcf3ce44SJohn Forte 		    cmdName, gettext("RADIUS server not configured yet"));
3646fcf3ce44SJohn Forte 		return (1);
3647fcf3ce44SJohn Forte 	}
3648fcf3ce44SJohn Forte 
3649fcf3ce44SJohn Forte 	/* Modify the shared secret only */
3650fcf3ce44SJohn Forte 	radiusConfig.sharedSecretLength = secretLen;
3651fcf3ce44SJohn Forte 	(void) memcpy(&radiusConfig.sharedSecret,
3652fcf3ce44SJohn Forte 	    &radiusSharedSecret[0], secretLen);
3653fcf3ce44SJohn Forte 	radiusConfig.sharedSecretValid = IMA_TRUE;
3654fcf3ce44SJohn Forte 	status = SUN_IMA_SetInitiatorRadiusConfig(oid, &radiusConfig);
3655fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
3656fcf3ce44SJohn Forte 		printLibError(status);
3657fcf3ce44SJohn Forte 		*funcRet = 1;
3658fcf3ce44SJohn Forte 	}
3659fcf3ce44SJohn Forte 
3660fcf3ce44SJohn Forte 	return (0);
3661fcf3ce44SJohn Forte }
3662fcf3ce44SJohn Forte 
3663fcf3ce44SJohn Forte /*
3664fcf3ce44SJohn Forte  * Set initiator node attributes.
3665fcf3ce44SJohn Forte  */
3666fcf3ce44SJohn Forte static int
3667fcf3ce44SJohn Forte modifyNode(cmdOptions_t *options, int *funcRet)
3668fcf3ce44SJohn Forte {
3669fcf3ce44SJohn Forte 	IMA_NODE_NAME	nodeName;
3670fcf3ce44SJohn Forte 	IMA_NODE_ALIAS	nodeAlias;
3671fcf3ce44SJohn Forte 	IMA_OID		oid;
3672fcf3ce44SJohn Forte 	IMA_STATUS	status;
3673fcf3ce44SJohn Forte 	cmdOptions_t	*optionList = options;
3674fcf3ce44SJohn Forte 	int		ret;
3675fcf3ce44SJohn Forte 	iSCSINameCheckStatusType nameCheckStatus;
3676fcf3ce44SJohn Forte 	IMA_OID sharedNodeOid;
3677fcf3ce44SJohn Forte 	int 		i;
3678fcf3ce44SJohn Forte 	int 		lowerCase;
36796cefaae1SJack Meng 	IMA_BOOL	iscsiBoot = IMA_FALSE;
36806cefaae1SJack Meng 	IMA_BOOL	mpxioEnabled = IMA_FALSE;
36817f848965Sbing zhao - Sun Microsystems - Beijing China 	char		*mb_name = NULL;
36827f848965Sbing zhao - Sun Microsystems - Beijing China 	int		prefixlen = 0;
3683fcf3ce44SJohn Forte 
3684fcf3ce44SJohn Forte 	assert(funcRet != NULL);
3685fcf3ce44SJohn Forte 
36866cefaae1SJack Meng 	/* Get boot session's info */
36876cefaae1SJack Meng 	(void) SUN_IMA_GetBootIscsi(&iscsiBoot);
36886cefaae1SJack Meng 	if (iscsiBoot == IMA_TRUE) {
36896cefaae1SJack Meng 		status = SUN_IMA_GetBootMpxio(&mpxioEnabled);
36906cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
36916cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
36926cefaae1SJack Meng 			    cmdName, gettext("unable to get MPxIO info"
36936cefaae1SJack Meng 			    " of root disk"));
36946cefaae1SJack Meng 			*funcRet = 1;
36956cefaae1SJack Meng 			return (1);
36966cefaae1SJack Meng 		}
36976cefaae1SJack Meng 	}
36986cefaae1SJack Meng 
3699fcf3ce44SJohn Forte 	/* Find Sun initiator */
3700fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&oid);
3701f5fc5c04SJack Meng 	if (ret != 0) {
3702fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
3703fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
3704fcf3ce44SJohn Forte 		return (ret);
3705fcf3ce44SJohn Forte 	}
3706fcf3ce44SJohn Forte 
3707fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
3708fcf3ce44SJohn Forte 		switch (optionList->optval) {
3709fcf3ce44SJohn Forte 			case 'N':
3710fcf3ce44SJohn Forte 				if (strlen(optionList->optarg) >=
3711fcf3ce44SJohn Forte 				    MAX_ISCSI_NAME_LEN) {
3712fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s %d\n",
3713fcf3ce44SJohn Forte 					    cmdName,
3714fcf3ce44SJohn Forte 					    gettext("name too long, \
3715fcf3ce44SJohn Forte 					    maximum length is:"),
3716fcf3ce44SJohn Forte 					    MAX_ISCSI_NAME_LEN);
3717fcf3ce44SJohn Forte 				}
3718fcf3ce44SJohn Forte 
3719fcf3ce44SJohn Forte 				/* Take the first operand as node name. */
3720fcf3ce44SJohn Forte 				(void) memset(&nodeName, 0,
3721fcf3ce44SJohn Forte 				    sizeof (IMA_NODE_NAME));
3722fcf3ce44SJohn Forte 				if (mbstowcs(nodeName, optionList->optarg,
3723fcf3ce44SJohn Forte 				    IMA_NODE_NAME_LEN) == (size_t)-1) {
3724fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s\n",
3725fcf3ce44SJohn Forte 					    cmdName,
3726fcf3ce44SJohn Forte 					    gettext("conversion error"));
3727fcf3ce44SJohn Forte 					return (1);
3728fcf3ce44SJohn Forte 				}
3729fcf3ce44SJohn Forte 
37307f848965Sbing zhao - Sun Microsystems - Beijing China 				prefixlen = strlen(ISCSI_IQN_NAME_PREFIX);
37317f848965Sbing zhao - Sun Microsystems - Beijing China 				mb_name = (char *)calloc(1, prefixlen + 1);
37327f848965Sbing zhao - Sun Microsystems - Beijing China 				if (mb_name == NULL) {
37337f848965Sbing zhao - Sun Microsystems - Beijing China 					return (1);
37347f848965Sbing zhao - Sun Microsystems - Beijing China 				}
37357f848965Sbing zhao - Sun Microsystems - Beijing China 
37367f848965Sbing zhao - Sun Microsystems - Beijing China 				if (wcstombs(mb_name, nodeName,
37377f848965Sbing zhao - Sun Microsystems - Beijing China 				    prefixlen) == (size_t)-1) {
37387f848965Sbing zhao - Sun Microsystems - Beijing China 					(void) fprintf(stderr, "%s: %s\n",
37397f848965Sbing zhao - Sun Microsystems - Beijing China 					    cmdName,
37407f848965Sbing zhao - Sun Microsystems - Beijing China 					    gettext("conversion error"));
37417f848965Sbing zhao - Sun Microsystems - Beijing China 					(void) IMA_FreeMemory(mb_name);
37427f848965Sbing zhao - Sun Microsystems - Beijing China 					return (1);
37437f848965Sbing zhao - Sun Microsystems - Beijing China 				}
37447f848965Sbing zhao - Sun Microsystems - Beijing China 				if (strncmp(mb_name, ISCSI_IQN_NAME_PREFIX,
37457f848965Sbing zhao - Sun Microsystems - Beijing China 				    prefixlen) == 0) {
37467f848965Sbing zhao - Sun Microsystems - Beijing China 					/*
37477f848965Sbing zhao - Sun Microsystems - Beijing China 					 * For iqn format, we should map
37487f848965Sbing zhao - Sun Microsystems - Beijing China 					 * the upper-case characters to
37497f848965Sbing zhao - Sun Microsystems - Beijing China 					 * their lower-case equivalents.
37507f848965Sbing zhao - Sun Microsystems - Beijing China 					 */
3751fcf3ce44SJohn Forte 					for (i = 0; nodeName[i] != 0; i++) {
37527f848965Sbing zhao - Sun Microsystems - Beijing China 						lowerCase =
37537f848965Sbing zhao - Sun Microsystems - Beijing China 						    tolower(nodeName[i]);
3754fcf3ce44SJohn Forte 						nodeName[i] = lowerCase;
3755fcf3ce44SJohn Forte 					}
37567f848965Sbing zhao - Sun Microsystems - Beijing China 				}
37577f848965Sbing zhao - Sun Microsystems - Beijing China 				(void) IMA_FreeMemory(mb_name);
37587f848965Sbing zhao - Sun Microsystems - Beijing China 
3759fcf3ce44SJohn Forte 				/* Perform string profile checks */
3760fcf3ce44SJohn Forte 				nameCheckStatus =
3761fcf3ce44SJohn Forte 				    iSCSINameStringProfileCheck(nodeName);
3762fcf3ce44SJohn Forte 				iSCSINameCheckStatusDisplay(nameCheckStatus);
3763fcf3ce44SJohn Forte 				if (nameCheckStatus != iSCSINameCheckOK) {
3764fcf3ce44SJohn Forte 					*funcRet = 1; /* DIY message fix */
3765fcf3ce44SJohn Forte 					return (1);
3766fcf3ce44SJohn Forte 				}
3767fcf3ce44SJohn Forte 
3768fcf3ce44SJohn Forte 				/*
3769fcf3ce44SJohn Forte 				 * IMA_GetSharedNodeOid(&sharedNodeOid);
3770fcf3ce44SJohn Forte 				 * if (!IMA_SUCCESS(status)) {
3771fcf3ce44SJohn Forte 				 *   printLibError(status);
3772fcf3ce44SJohn Forte 				 *   return (INF_ERROR);
3773fcf3ce44SJohn Forte 				 * }
3774fcf3ce44SJohn Forte 				 */
37756cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
37766cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
37776cefaae1SJack Meng 					    cmdName, gettext("iscsi boot, not"
37786cefaae1SJack Meng 					    " allowed to change"
37796cefaae1SJack Meng 					    " initiator's name"));
37806cefaae1SJack Meng 					return (1);
37816cefaae1SJack Meng 				}
3782fcf3ce44SJohn Forte 				oid.objectType = IMA_OBJECT_TYPE_NODE;
3783fcf3ce44SJohn Forte 				status = IMA_SetNodeName(oid, nodeName);
3784fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3785fcf3ce44SJohn Forte 					printLibError(status);
3786fcf3ce44SJohn Forte 					*funcRet = 1;
3787fcf3ce44SJohn Forte 					return (ret);
3788fcf3ce44SJohn Forte 				}
3789fcf3ce44SJohn Forte 				break;
3790fcf3ce44SJohn Forte 
3791fcf3ce44SJohn Forte 			case 'A':
37926cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
37936cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
37946cefaae1SJack Meng 					    cmdName, gettext("iscsi boot, not"
37956cefaae1SJack Meng 					    " allowed to change"
37966cefaae1SJack Meng 					    " initiator's alias"));
37976cefaae1SJack Meng 					return (1);
37986cefaae1SJack Meng 				}
3799fcf3ce44SJohn Forte 				/* Take the first operand as node alias. */
3800fcf3ce44SJohn Forte 				if (strlen(optionList->optarg) >=
3801fcf3ce44SJohn Forte 				    MAX_ISCSI_NAME_LEN) {
3802fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s %d\n",
3803fcf3ce44SJohn Forte 					    cmdName,
3804fcf3ce44SJohn Forte 					    gettext("alias too long, maximum  \
3805fcf3ce44SJohn Forte 					    length is:"),
3806fcf3ce44SJohn Forte 					    MAX_ISCSI_NAME_LEN);
3807fcf3ce44SJohn Forte 				}
3808fcf3ce44SJohn Forte 
3809fcf3ce44SJohn Forte 				(void) memset(&nodeAlias, 0,
3810fcf3ce44SJohn Forte 				    sizeof (IMA_NODE_ALIAS));
3811fcf3ce44SJohn Forte 				if (mbstowcs(nodeAlias, optionList->optarg,
3812fcf3ce44SJohn Forte 				    IMA_NODE_ALIAS_LEN) == (size_t)-1) {
3813fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s\n",
3814fcf3ce44SJohn Forte 					    cmdName,
3815fcf3ce44SJohn Forte 					    gettext("conversion error"));
3816fcf3ce44SJohn Forte 					return (1);
3817fcf3ce44SJohn Forte 				}
3818fcf3ce44SJohn Forte 
3819fcf3ce44SJohn Forte 				status = IMA_GetSharedNodeOid(&sharedNodeOid);
3820fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3821fcf3ce44SJohn Forte 					printLibError(status);
3822fcf3ce44SJohn Forte 					*funcRet = 1;
3823fcf3ce44SJohn Forte 					return (ret);
3824fcf3ce44SJohn Forte 				}
3825fcf3ce44SJohn Forte 
3826fcf3ce44SJohn Forte 				status = IMA_SetNodeAlias(sharedNodeOid,
3827fcf3ce44SJohn Forte 				    nodeAlias);
3828fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
3829fcf3ce44SJohn Forte 					printLibError(status);
3830fcf3ce44SJohn Forte 					*funcRet = 1;
3831fcf3ce44SJohn Forte 					return (ret);
3832fcf3ce44SJohn Forte 				}
3833fcf3ce44SJohn Forte 				break;
3834fcf3ce44SJohn Forte 
3835fcf3ce44SJohn Forte 			case 'a':
38366cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
38376cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
38386cefaae1SJack Meng 					    cmdName, gettext("iscsi boot, not"
38396cefaae1SJack Meng 					    " allowed to change authentication"
38406cefaae1SJack Meng 					    " method"));
38416cefaae1SJack Meng 					return (1);
38426cefaae1SJack Meng 				}
3843fcf3ce44SJohn Forte 				if (modifyNodeAuthMethod(oid, options->optarg,
3844fcf3ce44SJohn Forte 				    funcRet) != 0) {
3845fcf3ce44SJohn Forte 					return (1);
3846fcf3ce44SJohn Forte 				}
3847fcf3ce44SJohn Forte 				break;
3848fcf3ce44SJohn Forte 
3849fcf3ce44SJohn Forte 			case 'R':
3850fcf3ce44SJohn Forte 				if (modifyNodeRadiusAccess(oid, options->optarg,
3851fcf3ce44SJohn Forte 				    funcRet) != 0) {
3852fcf3ce44SJohn Forte 					return (1);
3853fcf3ce44SJohn Forte 				}
3854fcf3ce44SJohn Forte 				break;
3855fcf3ce44SJohn Forte 
3856fcf3ce44SJohn Forte 			case 'r':
3857fcf3ce44SJohn Forte 				if (modifyNodeRadiusConfig(oid, options->optarg,
3858fcf3ce44SJohn Forte 				    funcRet) != 0) {
3859fcf3ce44SJohn Forte 					return (1);
3860fcf3ce44SJohn Forte 				}
3861fcf3ce44SJohn Forte 				break;
3862fcf3ce44SJohn Forte 
3863fcf3ce44SJohn Forte 			case 'P':
3864fcf3ce44SJohn Forte 				if (modifyNodeRadiusSharedSecret(oid, funcRet)
3865fcf3ce44SJohn Forte 				    != 0) {
3866fcf3ce44SJohn Forte 					return (1);
3867fcf3ce44SJohn Forte 				}
3868fcf3ce44SJohn Forte 				break;
3869fcf3ce44SJohn Forte 
3870fcf3ce44SJohn Forte 			case 'C':
38716cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
38726cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
38736cefaae1SJack Meng 					    cmdName, gettext("iscsi boot, not"
38746cefaae1SJack Meng 					    " allowed to change CHAP secret"));
38756cefaae1SJack Meng 					return (1);
38766cefaae1SJack Meng 				}
3877fcf3ce44SJohn Forte 				if (modifyNodeAuthParam(oid, AUTH_PASSWORD,
3878fcf3ce44SJohn Forte 				    NULL, funcRet) != 0) {
3879fcf3ce44SJohn Forte 					return (1);
3880fcf3ce44SJohn Forte 				}
3881fcf3ce44SJohn Forte 				break;
3882fcf3ce44SJohn Forte 
3883fcf3ce44SJohn Forte 			case 'c':
38846cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
38856cefaae1SJack Meng 					if (mpxioEnabled == IMA_FALSE) {
38866cefaae1SJack Meng 						(void) fprintf(stderr,
38876cefaae1SJack Meng 						    "%s: %s\n", cmdName,
38886cefaae1SJack Meng 						    gettext("iscsi"
38896cefaae1SJack Meng 						    " boot and MPxIO"
38906cefaae1SJack Meng 						    " is disabled, not allowed"
38916cefaae1SJack Meng 						    " to change number of"
38926cefaae1SJack Meng 						    " sessions to be"
38936cefaae1SJack Meng 						    " configured"));
38946cefaae1SJack Meng 						return (1);
38956cefaae1SJack Meng 					}
38966cefaae1SJack Meng 				}
3897fcf3ce44SJohn Forte 				if (modifyConfiguredSessions(oid,
3898fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
38996cefaae1SJack Meng 					if (iscsiBoot == IMA_TRUE) {
39006cefaae1SJack Meng 						(void) fprintf(stderr,
39016cefaae1SJack Meng 						    "%s: %s\n", cmdName,
39026cefaae1SJack Meng 						    gettext("iscsi boot,"
39036cefaae1SJack Meng 						    " fail to set configured"
39046cefaae1SJack Meng 						    " session"));
39056cefaae1SJack Meng 					}
3906fcf3ce44SJohn Forte 					return (1);
3907fcf3ce44SJohn Forte 				}
3908fcf3ce44SJohn Forte 				break;
3909fcf3ce44SJohn Forte 
39106cefaae1SJack Meng 
3911fcf3ce44SJohn Forte 			case 'H':
39126cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
39136cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
39146cefaae1SJack Meng 					    cmdName, gettext("iscsi boot, not"
39156cefaae1SJack Meng 					    " allowed to change CHAP name"));
39166cefaae1SJack Meng 					return (1);
39176cefaae1SJack Meng 				}
3918fcf3ce44SJohn Forte 				if (modifyNodeAuthParam(oid, AUTH_NAME,
3919fcf3ce44SJohn Forte 				    optionList->optarg, funcRet) != 0) {
3920fcf3ce44SJohn Forte 					return (1);
3921fcf3ce44SJohn Forte 				}
3922fcf3ce44SJohn Forte 				break;
3923fcf3ce44SJohn Forte 
39246cefaae1SJack Meng 
3925fcf3ce44SJohn Forte 			case 'd':
39266cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
39276cefaae1SJack Meng 					if (mpxioEnabled == IMA_FALSE) {
39286cefaae1SJack Meng 						(void) fprintf(stderr,
39296cefaae1SJack Meng 						    "%s: %s\n", cmdName,
39306cefaae1SJack Meng 						    gettext("iscsi"
39316cefaae1SJack Meng 						    " boot and MPxIO"
39326cefaae1SJack Meng 						    " is disabled, not"
39336cefaae1SJack Meng 						    " allowed to"
39346cefaae1SJack Meng 						    " change initiator's"
39356cefaae1SJack Meng 						    " login params"));
39366cefaae1SJack Meng 						return (1);
39376cefaae1SJack Meng 					}
39386cefaae1SJack Meng 				}
3939fcf3ce44SJohn Forte 				if (setLoginParameter(oid, DATA_DIGEST,
3940fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
3941fcf3ce44SJohn Forte 					return (1);
3942fcf3ce44SJohn Forte 				}
3943fcf3ce44SJohn Forte 				break;
3944fcf3ce44SJohn Forte 
3945fcf3ce44SJohn Forte 			case 'h':
39466cefaae1SJack Meng 				if (iscsiBoot == IMA_TRUE) {
39476cefaae1SJack Meng 					if (mpxioEnabled == IMA_FALSE) {
39486cefaae1SJack Meng 						(void) fprintf(stderr,
39496cefaae1SJack Meng 						    "%s: %s\n", cmdName,
39506cefaae1SJack Meng 						    gettext("iscsi"
39516cefaae1SJack Meng 						    " boot and MPxIO"
39526cefaae1SJack Meng 						    " is disabled, not"
39536cefaae1SJack Meng 						    " allowed to"
39546cefaae1SJack Meng 						    " change initiator's"
39556cefaae1SJack Meng 						    " login params"));
39566cefaae1SJack Meng 						return (1);
39576cefaae1SJack Meng 					}
39586cefaae1SJack Meng 				}
3959fcf3ce44SJohn Forte 				if (setLoginParameter(oid, HEADER_DIGEST,
3960fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
3961fcf3ce44SJohn Forte 					return (1);
3962fcf3ce44SJohn Forte 				}
3963fcf3ce44SJohn Forte 				break;
3964fcf3ce44SJohn Forte 
3965aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case 'T':
3966aff4bce5Syi zhang - Sun Microsystems - Beijing China 				if (setTunableParameters(oid,
3967aff4bce5Syi zhang - Sun Microsystems - Beijing China 				    optionList->optarg) != 0) {
3968aff4bce5Syi zhang - Sun Microsystems - Beijing China 					return (1);
3969aff4bce5Syi zhang - Sun Microsystems - Beijing China 				}
3970aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
3971fcf3ce44SJohn Forte 			default:
3972fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %c: %s\n",
3973fcf3ce44SJohn Forte 				    cmdName, optionList->optval,
3974fcf3ce44SJohn Forte 				    gettext("unknown option"));
3975fcf3ce44SJohn Forte 				break;
3976fcf3ce44SJohn Forte 		}
3977fcf3ce44SJohn Forte 	}
3978fcf3ce44SJohn Forte 
3979fcf3ce44SJohn Forte 	return (ret);
3980fcf3ce44SJohn Forte }
3981fcf3ce44SJohn Forte 
3982fcf3ce44SJohn Forte /*
3983fcf3ce44SJohn Forte  * Modify target parameters
3984fcf3ce44SJohn Forte  */
3985fcf3ce44SJohn Forte static int
3986fcf3ce44SJohn Forte modifyTargetParam(cmdOptions_t *options, char *targetName, int *funcRet)
3987fcf3ce44SJohn Forte {
3988fcf3ce44SJohn Forte 	IMA_OID oid;
3989fcf3ce44SJohn Forte 	IMA_OID targetOid;
3990fcf3ce44SJohn Forte 	IMA_STATUS status;
3991fcf3ce44SJohn Forte 	IMA_OID_LIST *targetList;
3992fcf3ce44SJohn Forte 	SUN_IMA_TARGET_PROPERTIES targetProps;
3993fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ISCSI_NAME_LEN + 1];
3994fcf3ce44SJohn Forte 	wchar_t targetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
3995fcf3ce44SJohn Forte 	int ret;
3996fcf3ce44SJohn Forte 	boolean_t found;
3997fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_TRUE;
3998fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
3999fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
4000fcf3ce44SJohn Forte 	int i;
4001fcf3ce44SJohn Forte 	iSCSINameCheckStatusType nameCheckStatus;
4002fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
4003fcf3ce44SJohn Forte 	IMA_UINT16 tpgt = 0;
4004fcf3ce44SJohn Forte 
40056cefaae1SJack Meng 	IMA_NODE_NAME bootTargetName;
40066cefaae1SJack Meng 	IMA_INITIATOR_AUTHPARMS bootTargetCHAP;
40076cefaae1SJack Meng 	IMA_BOOL  iscsiBoot;
40086cefaae1SJack Meng 	IMA_BOOL  mpxioEnabled;
40096cefaae1SJack Meng 
4010fcf3ce44SJohn Forte 	cmdOptions_t *optionList = options;
4011fcf3ce44SJohn Forte 
4012fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4013fcf3ce44SJohn Forte 
4014fcf3ce44SJohn Forte 	/* Find Sun initiator */
4015fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&oid);
4016fcf3ce44SJohn Forte 	if (ret > 0) {
4017fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4018fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4019fcf3ce44SJohn Forte 	}
4020fcf3ce44SJohn Forte 
4021fcf3ce44SJohn Forte 	if (ret != 0) {
4022fcf3ce44SJohn Forte 		return (ret);
4023fcf3ce44SJohn Forte 	}
4024fcf3ce44SJohn Forte 
4025fcf3ce44SJohn Forte 	if (parseTarget(targetName,
4026fcf3ce44SJohn Forte 	    &wcInputObject[0],
4027fcf3ce44SJohn Forte 	    MAX_ISCSI_NAME_LEN + 1,
4028fcf3ce44SJohn Forte 	    &targetAddressSpecified,
4029fcf3ce44SJohn Forte 	    &targetAddress[0],
4030fcf3ce44SJohn Forte 	    SUN_IMA_IP_ADDRESS_PORT_LEN,
4031fcf3ce44SJohn Forte 	    &port,
4032fcf3ce44SJohn Forte 	    &tpgtSpecified,
4033fcf3ce44SJohn Forte 	    &tpgt,
4034fcf3ce44SJohn Forte 	    &isIpv6) != PARSE_TARGET_OK) {
4035fcf3ce44SJohn Forte 		return (1);
4036fcf3ce44SJohn Forte 	}
4037fcf3ce44SJohn Forte 
4038fcf3ce44SJohn Forte 	/* Perform string profile checks */
4039fcf3ce44SJohn Forte 	nameCheckStatus = iSCSINameStringProfileCheck(wcInputObject);
4040fcf3ce44SJohn Forte 	iSCSINameCheckStatusDisplay(nameCheckStatus);
4041fcf3ce44SJohn Forte 	if (nameCheckStatus != iSCSINameCheckOK) {
4042fcf3ce44SJohn Forte 		return (1);
4043fcf3ce44SJohn Forte 	}
4044fcf3ce44SJohn Forte 
4045fcf3ce44SJohn Forte 	status = IMA_GetTargetOidList(oid, &targetList);
4046fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
4047fcf3ce44SJohn Forte 		printLibError(status);
4048fcf3ce44SJohn Forte 		*funcRet = 1;
4049fcf3ce44SJohn Forte 		return (0);
4050fcf3ce44SJohn Forte 	}
4051fcf3ce44SJohn Forte 
40526cefaae1SJack Meng 	(void) SUN_IMA_GetBootIscsi(&iscsiBoot);
40536cefaae1SJack Meng 	if (iscsiBoot == IMA_TRUE) {
40546cefaae1SJack Meng 		status = SUN_IMA_GetBootMpxio(&mpxioEnabled);
40556cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
40566cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
40576cefaae1SJack Meng 			    cmdName, gettext("unable to get MPxIO info"
40586cefaae1SJack Meng 			    " of root disk"));
40596cefaae1SJack Meng 			*funcRet = 1;
40606cefaae1SJack Meng 			return (ret);
40616cefaae1SJack Meng 		}
40626cefaae1SJack Meng 		status = SUN_IMA_GetBootTargetName(bootTargetName);
40636cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
40646cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
40656cefaae1SJack Meng 			    cmdName, gettext("unable to get boot target's"
40666cefaae1SJack Meng 			    " name"));
40676cefaae1SJack Meng 			*funcRet = 1;
40686cefaae1SJack Meng 			return (ret);
40696cefaae1SJack Meng 		}
40706cefaae1SJack Meng 		status = SUN_IMA_GetBootTargetAuthParams(&bootTargetCHAP);
40716cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
40726cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
40736cefaae1SJack Meng 			    cmdName, gettext("unable to get boot target's"
40746cefaae1SJack Meng 			    " auth param"));
40756cefaae1SJack Meng 			*funcRet = 1;
40766cefaae1SJack Meng 			return (ret);
40776cefaae1SJack Meng 		}
40786cefaae1SJack Meng 	}
40796cefaae1SJack Meng 
4080fcf3ce44SJohn Forte 	/* find target oid */
4081fcf3ce44SJohn Forte 	for (found = B_FALSE, i = 0; i < targetList->oidCount; i++) {
4082fcf3ce44SJohn Forte 		status = SUN_IMA_GetTargetProperties(targetList->oids[i],
4083fcf3ce44SJohn Forte 		    &targetProps);
4084fcf3ce44SJohn Forte 		if (!IMA_SUCCESS(status)) {
4085fcf3ce44SJohn Forte 			printLibError(status);
4086fcf3ce44SJohn Forte 			(void) IMA_FreeMemory(targetList);
4087fcf3ce44SJohn Forte 			*funcRet = 1;
4088fcf3ce44SJohn Forte 			return (ret);
4089fcf3ce44SJohn Forte 		}
4090fcf3ce44SJohn Forte 
4091fcf3ce44SJohn Forte 		/*
4092fcf3ce44SJohn Forte 		 * Compare the target name with the input name
4093fcf3ce44SJohn Forte 		 */
4094fcf3ce44SJohn Forte 		if ((targetNamesEqual(wcInputObject, targetProps.imaProps.name)
4095fcf3ce44SJohn Forte 		    == B_TRUE)) {
4096fcf3ce44SJohn Forte 			/*
4097fcf3ce44SJohn Forte 			 * For now, regardless of whether a target address
4098fcf3ce44SJohn Forte 			 * is specified, we return B_TRUE because
4099fcf3ce44SJohn Forte 			 * IMA_TARGET_PROPERTIES does not have a field for
4100fcf3ce44SJohn Forte 			 * specifying address.
4101fcf3ce44SJohn Forte 			 */
4102fcf3ce44SJohn Forte 			found = B_TRUE;
4103fcf3ce44SJohn Forte 			targetOid = targetList->oids[i];
41046cefaae1SJack Meng 
41056cefaae1SJack Meng 			if ((targetNamesEqual(bootTargetName, wcInputObject)
41066cefaae1SJack Meng 			    == B_TRUE) && (iscsiBoot == IMA_TRUE)) {
41076cefaae1SJack Meng 				/*
41086cefaae1SJack Meng 				 * iscsi booting, need changed target param is
41096cefaae1SJack Meng 				 * booting target, for auth param, not allow
41106cefaae1SJack Meng 				 * to change, for others dependent on mpxio
41116cefaae1SJack Meng 				 */
41126cefaae1SJack Meng 
41136cefaae1SJack Meng 				if ((optionList->optval == 'C') ||
41146cefaae1SJack Meng 				    (optionList->optval == 'H') ||
41156cefaae1SJack Meng 				    (optionList->optval == 'B') ||
41166cefaae1SJack Meng 				    (optionList->optval == 'a')) {
41176cefaae1SJack Meng 					/*
41186cefaae1SJack Meng 					 * -C CHAP secret set
41196cefaae1SJack Meng 					 * -H CHAP name set
41206cefaae1SJack Meng 					 * -a authentication
41216cefaae1SJack Meng 					 * -B bi-directional-authentication
41226cefaae1SJack Meng 					 */
41236cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
41246cefaae1SJack Meng 					    cmdName, gettext("iscsi boot,"
41256cefaae1SJack Meng 					    " not allowed to modify"
41266cefaae1SJack Meng 					    " authentication parameters"
41276cefaae1SJack Meng 					    "  of boot target"));
41286cefaae1SJack Meng 					return (1);
41296cefaae1SJack Meng 				}
41306cefaae1SJack Meng 				if (mpxioEnabled == IMA_FALSE) {
41316cefaae1SJack Meng 					(void) fprintf(stderr, "%s: %s\n",
41326cefaae1SJack Meng 					    cmdName, gettext("iscsi boot and"
41336cefaae1SJack Meng 					    " MPxIO is disabled, not allowed"
41346cefaae1SJack Meng 					    " to modify boot target's"
41356cefaae1SJack Meng 					    " parameters"));
41366cefaae1SJack Meng 					return (1);
41376cefaae1SJack Meng 				}
41386cefaae1SJack Meng 
41396cefaae1SJack Meng 			}
41406cefaae1SJack Meng 
4141fcf3ce44SJohn Forte 			if (modifyIndividualTargetParam(optionList, targetOid,
4142fcf3ce44SJohn Forte 			    funcRet) != 0) {
4143fcf3ce44SJohn Forte 				return (ret);
4144fcf3ce44SJohn Forte 			}
4145fcf3ce44SJohn Forte 
4146fcf3ce44SJohn Forte 			/*
4147fcf3ce44SJohn Forte 			 * Even after finding a matched target, keep going
4148fcf3ce44SJohn Forte 			 * since there could be multiple target objects
4149fcf3ce44SJohn Forte 			 * associated with one target name in the system
4150fcf3ce44SJohn Forte 			 * because of different TPGTs.
4151fcf3ce44SJohn Forte 			 */
4152fcf3ce44SJohn Forte 		}
4153fcf3ce44SJohn Forte 	}
4154fcf3ce44SJohn Forte 
4155fcf3ce44SJohn Forte 	/* If the target OID cannot be found create one */
4156fcf3ce44SJohn Forte 	if (!found) {
4157fcf3ce44SJohn Forte 		status = SUN_IMA_CreateTargetOid(wcInputObject, &targetOid);
4158fcf3ce44SJohn Forte 		if (!IMA_SUCCESS(status)) {
4159fcf3ce44SJohn Forte 			printLibError(status);
4160fcf3ce44SJohn Forte 			(void) IMA_FreeMemory(targetList);
4161fcf3ce44SJohn Forte 			*funcRet = 1;
4162fcf3ce44SJohn Forte 			return (ret);
4163fcf3ce44SJohn Forte 		}
4164fcf3ce44SJohn Forte 		if (modifyIndividualTargetParam(optionList, targetOid,
4165fcf3ce44SJohn Forte 		    funcRet) != 0) {
4166fcf3ce44SJohn Forte 				return (ret);
4167fcf3ce44SJohn Forte 		}
4168fcf3ce44SJohn Forte 	}
4169fcf3ce44SJohn Forte 
4170fcf3ce44SJohn Forte 	(void) IMA_FreeMemory(targetList);
4171fcf3ce44SJohn Forte 	return (ret);
4172fcf3ce44SJohn Forte }
4173fcf3ce44SJohn Forte 
4174fcf3ce44SJohn Forte /*
4175fcf3ce44SJohn Forte  * Add one or more addresses
4176fcf3ce44SJohn Forte  */
4177fcf3ce44SJohn Forte static int
4178fcf3ce44SJohn Forte addAddress(int addrType, int operandLen, char *operand[], int *funcRet)
4179fcf3ce44SJohn Forte {
4180fcf3ce44SJohn Forte 	IMA_STATUS status;
4181fcf3ce44SJohn Forte 	IMA_OID oid, addressOid;
4182fcf3ce44SJohn Forte 	SUN_IMA_TARGET_ADDRESS address;
4183fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ADDRESS_LEN + 1];
4184fcf3ce44SJohn Forte 	int ret;
4185fcf3ce44SJohn Forte 	int i;
4186fcf3ce44SJohn Forte 
4187fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4188fcf3ce44SJohn Forte 
4189fcf3ce44SJohn Forte 	/* Find Sun initiator */
4190fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&oid);
4191fcf3ce44SJohn Forte 	if (ret > 0) {
4192fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4193fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4194fcf3ce44SJohn Forte 	}
4195fcf3ce44SJohn Forte 
4196fcf3ce44SJohn Forte 	if (ret != 0) {
4197fcf3ce44SJohn Forte 		return (ret);
4198fcf3ce44SJohn Forte 	}
4199fcf3ce44SJohn Forte 
4200fcf3ce44SJohn Forte 	/*
4201fcf3ce44SJohn Forte 	 * Format of discovery address operand:
4202fcf3ce44SJohn Forte 	 *
4203fcf3ce44SJohn Forte 	 * <IP address|hostname>:<port>
4204fcf3ce44SJohn Forte 	 */
4205fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
4206fcf3ce44SJohn Forte 		/* initialize */
4207fcf3ce44SJohn Forte 		(void) memset(&wcInputObject[0], 0, sizeof (wcInputObject));
4208fcf3ce44SJohn Forte 		(void) memset(&address, 0, sizeof (address));
4209fcf3ce44SJohn Forte 
4210fcf3ce44SJohn Forte 		if (mbstowcs(wcInputObject, operand[i],
4211fcf3ce44SJohn Forte 		    (MAX_ADDRESS_LEN + 1)) == (size_t)-1) {
4212fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4213fcf3ce44SJohn Forte 			    cmdName, gettext("conversion error"));
4214fcf3ce44SJohn Forte 			ret = 1;
4215fcf3ce44SJohn Forte 			continue;
4216fcf3ce44SJohn Forte 		}
4217fcf3ce44SJohn Forte 		if (getTargetAddress(addrType, operand[i], &address.imaStruct)
4218fcf3ce44SJohn Forte 		    != 0) {
4219fcf3ce44SJohn Forte 			ret = 1;
4220fcf3ce44SJohn Forte 			continue;
4221fcf3ce44SJohn Forte 		}
4222fcf3ce44SJohn Forte 		if (addrType == DISCOVERY_ADDRESS) {
4223fcf3ce44SJohn Forte 			status = IMA_AddDiscoveryAddress(oid,
4224fcf3ce44SJohn Forte 			    address.imaStruct, &addressOid);
4225fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4226fcf3ce44SJohn Forte 				printLibError(status);
4227fcf3ce44SJohn Forte 				*funcRet = 1;
4228fcf3ce44SJohn Forte 				return (ret);
4229fcf3ce44SJohn Forte 			}
4230fcf3ce44SJohn Forte 		} else if (addrType == ISNS_SERVER_ADDRESS) {
4231fcf3ce44SJohn Forte 			status = SUN_IMA_AddISNSServerAddress(address);
4232fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4233fcf3ce44SJohn Forte 				printLibError(status);
4234fcf3ce44SJohn Forte 				*funcRet = 1;
4235fcf3ce44SJohn Forte 				return (ret);
4236fcf3ce44SJohn Forte 			}
4237fcf3ce44SJohn Forte 		}
4238fcf3ce44SJohn Forte 	}
4239fcf3ce44SJohn Forte 	return (ret);
4240fcf3ce44SJohn Forte }
4241fcf3ce44SJohn Forte 
4242fcf3ce44SJohn Forte /*
4243fcf3ce44SJohn Forte  * Add one or more static configuration targets
4244fcf3ce44SJohn Forte  */
4245fcf3ce44SJohn Forte static int
4246fcf3ce44SJohn Forte addStaticConfig(int operandLen, char *operand[], int *funcRet)
4247fcf3ce44SJohn Forte {
4248fcf3ce44SJohn Forte 	int i;
4249fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_FALSE;
4250fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
4251fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
4252fcf3ce44SJohn Forte 	int ret;
4253fcf3ce44SJohn Forte 	int addrType;
4254fcf3ce44SJohn Forte 	IMA_STATUS status;
4255fcf3ce44SJohn Forte 	IMA_OID oid;
4256fcf3ce44SJohn Forte 	SUN_IMA_STATIC_DISCOVERY_TARGET staticConfig;
4257fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
4258fcf3ce44SJohn Forte 	IMA_UINT16 tpgt = 0;
4259fcf3ce44SJohn Forte 	wchar_t staticTargetName[MAX_ISCSI_NAME_LEN + 1];
4260fcf3ce44SJohn Forte 	wchar_t staticTargetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
4261fcf3ce44SJohn Forte 	iSCSINameCheckStatusType nameCheckStatus;
4262fcf3ce44SJohn Forte 	char sAddr[SUN_IMA_IP_ADDRESS_PORT_LEN];
4263fcf3ce44SJohn Forte 
4264fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4265fcf3ce44SJohn Forte 
4266fcf3ce44SJohn Forte 	/* Find Sun initiator */
4267fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&oid);
4268fcf3ce44SJohn Forte 	if (ret > 0) {
4269fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4270fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4271fcf3ce44SJohn Forte 	}
4272fcf3ce44SJohn Forte 
4273fcf3ce44SJohn Forte 	if (ret != 0) {
4274fcf3ce44SJohn Forte 		return (ret);
4275fcf3ce44SJohn Forte 	}
4276fcf3ce44SJohn Forte 
4277fcf3ce44SJohn Forte 	/*
4278fcf3ce44SJohn Forte 	 * Format of static config operand:
4279fcf3ce44SJohn Forte 	 *  <target-name>,<IP address|hostname>[:port][,tpgt]
4280fcf3ce44SJohn Forte 	 */
4281fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
4282fcf3ce44SJohn Forte 		if (parseTarget(operand[i],
4283fcf3ce44SJohn Forte 		    &staticTargetName[0],
4284fcf3ce44SJohn Forte 		    MAX_ISCSI_NAME_LEN + 1,
4285fcf3ce44SJohn Forte 		    &targetAddressSpecified,
4286fcf3ce44SJohn Forte 		    &staticTargetAddress[0],
4287fcf3ce44SJohn Forte 		    SUN_IMA_IP_ADDRESS_PORT_LEN,
4288fcf3ce44SJohn Forte 		    &port,
4289fcf3ce44SJohn Forte 		    &tpgtSpecified,
4290fcf3ce44SJohn Forte 		    &tpgt,
4291fcf3ce44SJohn Forte 		    &isIpv6) != PARSE_TARGET_OK) {
4292fcf3ce44SJohn Forte 			ret = 1;
4293fcf3ce44SJohn Forte 			continue;
4294fcf3ce44SJohn Forte 		}
4295fcf3ce44SJohn Forte 
4296fcf3ce44SJohn Forte 		if (targetAddressSpecified != B_TRUE) {
4297fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4298fcf3ce44SJohn Forte 			    cmdName, gettext("missing target address"));
4299fcf3ce44SJohn Forte 			*funcRet = 1; /* DIY message fix */
4300fcf3ce44SJohn Forte 			return (1);
4301fcf3ce44SJohn Forte 		}
4302fcf3ce44SJohn Forte 		/* Perform string profile checks */
4303fcf3ce44SJohn Forte 		nameCheckStatus = iSCSINameStringProfileCheck(staticTargetName);
4304fcf3ce44SJohn Forte 		iSCSINameCheckStatusDisplay(nameCheckStatus);
4305fcf3ce44SJohn Forte 		if (nameCheckStatus != iSCSINameCheckOK) {
4306fcf3ce44SJohn Forte 			*funcRet = 1; /* DIY message fix */
4307fcf3ce44SJohn Forte 			return (1);
4308fcf3ce44SJohn Forte 		}
4309fcf3ce44SJohn Forte 		(void) wcsncpy(staticConfig.targetName, staticTargetName,
4310fcf3ce44SJohn Forte 		    MAX_ISCSI_NAME_LEN + 1);
4311fcf3ce44SJohn Forte 
4312fcf3ce44SJohn Forte 		(void) wcstombs(sAddr, staticTargetAddress, sizeof (sAddr));
4313fcf3ce44SJohn Forte 
4314fcf3ce44SJohn Forte 		if (isIpv6 == B_TRUE) {
4315fcf3ce44SJohn Forte 			staticConfig.targetAddress.imaStruct.hostnameIpAddress.
4316fcf3ce44SJohn Forte 			    id.ipAddress.ipv4Address = B_FALSE;
4317fcf3ce44SJohn Forte 			addrType = AF_INET6;
4318fcf3ce44SJohn Forte 		} else {
4319fcf3ce44SJohn Forte 			staticConfig.targetAddress.imaStruct.hostnameIpAddress.
4320fcf3ce44SJohn Forte 			    id.ipAddress.ipv4Address = B_TRUE;
4321fcf3ce44SJohn Forte 			addrType = AF_INET;
4322fcf3ce44SJohn Forte 		}
4323fcf3ce44SJohn Forte 
4324fcf3ce44SJohn Forte 		if (inet_pton(addrType, sAddr, staticConfig.targetAddress.
4325fcf3ce44SJohn Forte 		    imaStruct.hostnameIpAddress.id.ipAddress.ipAddress) != 1) {
4326fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4327fcf3ce44SJohn Forte 			    cmdName, gettext("static config conversion error"));
4328fcf3ce44SJohn Forte 			ret = 1;
4329fcf3ce44SJohn Forte 			continue;
4330fcf3ce44SJohn Forte 		}
4331fcf3ce44SJohn Forte 
4332fcf3ce44SJohn Forte 		staticConfig.targetAddress.imaStruct.portNumber = port;
4333fcf3ce44SJohn Forte 		if (tpgtSpecified == B_TRUE) {
4334fcf3ce44SJohn Forte 			staticConfig.targetAddress.defaultTpgt = B_FALSE;
4335fcf3ce44SJohn Forte 			staticConfig.targetAddress.tpgt = tpgt;
4336fcf3ce44SJohn Forte 		} else {
4337fcf3ce44SJohn Forte 			staticConfig.targetAddress.defaultTpgt = B_TRUE;
4338fcf3ce44SJohn Forte 			staticConfig.targetAddress.tpgt = 0;
4339fcf3ce44SJohn Forte 		}
4340fcf3ce44SJohn Forte 
4341fcf3ce44SJohn Forte 		status = SUN_IMA_AddStaticTarget(oid, staticConfig, &oid);
4342fcf3ce44SJohn Forte 		if (!IMA_SUCCESS(status)) {
4343fcf3ce44SJohn Forte 			printLibError(status);
4344fcf3ce44SJohn Forte 			*funcRet = 1;
4345fcf3ce44SJohn Forte 			return (1);
4346fcf3ce44SJohn Forte 		}
4347fcf3ce44SJohn Forte 	}
43485df5713fSbing zhao - Sun Microsystems - Beijing China 
43495df5713fSbing zhao - Sun Microsystems - Beijing China 	if (ret != 0) {
43505df5713fSbing zhao - Sun Microsystems - Beijing China 		*funcRet = 1;
43515df5713fSbing zhao - Sun Microsystems - Beijing China 	}
43525df5713fSbing zhao - Sun Microsystems - Beijing China 
4353fcf3ce44SJohn Forte 	return (ret);
4354fcf3ce44SJohn Forte }
4355fcf3ce44SJohn Forte 
4356fcf3ce44SJohn Forte /*
4357fcf3ce44SJohn Forte  * Remove one or more addresses
4358fcf3ce44SJohn Forte  */
4359fcf3ce44SJohn Forte static int
4360fcf3ce44SJohn Forte removeAddress(int addrType, int operandLen, char *operand[], int *funcRet)
4361fcf3ce44SJohn Forte {
4362fcf3ce44SJohn Forte 	IMA_STATUS status;
4363fcf3ce44SJohn Forte 	IMA_OID initiatorOid;
4364fcf3ce44SJohn Forte 	SUN_IMA_TARGET_ADDRESS address;
4365fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ADDRESS_LEN + 1];
4366fcf3ce44SJohn Forte 	int ret;
4367fcf3ce44SJohn Forte 	int i;
4368fcf3ce44SJohn Forte 
4369fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4370fcf3ce44SJohn Forte 
4371fcf3ce44SJohn Forte 	/* Find Sun initiator */
4372fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
4373fcf3ce44SJohn Forte 	if (ret > 0) {
4374fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4375fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4376fcf3ce44SJohn Forte 	}
4377fcf3ce44SJohn Forte 
4378fcf3ce44SJohn Forte 	if (ret != 0) {
4379fcf3ce44SJohn Forte 		return (ret);
4380fcf3ce44SJohn Forte 	}
4381fcf3ce44SJohn Forte 
4382fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
4383fcf3ce44SJohn Forte 		/* initialize */
4384fcf3ce44SJohn Forte 		(void) memset(&wcInputObject[0], 0, sizeof (wcInputObject));
4385fcf3ce44SJohn Forte 		(void) memset(&address, 0, sizeof (address));
4386fcf3ce44SJohn Forte 
4387fcf3ce44SJohn Forte 		if (mbstowcs(wcInputObject, operand[i],
4388fcf3ce44SJohn Forte 		    MAX_ADDRESS_LEN + 1) == (size_t)-1) {
4389fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4390fcf3ce44SJohn Forte 			    cmdName, gettext("conversion error"));
4391fcf3ce44SJohn Forte 			ret = 1;
4392fcf3ce44SJohn Forte 			continue;
4393fcf3ce44SJohn Forte 		}
4394fcf3ce44SJohn Forte 
4395fcf3ce44SJohn Forte 		if (getTargetAddress(addrType, operand[i], &address.imaStruct)
4396fcf3ce44SJohn Forte 		    != 0) {
4397fcf3ce44SJohn Forte 			ret = 1;
4398fcf3ce44SJohn Forte 			continue;
4399fcf3ce44SJohn Forte 		}
4400fcf3ce44SJohn Forte 
4401fcf3ce44SJohn Forte 		if (addrType == DISCOVERY_ADDRESS) {
4402fcf3ce44SJohn Forte 			status = SUN_IMA_RemoveDiscoveryAddress(address);
4403fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4404fcf3ce44SJohn Forte 				if (status == IMA_ERROR_OBJECT_NOT_FOUND) {
4405fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s\n",
4406fcf3ce44SJohn Forte 					    operand[i], gettext("not found"));
4407fcf3ce44SJohn Forte 				} else {
4408fcf3ce44SJohn Forte 					printLibError(status);
4409fcf3ce44SJohn Forte 				}
4410fcf3ce44SJohn Forte 				*funcRet = 1;
4411fcf3ce44SJohn Forte 			}
4412fcf3ce44SJohn Forte 		} else {
4413fcf3ce44SJohn Forte 			status = SUN_IMA_RemoveISNSServerAddress(address);
4414fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4415fcf3ce44SJohn Forte 				printLibError(status);
4416fcf3ce44SJohn Forte 				*funcRet = 1;
4417fcf3ce44SJohn Forte 			}
4418fcf3ce44SJohn Forte 		}
4419fcf3ce44SJohn Forte 	}
4420fcf3ce44SJohn Forte 	return (ret);
4421fcf3ce44SJohn Forte }
4422fcf3ce44SJohn Forte 
4423fcf3ce44SJohn Forte /*
4424fcf3ce44SJohn Forte  * Remove one or more static configuration targets
4425fcf3ce44SJohn Forte  */
4426fcf3ce44SJohn Forte static int
4427fcf3ce44SJohn Forte removeStaticConfig(int operandLen, char *operand[], int *funcRet)
4428fcf3ce44SJohn Forte {
4429fcf3ce44SJohn Forte 	IMA_STATUS status;
4430fcf3ce44SJohn Forte 	IMA_OID initiatorOid;
4431fcf3ce44SJohn Forte 	IMA_OID_LIST *staticTargetList;
4432fcf3ce44SJohn Forte 	SUN_IMA_STATIC_TARGET_PROPERTIES staticTargetProps;
4433fcf3ce44SJohn Forte 	wchar_t staticTargetName[MAX_ISCSI_NAME_LEN + 1];
4434fcf3ce44SJohn Forte 	wchar_t staticTargetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
4435fcf3ce44SJohn Forte 	int ret;
4436fcf3ce44SJohn Forte 	boolean_t atLeastFoundOne;
4437fcf3ce44SJohn Forte 	boolean_t matched;
4438fcf3ce44SJohn Forte 	boolean_t targetAddressSpecified = B_TRUE;
4439fcf3ce44SJohn Forte 	boolean_t tpgtSpecified = B_FALSE;
4440fcf3ce44SJohn Forte 	boolean_t isIpv6 = B_FALSE;
4441fcf3ce44SJohn Forte 	int i, j;
4442fcf3ce44SJohn Forte 	IMA_UINT16 port = 0;
4443fcf3ce44SJohn Forte 	IMA_UINT16 tpgt = 0;
4444fcf3ce44SJohn Forte 	iSCSINameCheckStatusType nameCheckStatus;
4445fcf3ce44SJohn Forte 	char tmpStr[SUN_IMA_IP_ADDRESS_PORT_LEN];
4446fcf3ce44SJohn Forte 	wchar_t tmpTargetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
4447fcf3ce44SJohn Forte 
4448fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4449fcf3ce44SJohn Forte 
4450fcf3ce44SJohn Forte 	/* Find Sun initiator */
4451fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
4452fcf3ce44SJohn Forte 	if (ret > 0) {
4453fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4454fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4455fcf3ce44SJohn Forte 	}
4456fcf3ce44SJohn Forte 
4457fcf3ce44SJohn Forte 	if (ret != 0) {
4458fcf3ce44SJohn Forte 		return (ret);
4459fcf3ce44SJohn Forte 	}
4460fcf3ce44SJohn Forte 
4461fcf3ce44SJohn Forte 	status = IMA_GetStaticDiscoveryTargetOidList(initiatorOid,
4462fcf3ce44SJohn Forte 	    &staticTargetList);
4463fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
4464fcf3ce44SJohn Forte 		printLibError(status);
4465fcf3ce44SJohn Forte 		*funcRet = 1;
4466fcf3ce44SJohn Forte 		return (ret);
4467fcf3ce44SJohn Forte 	}
4468fcf3ce44SJohn Forte 
4469fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
4470fcf3ce44SJohn Forte 		if (parseTarget(operand[i],
4471fcf3ce44SJohn Forte 		    &staticTargetName[0],
4472fcf3ce44SJohn Forte 		    MAX_ISCSI_NAME_LEN + 1,
4473fcf3ce44SJohn Forte 		    &targetAddressSpecified,
4474fcf3ce44SJohn Forte 		    &staticTargetAddress[0],
4475fcf3ce44SJohn Forte 		    SUN_IMA_IP_ADDRESS_PORT_LEN,
4476fcf3ce44SJohn Forte 		    &port,
4477fcf3ce44SJohn Forte 		    &tpgtSpecified,
4478fcf3ce44SJohn Forte 		    &tpgt,
4479fcf3ce44SJohn Forte 		    &isIpv6) != PARSE_TARGET_OK) {
4480fcf3ce44SJohn Forte 			ret = 1;
4481fcf3ce44SJohn Forte 			continue;
4482fcf3ce44SJohn Forte 		}
4483fcf3ce44SJohn Forte 
4484fcf3ce44SJohn Forte 		/* Perform string profile checks */
4485fcf3ce44SJohn Forte 		nameCheckStatus = iSCSINameStringProfileCheck(staticTargetName);
4486fcf3ce44SJohn Forte 		iSCSINameCheckStatusDisplay(nameCheckStatus);
4487fcf3ce44SJohn Forte 		if (nameCheckStatus != iSCSINameCheckOK) {
4488fcf3ce44SJohn Forte 			return (1);
4489fcf3ce44SJohn Forte 		}
4490fcf3ce44SJohn Forte 
4491fcf3ce44SJohn Forte 		for (atLeastFoundOne = B_FALSE, j = 0;
4492fcf3ce44SJohn Forte 		    j < staticTargetList->oidCount;
4493fcf3ce44SJohn Forte 		    j++) {
4494fcf3ce44SJohn Forte 			IMA_UINT16 stpgt;
4495fcf3ce44SJohn Forte 
4496fcf3ce44SJohn Forte 			matched = B_FALSE;
4497fcf3ce44SJohn Forte 			status = SUN_IMA_GetStaticTargetProperties(
4498fcf3ce44SJohn Forte 			    staticTargetList->oids[j], &staticTargetProps);
4499fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4500fcf3ce44SJohn Forte 				if (status == IMA_ERROR_OBJECT_NOT_FOUND) {
4501fcf3ce44SJohn Forte 					/*
4502fcf3ce44SJohn Forte 					 * When removing multiple static-config
4503fcf3ce44SJohn Forte 					 * entries we need to expect get
4504fcf3ce44SJohn Forte 					 * failures. These failures occur when
4505fcf3ce44SJohn Forte 					 * we are trying to get entry
4506fcf3ce44SJohn Forte 					 * information we have just removed.
4507fcf3ce44SJohn Forte 					 * Ignore the failure and continue.
4508fcf3ce44SJohn Forte 					 */
4509fcf3ce44SJohn Forte 					ret = 1;
4510fcf3ce44SJohn Forte 					continue;
4511fcf3ce44SJohn Forte 				} else {
4512fcf3ce44SJohn Forte 					printLibError(status);
4513fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(staticTargetList);
4514fcf3ce44SJohn Forte 					*funcRet = 1;
4515fcf3ce44SJohn Forte 					return (ret);
4516fcf3ce44SJohn Forte 				}
4517fcf3ce44SJohn Forte 			}
4518fcf3ce44SJohn Forte 
4519fcf3ce44SJohn Forte 			stpgt =
4520fcf3ce44SJohn Forte 			    staticTargetProps.staticTarget.targetAddress.tpgt;
4521fcf3ce44SJohn Forte 
4522fcf3ce44SJohn Forte 			/*
4523fcf3ce44SJohn Forte 			 * Compare the static target name with the input if
4524fcf3ce44SJohn Forte 			 * one was input
4525fcf3ce44SJohn Forte 			 */
4526fcf3ce44SJohn Forte 			if ((targetNamesEqual(
4527fcf3ce44SJohn Forte 			    staticTargetProps.staticTarget.targetName,
4528fcf3ce44SJohn Forte 			    staticTargetName) == B_TRUE)) {
4529fcf3ce44SJohn Forte 				if (targetAddressSpecified == B_FALSE) {
4530fcf3ce44SJohn Forte 					matched = B_TRUE;
4531fcf3ce44SJohn Forte 				} else {
4532fcf3ce44SJohn Forte 
4533fcf3ce44SJohn Forte 					if (staticTargetProps.staticTarget.
4534fcf3ce44SJohn Forte 					    targetAddress.imaStruct.
4535fcf3ce44SJohn Forte 					    hostnameIpAddress.
4536fcf3ce44SJohn Forte 					    id.ipAddress.ipv4Address ==
4537fcf3ce44SJohn Forte 					    IMA_TRUE) {
4538fcf3ce44SJohn Forte 						(void) inet_ntop(AF_INET,
4539fcf3ce44SJohn Forte 						    staticTargetProps.
4540fcf3ce44SJohn Forte 						    staticTarget.targetAddress.
4541fcf3ce44SJohn Forte 						    imaStruct.hostnameIpAddress.
4542fcf3ce44SJohn Forte 						    id.ipAddress.ipAddress,
4543fcf3ce44SJohn Forte 						    tmpStr,
4544fcf3ce44SJohn Forte 						    sizeof (tmpStr));
4545fcf3ce44SJohn Forte 					} else {
4546fcf3ce44SJohn Forte 						(void) inet_ntop(AF_INET6,
4547fcf3ce44SJohn Forte 						    staticTargetProps.
4548fcf3ce44SJohn Forte 						    staticTarget.targetAddress.
4549fcf3ce44SJohn Forte 						    imaStruct.hostnameIpAddress.
4550fcf3ce44SJohn Forte 						    id.ipAddress.ipAddress,
4551fcf3ce44SJohn Forte 						    tmpStr,
4552fcf3ce44SJohn Forte 						    sizeof (tmpStr));
4553fcf3ce44SJohn Forte 					}
4554fcf3ce44SJohn Forte 
4555fcf3ce44SJohn Forte 					if (mbstowcs(tmpTargetAddress, tmpStr,
4556fcf3ce44SJohn Forte 					    SUN_IMA_IP_ADDRESS_PORT_LEN) ==
4557fcf3ce44SJohn Forte 					    (size_t)-1) {
4558fcf3ce44SJohn Forte 						(void) fprintf(stderr,
4559fcf3ce44SJohn Forte 						    "%s: %s\n",
4560fcf3ce44SJohn Forte 						    cmdName, gettext(
4561fcf3ce44SJohn Forte 						    "conversion error"));
4562fcf3ce44SJohn Forte 						ret = 1;
4563fcf3ce44SJohn Forte 						continue;
4564fcf3ce44SJohn Forte 					}
4565fcf3ce44SJohn Forte 
4566fcf3ce44SJohn Forte 					if ((wcsncmp(tmpTargetAddress,
4567fcf3ce44SJohn Forte 					    staticTargetAddress,
4568fcf3ce44SJohn Forte 					    SUN_IMA_IP_ADDRESS_PORT_LEN) ==
4569fcf3ce44SJohn Forte 					    0) && (staticTargetProps.
4570fcf3ce44SJohn Forte 					    staticTarget.targetAddress.
4571fcf3ce44SJohn Forte 					    imaStruct.portNumber == port)) {
4572fcf3ce44SJohn Forte 						if (tpgtSpecified == B_FALSE) {
4573fcf3ce44SJohn Forte 							matched = B_TRUE;
4574fcf3ce44SJohn Forte 						} else {
4575fcf3ce44SJohn Forte 							if (tpgt == stpgt) {
4576fcf3ce44SJohn Forte 								matched =
4577fcf3ce44SJohn Forte 								    B_TRUE;
4578fcf3ce44SJohn Forte 							}
4579fcf3ce44SJohn Forte 						}
4580fcf3ce44SJohn Forte 					}
4581fcf3ce44SJohn Forte 				}
4582fcf3ce44SJohn Forte 
4583fcf3ce44SJohn Forte 				if (matched) {
4584fcf3ce44SJohn Forte 					status =
4585fcf3ce44SJohn Forte 					    IMA_RemoveStaticDiscoveryTarget(
4586fcf3ce44SJohn Forte 					    staticTargetList->oids[j]);
4587fcf3ce44SJohn Forte 					if (!IMA_SUCCESS(status)) {
4588fcf3ce44SJohn Forte 						printLibError(status);
4589fcf3ce44SJohn Forte 						*funcRet = 1;
4590fcf3ce44SJohn Forte 						return (ret);
4591fcf3ce44SJohn Forte 					}
4592fcf3ce44SJohn Forte 					atLeastFoundOne = B_TRUE;
4593fcf3ce44SJohn Forte 				}
4594fcf3ce44SJohn Forte 			}
4595fcf3ce44SJohn Forte 		}
4596fcf3ce44SJohn Forte 		if (!atLeastFoundOne) {
4597fcf3ce44SJohn Forte 			(void) fprintf(stderr, gettext("%ws,%ws: %s\n"),
4598fcf3ce44SJohn Forte 			    staticTargetName, staticTargetAddress,
4599fcf3ce44SJohn Forte 			    gettext("not found"));
4600fcf3ce44SJohn Forte 		}
4601fcf3ce44SJohn Forte 	}
4602fcf3ce44SJohn Forte 	return (ret);
4603fcf3ce44SJohn Forte }
4604fcf3ce44SJohn Forte 
4605fcf3ce44SJohn Forte /*
4606fcf3ce44SJohn Forte  * Remove one or more target params.
4607fcf3ce44SJohn Forte  */
4608fcf3ce44SJohn Forte static int
4609fcf3ce44SJohn Forte removeTargetParam(int operandLen, char *operand[], int *funcRet)
4610fcf3ce44SJohn Forte {
4611fcf3ce44SJohn Forte 	char *commaPos;
4612fcf3ce44SJohn Forte 	IMA_STATUS status;
4613fcf3ce44SJohn Forte 	IMA_OID initiatorOid;
4614fcf3ce44SJohn Forte 	IMA_OID_LIST *targetList;
4615fcf3ce44SJohn Forte 	SUN_IMA_TARGET_PROPERTIES targetProps;
4616fcf3ce44SJohn Forte 	wchar_t wcInputObject[MAX_ISCSI_NAME_LEN + 1];
4617fcf3ce44SJohn Forte 	int ret;
4618fcf3ce44SJohn Forte 	boolean_t found;
4619fcf3ce44SJohn Forte 	int i, j;
46206cefaae1SJack Meng 	IMA_NODE_NAME bootTargetName;
46216cefaae1SJack Meng 	IMA_BOOL	iscsiBoot = IMA_FALSE;
46226cefaae1SJack Meng 	IMA_BOOL	mpxioEnabled = IMA_FALSE;
46236cefaae1SJack Meng 
46246cefaae1SJack Meng 	/* Get boot session's info */
46256cefaae1SJack Meng 	(void) SUN_IMA_GetBootIscsi(&iscsiBoot);
46266cefaae1SJack Meng 	if (iscsiBoot == IMA_TRUE) {
46276cefaae1SJack Meng 		status = SUN_IMA_GetBootMpxio(&mpxioEnabled);
46286cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
46296cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
46306cefaae1SJack Meng 			    cmdName, gettext("unable to get MPxIO info of"
46316cefaae1SJack Meng 			    " root disk"));
46326cefaae1SJack Meng 			*funcRet = 1;
46336cefaae1SJack Meng 			return (1);
46346cefaae1SJack Meng 		}
46356cefaae1SJack Meng 		status = SUN_IMA_GetBootTargetName(bootTargetName);
46366cefaae1SJack Meng 		if (!IMA_SUCCESS(status)) {
46376cefaae1SJack Meng 			(void) fprintf(stderr, "%s: %s\n",
46386cefaae1SJack Meng 			    cmdName, gettext("unable to get boot"
46396cefaae1SJack Meng 			    " target's name"));
46406cefaae1SJack Meng 			*funcRet = 1;
46416cefaae1SJack Meng 			return (1);
46426cefaae1SJack Meng 		}
46436cefaae1SJack Meng 	}
4644fcf3ce44SJohn Forte 
4645fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4646fcf3ce44SJohn Forte 
4647fcf3ce44SJohn Forte 	/* Find Sun initiator */
4648fcf3ce44SJohn Forte 	ret = sunInitiatorFind(&initiatorOid);
4649fcf3ce44SJohn Forte 	if (ret > 0) {
4650fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4651fcf3ce44SJohn Forte 		    cmdName, gettext("no initiator found"));
4652fcf3ce44SJohn Forte 	}
4653fcf3ce44SJohn Forte 
4654fcf3ce44SJohn Forte 	if (ret != 0) {
4655fcf3ce44SJohn Forte 		return (ret);
4656fcf3ce44SJohn Forte 	}
4657fcf3ce44SJohn Forte 
4658fcf3ce44SJohn Forte 	status = IMA_GetTargetOidList(initiatorOid, &targetList);
4659fcf3ce44SJohn Forte 	if (!IMA_SUCCESS(status)) {
4660fcf3ce44SJohn Forte 		printLibError(status);
4661fcf3ce44SJohn Forte 		*funcRet = 1;
4662fcf3ce44SJohn Forte 		return (ret);
4663fcf3ce44SJohn Forte 	}
4664fcf3ce44SJohn Forte 
4665fcf3ce44SJohn Forte 	for (i = 0; i < operandLen; i++) {
4666fcf3ce44SJohn Forte 		/* initialize */
4667fcf3ce44SJohn Forte 		commaPos = strchr(operand[i], ',');
4668fcf3ce44SJohn Forte 		if (commaPos) {
4669fcf3ce44SJohn Forte 			/* Ignore IP address. */
4670fcf3ce44SJohn Forte 			*commaPos = NULL;
4671fcf3ce44SJohn Forte 		}
4672fcf3ce44SJohn Forte 		(void) memset(&wcInputObject[0], 0, sizeof (wcInputObject));
4673fcf3ce44SJohn Forte 		if (mbstowcs(wcInputObject, operand[i],
4674fcf3ce44SJohn Forte 		    MAX_ISCSI_NAME_LEN + 1) == (size_t)-1) {
4675fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4676fcf3ce44SJohn Forte 			    gettext("conversion error"));
4677fcf3ce44SJohn Forte 			ret = 1;
4678fcf3ce44SJohn Forte 			continue;
4679fcf3ce44SJohn Forte 		}
4680fcf3ce44SJohn Forte 
4681fcf3ce44SJohn Forte 		for (found = B_FALSE, j = 0; j < targetList->oidCount;
4682fcf3ce44SJohn Forte 		    j++) {
4683fcf3ce44SJohn Forte 			status = SUN_IMA_GetTargetProperties(
4684fcf3ce44SJohn Forte 			    targetList->oids[j], &targetProps);
4685fcf3ce44SJohn Forte 			if (!IMA_SUCCESS(status)) {
4686fcf3ce44SJohn Forte 				printLibError(status);
4687fcf3ce44SJohn Forte 				(void) IMA_FreeMemory(targetList);
4688fcf3ce44SJohn Forte 				*funcRet = 1;
4689fcf3ce44SJohn Forte 				return (ret);
4690fcf3ce44SJohn Forte 			}
4691fcf3ce44SJohn Forte 
4692fcf3ce44SJohn Forte 			/*
4693fcf3ce44SJohn Forte 			 * Compare the target name with the input if
4694fcf3ce44SJohn Forte 			 * one was input
4695fcf3ce44SJohn Forte 			 */
4696fcf3ce44SJohn Forte 			if (targetNamesEqual(targetProps.imaProps.name,
4697fcf3ce44SJohn Forte 			    wcInputObject) == B_TRUE) {
4698fcf3ce44SJohn Forte 				found = B_TRUE;
46996cefaae1SJack Meng 				if ((targetNamesEqual(bootTargetName,
47006cefaae1SJack Meng 				    wcInputObject) == B_TRUE) &&
47016cefaae1SJack Meng 				    (iscsiBoot == IMA_TRUE)) {
47026cefaae1SJack Meng 					/*
47036cefaae1SJack Meng 					 * iscsi booting, need changed target
47046cefaae1SJack Meng 					 * param is booting target, booting
47056cefaae1SJack Meng 					 * session mpxio disabled, not
47066cefaae1SJack Meng 					 * allow to update
47076cefaae1SJack Meng 					 */
47086cefaae1SJack Meng 					if (mpxioEnabled == IMA_FALSE) {
47096cefaae1SJack Meng 						(void) fprintf(stderr,
47106cefaae1SJack Meng 						    "%s: %s\n", cmdName,
47116cefaae1SJack Meng 						    gettext("iscsi boot"
47126cefaae1SJack Meng 						    " with MPxIO disabled,"
47136cefaae1SJack Meng 						    " not allowed to remove"
47146cefaae1SJack Meng 						    " boot sess param"));
4715f03fb72cSyi zhang - Sun Microsystems - Beijing China 						ret = 1;
47166cefaae1SJack Meng 						continue;
47176cefaae1SJack Meng 					}
47186cefaae1SJack Meng 
47196cefaae1SJack Meng 				}
47206cefaae1SJack Meng 
4721fcf3ce44SJohn Forte 				status = SUN_IMA_RemoveTargetParam(
4722fcf3ce44SJohn Forte 				    targetList->oids[j]);
4723fcf3ce44SJohn Forte 				if (!IMA_SUCCESS(status)) {
4724fcf3ce44SJohn Forte 					printLibError(status);
4725fcf3ce44SJohn Forte 					(void) IMA_FreeMemory(targetList);
4726fcf3ce44SJohn Forte 					*funcRet = 1;
4727fcf3ce44SJohn Forte 					return (ret);
4728fcf3ce44SJohn Forte 				}
4729fcf3ce44SJohn Forte 			}
4730fcf3ce44SJohn Forte 		}
4731fcf3ce44SJohn Forte 		if (!found) {
4732fcf3ce44SJohn Forte 			/* Silently ignoring it? */
4733fcf3ce44SJohn Forte 			(void) fprintf(stderr, gettext("%ws: %s\n"),
4734fcf3ce44SJohn Forte 			    wcInputObject, gettext("not found"));
4735fcf3ce44SJohn Forte 		}
4736fcf3ce44SJohn Forte 	}
4737fcf3ce44SJohn Forte 
4738fcf3ce44SJohn Forte 	(void) IMA_FreeMemory(targetList);
4739fcf3ce44SJohn Forte 	return (ret);
4740fcf3ce44SJohn Forte }
4741fcf3ce44SJohn Forte 
4742fcf3ce44SJohn Forte /*ARGSUSED*/
4743fcf3ce44SJohn Forte static int
4744fcf3ce44SJohn Forte addFunc(int operandLen, char *operand[], int object, cmdOptions_t *options,
4745fcf3ce44SJohn Forte     void *addArgs, int *funcRet)
4746fcf3ce44SJohn Forte {
4747fcf3ce44SJohn Forte 	int ret;
4748fcf3ce44SJohn Forte 
4749fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4750fcf3ce44SJohn Forte 
4751fcf3ce44SJohn Forte 	switch (object) {
4752fcf3ce44SJohn Forte 		case DISCOVERY_ADDRESS:
4753fcf3ce44SJohn Forte 		case ISNS_SERVER_ADDRESS:
4754fcf3ce44SJohn Forte 			ret = addAddress(object, operandLen, operand, funcRet);
4755fcf3ce44SJohn Forte 			break;
4756fcf3ce44SJohn Forte 		case STATIC_CONFIG:
4757fcf3ce44SJohn Forte 			ret = addStaticConfig(operandLen, operand, funcRet);
4758fcf3ce44SJohn Forte 			break;
4759fcf3ce44SJohn Forte 		default:
4760fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4761fcf3ce44SJohn Forte 			    cmdName, gettext("unknown object"));
4762fcf3ce44SJohn Forte 			ret = 1;
4763fcf3ce44SJohn Forte 			break;
4764fcf3ce44SJohn Forte 	}
4765fcf3ce44SJohn Forte 	return (ret);
4766fcf3ce44SJohn Forte }
4767fcf3ce44SJohn Forte 
4768fcf3ce44SJohn Forte /*ARGSUSED*/
4769fcf3ce44SJohn Forte static int
4770fcf3ce44SJohn Forte listFunc(int operandLen, char *operand[], int object, cmdOptions_t *options,
4771fcf3ce44SJohn Forte     void *addArgs, int *funcRet)
4772fcf3ce44SJohn Forte {
4773fcf3ce44SJohn Forte 	int ret;
4774fcf3ce44SJohn Forte 
4775fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4776fcf3ce44SJohn Forte 
4777fcf3ce44SJohn Forte 	switch (object) {
4778fcf3ce44SJohn Forte 	case DISCOVERY:
4779fcf3ce44SJohn Forte 		ret = listDiscovery(funcRet);
4780fcf3ce44SJohn Forte 		break;
4781fcf3ce44SJohn Forte 	case DISCOVERY_ADDRESS:
4782fcf3ce44SJohn Forte 		ret = listDiscoveryAddress(operandLen, operand, options,
4783fcf3ce44SJohn Forte 		    funcRet);
4784fcf3ce44SJohn Forte 		break;
4785fcf3ce44SJohn Forte 	case ISNS_SERVER_ADDRESS:
4786fcf3ce44SJohn Forte 		ret = listISNSServerAddress(operandLen, operand, options,
4787fcf3ce44SJohn Forte 		    funcRet);
4788fcf3ce44SJohn Forte 		break;
4789fcf3ce44SJohn Forte 	case NODE:
4790fcf3ce44SJohn Forte 		ret = listNode(funcRet);
4791fcf3ce44SJohn Forte 		break;
4792fcf3ce44SJohn Forte 	case STATIC_CONFIG:
4793fcf3ce44SJohn Forte 		ret = listStaticConfig(operandLen, operand, funcRet);
4794fcf3ce44SJohn Forte 		break;
4795fcf3ce44SJohn Forte 	case TARGET:
4796fcf3ce44SJohn Forte 		ret = listTarget(operandLen, operand, options, funcRet);
4797fcf3ce44SJohn Forte 		break;
4798fcf3ce44SJohn Forte 	case TARGET_PARAM:
4799fcf3ce44SJohn Forte 		ret = listTargetParam(operandLen, operand, options, funcRet);
4800fcf3ce44SJohn Forte 		break;
4801fcf3ce44SJohn Forte 	default:
4802fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4803fcf3ce44SJohn Forte 		    cmdName, gettext("unknown object"));
4804fcf3ce44SJohn Forte 		ret = 1;
4805fcf3ce44SJohn Forte 		break;
4806fcf3ce44SJohn Forte 	}
4807fcf3ce44SJohn Forte 	return (ret);
4808fcf3ce44SJohn Forte }
4809fcf3ce44SJohn Forte 
4810fcf3ce44SJohn Forte /*ARGSUSED*/
4811fcf3ce44SJohn Forte static int
4812fcf3ce44SJohn Forte modifyFunc(int operandLen, char *operand[], int object, cmdOptions_t *options,
4813fcf3ce44SJohn Forte     void *addArgs, int *funcRet)
4814fcf3ce44SJohn Forte {
4815fcf3ce44SJohn Forte 	int ret, i;
4816fcf3ce44SJohn Forte 
4817fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4818fcf3ce44SJohn Forte 
4819fcf3ce44SJohn Forte 	switch (object) {
4820fcf3ce44SJohn Forte 	case DISCOVERY:
4821fcf3ce44SJohn Forte 		ret = modifyDiscovery(options, funcRet);
4822fcf3ce44SJohn Forte 		break;
4823fcf3ce44SJohn Forte 	case NODE:
4824fcf3ce44SJohn Forte 		ret = modifyNode(options, funcRet);
4825fcf3ce44SJohn Forte 		break;
4826fcf3ce44SJohn Forte 	case TARGET_PARAM:
4827fcf3ce44SJohn Forte 		i = 0;
4828fcf3ce44SJohn Forte 		while (operand[i]) {
4829fcf3ce44SJohn Forte 			ret = modifyTargetParam(options, operand[i], funcRet);
4830fcf3ce44SJohn Forte 
4831fcf3ce44SJohn Forte 			if (ret) {
4832fcf3ce44SJohn Forte 				(void) fprintf(stderr, "%s: %s: %s\n",
4833fcf3ce44SJohn Forte 				    cmdName, gettext("modify failed"),
4834fcf3ce44SJohn Forte 				    operand[i]);
4835fcf3ce44SJohn Forte 				return (ret);
4836fcf3ce44SJohn Forte 			}
4837fcf3ce44SJohn Forte 			i++;
4838fcf3ce44SJohn Forte 		}
4839fcf3ce44SJohn Forte 
4840fcf3ce44SJohn Forte 		break;
4841fcf3ce44SJohn Forte 	default:
4842fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
4843fcf3ce44SJohn Forte 		    cmdName, gettext("unknown object"));
4844fcf3ce44SJohn Forte 		ret = 1;
4845fcf3ce44SJohn Forte 		break;
4846fcf3ce44SJohn Forte 	}
4847fcf3ce44SJohn Forte 	return (ret);
4848fcf3ce44SJohn Forte }
4849fcf3ce44SJohn Forte 
4850fcf3ce44SJohn Forte /*ARGSUSED*/
4851fcf3ce44SJohn Forte static int
4852fcf3ce44SJohn Forte removeFunc(int operandLen, char *operand[], int object, cmdOptions_t *options,
4853fcf3ce44SJohn Forte     void *addArgs, int *funcRet)
4854fcf3ce44SJohn Forte {
4855fcf3ce44SJohn Forte 	int ret;
4856fcf3ce44SJohn Forte 
4857fcf3ce44SJohn Forte 	switch (object) {
4858fcf3ce44SJohn Forte 		case DISCOVERY_ADDRESS:
4859fcf3ce44SJohn Forte 		case ISNS_SERVER_ADDRESS:
4860fcf3ce44SJohn Forte 			ret = removeAddress(object, operandLen, operand,
4861fcf3ce44SJohn Forte 			    funcRet);
4862fcf3ce44SJohn Forte 			break;
4863fcf3ce44SJohn Forte 		case STATIC_CONFIG:
4864fcf3ce44SJohn Forte 			ret = removeStaticConfig(operandLen, operand, funcRet);
4865fcf3ce44SJohn Forte 			break;
4866fcf3ce44SJohn Forte 		case TARGET_PARAM:
4867fcf3ce44SJohn Forte 			ret = removeTargetParam(operandLen, operand, funcRet);
4868fcf3ce44SJohn Forte 			break;
4869fcf3ce44SJohn Forte 		default:
4870fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4871fcf3ce44SJohn Forte 			    cmdName, gettext("unknown object"));
4872fcf3ce44SJohn Forte 			ret = 1;
4873fcf3ce44SJohn Forte 			break;
4874fcf3ce44SJohn Forte 	}
4875fcf3ce44SJohn Forte 	return (ret);
4876fcf3ce44SJohn Forte }
4877fcf3ce44SJohn Forte 
4878fcf3ce44SJohn Forte static void
4879fcf3ce44SJohn Forte iSCSINameCheckStatusDisplay(iSCSINameCheckStatusType status)
4880fcf3ce44SJohn Forte {
4881fcf3ce44SJohn Forte 	switch (status) {
4882fcf3ce44SJohn Forte 		case iSCSINameLenZero:
4883fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4884fcf3ce44SJohn Forte 			    cmdName, gettext("empty iSCSI name."));
4885fcf3ce44SJohn Forte 			break;
4886fcf3ce44SJohn Forte 		case iSCSINameLenExceededMax:
4887fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4888fcf3ce44SJohn Forte 			    gettext("iSCSI name exceeded maximum length."));
4889fcf3ce44SJohn Forte 			break;
4890fcf3ce44SJohn Forte 		case iSCSINameUnknownType:
4891fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4892fcf3ce44SJohn Forte 			    gettext("unknown iSCSI name type."));
4893fcf3ce44SJohn Forte 			break;
4894fcf3ce44SJohn Forte 		case iSCSINameInvalidCharacter:
4895fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4896fcf3ce44SJohn Forte 			    cmdName,
4897fcf3ce44SJohn Forte 			    gettext("iSCSI name invalid character used"));
4898fcf3ce44SJohn Forte 			break;
4899fcf3ce44SJohn Forte 		case iSCSINameIqnFormatError:
4900fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4901fcf3ce44SJohn Forte 			    gettext("iqn formatting error."));
4902fcf3ce44SJohn Forte 			break;
4903fcf3ce44SJohn Forte 		case iSCSINameIqnDateFormatError:
4904fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4905fcf3ce44SJohn Forte 			    cmdName, gettext("invalid iqn date." \
4906fcf3ce44SJohn Forte 			    "  format is: YYYY-MM"));
4907fcf3ce44SJohn Forte 			break;
4908fcf3ce44SJohn Forte 		case iSCSINameIqnSubdomainFormatError:
4909fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4910fcf3ce44SJohn Forte 			    cmdName, gettext("missing subdomain after \":\""));
4911fcf3ce44SJohn Forte 			break;
4912fcf3ce44SJohn Forte 		case iSCSINameIqnInvalidYearError:
4913fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4914fcf3ce44SJohn Forte 			    cmdName, gettext("invalid year"));
4915fcf3ce44SJohn Forte 			break;
4916fcf3ce44SJohn Forte 		case iSCSINameIqnInvalidMonthError:
4917fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4918fcf3ce44SJohn Forte 			    cmdName, gettext("invalid month"));
4919fcf3ce44SJohn Forte 			break;
4920fcf3ce44SJohn Forte 		case iSCSINameIqnFQDNError:
4921fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
4922fcf3ce44SJohn Forte 			    cmdName, gettext("missing reversed fully qualified"\
4923fcf3ce44SJohn Forte 			    " domain name"));
4924fcf3ce44SJohn Forte 			break;
4925fcf3ce44SJohn Forte 		case iSCSINameEUIFormatError:
4926fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n", cmdName,
4927fcf3ce44SJohn Forte 			    gettext("eui formatting error."));
4928fcf3ce44SJohn Forte 			break;
4929fcf3ce44SJohn Forte 	}
4930fcf3ce44SJohn Forte }
4931fcf3ce44SJohn Forte 
4932fcf3ce44SJohn Forte /*
4933fcf3ce44SJohn Forte  * A convenient function to modify the target parameters of an individual
4934fcf3ce44SJohn Forte  * target.
4935fcf3ce44SJohn Forte  *
4936fcf3ce44SJohn Forte  * Return 0 if successful
4937fcf3ce44SJohn Forte  * Return 1 if failed
4938fcf3ce44SJohn Forte  */
4939fcf3ce44SJohn Forte static int
4940fcf3ce44SJohn Forte modifyIndividualTargetParam(cmdOptions_t *optionList, IMA_OID targetOid,
4941fcf3ce44SJohn Forte     int *funcRet)
4942fcf3ce44SJohn Forte {
4943fcf3ce44SJohn Forte 	assert(funcRet != NULL);
4944fcf3ce44SJohn Forte 
4945fcf3ce44SJohn Forte 	for (; optionList->optval; optionList++) {
4946fcf3ce44SJohn Forte 		switch (optionList->optval) {
4947fcf3ce44SJohn Forte 			case 'a':
4948fcf3ce44SJohn Forte 				if (modifyTargetAuthMethod(targetOid,
4949fcf3ce44SJohn Forte 				    optionList->optarg, funcRet) != 0) {
4950fcf3ce44SJohn Forte 					return (1);
4951fcf3ce44SJohn Forte 				}
4952fcf3ce44SJohn Forte 				break;
4953fcf3ce44SJohn Forte 			case 'B':
4954fcf3ce44SJohn Forte 				if (modifyTargetBidirAuthFlag(targetOid,
4955fcf3ce44SJohn Forte 				    optionList->optarg, funcRet) != 0) {
4956fcf3ce44SJohn Forte 					return (1);
4957fcf3ce44SJohn Forte 				}
4958fcf3ce44SJohn Forte 				break;
4959fcf3ce44SJohn Forte 			case 'C':
4960fcf3ce44SJohn Forte 				if (modifyTargetAuthParam(targetOid,
4961fcf3ce44SJohn Forte 				    AUTH_PASSWORD, NULL, funcRet) != 0) {
4962fcf3ce44SJohn Forte 					return (1);
4963fcf3ce44SJohn Forte 				}
4964fcf3ce44SJohn Forte 				break;
4965fcf3ce44SJohn Forte 			case 'd':
4966fcf3ce44SJohn Forte 				if (setLoginParameter(targetOid, DATA_DIGEST,
4967fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
4968fcf3ce44SJohn Forte 					return (1);
4969fcf3ce44SJohn Forte 				}
4970fcf3ce44SJohn Forte 				break;
4971fcf3ce44SJohn Forte 			case 'h':
4972fcf3ce44SJohn Forte 				if (setLoginParameter(targetOid, HEADER_DIGEST,
4973fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
4974fcf3ce44SJohn Forte 					return (1);
4975fcf3ce44SJohn Forte 				}
4976fcf3ce44SJohn Forte 				break;
4977fcf3ce44SJohn Forte 			case 'p':
4978fcf3ce44SJohn Forte 				/* Login parameter */
4979fcf3ce44SJohn Forte 				if (setLoginParameters(targetOid,
4980fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
4981fcf3ce44SJohn Forte 					return (1);
4982fcf3ce44SJohn Forte 				}
4983fcf3ce44SJohn Forte 				break;
4984fcf3ce44SJohn Forte 			case 'c':
4985fcf3ce44SJohn Forte 				/* Modify configure sessions */
4986fcf3ce44SJohn Forte 				if (modifyConfiguredSessions(targetOid,
4987fcf3ce44SJohn Forte 				    optionList->optarg) != 0) {
4988fcf3ce44SJohn Forte 					return (1);
4989fcf3ce44SJohn Forte 				}
4990fcf3ce44SJohn Forte 				break;
4991fcf3ce44SJohn Forte 			case 'H':
4992fcf3ce44SJohn Forte 				if (modifyTargetAuthParam(targetOid, AUTH_NAME,
4993fcf3ce44SJohn Forte 				    optionList->optarg, funcRet) != 0) {
4994fcf3ce44SJohn Forte 					return (1);
4995fcf3ce44SJohn Forte 				}
4996fcf3ce44SJohn Forte 				break;
4997aff4bce5Syi zhang - Sun Microsystems - Beijing China 			case 'T':
4998aff4bce5Syi zhang - Sun Microsystems - Beijing China 				if (setTunableParameters(targetOid,
4999aff4bce5Syi zhang - Sun Microsystems - Beijing China 				    optionList->optarg) != 0) {
5000aff4bce5Syi zhang - Sun Microsystems - Beijing China 					return (1);
5001aff4bce5Syi zhang - Sun Microsystems - Beijing China 				}
5002aff4bce5Syi zhang - Sun Microsystems - Beijing China 				break;
5003fcf3ce44SJohn Forte 		}
5004fcf3ce44SJohn Forte 	}
5005fcf3ce44SJohn Forte 
5006fcf3ce44SJohn Forte 	return (0);
5007fcf3ce44SJohn Forte }
5008fcf3ce44SJohn Forte 
5009fcf3ce44SJohn Forte /*
5010fcf3ce44SJohn Forte  * This helper function could go into a utility module for general use.
5011fcf3ce44SJohn Forte  */
5012fcf3ce44SJohn Forte static int
5013fcf3ce44SJohn Forte parseAddress(char *address_port_str,
5014fcf3ce44SJohn Forte     uint16_t defaultPort,
5015fcf3ce44SJohn Forte     char *address_str,
5016fcf3ce44SJohn Forte     size_t address_str_len,
5017fcf3ce44SJohn Forte     uint16_t *port,
5018fcf3ce44SJohn Forte     boolean_t *isIpv6)
5019fcf3ce44SJohn Forte {
5020fcf3ce44SJohn Forte 	char port_str[64];
5021fcf3ce44SJohn Forte 	int tmp_port;
5022fcf3ce44SJohn Forte 	char *errchr;
5023fcf3ce44SJohn Forte 
5024fcf3ce44SJohn Forte 	if (address_port_str[0] == '[') {
5025fcf3ce44SJohn Forte 		/* IPv6 address */
5026fcf3ce44SJohn Forte 		char *close_bracket_pos;
5027fcf3ce44SJohn Forte 		close_bracket_pos = strchr(address_port_str, ']');
5028fcf3ce44SJohn Forte 		if (!close_bracket_pos) {
5029fcf3ce44SJohn Forte 			syslog(LOG_USER|LOG_DEBUG,
5030fcf3ce44SJohn Forte 			    "IP address format error: %s\n", address_str);
5031fcf3ce44SJohn Forte 			return (PARSE_ADDR_MISSING_CLOSING_BRACKET);
5032fcf3ce44SJohn Forte 		}
5033fcf3ce44SJohn Forte 
5034fcf3ce44SJohn Forte 		*close_bracket_pos = NULL;
5035fcf3ce44SJohn Forte 		(void) strlcpy(address_str, &address_port_str[1],
5036fcf3ce44SJohn Forte 		    address_str_len);
5037fcf3ce44SJohn Forte 
5038fcf3ce44SJohn Forte 		/* Extract the port number */
5039fcf3ce44SJohn Forte 		close_bracket_pos++;
5040fcf3ce44SJohn Forte 		if (*close_bracket_pos == ':') {
5041fcf3ce44SJohn Forte 			close_bracket_pos++;
5042fcf3ce44SJohn Forte 			if (*close_bracket_pos != NULL) {
5043fcf3ce44SJohn Forte 				(void) strlcpy(port_str, close_bracket_pos, 64);
5044fcf3ce44SJohn Forte 				tmp_port = strtol(port_str, &errchr, 10);
5045fcf3ce44SJohn Forte 				if (tmp_port == 0 && errchr != NULL) {
5046fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s:%s %s\n",
5047fcf3ce44SJohn Forte 					    cmdName, address_str,
5048fcf3ce44SJohn Forte 					    close_bracket_pos,
5049fcf3ce44SJohn Forte 					    gettext("port number invalid"));
5050fcf3ce44SJohn Forte 					return (PARSE_ADDR_PORT_OUT_OF_RANGE);
5051fcf3ce44SJohn Forte 				}
5052fcf3ce44SJohn Forte 				if ((tmp_port > 0) && (tmp_port > USHRT_MAX) ||
5053fcf3ce44SJohn Forte 				    (tmp_port < 0)) {
5054fcf3ce44SJohn Forte 					/* Port number out of range */
5055fcf3ce44SJohn Forte 					syslog(LOG_USER|LOG_DEBUG,
5056fcf3ce44SJohn Forte 					    "Specified port out of range: %d",
5057fcf3ce44SJohn Forte 					    tmp_port);
5058fcf3ce44SJohn Forte 					return (PARSE_ADDR_PORT_OUT_OF_RANGE);
5059fcf3ce44SJohn Forte 				} else {
5060fcf3ce44SJohn Forte 					*port = (uint16_t)tmp_port;
5061fcf3ce44SJohn Forte 				}
5062fcf3ce44SJohn Forte 			} else {
5063fcf3ce44SJohn Forte 				*port = defaultPort;
5064fcf3ce44SJohn Forte 			}
5065fcf3ce44SJohn Forte 		} else {
5066fcf3ce44SJohn Forte 			*port = defaultPort;
5067fcf3ce44SJohn Forte 		}
5068fcf3ce44SJohn Forte 
5069fcf3ce44SJohn Forte 		*isIpv6 = B_TRUE;
5070fcf3ce44SJohn Forte 	} else {
5071fcf3ce44SJohn Forte 		/* IPv4 address */
5072fcf3ce44SJohn Forte 		char *colon_pos;
5073fcf3ce44SJohn Forte 		colon_pos = strchr(address_port_str, ':');
5074fcf3ce44SJohn Forte 		if (!colon_pos) {
5075fcf3ce44SJohn Forte 			/* No port number specified. */
5076fcf3ce44SJohn Forte 			*port = defaultPort;
5077fcf3ce44SJohn Forte 			(void) strlcpy(address_str, address_port_str,
5078fcf3ce44SJohn Forte 			    address_str_len);
5079fcf3ce44SJohn Forte 		} else {
5080fcf3ce44SJohn Forte 			*colon_pos = (char)NULL;
5081fcf3ce44SJohn Forte 			(void) strlcpy(address_str, address_port_str,
5082fcf3ce44SJohn Forte 			    address_str_len);
5083fcf3ce44SJohn Forte 
5084fcf3ce44SJohn Forte 			/* Extract the port number */
5085fcf3ce44SJohn Forte 			colon_pos++;
5086fcf3ce44SJohn Forte 			if (*colon_pos != NULL) {
5087fcf3ce44SJohn Forte 
5088fcf3ce44SJohn Forte 				(void) strlcpy(port_str, colon_pos, 64);
5089fcf3ce44SJohn Forte 				tmp_port = strtol(port_str, &errchr, 10);
5090fcf3ce44SJohn Forte 				if (tmp_port == 0 && errchr != NULL) {
5091fcf3ce44SJohn Forte 					(void) fprintf(stderr, "%s: %s:%s %s\n",
5092fcf3ce44SJohn Forte 					    cmdName, address_str, colon_pos,
5093fcf3ce44SJohn Forte 					    gettext("port number invalid"));
5094fcf3ce44SJohn Forte 					return (PARSE_ADDR_PORT_OUT_OF_RANGE);
5095fcf3ce44SJohn Forte 				}
5096fcf3ce44SJohn Forte 				if ((tmp_port > 0) && (tmp_port > USHRT_MAX) ||
5097fcf3ce44SJohn Forte 				    (tmp_port < 0)) {
5098fcf3ce44SJohn Forte 					/* Port number out of range */
5099fcf3ce44SJohn Forte 					syslog(LOG_USER|LOG_DEBUG,
5100fcf3ce44SJohn Forte 					    "Specified port out of range: %d",
5101fcf3ce44SJohn Forte 					    tmp_port);
5102fcf3ce44SJohn Forte 					return (PARSE_ADDR_PORT_OUT_OF_RANGE);
5103fcf3ce44SJohn Forte 				} else {
5104fcf3ce44SJohn Forte 					*port = (uint16_t)tmp_port;
5105fcf3ce44SJohn Forte 				}
5106fcf3ce44SJohn Forte 			} else {
5107fcf3ce44SJohn Forte 				*port = defaultPort;
5108fcf3ce44SJohn Forte 			}
5109fcf3ce44SJohn Forte 		}
5110fcf3ce44SJohn Forte 
5111fcf3ce44SJohn Forte 		*isIpv6 = B_FALSE;
5112fcf3ce44SJohn Forte 	}
5113fcf3ce44SJohn Forte 
5114fcf3ce44SJohn Forte 	return (PARSE_ADDR_OK);
5115fcf3ce44SJohn Forte }
5116fcf3ce44SJohn Forte 
5117fcf3ce44SJohn Forte /*
5118fcf3ce44SJohn Forte  * This helper function could go into a utility module for general use.
5119fcf3ce44SJohn Forte  */
5120fcf3ce44SJohn Forte iSCSINameCheckStatusType
5121fcf3ce44SJohn Forte iSCSINameStringProfileCheck(wchar_t *name)
5122fcf3ce44SJohn Forte {
5123fcf3ce44SJohn Forte 	char mb_name[MAX_ISCSI_NAME_LEN + 1];
5124fcf3ce44SJohn Forte 	size_t name_len;
5125fcf3ce44SJohn Forte 	char *tmp;
5126fcf3ce44SJohn Forte 
5127fcf3ce44SJohn Forte 	(void) wcstombs(mb_name, name, MAX_ISCSI_NAME_LEN + 1);
5128fcf3ce44SJohn Forte 
5129fcf3ce44SJohn Forte 	if ((name_len = strlen(mb_name)) == 0) {
5130fcf3ce44SJohn Forte 		return (iSCSINameLenZero);
5131fcf3ce44SJohn Forte 	} else if (name_len > MAX_ISCSI_NAME_LEN) {
5132fcf3ce44SJohn Forte 		return (iSCSINameLenExceededMax);
5133fcf3ce44SJohn Forte 	}
5134fcf3ce44SJohn Forte 
5135fcf3ce44SJohn Forte 	/*
5136fcf3ce44SJohn Forte 	 * check for invalid characters
5137fcf3ce44SJohn Forte 	 * According to RFC 3722 iSCSI name must be either a letter,
5138fcf3ce44SJohn Forte 	 * a digit or one of the following '-' '.' ':'
5139fcf3ce44SJohn Forte 	 */
5140fcf3ce44SJohn Forte 	for (tmp = mb_name; *tmp != NULL; tmp++) {
5141fcf3ce44SJohn Forte 		if ((isalnum(*tmp) == 0) &&
5142fcf3ce44SJohn Forte 		    (*tmp != '-') &&
5143fcf3ce44SJohn Forte 		    (*tmp != '.') &&
5144fcf3ce44SJohn Forte 		    (*tmp != ':')) {
5145fcf3ce44SJohn Forte 			return (iSCSINameInvalidCharacter);
5146fcf3ce44SJohn Forte 		}
5147fcf3ce44SJohn Forte 	}
5148fcf3ce44SJohn Forte 
5149fcf3ce44SJohn Forte 	if (strncmp(mb_name, ISCSI_IQN_NAME_PREFIX,
5150fcf3ce44SJohn Forte 	    strlen(ISCSI_IQN_NAME_PREFIX)) == 0) {
5151fcf3ce44SJohn Forte 		/*
5152fcf3ce44SJohn Forte 		 * If name is of type iqn, check date string and naming
5153fcf3ce44SJohn Forte 		 * authority.
5154fcf3ce44SJohn Forte 		 */
5155fcf3ce44SJohn Forte 		char *strp = NULL;
5156fcf3ce44SJohn Forte 
5157fcf3ce44SJohn Forte 		/*
5158fcf3ce44SJohn Forte 		 * Don't allow the string to end with a colon.  If there is a
5159fcf3ce44SJohn Forte 		 * colon then there must be a subdomain provided.
5160fcf3ce44SJohn Forte 		 */
5161fcf3ce44SJohn Forte 		if (mb_name[strlen(mb_name) - 1] == ':') {
5162fcf3ce44SJohn Forte 			return (iSCSINameIqnSubdomainFormatError);
5163fcf3ce44SJohn Forte 		}
5164fcf3ce44SJohn Forte 
5165fcf3ce44SJohn Forte 		/* Date string */
5166fcf3ce44SJohn Forte 		strp = strtok(&mb_name[3], ".");
5167fcf3ce44SJohn Forte 		if (strp) {
5168fcf3ce44SJohn Forte 			char tmpYear[5], tmpMonth[3], *endPtr = NULL;
5169fcf3ce44SJohn Forte 			int year, month;
5170fcf3ce44SJohn Forte 
5171fcf3ce44SJohn Forte 			/* Date string should be in YYYY-MM format */
5172fcf3ce44SJohn Forte 			if (strlen(strp) != strlen("YYYY-MM") ||
5173fcf3ce44SJohn Forte 			    strp[4] != '-') {
5174fcf3ce44SJohn Forte 				return (iSCSINameIqnDateFormatError);
5175fcf3ce44SJohn Forte 			}
5176fcf3ce44SJohn Forte 
5177fcf3ce44SJohn Forte 			/*
5178fcf3ce44SJohn Forte 			 * Validate year.  Only validating that the
5179fcf3ce44SJohn Forte 			 * year can be converted to a number.  No
5180fcf3ce44SJohn Forte 			 * validation will be done on year's actual
5181fcf3ce44SJohn Forte 			 * value.
5182fcf3ce44SJohn Forte 			 */
5183fcf3ce44SJohn Forte 			(void) strncpy(tmpYear, strp, 4);
5184fcf3ce44SJohn Forte 			tmpYear[4] = '\0';
5185fcf3ce44SJohn Forte 
5186fcf3ce44SJohn Forte 			errno = 0;
5187fcf3ce44SJohn Forte 			year = strtol(tmpYear, &endPtr, 10);
5188fcf3ce44SJohn Forte 			if (errno != 0 || *endPtr != '\0' ||
5189fcf3ce44SJohn Forte 			    year < 0 || year > 9999) {
5190fcf3ce44SJohn Forte 				return (iSCSINameIqnInvalidYearError);
5191fcf3ce44SJohn Forte 			}
5192fcf3ce44SJohn Forte 
5193fcf3ce44SJohn Forte 			/*
5194fcf3ce44SJohn Forte 			 * Validate month is valid.
5195fcf3ce44SJohn Forte 			 */
5196fcf3ce44SJohn Forte 			(void) strncpy(tmpMonth, &strp[5], 2);
5197fcf3ce44SJohn Forte 			tmpMonth[2] = '\0';
5198fcf3ce44SJohn Forte 			errno = 0;
5199fcf3ce44SJohn Forte 			month = strtol(tmpMonth, &endPtr, 10);
5200fcf3ce44SJohn Forte 
5201fcf3ce44SJohn Forte 			if (errno != 0 || *endPtr != '\0' ||
5202fcf3ce44SJohn Forte 			    month < 1 || month > 12) {
5203fcf3ce44SJohn Forte 				return (iSCSINameIqnInvalidMonthError);
5204fcf3ce44SJohn Forte 			}
5205fcf3ce44SJohn Forte 
5206fcf3ce44SJohn Forte 			/*
5207fcf3ce44SJohn Forte 			 * A reversed FQDN needs to be provided.  We
5208fcf3ce44SJohn Forte 			 * will only check for a "." followed by more
5209fcf3ce44SJohn Forte 			 * than two or more characters.  The list of domains is
5210fcf3ce44SJohn Forte 			 * too large and changes too frequently to
5211fcf3ce44SJohn Forte 			 * add validation for.
5212fcf3ce44SJohn Forte 			 */
5213fcf3ce44SJohn Forte 			strp = strtok(NULL, ".");
5214fcf3ce44SJohn Forte 			if (!strp || strlen(strp) < 2) {
5215fcf3ce44SJohn Forte 				return (iSCSINameIqnFQDNError);
5216fcf3ce44SJohn Forte 			}
5217fcf3ce44SJohn Forte 
5218fcf3ce44SJohn Forte 			/* Name authority string */
5219fcf3ce44SJohn Forte 			strp = strtok(NULL, ":");
5220fcf3ce44SJohn Forte 			if (strp) {
5221fcf3ce44SJohn Forte 				return (iSCSINameCheckOK);
5222fcf3ce44SJohn Forte 			} else {
5223fcf3ce44SJohn Forte 				return (iSCSINameIqnFQDNError);
5224fcf3ce44SJohn Forte 			}
5225fcf3ce44SJohn Forte 		} else {
5226fcf3ce44SJohn Forte 			return (iSCSINameIqnFormatError);
5227fcf3ce44SJohn Forte 		}
5228fcf3ce44SJohn Forte 	} else if (strncmp(mb_name, ISCSI_EUI_NAME_PREFIX,
5229fcf3ce44SJohn Forte 	    strlen(ISCSI_EUI_NAME_PREFIX)) == 0) {
5230fcf3ce44SJohn Forte 		/* If name is of type EUI, change its length */
5231fcf3ce44SJohn Forte 
5232fcf3ce44SJohn Forte 		if (strlen(mb_name) != ISCSI_EUI_NAME_LEN) {
5233fcf3ce44SJohn Forte 			return (iSCSINameEUIFormatError);
5234fcf3ce44SJohn Forte 		}
5235fcf3ce44SJohn Forte 
5236fcf3ce44SJohn Forte 		for (tmp = mb_name + strlen(ISCSI_EUI_NAME_PREFIX) + 1;
5237fcf3ce44SJohn Forte 		    *tmp != '\0'; tmp++) {
5238fcf3ce44SJohn Forte 			if (isxdigit(*tmp)) {
5239fcf3ce44SJohn Forte 				continue;
5240fcf3ce44SJohn Forte 			}
5241fcf3ce44SJohn Forte 			return (iSCSINameEUIFormatError);
5242fcf3ce44SJohn Forte 		}
5243fcf3ce44SJohn Forte 
5244fcf3ce44SJohn Forte 		return (iSCSINameCheckOK);
5245fcf3ce44SJohn Forte 	} else {
5246fcf3ce44SJohn Forte 		return (iSCSINameUnknownType);
5247fcf3ce44SJohn Forte 	}
5248fcf3ce44SJohn Forte }
5249fcf3ce44SJohn Forte 
5250fcf3ce44SJohn Forte /*
5251fcf3ce44SJohn Forte  * This helper function could go into a utility module for general use.
5252fcf3ce44SJohn Forte  *
5253fcf3ce44SJohn Forte  * Returns:
5254fcf3ce44SJohn Forte  * B_TRUE is the numberStr is an unsigned natural number and within the
5255fcf3ce44SJohn Forte  * specified bound.
5256fcf3ce44SJohn Forte  * B_FALSE otherwise.
5257fcf3ce44SJohn Forte  */
5258fcf3ce44SJohn Forte boolean_t
5259fcf3ce44SJohn Forte isNaturalNumber(char *numberStr, uint32_t upperBound)
5260fcf3ce44SJohn Forte {
5261fcf3ce44SJohn Forte 	int i;
5262fcf3ce44SJohn Forte 	int number_str_len;
5263fcf3ce44SJohn Forte 
5264fcf3ce44SJohn Forte 	if ((number_str_len = strlen(numberStr)) == 0) {
5265fcf3ce44SJohn Forte 		return (B_FALSE);
5266fcf3ce44SJohn Forte 	}
5267fcf3ce44SJohn Forte 
5268fcf3ce44SJohn Forte 	for (i = 0; i < number_str_len; i++) {
5269fcf3ce44SJohn Forte 		if (numberStr[i] < 060 || numberStr[i] > 071) {
5270fcf3ce44SJohn Forte 			return (B_FALSE);
5271fcf3ce44SJohn Forte 		}
5272fcf3ce44SJohn Forte 	}
5273fcf3ce44SJohn Forte 
5274fcf3ce44SJohn Forte 	if (atoi(numberStr) > upperBound) {
5275fcf3ce44SJohn Forte 		return (B_FALSE);
5276fcf3ce44SJohn Forte 	}
5277fcf3ce44SJohn Forte 
5278fcf3ce44SJohn Forte 	return (B_TRUE);
5279fcf3ce44SJohn Forte }
5280fcf3ce44SJohn Forte 
5281fcf3ce44SJohn Forte /*
5282fcf3ce44SJohn Forte  * This helper function could go into a utility module for general use.
5283fcf3ce44SJohn Forte  * It parses a target string in the format of:
5284fcf3ce44SJohn Forte  *
5285fcf3ce44SJohn Forte  * 	<target_name>,[<ip_address>[:port][,tpgt]]
5286fcf3ce44SJohn Forte  *
5287fcf3ce44SJohn Forte  * and creates wchar strings for target name and target address. It
5288fcf3ce44SJohn Forte  * also populates port and tpgt if found.
5289fcf3ce44SJohn Forte  *
5290fcf3ce44SJohn Forte  * Returns:
5291fcf3ce44SJohn Forte  * 	PARSE_TARGET_OK if parsing is successful.
5292fcf3ce44SJohn Forte  *	PARSE_TARGET_INVALID_TPGT if the specified tpgt is
5293fcf3ce44SJohn Forte  *	invalid.
5294fcf3ce44SJohn Forte  * 	PARSE_TARGET_INVALID_ADDR if the address specified is
5295fcf3ce44SJohn Forte  *	invalid.
5296fcf3ce44SJohn Forte  */
5297fcf3ce44SJohn Forte int
5298fcf3ce44SJohn Forte parseTarget(char *targetStr,
5299fcf3ce44SJohn Forte 		wchar_t *targetNameStr,
5300fcf3ce44SJohn Forte 		size_t targetNameStrLen,
5301fcf3ce44SJohn Forte 		boolean_t *targetAddressSpecified,
5302fcf3ce44SJohn Forte 		wchar_t *targetAddressStr,
5303fcf3ce44SJohn Forte 		size_t targetAddressStrLen,
5304fcf3ce44SJohn Forte 		uint16_t *port,
5305fcf3ce44SJohn Forte 		boolean_t *tpgtSpecified,
5306fcf3ce44SJohn Forte 		uint16_t *tpgt,
5307fcf3ce44SJohn Forte 		boolean_t *isIpv6)
5308fcf3ce44SJohn Forte {
5309fcf3ce44SJohn Forte 	char *commaPos;
5310fcf3ce44SJohn Forte 	char *commaPos2;
5311fcf3ce44SJohn Forte 	char targetAddress[SUN_IMA_IP_ADDRESS_PORT_LEN];
5312fcf3ce44SJohn Forte 	int i;
5313fcf3ce44SJohn Forte 	int lowerCase;
5314fcf3ce44SJohn Forte 
5315fcf3ce44SJohn Forte 	(void) memset(targetNameStr, 0,
5316fcf3ce44SJohn Forte 	    targetNameStrLen * sizeof (wchar_t));
5317fcf3ce44SJohn Forte 	(void) memset(targetAddressStr, 0,
5318fcf3ce44SJohn Forte 	    targetAddressStrLen * sizeof (wchar_t));
5319fcf3ce44SJohn Forte 
5320fcf3ce44SJohn Forte 	commaPos = strchr(targetStr, ',');
5321fcf3ce44SJohn Forte 	if (commaPos != NULL) {
5322fcf3ce44SJohn Forte 		*commaPos = NULL;
5323fcf3ce44SJohn Forte 		commaPos++;
5324fcf3ce44SJohn Forte 		*targetAddressSpecified = B_TRUE;
5325fcf3ce44SJohn Forte 
5326fcf3ce44SJohn Forte 		/*
5327fcf3ce44SJohn Forte 		 * Checking of tpgt makes sense only when
5328fcf3ce44SJohn Forte 		 * the target address/port are specified.
5329fcf3ce44SJohn Forte 		 */
5330fcf3ce44SJohn Forte 		commaPos2 = strchr(commaPos, ',');
5331fcf3ce44SJohn Forte 		if (commaPos2 != NULL) {
5332fcf3ce44SJohn Forte 			*commaPos2 = NULL;
5333fcf3ce44SJohn Forte 			commaPos2++;
5334fcf3ce44SJohn Forte 			if (isNaturalNumber(commaPos2, ISCSI_MAX_TPGT_VALUE) ==
5335fcf3ce44SJohn Forte 			    B_TRUE) {
5336fcf3ce44SJohn Forte 				*tpgt = atoi(commaPos2);
5337fcf3ce44SJohn Forte 				*tpgtSpecified = B_TRUE;
5338fcf3ce44SJohn Forte 			} else {
53395df5713fSbing zhao - Sun Microsystems - Beijing China 				(void) fprintf(stderr, "%s: %s\n", cmdName,
53405df5713fSbing zhao - Sun Microsystems - Beijing China 				    gettext("parse target invalid TPGT"));
5341fcf3ce44SJohn Forte 				return (PARSE_TARGET_INVALID_TPGT);
5342fcf3ce44SJohn Forte 			}
5343fcf3ce44SJohn Forte 		}
5344fcf3ce44SJohn Forte 
5345fcf3ce44SJohn Forte 		switch (parseAddress(commaPos, ISCSI_LISTEN_PORT,
5346fcf3ce44SJohn Forte 		    &targetAddress[0], MAX_ADDRESS_LEN + 1, port, isIpv6)) {
5347fcf3ce44SJohn Forte 		case PARSE_ADDR_PORT_OUT_OF_RANGE:
5348fcf3ce44SJohn Forte 			return (PARSE_TARGET_INVALID_ADDR);
5349fcf3ce44SJohn Forte 		case PARSE_ADDR_OK:
5350fcf3ce44SJohn Forte 			break;
5351fcf3ce44SJohn Forte 		default:
5352fcf3ce44SJohn Forte 			(void) fprintf(stderr, "%s: %s\n",
5353fcf3ce44SJohn Forte 			    cmdName, gettext("cannot parse target name"));
5354fcf3ce44SJohn Forte 			return (PARSE_TARGET_INVALID_ADDR);
5355fcf3ce44SJohn Forte 		}
5356fcf3ce44SJohn Forte 		(void) mbstowcs(targetAddressStr, targetAddress,
5357fcf3ce44SJohn Forte 		    targetAddressStrLen);
5358fcf3ce44SJohn Forte 		for (i = 0; targetAddressStr[i] != 0; i++) {
5359fcf3ce44SJohn Forte 			lowerCase = tolower(targetAddressStr[i]);
5360fcf3ce44SJohn Forte 			targetAddressStr[i] = lowerCase;
5361fcf3ce44SJohn Forte 		}
5362fcf3ce44SJohn Forte 	} else {
5363fcf3ce44SJohn Forte 		*targetAddressSpecified = B_FALSE;
5364fcf3ce44SJohn Forte 		*tpgtSpecified = B_FALSE;
5365fcf3ce44SJohn Forte 	}
5366fcf3ce44SJohn Forte 
5367fcf3ce44SJohn Forte 	(void) mbstowcs(targetNameStr, targetStr, targetNameStrLen);
5368fcf3ce44SJohn Forte 	for (i = 0; targetNameStr[i] != 0; i++) {
5369fcf3ce44SJohn Forte 		lowerCase = tolower(targetNameStr[i]);
5370fcf3ce44SJohn Forte 		targetNameStr[i] = lowerCase;
5371fcf3ce44SJohn Forte 	}
5372fcf3ce44SJohn Forte 
5373fcf3ce44SJohn Forte 	return (PARSE_TARGET_OK);
5374fcf3ce44SJohn Forte }
5375fcf3ce44SJohn Forte 
5376fcf3ce44SJohn Forte /*ARGSUSED*/
5377fcf3ce44SJohn Forte static void
5378fcf3ce44SJohn Forte listCHAPName(IMA_OID oid)
5379fcf3ce44SJohn Forte {
5380fcf3ce44SJohn Forte 	IMA_INITIATOR_AUTHPARMS authParams;
5381fcf3ce44SJohn Forte 	IMA_STATUS status;
5382fcf3ce44SJohn Forte 	IMA_BYTE chapName [MAX_CHAP_NAME_LEN + 1];
5383fcf3ce44SJohn Forte 
5384fcf3ce44SJohn Forte 	/* Get Chap Name depending upon oid object type */
5385fcf3ce44SJohn Forte 	if (oid.objectType == IMA_OBJECT_TYPE_LHBA) {
5386fcf3ce44SJohn Forte 		status = IMA_GetInitiatorAuthParms(oid,
5387fcf3ce44SJohn Forte 		    IMA_AUTHMETHOD_CHAP, &authParams);
5388fcf3ce44SJohn Forte 	} else {
5389fcf3ce44SJohn Forte 		status = SUN_IMA_GetTargetAuthParms(oid,
5390fcf3ce44SJohn Forte 		    IMA_AUTHMETHOD_CHAP, &authParams);
5391fcf3ce44SJohn Forte 	}
5392fcf3ce44SJohn Forte 
5393fcf3ce44SJohn Forte 	(void) fprintf(stdout, "\n\t\t%s: ", gettext("CHAP Name"));
5394fcf3ce44SJohn Forte 
5395fcf3ce44SJohn Forte 	if (IMA_SUCCESS(status)) {
5396fcf3ce44SJohn Forte 		/*
5397fcf3ce44SJohn Forte 		 * Default chap name will be the node name.  The default will
5398fcf3ce44SJohn Forte 		 * be set by the driver.
5399fcf3ce44SJohn Forte 		 */
5400fcf3ce44SJohn Forte 		if (authParams.chapParms.nameLength != 0) {
5401fcf3ce44SJohn Forte 			(void) memset(chapName, 0, sizeof (chapName));
5402fcf3ce44SJohn Forte 			(void) memcpy(chapName, authParams.chapParms.name,
5403fcf3ce44SJohn Forte 			    authParams.chapParms.nameLength);
5404fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s", chapName);
5405fcf3ce44SJohn Forte 
5406fcf3ce44SJohn Forte 		} else {
5407fcf3ce44SJohn Forte 			(void) fprintf(stdout, "%s", "-");
5408fcf3ce44SJohn Forte 		}
5409fcf3ce44SJohn Forte 	} else {
5410fcf3ce44SJohn Forte 		(void) fprintf(stdout, "%s", "-");
5411fcf3ce44SJohn Forte 	}
5412fcf3ce44SJohn Forte }
5413fcf3ce44SJohn Forte 
54144246c8e9SJack Meng static boolean_t
54154246c8e9SJack Meng checkServiceStatus(void)
54164246c8e9SJack Meng {
54174246c8e9SJack Meng 	IMA_STATUS	status	=	IMA_ERROR_UNKNOWN_ERROR;
54184246c8e9SJack Meng 	IMA_BOOL	enabled =	0;
54194246c8e9SJack Meng 
54204246c8e9SJack Meng 	status = SUN_IMA_GetSvcStatus(&enabled);
54214246c8e9SJack Meng 
54224246c8e9SJack Meng 	if (status != IMA_STATUS_SUCCESS) {
54234246c8e9SJack Meng 		(void) fprintf(stdout, "%s\n%s\n",
54244246c8e9SJack Meng 		    gettext("Unable to query the service status of"
54254246c8e9SJack Meng 		    " iSCSI initiator."),
54264246c8e9SJack Meng 		    gettext("For more information, please refer to"
54274246c8e9SJack Meng 		    " iscsi(7D)."));
54284246c8e9SJack Meng 		return (B_FALSE);
54294246c8e9SJack Meng 	}
54304246c8e9SJack Meng 
54314246c8e9SJack Meng 	if (enabled == 0) {
54324246c8e9SJack Meng 		(void) fprintf(stdout, "%s\n%s\n",
54334246c8e9SJack Meng 		    gettext("iSCSI Initiator Service is disabled,"
54344246c8e9SJack Meng 		    " try 'svcadm enable network/iscsi/initiator' to"
54354246c8e9SJack Meng 		    " enable the service."),
54364246c8e9SJack Meng 		    gettext("For more information, please refer to"
54374246c8e9SJack Meng 		    " iscsi(7D)."));
54384246c8e9SJack Meng 		return (B_FALSE);
54394246c8e9SJack Meng 	}
54404246c8e9SJack Meng 
54414246c8e9SJack Meng 	return (B_TRUE);
54424246c8e9SJack Meng }
54434246c8e9SJack Meng 
5444fcf3ce44SJohn Forte /*
5445fcf3ce44SJohn Forte  * Prints out see manual page.
5446fcf3ce44SJohn Forte  * Called out through atexit(3C) so is always last thing displayed.
5447fcf3ce44SJohn Forte  */
5448fcf3ce44SJohn Forte void
5449fcf3ce44SJohn Forte seeMan(void)
5450fcf3ce44SJohn Forte {
5451fcf3ce44SJohn Forte 	static int sent = 0;
5452fcf3ce44SJohn Forte 
5453fcf3ce44SJohn Forte 	if (sent)
5454fcf3ce44SJohn Forte 		return;
5455fcf3ce44SJohn Forte 
5456fcf3ce44SJohn Forte 	(void) fprintf(stdout, "%s %s(1M)\n",
5457fcf3ce44SJohn Forte 	    gettext("For more information, please see"), cmdName);
5458fcf3ce44SJohn Forte 
5459fcf3ce44SJohn Forte 	sent = 1;
5460fcf3ce44SJohn Forte }
5461fcf3ce44SJohn Forte 
5462fcf3ce44SJohn Forte 
5463fcf3ce44SJohn Forte /*
5464fcf3ce44SJohn Forte  * main calls a parser that checks syntax of the input command against
5465fcf3ce44SJohn Forte  * various rules tables.
5466fcf3ce44SJohn Forte  *
5467fcf3ce44SJohn Forte  * The parser provides usage feedback based upon same tables by calling
5468fcf3ce44SJohn Forte  * two usage functions, usage and subUsage, handling command and subcommand
5469fcf3ce44SJohn Forte  * usage respectively.
5470fcf3ce44SJohn Forte  *
5471fcf3ce44SJohn Forte  * The parser handles all printing of usage syntactical errors
5472fcf3ce44SJohn Forte  *
5473fcf3ce44SJohn Forte  * When syntax is successfully validated, the parser calls the associated
5474fcf3ce44SJohn Forte  * function using the subcommands table functions.
5475fcf3ce44SJohn Forte  *
5476fcf3ce44SJohn Forte  * Syntax is as follows:
5477fcf3ce44SJohn Forte  *	command subcommand [options] resource-type [<object>]
5478fcf3ce44SJohn Forte  *
5479fcf3ce44SJohn Forte  * The return value from the function is placed in funcRet
5480fcf3ce44SJohn Forte  */
5481fcf3ce44SJohn Forte int
5482fcf3ce44SJohn Forte main(int argc, char *argv[])
5483fcf3ce44SJohn Forte {
5484fcf3ce44SJohn Forte 	synTables_t synTables;
5485fcf3ce44SJohn Forte 	char versionString[VERSION_STRING_MAX_LEN];
5486fcf3ce44SJohn Forte 	int ret;
5487fcf3ce44SJohn Forte 	int funcRet = 0;
5488fcf3ce44SJohn Forte 	void *subcommandArgs = NULL;
5489fcf3ce44SJohn Forte 
5490fcf3ce44SJohn Forte 	if (geteuid() != 0) {
5491fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s\n", gettext("permission denied"));
5492fcf3ce44SJohn Forte 		return (1);
5493fcf3ce44SJohn Forte 	}
5494fcf3ce44SJohn Forte 
54954246c8e9SJack Meng 	if (checkServiceStatus() == B_FALSE) {
54964246c8e9SJack Meng 		return (1);
54974246c8e9SJack Meng 	}
54984246c8e9SJack Meng 
5499fcf3ce44SJohn Forte 	/* set global command name */
5500fcf3ce44SJohn Forte 	cmdName = getExecBasename(argv[0]);
5501fcf3ce44SJohn Forte 
5502fcf3ce44SJohn Forte 	(void) snprintf(versionString, sizeof (versionString), "%s.%s",
5503fcf3ce44SJohn Forte 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
5504fcf3ce44SJohn Forte 	synTables.versionString = versionString;
5505fcf3ce44SJohn Forte 	synTables.longOptionTbl = &longOptions[0];
5506fcf3ce44SJohn Forte 	synTables.subcommandTbl = &subcommands[0];
5507fcf3ce44SJohn Forte 	synTables.objectTbl = &objects[0];
5508fcf3ce44SJohn Forte 	synTables.objectRulesTbl = &objectRules[0];
5509fcf3ce44SJohn Forte 	synTables.optionRulesTbl = &optionRules[0];
5510fcf3ce44SJohn Forte 
5511fcf3ce44SJohn Forte 	/* call the CLI parser */
5512fcf3ce44SJohn Forte 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
5513fcf3ce44SJohn Forte 	if (ret == -1) {
5514fcf3ce44SJohn Forte 		perror(cmdName);
5515fcf3ce44SJohn Forte 		ret = 1;
5516fcf3ce44SJohn Forte 	}
5517fcf3ce44SJohn Forte 
5518fcf3ce44SJohn Forte 	if (funcRet != 0) {
5519fcf3ce44SJohn Forte 		(void) fprintf(stderr, "%s: %s\n",
5520fcf3ce44SJohn Forte 		    cmdName, gettext("Unable to complete operation"));
5521fcf3ce44SJohn Forte 		ret = 1;
5522fcf3ce44SJohn Forte 	}
5523fcf3ce44SJohn Forte 	return (ret);
5524fcf3ce44SJohn Forte }
5525aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5526aff4bce5Syi zhang - Sun Microsystems - Beijing China static int
5527aff4bce5Syi zhang - Sun Microsystems - Beijing China setTunableParameters(IMA_OID oid, char *optarg)
5528aff4bce5Syi zhang - Sun Microsystems - Beijing China {
5529aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char keyp[MAXOPTARGLEN];
5530aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char valp[MAXOPTARGLEN];
5531aff4bce5Syi zhang - Sun Microsystems - Beijing China 	int key;
5532aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_STATUS status;
5533aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_UINT uintValue;
5534aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ISCSI_TUNABLE_PARAM	tunableObj;
5535aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char *nameValueString, *endptr;
5536aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5537aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((nameValueString = strdup(optarg)) == NULL) {
5538aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (errno == ENOMEM) {
5539aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s\n",
5540aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    cmdName, strerror(errno));
5541aff4bce5Syi zhang - Sun Microsystems - Beijing China 		} else {
5542aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s\n", cmdName,
5543aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    gettext("unknown error"));
5544aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5545aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5546aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5547aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5548aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) memset(keyp, 0, sizeof (keyp));
5549aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) memset(valp, 0, sizeof (valp));
5550aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (sscanf(nameValueString, gettext("%[^=]=%s"), keyp, valp) != 2) {
5551aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
5552aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    gettext("Unknown param"), nameValueString);
5553aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (nameValueString) {
5554aff4bce5Syi zhang - Sun Microsystems - Beijing China 			free(nameValueString);
5555aff4bce5Syi zhang - Sun Microsystems - Beijing China 			nameValueString = NULL;
5556aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5557aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5558aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5559aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((key = getTunableParam(keyp)) == -1) {
5560aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
5561aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    gettext("Unknown key"), keyp);
5562aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (nameValueString) {
5563aff4bce5Syi zhang - Sun Microsystems - Beijing China 			free(nameValueString);
5564aff4bce5Syi zhang - Sun Microsystems - Beijing China 			nameValueString = NULL;
5565aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5566aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5567aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5568aff4bce5Syi zhang - Sun Microsystems - Beijing China 	switch (key) {
5569aff4bce5Syi zhang - Sun Microsystems - Beijing China 	case RECV_LOGIN_RSP_TIMEOUT:
5570aff4bce5Syi zhang - Sun Microsystems - Beijing China 	case CONN_LOGIN_MAX:
5571aff4bce5Syi zhang - Sun Microsystems - Beijing China 	case POLLING_LOGIN_DELAY:
5572aff4bce5Syi zhang - Sun Microsystems - Beijing China 		errno = 0;
5573aff4bce5Syi zhang - Sun Microsystems - Beijing China 		uintValue = strtoul(valp, &endptr, 0);
5574aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (*endptr != '\0' || errno != 0) {
5575aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s - %s\n",
5576aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    cmdName,
5577aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    gettext("invalid option argument"),
5578aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    optarg);
5579aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
5580aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
5581aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
5582aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
5583aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (1);
5584aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5585aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (uintValue > 3600) {
5586aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s\n",
5587aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    cmdName,
5588aff4bce5Syi zhang - Sun Microsystems - Beijing China gettext("value must be between 0 and 3600"));
5589aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
5590aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
5591aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
5592aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
5593aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (1);
5594aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5595aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5596aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (chkConnLoginMaxPollingLoginDelay(oid, key, uintValue) > 0) {
5597aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (nameValueString) {
5598aff4bce5Syi zhang - Sun Microsystems - Beijing China 				free(nameValueString);
5599aff4bce5Syi zhang - Sun Microsystems - Beijing China 				nameValueString = NULL;
5600aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
5601aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (1);
5602aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5603aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5604aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (key == RECV_LOGIN_RSP_TIMEOUT) {
5605aff4bce5Syi zhang - Sun Microsystems - Beijing China 			tunableObj.tunable_objectType =
5606aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ISCSI_RX_TIMEOUT_VALUE;
5607aff4bce5Syi zhang - Sun Microsystems - Beijing China 		} else if (key == CONN_LOGIN_MAX) {
5608aff4bce5Syi zhang - Sun Microsystems - Beijing China 			tunableObj.tunable_objectType =
5609aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ISCSI_CONN_DEFAULT_LOGIN_MAX;
5610aff4bce5Syi zhang - Sun Microsystems - Beijing China 		} else if (key == POLLING_LOGIN_DELAY) {
5611aff4bce5Syi zhang - Sun Microsystems - Beijing China 			tunableObj.tunable_objectType =
5612aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ISCSI_LOGIN_POLLING_DELAY;
5613aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5614aff4bce5Syi zhang - Sun Microsystems - Beijing China 		tunableObj.tunable_objectValue = valp;
5615aff4bce5Syi zhang - Sun Microsystems - Beijing China 		status = SUN_IMA_SetTunableProperties(oid, &tunableObj);
5616aff4bce5Syi zhang - Sun Microsystems - Beijing China 		break;
5617aff4bce5Syi zhang - Sun Microsystems - Beijing China 	default:
5618aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) fprintf(stderr, "%s: %s: %s\n", cmdName,
5619aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    gettext("Unsupported key"), keyp);
5620aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (nameValueString) {
5621aff4bce5Syi zhang - Sun Microsystems - Beijing China 			free(nameValueString);
5622aff4bce5Syi zhang - Sun Microsystems - Beijing China 			nameValueString = NULL;
5623aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5624aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5625aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5626aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (!IMA_SUCCESS(status)) {
5627aff4bce5Syi zhang - Sun Microsystems - Beijing China 		printLibError(status);
5628aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (nameValueString) {
5629aff4bce5Syi zhang - Sun Microsystems - Beijing China 			free(nameValueString);
5630aff4bce5Syi zhang - Sun Microsystems - Beijing China 			nameValueString = NULL;
5631aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5632aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5633aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5634aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5635aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (nameValueString) {
5636aff4bce5Syi zhang - Sun Microsystems - Beijing China 		free(nameValueString);
5637aff4bce5Syi zhang - Sun Microsystems - Beijing China 		nameValueString = NULL;
5638aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5639aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (0);
5640aff4bce5Syi zhang - Sun Microsystems - Beijing China }
5641aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5642aff4bce5Syi zhang - Sun Microsystems - Beijing China /*
5643aff4bce5Syi zhang - Sun Microsystems - Beijing China  * Print tunable parameters information
5644aff4bce5Syi zhang - Sun Microsystems - Beijing China  */
5645aff4bce5Syi zhang - Sun Microsystems - Beijing China static int
5646aff4bce5Syi zhang - Sun Microsystems - Beijing China printTunableParameters(IMA_OID oid)
5647aff4bce5Syi zhang - Sun Microsystems - Beijing China {
5648aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ISCSI_TUNABLE_PARAM tunableObj;
5649aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char value[MAXOPTARGLEN] = "\0";
5650aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_STATUS status;
5651aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5652aff4bce5Syi zhang - Sun Microsystems - Beijing China 	tunableObj.tunable_objectValue = value;
5653aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "\t%s:\n",
5654aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    gettext("Tunable Parameters (Default/Configured)"));
5655aff4bce5Syi zhang - Sun Microsystems - Beijing China 	tunableObj.tunable_objectType = ISCSI_RX_TIMEOUT_VALUE;
5656aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = SUN_IMA_GetTunableProperties(oid, &tunableObj);
5657aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (!IMA_SUCCESS(status)) {
5658aff4bce5Syi zhang - Sun Microsystems - Beijing China 		printLibError(status);
5659aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5660aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5661aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (value[0] == '\0') {
5662aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[0] = '-';
5663aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[1] = '\0';
5664aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5665aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "\t\t%s: ",
5666aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    gettext("Session Login Response Time"));
5667aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "%s/%s\n", ISCSI_DEFAULT_RX_TIMEOUT_VALUE,
5668aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    tunableObj.tunable_objectValue);
5669aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5670aff4bce5Syi zhang - Sun Microsystems - Beijing China 	value[0] = '\0';
5671aff4bce5Syi zhang - Sun Microsystems - Beijing China 	tunableObj.tunable_objectType = ISCSI_CONN_DEFAULT_LOGIN_MAX;
5672aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = SUN_IMA_GetTunableProperties(oid, &tunableObj);
5673aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (!IMA_SUCCESS(status)) {
5674aff4bce5Syi zhang - Sun Microsystems - Beijing China 		printLibError(status);
5675aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5676aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5677aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (value[0] == '\0') {
5678aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[0] = '-';
5679aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[1] = '\0';
5680aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5681aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "\t\t%s: ",
5682aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    gettext("Maximum Connection Retry Time"));
5683aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "%s/%s\n", ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX,
5684aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    tunableObj.tunable_objectValue);
5685aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5686aff4bce5Syi zhang - Sun Microsystems - Beijing China 	value[0] = '\0';
5687aff4bce5Syi zhang - Sun Microsystems - Beijing China 	tunableObj.tunable_objectType = ISCSI_LOGIN_POLLING_DELAY;
5688aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = SUN_IMA_GetTunableProperties(oid, &tunableObj);
5689aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (!IMA_SUCCESS(status)) {
5690aff4bce5Syi zhang - Sun Microsystems - Beijing China 		printLibError(status);
5691aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5692aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5693aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (value[0] == '\0') {
5694aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[0] = '-';
5695aff4bce5Syi zhang - Sun Microsystems - Beijing China 		value[1] = '\0';
5696aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5697aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "\t\t%s: ",
5698aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    gettext("Login Retry Time Interval"));
5699aff4bce5Syi zhang - Sun Microsystems - Beijing China 	(void) fprintf(stdout, "%s/%s\n", ISCSI_DEFAULT_LOGIN_POLLING_DELAY,
5700aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    tunableObj.tunable_objectValue);
5701aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (0);
5702aff4bce5Syi zhang - Sun Microsystems - Beijing China }
5703aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5704aff4bce5Syi zhang - Sun Microsystems - Beijing China /*
5705aff4bce5Syi zhang - Sun Microsystems - Beijing China  * This is helper function to check conn_login_max and polling_login_delay.
5706aff4bce5Syi zhang - Sun Microsystems - Beijing China  */
5707aff4bce5Syi zhang - Sun Microsystems - Beijing China static int
5708aff4bce5Syi zhang - Sun Microsystems - Beijing China chkConnLoginMaxPollingLoginDelay(IMA_OID oid, int key, int uintValue)
5709aff4bce5Syi zhang - Sun Microsystems - Beijing China {
5710aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char valuep[MAXOPTARGLEN];
5711aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_STATUS	status;
5712aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_UINT	getValue;
5713aff4bce5Syi zhang - Sun Microsystems - Beijing China 	ISCSI_TUNABLE_PARAM	getObj;
5714aff4bce5Syi zhang - Sun Microsystems - Beijing China 	char *endptr;
5715aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5716aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (key == CONN_LOGIN_MAX) {
5717aff4bce5Syi zhang - Sun Microsystems - Beijing China 		getObj.tunable_objectType = ISCSI_LOGIN_POLLING_DELAY;
5718*fb2a9baeSyi zhang - Sun Microsystems - Beijing China 	} else if (key == POLLING_LOGIN_DELAY) {
5719aff4bce5Syi zhang - Sun Microsystems - Beijing China 		getObj.tunable_objectType = ISCSI_CONN_DEFAULT_LOGIN_MAX;
5720*fb2a9baeSyi zhang - Sun Microsystems - Beijing China 	} else {
5721*fb2a9baeSyi zhang - Sun Microsystems - Beijing China 		return (0);
5722aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5723aff4bce5Syi zhang - Sun Microsystems - Beijing China 	valuep[0] = '\0';
5724aff4bce5Syi zhang - Sun Microsystems - Beijing China 	getObj.tunable_objectValue = valuep;
5725aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = SUN_IMA_GetTunableProperties(oid, &getObj);
5726aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (!IMA_SUCCESS(status)) {
5727aff4bce5Syi zhang - Sun Microsystems - Beijing China 		printLibError(status);
5728aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5729aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5730aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (valuep[0] == '\0') {
5731aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (key == CONN_LOGIN_MAX) {
5732aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) strlcpy(valuep,
5733aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ISCSI_DEFAULT_LOGIN_POLLING_DELAY,
5734aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    strlen(ISCSI_DEFAULT_LOGIN_POLLING_DELAY) +1);
5735aff4bce5Syi zhang - Sun Microsystems - Beijing China 		} else {
5736aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) strlcpy(valuep,
5737aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX,
5738aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    strlen(ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX) +1);
5739aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5740aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5741aff4bce5Syi zhang - Sun Microsystems - Beijing China 
5742aff4bce5Syi zhang - Sun Microsystems - Beijing China 	errno = 0;
5743aff4bce5Syi zhang - Sun Microsystems - Beijing China 	getValue = strtoul(valuep, &endptr, 0);
5744aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (*endptr != '\0' || errno != 0) {
5745aff4bce5Syi zhang - Sun Microsystems - Beijing China 		(void) fprintf(stderr, "%s: %s - %s\n",
5746aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    cmdName,
5747aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    gettext("cannot convert tunable string"),
5748aff4bce5Syi zhang - Sun Microsystems - Beijing China 		    valuep);
5749aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (1);
5750aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5751aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (key == CONN_LOGIN_MAX) {
5752aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (uintValue < getValue) {
5753aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s %ld\n",
5754aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    cmdName, gettext("value must larger than"),
5755aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    getValue);
5756aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (1);
5757aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5758aff4bce5Syi zhang - Sun Microsystems - Beijing China 	} else {
5759aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (uintValue > getValue) {
5760aff4bce5Syi zhang - Sun Microsystems - Beijing China 			(void) fprintf(stderr, "%s: %s %ld\n",
5761aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    cmdName, gettext("value must smaller than"),
5762aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    getValue);
5763aff4bce5Syi zhang - Sun Microsystems - Beijing China 			return (1);
5764aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
5765aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
5766aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (0);
5767aff4bce5Syi zhang - Sun Microsystems - Beijing China }
5768