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