xref: /onnv-gate/usr/src/cmd/isns/isnsadm/isnsadm.c (revision 7836:4e95154b5b7a)
1*7836SJohn.Forte@Sun.COM /*
2*7836SJohn.Forte@Sun.COM  * CDDL HEADER START
3*7836SJohn.Forte@Sun.COM  *
4*7836SJohn.Forte@Sun.COM  * The contents of this file are subject to the terms of the
5*7836SJohn.Forte@Sun.COM  * Common Development and Distribution License (the "License").
6*7836SJohn.Forte@Sun.COM  * You may not use this file except in compliance with the License.
7*7836SJohn.Forte@Sun.COM  *
8*7836SJohn.Forte@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7836SJohn.Forte@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*7836SJohn.Forte@Sun.COM  * See the License for the specific language governing permissions
11*7836SJohn.Forte@Sun.COM  * and limitations under the License.
12*7836SJohn.Forte@Sun.COM  *
13*7836SJohn.Forte@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*7836SJohn.Forte@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7836SJohn.Forte@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*7836SJohn.Forte@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*7836SJohn.Forte@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7836SJohn.Forte@Sun.COM  *
19*7836SJohn.Forte@Sun.COM  * CDDL HEADER END
20*7836SJohn.Forte@Sun.COM  */
21*7836SJohn.Forte@Sun.COM /*
22*7836SJohn.Forte@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*7836SJohn.Forte@Sun.COM  * Use is subject to license terms.
24*7836SJohn.Forte@Sun.COM  */
25*7836SJohn.Forte@Sun.COM 
26*7836SJohn.Forte@Sun.COM /*
27*7836SJohn.Forte@Sun.COM  * isnsadm.c : isnsadm CL
28*7836SJohn.Forte@Sun.COM  *
29*7836SJohn.Forte@Sun.COM  */
30*7836SJohn.Forte@Sun.COM 
31*7836SJohn.Forte@Sun.COM #include <sys/types.h>
32*7836SJohn.Forte@Sun.COM #include <sys/stat.h>
33*7836SJohn.Forte@Sun.COM #include <unistd.h>
34*7836SJohn.Forte@Sun.COM #include <stdlib.h>
35*7836SJohn.Forte@Sun.COM #include <devid.h>
36*7836SJohn.Forte@Sun.COM #include <fcntl.h>
37*7836SJohn.Forte@Sun.COM #include <door.h>
38*7836SJohn.Forte@Sun.COM #include <errno.h>
39*7836SJohn.Forte@Sun.COM #include <strings.h>
40*7836SJohn.Forte@Sun.COM #include <libscf.h>
41*7836SJohn.Forte@Sun.COM #include <libxml/xmlreader.h>
42*7836SJohn.Forte@Sun.COM #include <libxml/xmlwriter.h>
43*7836SJohn.Forte@Sun.COM #include <libxml/parser.h>
44*7836SJohn.Forte@Sun.COM #include <libxml/xpath.h>
45*7836SJohn.Forte@Sun.COM #include <libxml/tree.h>
46*7836SJohn.Forte@Sun.COM #include <wchar.h>
47*7836SJohn.Forte@Sun.COM #include <locale.h>
48*7836SJohn.Forte@Sun.COM #include "isns_mgmt.h"
49*7836SJohn.Forte@Sun.COM #include "isns_utils.h"
50*7836SJohn.Forte@Sun.COM #include "isns_protocol.h"
51*7836SJohn.Forte@Sun.COM #include "cmdparse.h"
52*7836SJohn.Forte@Sun.COM #include "isnsadm.h"
53*7836SJohn.Forte@Sun.COM 
54*7836SJohn.Forte@Sun.COM /* object functions per subcommand */
55*7836SJohn.Forte@Sun.COM static int list_node_func(int, char **, cmdOptions_t *, void *);
56*7836SJohn.Forte@Sun.COM static int list_dd_func(int, char **, cmdOptions_t *, void *);
57*7836SJohn.Forte@Sun.COM static int list_ddset_func(int, char **, cmdOptions_t *, void *);
58*7836SJohn.Forte@Sun.COM static int add_node_func(int, char **, cmdOptions_t *, void *);
59*7836SJohn.Forte@Sun.COM static int add_dd_func(int, char **, cmdOptions_t *, void *);
60*7836SJohn.Forte@Sun.COM static int delete_dd_func(int, char **, cmdOptions_t *, void *);
61*7836SJohn.Forte@Sun.COM static int delete_ddset_func(int, char **, cmdOptions_t *, void *);
62*7836SJohn.Forte@Sun.COM static int create_dd_func(int, char **, cmdOptions_t *, void *);
63*7836SJohn.Forte@Sun.COM static int create_ddset_func(int, char **, cmdOptions_t *, void *);
64*7836SJohn.Forte@Sun.COM static int remove_node_func(int, char **, cmdOptions_t *, void *);
65*7836SJohn.Forte@Sun.COM static int remove_dd_func(int, char **, cmdOptions_t *, void *);
66*7836SJohn.Forte@Sun.COM static int modify_dd_func(int, char **, cmdOptions_t *, void *);
67*7836SJohn.Forte@Sun.COM static int modify_ddset_func(int, char **, cmdOptions_t *, void *);
68*7836SJohn.Forte@Sun.COM static int enable_ddset_func(int, char **, cmdOptions_t *, void *);
69*7836SJohn.Forte@Sun.COM static int disable_ddset_func(int, char **, cmdOptions_t *, void *);
70*7836SJohn.Forte@Sun.COM static int show_config_func(int, char **, cmdOptions_t *, void *);
71*7836SJohn.Forte@Sun.COM static int i_enableddset(int, char **, boolean_t);
72*7836SJohn.Forte@Sun.COM static xmlTextReaderPtr lookup_next_matching_elem(xmlTextReaderPtr, int *,
73*7836SJohn.Forte@Sun.COM 	const char *, const char *);
74*7836SJohn.Forte@Sun.COM static int handle_association_info(xmlChar *, association_t);
75*7836SJohn.Forte@Sun.COM static int process_result_response(xmlChar *, int obj);
76*7836SJohn.Forte@Sun.COM static int process_get_assoc_response(xmlChar *, association_t);
77*7836SJohn.Forte@Sun.COM static int process_get_response(object_type, xmlChar *, uint32_t);
78*7836SJohn.Forte@Sun.COM static int cvt_enumerate_rsp_to_get_req(xmlChar *, xmlChar **, object_type,
79*7836SJohn.Forte@Sun.COM 	uint32_t);
80*7836SJohn.Forte@Sun.COM static int build_get_xml_doc(int, char **, object_type, xmlChar **);
81*7836SJohn.Forte@Sun.COM static int build_delete_xml_doc(int, char **, object_type, char *, xmlChar **);
82*7836SJohn.Forte@Sun.COM static int build_create_xml_doc(int, char **, object_type, char *, xmlChar **);
83*7836SJohn.Forte@Sun.COM static int build_modify_xml_doc(int, char **, object_type, boolean_t,
84*7836SJohn.Forte@Sun.COM 	xmlChar **);
85*7836SJohn.Forte@Sun.COM static int build_rename_xml_doc(char *, object_type, uint32_t, xmlChar **);
86*7836SJohn.Forte@Sun.COM static int build_assoc_xml_doc(xmlChar *, association_t, xmlChar **);
87*7836SJohn.Forte@Sun.COM static int build_assoc_xml_doc(xmlChar *, association_t, xmlChar **);
88*7836SJohn.Forte@Sun.COM static int build_enumerate_xml_doc(object_type, xmlChar **);
89*7836SJohn.Forte@Sun.COM 
90*7836SJohn.Forte@Sun.COM #define	NEW_XMLARGV(old, n) (xmlChar **)realloc((xmlChar *)old, \
91*7836SJohn.Forte@Sun.COM 	(unsigned)(n+2) * sizeof (xmlChar *))
92*7836SJohn.Forte@Sun.COM 
93*7836SJohn.Forte@Sun.COM #define	XML_SFREE(x)	(((x) != NULL) ? (xmlFree(x), (x) = NULL) : (void *)0)
94*7836SJohn.Forte@Sun.COM 
95*7836SJohn.Forte@Sun.COM #define	VERSION_STRING_MAX_LEN	10
96*7836SJohn.Forte@Sun.COM 
97*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_NAME	"name"
98*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_DDNAME	"Discovery Domain name"
99*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_DDSETNAME	"Discovery Domain Set name"
100*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_TARGET	"target"
101*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_INITIATOR	"initiator"
102*7836SJohn.Forte@Sun.COM #define	OPTIONSTRING_VERBOSE	"verbose"
103*7836SJohn.Forte@Sun.COM 
104*7836SJohn.Forte@Sun.COM #define	VERBOSE		0x00000001
105*7836SJohn.Forte@Sun.COM #define	INITIATOR_ONLY	0x00000010
106*7836SJohn.Forte@Sun.COM #define	TARGET_ONLY	0x00000100
107*7836SJohn.Forte@Sun.COM 
108*7836SJohn.Forte@Sun.COM /* object table based on definitions in isns_mgmt.h. */
109*7836SJohn.Forte@Sun.COM static obj_table_entry_t obj_table[] = {
110*7836SJohn.Forte@Sun.COM 	{NODEOBJECT, Node},
111*7836SJohn.Forte@Sun.COM 	{DDOBJECT, DiscoveryDomain},
112*7836SJohn.Forte@Sun.COM 	{DDSETOBJECT, DiscoveryDomainSet},
113*7836SJohn.Forte@Sun.COM 	{DDOBJECTMEMBER, DiscoveryDomainMember},
114*7836SJohn.Forte@Sun.COM 	{DDSETOBJECTMEMBER, DiscoveryDomainSetMember},
115*7836SJohn.Forte@Sun.COM 	{ISNSSERVER, ServerConfig},
116*7836SJohn.Forte@Sun.COM 	{NULL, 0}
117*7836SJohn.Forte@Sun.COM };
118*7836SJohn.Forte@Sun.COM 
119*7836SJohn.Forte@Sun.COM /*
120*7836SJohn.Forte@Sun.COM  *  MAJOR - This should only change when there is an incompatible change made
121*7836SJohn.Forte@Sun.COM  *  to the interfaces or the output.
122*7836SJohn.Forte@Sun.COM  *
123*7836SJohn.Forte@Sun.COM  *  MINOR - This should change whenever there is a new command or new feature
124*7836SJohn.Forte@Sun.COM  *  with no incompatible change.
125*7836SJohn.Forte@Sun.COM  */
126*7836SJohn.Forte@Sun.COM #define	VERSION_STRING_MAJOR	    "1"
127*7836SJohn.Forte@Sun.COM #define	VERSION_STRING_MINOR	    "0"
128*7836SJohn.Forte@Sun.COM static char *ISNS_FMRI = "network/isns_server:default";
129*7836SJohn.Forte@Sun.COM 
130*7836SJohn.Forte@Sun.COM /*
131*7836SJohn.Forte@Sun.COM  * Add new options here
132*7836SJohn.Forte@Sun.COM  */
133*7836SJohn.Forte@Sun.COM 
134*7836SJohn.Forte@Sun.COM /* tables set up based on cmdparse instructions */
135*7836SJohn.Forte@Sun.COM optionTbl_t longOptions[] = {
136*7836SJohn.Forte@Sun.COM 	{"target", no_arg, 't', OPTIONSTRING_TARGET},
137*7836SJohn.Forte@Sun.COM 	{"initiator", no_arg, 'i', OPTIONSTRING_INITIATOR},
138*7836SJohn.Forte@Sun.COM 	{"verbose", no_arg, 'v', OPTIONSTRING_VERBOSE},
139*7836SJohn.Forte@Sun.COM 	{"name", required_arg, 'n', OPTIONSTRING_NAME},
140*7836SJohn.Forte@Sun.COM 	{"dd", required_arg, 'd', OPTIONSTRING_DDNAME},
141*7836SJohn.Forte@Sun.COM 	{"dd-set", required_arg, 's', OPTIONSTRING_DDSETNAME},
142*7836SJohn.Forte@Sun.COM 	{NULL, 0, 0, 0}
143*7836SJohn.Forte@Sun.COM };
144*7836SJohn.Forte@Sun.COM 
145*7836SJohn.Forte@Sun.COM 
146*7836SJohn.Forte@Sun.COM /*
147*7836SJohn.Forte@Sun.COM  * Add new subcommands here
148*7836SJohn.Forte@Sun.COM  */
149*7836SJohn.Forte@Sun.COM subCommandProps_t subcommands[] = {
150*7836SJohn.Forte@Sun.COM 	{"list-node", LISTNODE, list_node_func, "itv", B_FALSE, NULL,
151*7836SJohn.Forte@Sun.COM 		OPERAND_OPTIONAL_MULTIPLE, "node-name"},
152*7836SJohn.Forte@Sun.COM 	{"list-dd", LISTDD, list_dd_func, "v", B_FALSE, NULL,
153*7836SJohn.Forte@Sun.COM 		OPERAND_OPTIONAL_MULTIPLE, OPTIONSTRING_DDNAME},
154*7836SJohn.Forte@Sun.COM 	{"list-dd-set", LISTDDSET, list_ddset_func, "v", B_FALSE, NULL,
155*7836SJohn.Forte@Sun.COM 		OPERAND_OPTIONAL_MULTIPLE, OPTIONSTRING_DDSETNAME},
156*7836SJohn.Forte@Sun.COM 	{"create-dd", CREATEDD, create_dd_func, NULL, B_FALSE, NULL,
157*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDNAME},
158*7836SJohn.Forte@Sun.COM 	{"create-dd-set", CREATEDDSET, create_ddset_func, NULL, B_FALSE, NULL,
159*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDSETNAME},
160*7836SJohn.Forte@Sun.COM 	{"delete-dd", DELETEDD, delete_dd_func, NULL, B_FALSE, NULL,
161*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDNAME},
162*7836SJohn.Forte@Sun.COM 	{"delete-dd-set", DELETEDDSET, delete_ddset_func, NULL, B_FALSE, NULL,
163*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDSETNAME},
164*7836SJohn.Forte@Sun.COM 	{"add-node", ADDNODE, add_node_func, "d", B_TRUE, NULL,
165*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, "node-name"},
166*7836SJohn.Forte@Sun.COM 	{"add-dd", ADDDD, add_dd_func, "s", B_TRUE, NULL,
167*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDNAME},
168*7836SJohn.Forte@Sun.COM 	{"remove-node", REMOVENODE, remove_node_func, "d", B_TRUE, NULL,
169*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, "node-name"},
170*7836SJohn.Forte@Sun.COM 	{"remove-dd", REMOVEDD, remove_dd_func, "s", B_TRUE, NULL,
171*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDNAME},
172*7836SJohn.Forte@Sun.COM 	{"modify-dd", MODIFYDD, modify_dd_func, "n", B_TRUE, NULL,
173*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_SINGLE, OPTIONSTRING_NAME},
174*7836SJohn.Forte@Sun.COM 	{"modify-dd-set", MODIFYDDSET, modify_ddset_func, "n", B_TRUE, NULL,
175*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_SINGLE, OPTIONSTRING_NAME},
176*7836SJohn.Forte@Sun.COM 	{"enable-dd-set", ENABLEDDSET, enable_ddset_func, NULL, B_FALSE, NULL,
177*7836SJohn.Forte@Sun.COM 		OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDSETNAME},
178*7836SJohn.Forte@Sun.COM 	{"disable-dd-set", DISABLEDDSET, disable_ddset_func, NULL, B_FALSE,
179*7836SJohn.Forte@Sun.COM 		NULL, OPERAND_MANDATORY_MULTIPLE, OPTIONSTRING_DDSETNAME},
180*7836SJohn.Forte@Sun.COM 	{"show-config", SHOWCONFIG, show_config_func, NULL, B_FALSE, NULL,
181*7836SJohn.Forte@Sun.COM 		OPERAND_NONE, NULL},
182*7836SJohn.Forte@Sun.COM 	{NULL, 0, NULL, NULL, 0, NULL, 0, NULL}
183*7836SJohn.Forte@Sun.COM };
184*7836SJohn.Forte@Sun.COM 
185*7836SJohn.Forte@Sun.COM /*
186*7836SJohn.Forte@Sun.COM  * ****************************************************************************
187*7836SJohn.Forte@Sun.COM  *
188*7836SJohn.Forte@Sun.COM  * check_door_error
189*7836SJohn.Forte@Sun.COM  *
190*7836SJohn.Forte@Sun.COM  * input:
191*7836SJohn.Forte@Sun.COM  *  errno from the door call.
192*7836SJohn.Forte@Sun.COM  *
193*7836SJohn.Forte@Sun.COM  * Returns:
194*7836SJohn.Forte@Sun.COM  *  either door error or smf service error.
195*7836SJohn.Forte@Sun.COM  *
196*7836SJohn.Forte@Sun.COM  * ****************************************************************************
197*7836SJohn.Forte@Sun.COM  */
198*7836SJohn.Forte@Sun.COM static int
check_door_error(int door_err,int err)199*7836SJohn.Forte@Sun.COM check_door_error(int door_err, int err)
200*7836SJohn.Forte@Sun.COM {
201*7836SJohn.Forte@Sun.COM 	char	*state = NULL;
202*7836SJohn.Forte@Sun.COM 	int	ret;
203*7836SJohn.Forte@Sun.COM 
204*7836SJohn.Forte@Sun.COM 	if (((state = smf_get_state(ISNS_FMRI)) != NULL) &&
205*7836SJohn.Forte@Sun.COM 	    (strcmp(state, SCF_STATE_STRING_ONLINE) != 0)) {
206*7836SJohn.Forte@Sun.COM 		ret = ERROR_ISNS_SMF_SERVICE_NOT_ONLINE;
207*7836SJohn.Forte@Sun.COM 	} else {
208*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
209*7836SJohn.Forte@Sun.COM 		(door_err == ERROR_DOOR_CALL_FAILED) ?
210*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DOOR_CALL_FAILED) :
211*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DOOR_OPEN_FAILED));
212*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "\terrno: %s\n", strerror(err));
213*7836SJohn.Forte@Sun.COM 	    ret = door_err;
214*7836SJohn.Forte@Sun.COM 	}
215*7836SJohn.Forte@Sun.COM 
216*7836SJohn.Forte@Sun.COM 	if (state) free(state);
217*7836SJohn.Forte@Sun.COM 
218*7836SJohn.Forte@Sun.COM 	return (ret);
219*7836SJohn.Forte@Sun.COM }
220*7836SJohn.Forte@Sun.COM 
221*7836SJohn.Forte@Sun.COM /*
222*7836SJohn.Forte@Sun.COM  * ****************************************************************************
223*7836SJohn.Forte@Sun.COM  *
224*7836SJohn.Forte@Sun.COM  * lookup an element based on the element name.
225*7836SJohn.Forte@Sun.COM  *
226*7836SJohn.Forte@Sun.COM  * reader	- current xmlReaderReadPtr
227*7836SJohn.Forte@Sun.COM  * m_falg	- indicate lookup result
228*7836SJohn.Forte@Sun.COM  * elem		- name of element to look up.
229*7836SJohn.Forte@Sun.COM  * endelem	- name of end element to look up.
230*7836SJohn.Forte@Sun.COM  *
231*7836SJohn.Forte@Sun.COM  * ****************************************************************************
232*7836SJohn.Forte@Sun.COM  */
233*7836SJohn.Forte@Sun.COM static	xmlTextReaderPtr
lookup_next_matching_elem(xmlTextReaderPtr reader,int * m_flag,const char * elem,const char * endelem)234*7836SJohn.Forte@Sun.COM lookup_next_matching_elem(xmlTextReaderPtr reader, int *m_flag,
235*7836SJohn.Forte@Sun.COM 	const char *elem, const char *endelem)
236*7836SJohn.Forte@Sun.COM {
237*7836SJohn.Forte@Sun.COM 
238*7836SJohn.Forte@Sun.COM 	if (reader == NULL) {
239*7836SJohn.Forte@Sun.COM 	    *m_flag = NO_MATCH;
240*7836SJohn.Forte@Sun.COM 	    return (NULL);
241*7836SJohn.Forte@Sun.COM 	}
242*7836SJohn.Forte@Sun.COM 
243*7836SJohn.Forte@Sun.COM 	do {
244*7836SJohn.Forte@Sun.COM 	/*
245*7836SJohn.Forte@Sun.COM 	 * if (xmlTextReaderName(reader) != NULL) {
246*7836SJohn.Forte@Sun.COM 	 * 	printf("%s ", xmlTextReaderName(reader));
247*7836SJohn.Forte@Sun.COM 	 * }
248*7836SJohn.Forte@Sun.COM 	 * printf("%d %d %d\n",
249*7836SJohn.Forte@Sun.COM 	 * xmlTextReaderDepth(reader),
250*7836SJohn.Forte@Sun.COM 	 * xmlTextReaderNodeType(reader),
251*7836SJohn.Forte@Sun.COM 	 * xmlTextReaderIsEmptyElement(reader));
252*7836SJohn.Forte@Sun.COM 	 */
253*7836SJohn.Forte@Sun.COM 		/*
254*7836SJohn.Forte@Sun.COM 		 * if match with elem, return the reader with READER_MATCH flag.
255*7836SJohn.Forte@Sun.COM 		 * if match with end elem, return the reader wtih
256*7836SJohn.Forte@Sun.COM 		 * END_READER_MATCH flag.
257*7836SJohn.Forte@Sun.COM 		 */
258*7836SJohn.Forte@Sun.COM 	    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
259*7836SJohn.Forte@Sun.COM 		if (XMLNCMP(reader, elem) == 0) {
260*7836SJohn.Forte@Sun.COM 		    *m_flag = READER_MATCH;
261*7836SJohn.Forte@Sun.COM 		    return (reader);
262*7836SJohn.Forte@Sun.COM 		}
263*7836SJohn.Forte@Sun.COM 	    } else if (xmlTextReaderNodeType(reader) ==
264*7836SJohn.Forte@Sun.COM 		XML_READER_TYPE_END_ELEMENT) {
265*7836SJohn.Forte@Sun.COM 		if (XMLNCMP(reader, endelem) == 0) {
266*7836SJohn.Forte@Sun.COM 		    *m_flag = END_READER_MATCH;
267*7836SJohn.Forte@Sun.COM 		    return (reader);
268*7836SJohn.Forte@Sun.COM 		}
269*7836SJohn.Forte@Sun.COM 	    }
270*7836SJohn.Forte@Sun.COM 	} while (xmlTextReaderRead(reader) == 1);
271*7836SJohn.Forte@Sun.COM 
272*7836SJohn.Forte@Sun.COM 	*m_flag = NO_MATCH;
273*7836SJohn.Forte@Sun.COM 	return (NULL);
274*7836SJohn.Forte@Sun.COM }
275*7836SJohn.Forte@Sun.COM 
276*7836SJohn.Forte@Sun.COM /*
277*7836SJohn.Forte@Sun.COM  * ****************************************************************************
278*7836SJohn.Forte@Sun.COM  *
279*7836SJohn.Forte@Sun.COM  * Routine for getAssociated operation
280*7836SJohn.Forte@Sun.COM  *	Construct association request  based on the name and calls door
281*7836SJohn.Forte@Sun.COM  *	interface.
282*7836SJohn.Forte@Sun.COM  *
283*7836SJohn.Forte@Sun.COM  * name		- name attributes of an object for getting an association
284*7836SJohn.Forte@Sun.COM  * assoc	- association type
285*7836SJohn.Forte@Sun.COM  *
286*7836SJohn.Forte@Sun.COM  * ****************************************************************************
287*7836SJohn.Forte@Sun.COM  */
288*7836SJohn.Forte@Sun.COM static int
handle_association_info(xmlChar * name,association_t assoc)289*7836SJohn.Forte@Sun.COM handle_association_info(xmlChar *name, association_t assoc)
290*7836SJohn.Forte@Sun.COM {
291*7836SJohn.Forte@Sun.COM 
292*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
293*7836SJohn.Forte@Sun.COM 	door_arg_t darg;
294*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
295*7836SJohn.Forte@Sun.COM 	int fd;
296*7836SJohn.Forte@Sun.COM 
297*7836SJohn.Forte@Sun.COM 	if ((ret = build_assoc_xml_doc(name, assoc, &doc)) != 0) {
298*7836SJohn.Forte@Sun.COM 	    return (ret);
299*7836SJohn.Forte@Sun.COM 	}
300*7836SJohn.Forte@Sun.COM 
301*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
302*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
303*7836SJohn.Forte@Sun.COM 	    return (ret);
304*7836SJohn.Forte@Sun.COM 	}
305*7836SJohn.Forte@Sun.COM 
306*7836SJohn.Forte@Sun.COM 	(void) bzero(&darg, sizeof (darg));
307*7836SJohn.Forte@Sun.COM 	bzero(&darg, sizeof (darg));
308*7836SJohn.Forte@Sun.COM 	darg.data_ptr = (char *)doc;
309*7836SJohn.Forte@Sun.COM 	darg.data_size = xmlStrlen(doc) + 1;
310*7836SJohn.Forte@Sun.COM 	darg.rbuf = NULL;
311*7836SJohn.Forte@Sun.COM 	darg.rsize = 0;
312*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
313*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
314*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
315*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
316*7836SJohn.Forte@Sun.COM 	    return (ret);
317*7836SJohn.Forte@Sun.COM 	}
318*7836SJohn.Forte@Sun.COM 
319*7836SJohn.Forte@Sun.COM 	if ((ret = process_get_assoc_response((xmlChar *)darg.rbuf,
320*7836SJohn.Forte@Sun.COM 	    assoc)) != 0) {
321*7836SJohn.Forte@Sun.COM 	/*
322*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager
323*7836SJohn.Forte@Sun.COM 	 * that rbuf. indicate if munmap is required on rbuf.
324*7836SJohn.Forte@Sun.COM 	 */
325*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
326*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
327*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
328*7836SJohn.Forte@Sun.COM 	    return (ret);
329*7836SJohn.Forte@Sun.COM 	}
330*7836SJohn.Forte@Sun.COM 
331*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
332*7836SJohn.Forte@Sun.COM 
333*7836SJohn.Forte@Sun.COM 	(void) close(fd);
334*7836SJohn.Forte@Sun.COM 	(void) xmlFree(doc);
335*7836SJohn.Forte@Sun.COM 
336*7836SJohn.Forte@Sun.COM 	return (0);
337*7836SJohn.Forte@Sun.COM }
338*7836SJohn.Forte@Sun.COM 
339*7836SJohn.Forte@Sun.COM /*
340*7836SJohn.Forte@Sun.COM  * ****************************************************************************
341*7836SJohn.Forte@Sun.COM  *
342*7836SJohn.Forte@Sun.COM  * process_error_status
343*7836SJohn.Forte@Sun.COM  *	The routine process non 0 status and print out error message.
344*7836SJohn.Forte@Sun.COM  *
345*7836SJohn.Forte@Sun.COM  * status	- status code
346*7836SJohn.Forte@Sun.COM  * reader	- reader that points to the message element.
347*7836SJohn.Forte@Sun.COM  *
348*7836SJohn.Forte@Sun.COM  * ****************************************************************************
349*7836SJohn.Forte@Sun.COM  */
350*7836SJohn.Forte@Sun.COM static void
print_error_status(int status,int obj,xmlTextReaderPtr reader)351*7836SJohn.Forte@Sun.COM print_error_status(int status, int obj, xmlTextReaderPtr reader)
352*7836SJohn.Forte@Sun.COM {
353*7836SJohn.Forte@Sun.COM 	int m_flag = 0;
354*7836SJohn.Forte@Sun.COM 
355*7836SJohn.Forte@Sun.COM 	switch (status) {
356*7836SJohn.Forte@Sun.COM 	case ISNS_RSP_BUSY:
357*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
358*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_SERVER_BUSY));
359*7836SJohn.Forte@Sun.COM 	    break;
360*7836SJohn.Forte@Sun.COM 	case ISNS_RSP_INTERNAL_ERROR:
361*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
362*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_SERVER_INTERNAL_ERROR));
363*7836SJohn.Forte@Sun.COM 	    break;
364*7836SJohn.Forte@Sun.COM 	case ISNS_RSP_OPTION_NOT_UNDERSTOOD:
365*7836SJohn.Forte@Sun.COM 	    if ((obj == DiscoveryDomain) ||
366*7836SJohn.Forte@Sun.COM 		(obj == DiscoveryDomainMember)) {
367*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
368*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_OPERATION_NOT_ALLOWED_FOR_DEFAULT_DD));
369*7836SJohn.Forte@Sun.COM 	    } else {
370*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
371*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_OPERATION_NOT_ALLOWED_FOR_DEFAULT_DDSET));
372*7836SJohn.Forte@Sun.COM 	    }
373*7836SJohn.Forte@Sun.COM 	    break;
374*7836SJohn.Forte@Sun.COM 	case PARTIAL_FAILURE:
375*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
376*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_PARTIAL_FAILURE));
377*7836SJohn.Forte@Sun.COM 	    break;
378*7836SJohn.Forte@Sun.COM 	case ERR_NO_SUCH_ASSOCIATION:
379*7836SJohn.Forte@Sun.COM 	    if ((obj == DiscoveryDomain) ||
380*7836SJohn.Forte@Sun.COM 		(obj == DiscoveryDomainMember)) {
381*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
382*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DDMEMBER_NOT_FOUND));
383*7836SJohn.Forte@Sun.COM 	    } else {
384*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
385*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DDSETMEMBER_NOT_FOUND));
386*7836SJohn.Forte@Sun.COM 	    }
387*7836SJohn.Forte@Sun.COM 	    break;
388*7836SJohn.Forte@Sun.COM 	case ERR_ALREADY_ASSOCIATED:
389*7836SJohn.Forte@Sun.COM 	    if ((obj == DiscoveryDomain) ||
390*7836SJohn.Forte@Sun.COM 		(obj == DiscoveryDomainMember)) {
391*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
392*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DDMEMBER_ALREADY_EXIST));
393*7836SJohn.Forte@Sun.COM 	    } else {
394*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
395*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DDSETMEMBER_ALREADY_EXIST));
396*7836SJohn.Forte@Sun.COM 	    }
397*7836SJohn.Forte@Sun.COM 	    break;
398*7836SJohn.Forte@Sun.COM 	case ERR_NAME_IN_USE:
399*7836SJohn.Forte@Sun.COM 	    if ((obj == DiscoveryDomain) ||
400*7836SJohn.Forte@Sun.COM 		(obj == DiscoveryDomainMember)) {
401*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
402*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DD_NAME_IN_USE));
403*7836SJohn.Forte@Sun.COM 	    } else {
404*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
405*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_DDSET_NAME_IN_USE));
406*7836SJohn.Forte@Sun.COM 	    }
407*7836SJohn.Forte@Sun.COM 	    break;
408*7836SJohn.Forte@Sun.COM 	default:
409*7836SJohn.Forte@Sun.COM 	    reader = lookup_next_matching_elem(reader, &m_flag,
410*7836SJohn.Forte@Sun.COM 		MESSAGEELEMENT, RESULTELEMENT);
411*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
412*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderRead(reader);
413*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "Error: %s\n",
414*7836SJohn.Forte@Sun.COM 			(const char *) xmlTextReaderConstValue(reader));
415*7836SJohn.Forte@Sun.COM 	    } else {
416*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "Error: %s\n",
417*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_XML_MESSAGE_ELEM_NOT_FOUND));
418*7836SJohn.Forte@Sun.COM 	    }
419*7836SJohn.Forte@Sun.COM 	}
420*7836SJohn.Forte@Sun.COM }
421*7836SJohn.Forte@Sun.COM 
422*7836SJohn.Forte@Sun.COM /*
423*7836SJohn.Forte@Sun.COM  * ****************************************************************************
424*7836SJohn.Forte@Sun.COM  *
425*7836SJohn.Forte@Sun.COM  * print_partial_failure_info
426*7836SJohn.Forte@Sun.COM  *	The routine prints partial failure info.
427*7836SJohn.Forte@Sun.COM  *
428*7836SJohn.Forte@Sun.COM  * status	- status code
429*7836SJohn.Forte@Sun.COM  * reader	- reader that points to the message element.
430*7836SJohn.Forte@Sun.COM  *
431*7836SJohn.Forte@Sun.COM  * ****************************************************************************
432*7836SJohn.Forte@Sun.COM  */
433*7836SJohn.Forte@Sun.COM static void
print_partial_failure_info(xmlChar * doc)434*7836SJohn.Forte@Sun.COM print_partial_failure_info(xmlChar *doc)
435*7836SJohn.Forte@Sun.COM {
436*7836SJohn.Forte@Sun.COM 	xmlChar expr[ISNS_MAX_LABEL_LEN + 13];
437*7836SJohn.Forte@Sun.COM 	xmlDocPtr x_doc;
438*7836SJohn.Forte@Sun.COM 	xmlXPathContextPtr ctext = NULL;
439*7836SJohn.Forte@Sun.COM 	xmlXPathObjectPtr xpath_obj = NULL;
440*7836SJohn.Forte@Sun.COM 	xmlNodeSetPtr r_nodes = NULL;
441*7836SJohn.Forte@Sun.COM 	xmlAttrPtr attr = NULL;
442*7836SJohn.Forte@Sun.COM 	int i, cnt, obj = 0;
443*7836SJohn.Forte@Sun.COM 
444*7836SJohn.Forte@Sun.COM 	if ((x_doc = xmlParseMemory((const char *)doc, xmlStrlen(doc))) ==
445*7836SJohn.Forte@Sun.COM 	    NULL) {
446*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
447*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_NO_ADDITIONAL_PARTIAL_FAILIRE_INFO));
448*7836SJohn.Forte@Sun.COM 	}
449*7836SJohn.Forte@Sun.COM 
450*7836SJohn.Forte@Sun.COM 	ctext = xmlXPathNewContext(x_doc);
451*7836SJohn.Forte@Sun.COM 	if (ctext == NULL) {
452*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
453*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_NO_ADDITIONAL_PARTIAL_FAILIRE_INFO));
454*7836SJohn.Forte@Sun.COM 	}
455*7836SJohn.Forte@Sun.COM 
456*7836SJohn.Forte@Sun.COM 	for (i = 0; obj_table[i].obj_str != NULL; i++) {
457*7836SJohn.Forte@Sun.COM 	    (void) xmlStrPrintf(expr, ISNS_MAX_LABEL_LEN + 13,
458*7836SJohn.Forte@Sun.COM 		(const unsigned char *)"%s\"%s\"]", "//*[name()=",
459*7836SJohn.Forte@Sun.COM 		obj_table[i].obj_str);
460*7836SJohn.Forte@Sun.COM 	    xpath_obj = xmlXPathEvalExpression(expr, ctext);
461*7836SJohn.Forte@Sun.COM 	    if ((xpath_obj) && (xpath_obj->nodesetval) &&
462*7836SJohn.Forte@Sun.COM 		(xpath_obj->nodesetval->nodeNr > 0) &&
463*7836SJohn.Forte@Sun.COM 		(xpath_obj->nodesetval->nodeTab)) {
464*7836SJohn.Forte@Sun.COM 		obj = obj_table[i].obj_id;
465*7836SJohn.Forte@Sun.COM 		break;
466*7836SJohn.Forte@Sun.COM 	    }
467*7836SJohn.Forte@Sun.COM 	}
468*7836SJohn.Forte@Sun.COM 
469*7836SJohn.Forte@Sun.COM 	if (obj == 0) {
470*7836SJohn.Forte@Sun.COM 	    if (xpath_obj) xmlXPathFreeObject(xpath_obj);
471*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
472*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_NO_ADDITIONAL_PARTIAL_FAILIRE_INFO));
473*7836SJohn.Forte@Sun.COM 	}
474*7836SJohn.Forte@Sun.COM 
475*7836SJohn.Forte@Sun.COM 	switch (obj) {
476*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainMember:
477*7836SJohn.Forte@Sun.COM 		r_nodes = xpath_obj->nodesetval;
478*7836SJohn.Forte@Sun.COM 		cnt = r_nodes->nodeNr;
479*7836SJohn.Forte@Sun.COM 		for (i = 0; i < cnt; i++) {
480*7836SJohn.Forte@Sun.COM 		    attr = r_nodes->nodeTab[i]->properties;
481*7836SJohn.Forte@Sun.COM 		    for (; attr != NULL; attr = attr->next) {
482*7836SJohn.Forte@Sun.COM 			if (xmlStrncmp(attr->name, (xmlChar *)DDNAMEATTR,
483*7836SJohn.Forte@Sun.COM 			    xmlStrlen((xmlChar *)DDNAMEATTR)) == 0) {
484*7836SJohn.Forte@Sun.COM 				(void) fprintf(stderr, "DD Name: %s\t",
485*7836SJohn.Forte@Sun.COM 				xmlNodeGetContent(attr->children));
486*7836SJohn.Forte@Sun.COM 			}
487*7836SJohn.Forte@Sun.COM 			if (xmlStrncmp(attr->name, (xmlChar *)NODENAMEATTR,
488*7836SJohn.Forte@Sun.COM 			    xmlStrlen((xmlChar *)NODENAMEATTR)) == 0) {
489*7836SJohn.Forte@Sun.COM 				(void) fprintf(stderr, "Node Name: %s\t",
490*7836SJohn.Forte@Sun.COM 				xmlNodeGetContent(attr->children));
491*7836SJohn.Forte@Sun.COM 			}
492*7836SJohn.Forte@Sun.COM 		    }
493*7836SJohn.Forte@Sun.COM 		    (void) fprintf(stderr, "\n");
494*7836SJohn.Forte@Sun.COM 		}
495*7836SJohn.Forte@Sun.COM 		if (xpath_obj) xmlXPathFreeObject(xpath_obj);
496*7836SJohn.Forte@Sun.COM 		break;
497*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSetMember:
498*7836SJohn.Forte@Sun.COM 		r_nodes = xpath_obj->nodesetval;
499*7836SJohn.Forte@Sun.COM 		cnt = r_nodes->nodeNr;
500*7836SJohn.Forte@Sun.COM 		for (i = 0; i < cnt; i++) {
501*7836SJohn.Forte@Sun.COM 		    attr = r_nodes->nodeTab[i]->properties;
502*7836SJohn.Forte@Sun.COM 		    for (; attr != NULL; attr = attr->next) {
503*7836SJohn.Forte@Sun.COM 			if (xmlStrncmp(attr->name, (xmlChar *)DDSETNAMEATTR,
504*7836SJohn.Forte@Sun.COM 			    xmlStrlen((xmlChar *)DDNAMEATTR)) == 0) {
505*7836SJohn.Forte@Sun.COM 				(void) fprintf(stderr, "DD Set Name: %s\t",
506*7836SJohn.Forte@Sun.COM 				xmlNodeGetContent(attr->children));
507*7836SJohn.Forte@Sun.COM 			}
508*7836SJohn.Forte@Sun.COM 			if (xmlStrncmp(attr->name, (xmlChar *)DDNAMEATTR,
509*7836SJohn.Forte@Sun.COM 			    xmlStrlen((xmlChar *)NODENAMEATTR)) == 0) {
510*7836SJohn.Forte@Sun.COM 				(void) fprintf(stderr, "DD Name: %s\t",
511*7836SJohn.Forte@Sun.COM 				xmlNodeGetContent(attr->children));
512*7836SJohn.Forte@Sun.COM 			}
513*7836SJohn.Forte@Sun.COM 		    }
514*7836SJohn.Forte@Sun.COM 		    (void) fprintf(stderr, "\n");
515*7836SJohn.Forte@Sun.COM 		}
516*7836SJohn.Forte@Sun.COM 		if (xpath_obj) xmlXPathFreeObject(xpath_obj);
517*7836SJohn.Forte@Sun.COM 		break;
518*7836SJohn.Forte@Sun.COM 	    case Node:
519*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
520*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
521*7836SJohn.Forte@Sun.COM 		r_nodes = xpath_obj->nodesetval;
522*7836SJohn.Forte@Sun.COM 		cnt = r_nodes->nodeNr;
523*7836SJohn.Forte@Sun.COM 		for (i = 0; i < cnt; i++) {
524*7836SJohn.Forte@Sun.COM 		    attr = r_nodes->nodeTab[i]->properties;
525*7836SJohn.Forte@Sun.COM 		    for (; attr != NULL; attr = attr->next) {
526*7836SJohn.Forte@Sun.COM 			if ((xmlStrncmp(attr->name, (xmlChar *)NAMEATTR,
527*7836SJohn.Forte@Sun.COM 			    xmlStrlen((xmlChar *)NAMEATTR))) == 0) {
528*7836SJohn.Forte@Sun.COM 				(void) fprintf(stderr, "Object Name: %s\n",
529*7836SJohn.Forte@Sun.COM 				xmlNodeGetContent(attr->children));
530*7836SJohn.Forte@Sun.COM 			}
531*7836SJohn.Forte@Sun.COM 		    }
532*7836SJohn.Forte@Sun.COM 		}
533*7836SJohn.Forte@Sun.COM 		if (xpath_obj) xmlXPathFreeObject(xpath_obj);
534*7836SJohn.Forte@Sun.COM 		break;
535*7836SJohn.Forte@Sun.COM 	}
536*7836SJohn.Forte@Sun.COM }
537*7836SJohn.Forte@Sun.COM 
538*7836SJohn.Forte@Sun.COM /*
539*7836SJohn.Forte@Sun.COM  * ****************************************************************************
540*7836SJohn.Forte@Sun.COM  *
541*7836SJohn.Forte@Sun.COM  * process_result_response
542*7836SJohn.Forte@Sun.COM  *	The routine process association data based on the association type.
543*7836SJohn.Forte@Sun.COM  *
544*7836SJohn.Forte@Sun.COM  * doc		- result
545*7836SJohn.Forte@Sun.COM  * obj		- associated object type
546*7836SJohn.Forte@Sun.COM  *
547*7836SJohn.Forte@Sun.COM  * ****************************************************************************
548*7836SJohn.Forte@Sun.COM  */
549*7836SJohn.Forte@Sun.COM static int
process_result_response(xmlChar * doc,int obj)550*7836SJohn.Forte@Sun.COM process_result_response(xmlChar *doc, int obj)
551*7836SJohn.Forte@Sun.COM {
552*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
553*7836SJohn.Forte@Sun.COM 	int m_flag = 0, status;
554*7836SJohn.Forte@Sun.COM 
555*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory((const char *)doc,
556*7836SJohn.Forte@Sun.COM 	    xmlStrlen(doc), NULL, NULL, 0)) == NULL) {
557*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_READER_NULL);
558*7836SJohn.Forte@Sun.COM 	}
559*7836SJohn.Forte@Sun.COM 
560*7836SJohn.Forte@Sun.COM 	/* if status is 0, continue on.  Otherwise return an error. */
561*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, STATUSELEMENT,
562*7836SJohn.Forte@Sun.COM 	    RESULTELEMENT)) {
563*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
564*7836SJohn.Forte@Sun.COM 		if (xmlTextReaderRead(reader) == 1) {
565*7836SJohn.Forte@Sun.COM 		    status =
566*7836SJohn.Forte@Sun.COM 		    atoi((const char *)xmlTextReaderConstValue(reader));
567*7836SJohn.Forte@Sun.COM 		    if (status != 0) {
568*7836SJohn.Forte@Sun.COM 			print_error_status(status, obj, reader);
569*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderClose(reader);
570*7836SJohn.Forte@Sun.COM 			(void) xmlFreeTextReader(reader);
571*7836SJohn.Forte@Sun.COM 			if (status == PARTIAL_FAILURE) {
572*7836SJohn.Forte@Sun.COM 			    print_partial_failure_info(doc);
573*7836SJohn.Forte@Sun.COM 			}
574*7836SJohn.Forte@Sun.COM 			return (status);
575*7836SJohn.Forte@Sun.COM 		    }
576*7836SJohn.Forte@Sun.COM 		} else {
577*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderClose(reader);
578*7836SJohn.Forte@Sun.COM 		    (void) xmlFreeTextReader(reader);
579*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
580*7836SJohn.Forte@Sun.COM 		}
581*7836SJohn.Forte@Sun.COM 	    } else {
582*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderClose(reader);
583*7836SJohn.Forte@Sun.COM 		(void) xmlFreeTextReader(reader);
584*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
585*7836SJohn.Forte@Sun.COM 	    }
586*7836SJohn.Forte@Sun.COM 	} else {
587*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
588*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_XML_READER_NULL));
589*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
590*7836SJohn.Forte@Sun.COM 	}
591*7836SJohn.Forte@Sun.COM 
592*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
593*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
594*7836SJohn.Forte@Sun.COM 	return (0);
595*7836SJohn.Forte@Sun.COM }
596*7836SJohn.Forte@Sun.COM 
597*7836SJohn.Forte@Sun.COM /*
598*7836SJohn.Forte@Sun.COM  * ****************************************************************************
599*7836SJohn.Forte@Sun.COM  *
600*7836SJohn.Forte@Sun.COM  * process_get_assoc_response
601*7836SJohn.Forte@Sun.COM  *	The routine process association data based on the association type.
602*7836SJohn.Forte@Sun.COM  *
603*7836SJohn.Forte@Sun.COM  * doc		- association data
604*7836SJohn.Forte@Sun.COM  * assoc	- associatiion type
605*7836SJohn.Forte@Sun.COM  *
606*7836SJohn.Forte@Sun.COM  * ****************************************************************************
607*7836SJohn.Forte@Sun.COM  */
608*7836SJohn.Forte@Sun.COM static int
process_get_assoc_response(xmlChar * doc,association_t assoc)609*7836SJohn.Forte@Sun.COM process_get_assoc_response(xmlChar *doc, association_t assoc)
610*7836SJohn.Forte@Sun.COM {
611*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
612*7836SJohn.Forte@Sun.COM 	xmlChar *ddsname, *ddname, *nodename;
613*7836SJohn.Forte@Sun.COM 	wchar_t wc_name[ISNS_MAX_NAME_LEN];
614*7836SJohn.Forte@Sun.COM 	int m_flag = 0, h_printed = 0, status;
615*7836SJohn.Forte@Sun.COM 
616*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory((const char *)doc,
617*7836SJohn.Forte@Sun.COM 			xmlStrlen(doc), NULL, NULL, 0)) == NULL) {
618*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
619*7836SJohn.Forte@Sun.COM 	}
620*7836SJohn.Forte@Sun.COM 
621*7836SJohn.Forte@Sun.COM 	/* if status is 0, continue on.  Otherwise return an error. */
622*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, STATUSELEMENT,
623*7836SJohn.Forte@Sun.COM 	    RESULTELEMENT)) {
624*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
625*7836SJohn.Forte@Sun.COM 		if (xmlTextReaderRead(reader) == 1) {
626*7836SJohn.Forte@Sun.COM 		    status =
627*7836SJohn.Forte@Sun.COM 		    atoi((const char *)xmlTextReaderConstValue(reader));
628*7836SJohn.Forte@Sun.COM 		    if ((status != 0) && (status != PARTIAL_SUCCESS)) {
629*7836SJohn.Forte@Sun.COM 			/* not an error */
630*7836SJohn.Forte@Sun.COM 			if ((status !=  ERR_NO_SUCH_ASSOCIATION) &&
631*7836SJohn.Forte@Sun.COM 			    (status !=  ERR_NO_ASSOCIATED_DD_FOUND) &&
632*7836SJohn.Forte@Sun.COM 			    (status !=  ERR_NO_ASSOCIATED_DDSET_FOUND)) {
633*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderClose(reader);
634*7836SJohn.Forte@Sun.COM 			    (void) xmlFreeTextReader(reader);
635*7836SJohn.Forte@Sun.COM 			    return (0);
636*7836SJohn.Forte@Sun.COM 			} else {
637*7836SJohn.Forte@Sun.COM 			    print_error_status(status,
638*7836SJohn.Forte@Sun.COM 				((assoc == node_to_dd) || (dd_to_node)) ?
639*7836SJohn.Forte@Sun.COM 				DiscoveryDomain : DiscoveryDomainSet, reader);
640*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderClose(reader);
641*7836SJohn.Forte@Sun.COM 			    (void) xmlFreeTextReader(reader);
642*7836SJohn.Forte@Sun.COM 			    return (status);
643*7836SJohn.Forte@Sun.COM 			}
644*7836SJohn.Forte@Sun.COM 		    }
645*7836SJohn.Forte@Sun.COM 		} else {
646*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderClose(reader);
647*7836SJohn.Forte@Sun.COM 		    (void) xmlFreeTextReader(reader);
648*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
649*7836SJohn.Forte@Sun.COM 		}
650*7836SJohn.Forte@Sun.COM 	    } else {
651*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
652*7836SJohn.Forte@Sun.COM 	    }
653*7836SJohn.Forte@Sun.COM 	} else {
654*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
655*7836SJohn.Forte@Sun.COM 	}
656*7836SJohn.Forte@Sun.COM 
657*7836SJohn.Forte@Sun.COM 	m_flag = 0;
658*7836SJohn.Forte@Sun.COM 
659*7836SJohn.Forte@Sun.COM 	switch (assoc) {
660*7836SJohn.Forte@Sun.COM 	    case node_to_dd:
661*7836SJohn.Forte@Sun.COM 		/* process DD elements */
662*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
663*7836SJohn.Forte@Sun.COM 		    DDOBJECTMEMBER, ISNSRESPONSE)) {
664*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
665*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
666*7836SJohn.Forte@Sun.COM 			break;
667*7836SJohn.Forte@Sun.COM 		    } else if (m_flag == READER_MATCH) {
668*7836SJohn.Forte@Sun.COM 			if ((ddname = (xmlTextReaderGetAttribute(reader,
669*7836SJohn.Forte@Sun.COM 			    (const xmlChar *)DDNAMEATTR))) != NULL) {
670*7836SJohn.Forte@Sun.COM 			    if (mbstowcs(wc_name, (const char *)ddname,
671*7836SJohn.Forte@Sun.COM 				ISNS_MAX_NAME_LEN) == (size_t)-1) {
672*7836SJohn.Forte@Sun.COM 				(void) wcscpy(wc_name, L"-");
673*7836SJohn.Forte@Sun.COM 			    }
674*7836SJohn.Forte@Sun.COM 			    if (h_printed) {
675*7836SJohn.Forte@Sun.COM 				(void) printf("\tDD Name: %ws\n", wc_name);
676*7836SJohn.Forte@Sun.COM 			    } else {
677*7836SJohn.Forte@Sun.COM 				(void) printf("\tDD Name: %ws\n", wc_name);
678*7836SJohn.Forte@Sun.COM 				h_printed = 1;
679*7836SJohn.Forte@Sun.COM 			    }
680*7836SJohn.Forte@Sun.COM 			    xmlFree(ddname);
681*7836SJohn.Forte@Sun.COM 			} else {
682*7836SJohn.Forte@Sun.COM 			    if (h_printed) {
683*7836SJohn.Forte@Sun.COM 				(void) printf("\t         %s\n", "-");
684*7836SJohn.Forte@Sun.COM 			    } else {
685*7836SJohn.Forte@Sun.COM 				(void) printf("\tDD Name: %s\n", "-");
686*7836SJohn.Forte@Sun.COM 				h_printed = 1;
687*7836SJohn.Forte@Sun.COM 			    }
688*7836SJohn.Forte@Sun.COM 			}
689*7836SJohn.Forte@Sun.COM 		    }
690*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
691*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderRead(reader);
692*7836SJohn.Forte@Sun.COM 		}
693*7836SJohn.Forte@Sun.COM 	    break;
694*7836SJohn.Forte@Sun.COM 	case dd_to_node:
695*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoamin elements */
696*7836SJohn.Forte@Sun.COM 	    while (reader = lookup_next_matching_elem(reader, &m_flag,
697*7836SJohn.Forte@Sun.COM 		    DDOBJECTMEMBER, ISNSRESPONSE)) {
698*7836SJohn.Forte@Sun.COM 		if (m_flag == END_READER_MATCH) {
699*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderNext(reader);
700*7836SJohn.Forte@Sun.COM 		    break;
701*7836SJohn.Forte@Sun.COM 		} else if (m_flag == READER_MATCH) {
702*7836SJohn.Forte@Sun.COM 		    if ((nodename = (xmlTextReaderGetAttribute(reader,
703*7836SJohn.Forte@Sun.COM 			    (const xmlChar *)NODENAMEATTR))) != NULL) {
704*7836SJohn.Forte@Sun.COM 			if (mbstowcs(wc_name, (const char *)nodename,
705*7836SJohn.Forte@Sun.COM 			    ISNS_MAX_NAME_LEN) == (size_t)-1) {
706*7836SJohn.Forte@Sun.COM 			    (void) wcscpy(wc_name, L"-");
707*7836SJohn.Forte@Sun.COM 			}
708*7836SJohn.Forte@Sun.COM 			(void) printf("\tiSCSI name: %ws\n", wc_name);
709*7836SJohn.Forte@Sun.COM 			xmlFree(nodename);
710*7836SJohn.Forte@Sun.COM 		    } else {
711*7836SJohn.Forte@Sun.COM 			(void) printf("\tiSCSI name: %s\n", "-");
712*7836SJohn.Forte@Sun.COM 		    }
713*7836SJohn.Forte@Sun.COM 		}
714*7836SJohn.Forte@Sun.COM 		m_flag = 0;
715*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderRead(reader);
716*7836SJohn.Forte@Sun.COM 	    }
717*7836SJohn.Forte@Sun.COM 	    break;
718*7836SJohn.Forte@Sun.COM 	case dd_to_ddset:
719*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoaminSet elements */
720*7836SJohn.Forte@Sun.COM 	    while (reader = lookup_next_matching_elem(reader, &m_flag,
721*7836SJohn.Forte@Sun.COM 		    DDSETOBJECTMEMBER, ISNSRESPONSE)) {
722*7836SJohn.Forte@Sun.COM 		if (m_flag == END_READER_MATCH) {
723*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderNext(reader);
724*7836SJohn.Forte@Sun.COM 		    break;
725*7836SJohn.Forte@Sun.COM 		} else if (m_flag == READER_MATCH) {
726*7836SJohn.Forte@Sun.COM 		    if ((ddsname = (xmlTextReaderGetAttribute(reader,
727*7836SJohn.Forte@Sun.COM 			(const xmlChar *)DDSETNAMEATTR))) != NULL) {
728*7836SJohn.Forte@Sun.COM 			if (mbstowcs(wc_name, (const char *)ddsname,
729*7836SJohn.Forte@Sun.COM 			    ISNS_MAX_NAME_LEN) == (size_t)-1) {
730*7836SJohn.Forte@Sun.COM 			    (void) wcscpy(wc_name, L"-");
731*7836SJohn.Forte@Sun.COM 			}
732*7836SJohn.Forte@Sun.COM 			if (h_printed) {
733*7836SJohn.Forte@Sun.COM 			    (void) printf("\t           %ws\n", wc_name);
734*7836SJohn.Forte@Sun.COM 			} else {
735*7836SJohn.Forte@Sun.COM 			    (void) printf("\tDD set(s): %ws\n", wc_name);
736*7836SJohn.Forte@Sun.COM 			    h_printed = 1;
737*7836SJohn.Forte@Sun.COM 			}
738*7836SJohn.Forte@Sun.COM 			xmlFree(ddsname);
739*7836SJohn.Forte@Sun.COM 		    } else {
740*7836SJohn.Forte@Sun.COM 			(void) printf("\tDD set(s): %s\n", "-");
741*7836SJohn.Forte@Sun.COM 		    }
742*7836SJohn.Forte@Sun.COM 		}
743*7836SJohn.Forte@Sun.COM 		m_flag = 0;
744*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderRead(reader);
745*7836SJohn.Forte@Sun.COM 	    }
746*7836SJohn.Forte@Sun.COM 	    break;
747*7836SJohn.Forte@Sun.COM 	case ddset_to_dd:
748*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoaminSet elements */
749*7836SJohn.Forte@Sun.COM 	    while (reader = lookup_next_matching_elem(reader, &m_flag,
750*7836SJohn.Forte@Sun.COM 		    DDSETOBJECTMEMBER, ISNSRESPONSE)) {
751*7836SJohn.Forte@Sun.COM 		if (m_flag == END_READER_MATCH) {
752*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderNext(reader);
753*7836SJohn.Forte@Sun.COM 		    break;
754*7836SJohn.Forte@Sun.COM 		} else if (m_flag == READER_MATCH) {
755*7836SJohn.Forte@Sun.COM 			if ((ddname = (xmlTextReaderGetAttribute(reader,
756*7836SJohn.Forte@Sun.COM 			    (const xmlChar *)DDNAMEATTR))) != NULL) {
757*7836SJohn.Forte@Sun.COM 			    if (mbstowcs(wc_name, (const char *)ddname,
758*7836SJohn.Forte@Sun.COM 				ISNS_MAX_NAME_LEN) == (size_t)-1) {
759*7836SJohn.Forte@Sun.COM 				(void) wcscpy(wc_name, L"-");
760*7836SJohn.Forte@Sun.COM 			    }
761*7836SJohn.Forte@Sun.COM 			    (void) printf("\tDD Name: %ws\n", wc_name);
762*7836SJohn.Forte@Sun.COM 			    xmlFree(ddname);
763*7836SJohn.Forte@Sun.COM 			} else {
764*7836SJohn.Forte@Sun.COM 			    (void) printf("\tDD Name: %s\n", "-");
765*7836SJohn.Forte@Sun.COM 			}
766*7836SJohn.Forte@Sun.COM 		}
767*7836SJohn.Forte@Sun.COM 		m_flag = 0;
768*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderRead(reader);
769*7836SJohn.Forte@Sun.COM 	    }
770*7836SJohn.Forte@Sun.COM 	    break;
771*7836SJohn.Forte@Sun.COM 	default:
772*7836SJohn.Forte@Sun.COM 	    (void) xmlTextReaderClose(reader);
773*7836SJohn.Forte@Sun.COM 	    (void) xmlFreeTextReader(reader);
774*7836SJohn.Forte@Sun.COM 	    return (UNKNOWN);
775*7836SJohn.Forte@Sun.COM 	}
776*7836SJohn.Forte@Sun.COM 
777*7836SJohn.Forte@Sun.COM 	if (status == PARTIAL_SUCCESS) {
778*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
779*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_PARTIAL_SUCCESS));
780*7836SJohn.Forte@Sun.COM 	}
781*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
782*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
783*7836SJohn.Forte@Sun.COM 	return (status);
784*7836SJohn.Forte@Sun.COM }
785*7836SJohn.Forte@Sun.COM 
786*7836SJohn.Forte@Sun.COM /*
787*7836SJohn.Forte@Sun.COM  * ****************************************************************************
788*7836SJohn.Forte@Sun.COM  *
789*7836SJohn.Forte@Sun.COM  * process_get_response :
790*7836SJohn.Forte@Sun.COM  *	display data from the get response doc based on flag.
791*7836SJohn.Forte@Sun.COM  *
792*7836SJohn.Forte@Sun.COM  * obj		- object type
793*7836SJohn.Forte@Sun.COM  * doc		- docuemet to process
794*7836SJohn.Forte@Sun.COM  * flag		- options from the subcommand
795*7836SJohn.Forte@Sun.COM  *
796*7836SJohn.Forte@Sun.COM  * ****************************************************************************
797*7836SJohn.Forte@Sun.COM  */
798*7836SJohn.Forte@Sun.COM static int
process_get_response(object_type obj,xmlChar * doc,uint32_t flag)799*7836SJohn.Forte@Sun.COM process_get_response(object_type obj, xmlChar *doc, uint32_t flag)
800*7836SJohn.Forte@Sun.COM {
801*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
802*7836SJohn.Forte@Sun.COM 	int m_flag = 0, ret = 0, status;
803*7836SJohn.Forte@Sun.COM 	xmlChar *name = NULL;
804*7836SJohn.Forte@Sun.COM 	wchar_t wc_name[ISNS_MAX_NAME_LEN];
805*7836SJohn.Forte@Sun.COM 	int tag_printed = 0;
806*7836SJohn.Forte@Sun.COM 
807*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory((const char *)doc,
808*7836SJohn.Forte@Sun.COM 	    xmlStrlen(doc), NULL, NULL, 0)) == NULL) {
809*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_READER_NULL);
810*7836SJohn.Forte@Sun.COM 	}
811*7836SJohn.Forte@Sun.COM 
812*7836SJohn.Forte@Sun.COM 	/* if status is 0, continue on.  Otherwise return an error. */
813*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, STATUSELEMENT,
814*7836SJohn.Forte@Sun.COM 	    RESULTELEMENT)) {
815*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
816*7836SJohn.Forte@Sun.COM 		if (xmlTextReaderRead(reader) == 1) {
817*7836SJohn.Forte@Sun.COM 		    status =
818*7836SJohn.Forte@Sun.COM 		    atoi((const char *)xmlTextReaderConstValue(reader));
819*7836SJohn.Forte@Sun.COM 		    if ((status != 0) && (status != PARTIAL_SUCCESS)) {
820*7836SJohn.Forte@Sun.COM 			print_error_status(status, obj, reader);
821*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderClose(reader);
822*7836SJohn.Forte@Sun.COM 			(void) xmlFreeTextReader(reader);
823*7836SJohn.Forte@Sun.COM 			return (status);
824*7836SJohn.Forte@Sun.COM 		    }
825*7836SJohn.Forte@Sun.COM 		} else {
826*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderClose(reader);
827*7836SJohn.Forte@Sun.COM 		    (void) xmlFreeTextReader(reader);
828*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
829*7836SJohn.Forte@Sun.COM 		}
830*7836SJohn.Forte@Sun.COM 	    } else {
831*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderClose(reader);
832*7836SJohn.Forte@Sun.COM 		(void) xmlFreeTextReader(reader);
833*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
834*7836SJohn.Forte@Sun.COM 	    }
835*7836SJohn.Forte@Sun.COM 	} else {
836*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
837*7836SJohn.Forte@Sun.COM 	}
838*7836SJohn.Forte@Sun.COM 
839*7836SJohn.Forte@Sun.COM 	m_flag = 0;
840*7836SJohn.Forte@Sun.COM 
841*7836SJohn.Forte@Sun.COM 	switch (obj) {
842*7836SJohn.Forte@Sun.COM 	    case Node:
843*7836SJohn.Forte@Sun.COM 		/* process the node elements */
844*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
845*7836SJohn.Forte@Sun.COM 		    NODEOBJECT, ISNSRESPONSE)) {
846*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
847*7836SJohn.Forte@Sun.COM 			break;
848*7836SJohn.Forte@Sun.COM 		    }
849*7836SJohn.Forte@Sun.COM 
850*7836SJohn.Forte@Sun.COM 		    /* check the type */
851*7836SJohn.Forte@Sun.COM 		    if ((xmlTextReaderMoveToAttribute(reader,
852*7836SJohn.Forte@Sun.COM 			(const xmlChar *)TYPEATTR)) == 1) {
853*7836SJohn.Forte@Sun.COM 			if (((flag & TARGET_ONLY) == TARGET_ONLY) &&
854*7836SJohn.Forte@Sun.COM 			    (XMLNCMPVAL(reader, TARGETTYPE) != 0)) {
855*7836SJohn.Forte@Sun.COM 			    /* move to next node object. */
856*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderMoveToElement(reader);
857*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderNext(reader);
858*7836SJohn.Forte@Sun.COM 			    continue;
859*7836SJohn.Forte@Sun.COM 			}
860*7836SJohn.Forte@Sun.COM 			if (((flag & INITIATOR_ONLY) == INITIATOR_ONLY) &&
861*7836SJohn.Forte@Sun.COM 			    (XMLNCMPVAL(reader, INITIATORTYPE) != 0)) {
862*7836SJohn.Forte@Sun.COM 			    /* move to next node object. */
863*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderMoveToElement(reader);
864*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderNext(reader);
865*7836SJohn.Forte@Sun.COM 			    continue;
866*7836SJohn.Forte@Sun.COM 			}
867*7836SJohn.Forte@Sun.COM 		    } else {
868*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_TYPE_ATTR_NOT_FOUND;
869*7836SJohn.Forte@Sun.COM 			goto out;
870*7836SJohn.Forte@Sun.COM 		    }
871*7836SJohn.Forte@Sun.COM 
872*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
873*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
874*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader)) {
875*7836SJohn.Forte@Sun.COM 			if (mbstowcs(wc_name,
876*7836SJohn.Forte@Sun.COM 			    (const char *)xmlTextReaderConstValue(reader),
877*7836SJohn.Forte@Sun.COM 			    ISNS_MAX_NAME_LEN) == (size_t)-1) {
878*7836SJohn.Forte@Sun.COM 			    (void) wcscpy(wc_name, L"-");
879*7836SJohn.Forte@Sun.COM 			}
880*7836SJohn.Forte@Sun.COM 			if ((flag & VERBOSE) == VERBOSE) {
881*7836SJohn.Forte@Sun.COM 			    name = xmlTextReaderValue(reader);
882*7836SJohn.Forte@Sun.COM 			    (void) printf("iSCSI Name: %ws\n", wc_name);
883*7836SJohn.Forte@Sun.COM 			} else {
884*7836SJohn.Forte@Sun.COM 			    (void) printf("iSCSI Name: %ws\n", wc_name);
885*7836SJohn.Forte@Sun.COM 			}
886*7836SJohn.Forte@Sun.COM 		    } else {
887*7836SJohn.Forte@Sun.COM 			XML_SFREE(name);
888*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_TYPE_ATTR_NOT_FOUND;
889*7836SJohn.Forte@Sun.COM 			goto out;
890*7836SJohn.Forte@Sun.COM 		    }
891*7836SJohn.Forte@Sun.COM 		    if ((xmlTextReaderMoveToAttribute(reader,
892*7836SJohn.Forte@Sun.COM 			(const xmlChar *)ALIASATTR)) == 1) {
893*7836SJohn.Forte@Sun.COM 			if (xmlStrcmp(xmlTextReaderConstValue(reader),
894*7836SJohn.Forte@Sun.COM 			    (xmlChar *)"") == 0) {
895*7836SJohn.Forte@Sun.COM 			    (void) printf("\tAlias: %s\n", "-");
896*7836SJohn.Forte@Sun.COM 			} else {
897*7836SJohn.Forte@Sun.COM 			    if (mbstowcs(wc_name,
898*7836SJohn.Forte@Sun.COM 				(const char *)xmlTextReaderConstValue(reader),
899*7836SJohn.Forte@Sun.COM 				ISNS_MAX_NAME_LEN) == (size_t)-1) {
900*7836SJohn.Forte@Sun.COM 				(void) wcscpy(wc_name, L"-");
901*7836SJohn.Forte@Sun.COM 			    }
902*7836SJohn.Forte@Sun.COM 			    (void) printf("\tAlias: %ws\n", wc_name);
903*7836SJohn.Forte@Sun.COM 			}
904*7836SJohn.Forte@Sun.COM 		    }
905*7836SJohn.Forte@Sun.COM 
906*7836SJohn.Forte@Sun.COM 		    /* type attribute exist based on the previous checking. */
907*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderMoveToAttribute(reader,
908*7836SJohn.Forte@Sun.COM 			(const xmlChar *)TYPEATTR);
909*7836SJohn.Forte@Sun.COM 		    (void) printf("\tType: %s\n",
910*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader) ?
911*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader) : "-");
912*7836SJohn.Forte@Sun.COM 
913*7836SJohn.Forte@Sun.COM 		    if ((flag & VERBOSE) == VERBOSE) {
914*7836SJohn.Forte@Sun.COM 			/* print more details */
915*7836SJohn.Forte@Sun.COM 			m_flag = 0;
916*7836SJohn.Forte@Sun.COM 			/*
917*7836SJohn.Forte@Sun.COM 			 * No details for deregistered node.
918*7836SJohn.Forte@Sun.COM 			 * skip to next isns object.
919*7836SJohn.Forte@Sun.COM 			 */
920*7836SJohn.Forte@Sun.COM 			if ((reader = lookup_next_matching_elem(reader,
921*7836SJohn.Forte@Sun.COM 			    &m_flag, ENTITYID, ISNSOBJECT))) {
922*7836SJohn.Forte@Sun.COM 			    if (m_flag == READER_MATCH) {
923*7836SJohn.Forte@Sun.COM 				/* move to entity id value. */
924*7836SJohn.Forte@Sun.COM 				if ((xmlTextReaderRead(reader) == 1) &&
925*7836SJohn.Forte@Sun.COM 				    xmlTextReaderConstValue(reader)) {
926*7836SJohn.Forte@Sun.COM 				    if (mbstowcs(wc_name,
927*7836SJohn.Forte@Sun.COM 					(const char *)
928*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader),
929*7836SJohn.Forte@Sun.COM 					ISNS_MAX_NAME_LEN) == (size_t)-1) {
930*7836SJohn.Forte@Sun.COM 					(void) wcscpy(wc_name,
931*7836SJohn.Forte@Sun.COM 					    L"-");
932*7836SJohn.Forte@Sun.COM 				    }
933*7836SJohn.Forte@Sun.COM 				    (void) printf("\tNetwork Entity: %ws\n",
934*7836SJohn.Forte@Sun.COM 					wc_name);
935*7836SJohn.Forte@Sun.COM 				} else {
936*7836SJohn.Forte@Sun.COM 				    (void) printf("\tNework Entity: -\n");
937*7836SJohn.Forte@Sun.COM 				}
938*7836SJohn.Forte@Sun.COM 			    } else if (m_flag == END_READER_MATCH) {
939*7836SJohn.Forte@Sun.COM 				(void) xmlTextReaderRead(reader);
940*7836SJohn.Forte@Sun.COM 				XML_SFREE(name);
941*7836SJohn.Forte@Sun.COM 				continue;
942*7836SJohn.Forte@Sun.COM 			    }
943*7836SJohn.Forte@Sun.COM 			}
944*7836SJohn.Forte@Sun.COM 
945*7836SJohn.Forte@Sun.COM 			/* print  portal info */
946*7836SJohn.Forte@Sun.COM 			m_flag = 0;
947*7836SJohn.Forte@Sun.COM 			while ((reader = lookup_next_matching_elem(reader,
948*7836SJohn.Forte@Sun.COM 			    &m_flag, IPADDR, NODEOBJECT))) {
949*7836SJohn.Forte@Sun.COM 			    if (m_flag == END_READER_MATCH) {
950*7836SJohn.Forte@Sun.COM 				(void) xmlTextReaderRead(reader);
951*7836SJohn.Forte@Sun.COM 				break;
952*7836SJohn.Forte@Sun.COM 			    }
953*7836SJohn.Forte@Sun.COM 			    /* move to the value of IP addr. */
954*7836SJohn.Forte@Sun.COM 			    if ((xmlTextReaderRead(reader) == 1) &&
955*7836SJohn.Forte@Sun.COM 				xmlTextReaderConstValue(reader)) {
956*7836SJohn.Forte@Sun.COM 				(void) printf("\tPortal: %s",
957*7836SJohn.Forte@Sun.COM 				xmlTextReaderConstValue(reader));
958*7836SJohn.Forte@Sun.COM 				/* get port number */
959*7836SJohn.Forte@Sun.COM 				m_flag = 0;
960*7836SJohn.Forte@Sun.COM 				if (reader = lookup_next_matching_elem(reader,
961*7836SJohn.Forte@Sun.COM 				    &m_flag, PORTNUMBER, UDPTCPPORT)) {
962*7836SJohn.Forte@Sun.COM 				    if ((xmlTextReaderRead(reader) == 1) &&
963*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader)) {
964*7836SJohn.Forte@Sun.COM 				    (void) printf(":%d\n",
965*7836SJohn.Forte@Sun.COM 					atoi((const char *)
966*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader)));
967*7836SJohn.Forte@Sun.COM 				    } else {
968*7836SJohn.Forte@Sun.COM 					(void) printf(":-\n");
969*7836SJohn.Forte@Sun.COM 				    }
970*7836SJohn.Forte@Sun.COM 				}
971*7836SJohn.Forte@Sun.COM 				m_flag = 0;
972*7836SJohn.Forte@Sun.COM 				if (reader = lookup_next_matching_elem(reader,
973*7836SJohn.Forte@Sun.COM 				    &m_flag, GROUPTAG, GROUPTAG)) {
974*7836SJohn.Forte@Sun.COM 				    if ((xmlTextReaderRead(reader) == 1) &&
975*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader)) {
976*7836SJohn.Forte@Sun.COM 				    (void) printf("\t\tPortal Group: %s\n",
977*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader));
978*7836SJohn.Forte@Sun.COM 				    } else {
979*7836SJohn.Forte@Sun.COM 					(void) printf(":-\n");
980*7836SJohn.Forte@Sun.COM 				    }
981*7836SJohn.Forte@Sun.COM 				}
982*7836SJohn.Forte@Sun.COM 			    }
983*7836SJohn.Forte@Sun.COM 			} /* Portal end */
984*7836SJohn.Forte@Sun.COM 			if ((ret = handle_association_info(name,
985*7836SJohn.Forte@Sun.COM 			    node_to_dd)) != 0) {
986*7836SJohn.Forte@Sun.COM 			    XML_SFREE(name);
987*7836SJohn.Forte@Sun.COM 			    goto out;
988*7836SJohn.Forte@Sun.COM 			}
989*7836SJohn.Forte@Sun.COM 		    } /* verbose end */
990*7836SJohn.Forte@Sun.COM 		    XML_SFREE(name);
991*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderRead(reader);
992*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
993*7836SJohn.Forte@Sun.COM 		} /* end for node while */
994*7836SJohn.Forte@Sun.COM 		break;
995*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
996*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoamin elements */
997*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
998*7836SJohn.Forte@Sun.COM 		    DDOBJECT, ISNSRESPONSE)) {
999*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
1000*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
1001*7836SJohn.Forte@Sun.COM 			break;
1002*7836SJohn.Forte@Sun.COM 		    }
1003*7836SJohn.Forte@Sun.COM 
1004*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
1005*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
1006*7836SJohn.Forte@Sun.COM 			(name = xmlTextReaderValue(reader))) {
1007*7836SJohn.Forte@Sun.COM 			if (mbstowcs(wc_name, (const char *)name,
1008*7836SJohn.Forte@Sun.COM 			    ISNS_MAX_NAME_LEN) == (size_t)-1) {
1009*7836SJohn.Forte@Sun.COM 			    (void) wcscpy(wc_name, L"-");
1010*7836SJohn.Forte@Sun.COM 			}
1011*7836SJohn.Forte@Sun.COM 			(void) printf("DD name: %ws\n", wc_name);
1012*7836SJohn.Forte@Sun.COM 		    } else {
1013*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_NAME_ATTR_NOT_FOUND;
1014*7836SJohn.Forte@Sun.COM 			XML_SFREE(name);
1015*7836SJohn.Forte@Sun.COM 			goto out;
1016*7836SJohn.Forte@Sun.COM 		    }
1017*7836SJohn.Forte@Sun.COM 		    if ((ret = handle_association_info(name, dd_to_ddset)) !=
1018*7836SJohn.Forte@Sun.COM 			0) {
1019*7836SJohn.Forte@Sun.COM 			XML_SFREE(name);
1020*7836SJohn.Forte@Sun.COM 			goto out;
1021*7836SJohn.Forte@Sun.COM 		    }
1022*7836SJohn.Forte@Sun.COM 		    /* handle verbose */
1023*7836SJohn.Forte@Sun.COM 		    if ((flag & VERBOSE) == VERBOSE) {
1024*7836SJohn.Forte@Sun.COM 			if ((ret = handle_association_info(name,
1025*7836SJohn.Forte@Sun.COM 			    dd_to_node)) != 0) {
1026*7836SJohn.Forte@Sun.COM 			    XML_SFREE(name);
1027*7836SJohn.Forte@Sun.COM 			    goto out;
1028*7836SJohn.Forte@Sun.COM 			}
1029*7836SJohn.Forte@Sun.COM 		    }
1030*7836SJohn.Forte@Sun.COM 		    XML_SFREE(name);
1031*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1032*7836SJohn.Forte@Sun.COM 		}
1033*7836SJohn.Forte@Sun.COM 		break;
1034*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1035*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoaminSet elements */
1036*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
1037*7836SJohn.Forte@Sun.COM 		    DDSETOBJECT, ISNSRESPONSE)) {
1038*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
1039*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
1040*7836SJohn.Forte@Sun.COM 			break;
1041*7836SJohn.Forte@Sun.COM 		    }
1042*7836SJohn.Forte@Sun.COM 
1043*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
1044*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
1045*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader)) {
1046*7836SJohn.Forte@Sun.COM 			if (mbstowcs(wc_name,
1047*7836SJohn.Forte@Sun.COM 			    (const char *)xmlTextReaderConstValue(reader),
1048*7836SJohn.Forte@Sun.COM 			    ISNS_MAX_NAME_LEN) == (size_t)-1) {
1049*7836SJohn.Forte@Sun.COM 			    (void) wcscpy(wc_name, L"-");
1050*7836SJohn.Forte@Sun.COM 			}
1051*7836SJohn.Forte@Sun.COM 			if ((flag & VERBOSE) == VERBOSE) {
1052*7836SJohn.Forte@Sun.COM 			    name = xmlTextReaderValue(reader);
1053*7836SJohn.Forte@Sun.COM 			    (void) printf("DD Set name: %ws\n", wc_name);
1054*7836SJohn.Forte@Sun.COM 			} else {
1055*7836SJohn.Forte@Sun.COM 			    (void) printf("DD Set name: %ws\n", wc_name);
1056*7836SJohn.Forte@Sun.COM 			}
1057*7836SJohn.Forte@Sun.COM 		    } else {
1058*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_NAME_ATTR_NOT_FOUND;
1059*7836SJohn.Forte@Sun.COM 			XML_SFREE(name);
1060*7836SJohn.Forte@Sun.COM 			goto out;
1061*7836SJohn.Forte@Sun.COM 		    }
1062*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1063*7836SJohn.Forte@Sun.COM 		    if ((reader = lookup_next_matching_elem(reader,
1064*7836SJohn.Forte@Sun.COM 			&m_flag, ENABLEDELEM, ISNSOBJECT))) {
1065*7836SJohn.Forte@Sun.COM 			if (m_flag == READER_MATCH) {
1066*7836SJohn.Forte@Sun.COM 			    /* move to entity id value. */
1067*7836SJohn.Forte@Sun.COM 			    if ((xmlTextReaderRead(reader) == 1) &&
1068*7836SJohn.Forte@Sun.COM 				(XMLNCMPVAL(reader, XMLTRUE) == 0)) {
1069*7836SJohn.Forte@Sun.COM 				(void) printf("\tState: Enabled\n");
1070*7836SJohn.Forte@Sun.COM 			    } else {
1071*7836SJohn.Forte@Sun.COM 				(void) printf("\tState: Disabled\n");
1072*7836SJohn.Forte@Sun.COM 			    }
1073*7836SJohn.Forte@Sun.COM 			} else if (m_flag == END_READER_MATCH) {
1074*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderRead(reader);
1075*7836SJohn.Forte@Sun.COM 			}
1076*7836SJohn.Forte@Sun.COM 		    }
1077*7836SJohn.Forte@Sun.COM 
1078*7836SJohn.Forte@Sun.COM 		    /* handle verbose */
1079*7836SJohn.Forte@Sun.COM 		    if ((flag & VERBOSE) == VERBOSE) {
1080*7836SJohn.Forte@Sun.COM 			if ((ret = handle_association_info(name,
1081*7836SJohn.Forte@Sun.COM 			    ddset_to_dd)) != 0) {
1082*7836SJohn.Forte@Sun.COM 			    XML_SFREE(name);
1083*7836SJohn.Forte@Sun.COM 			    goto out;
1084*7836SJohn.Forte@Sun.COM 			}
1085*7836SJohn.Forte@Sun.COM 		    }
1086*7836SJohn.Forte@Sun.COM 		    XML_SFREE(name);
1087*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1088*7836SJohn.Forte@Sun.COM 		}
1089*7836SJohn.Forte@Sun.COM 		break;
1090*7836SJohn.Forte@Sun.COM 	    case ServerConfig:
1091*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoaminSet elements */
1092*7836SJohn.Forte@Sun.COM 		m_flag = 0;
1093*7836SJohn.Forte@Sun.COM 		reader = lookup_next_matching_elem(reader, &m_flag,
1094*7836SJohn.Forte@Sun.COM 		    ISNSSERVER, ISNSRESPONSE);
1095*7836SJohn.Forte@Sun.COM 		if (m_flag == END_READER_MATCH) {
1096*7836SJohn.Forte@Sun.COM 		    ret = ERROR_XML_ISNSSERVER_ELEM_NOT_FOUND;
1097*7836SJohn.Forte@Sun.COM 		    goto out;
1098*7836SJohn.Forte@Sun.COM 		}
1099*7836SJohn.Forte@Sun.COM 		m_flag = 0;
1100*7836SJohn.Forte@Sun.COM 		if ((reader = lookup_next_matching_elem(reader,
1101*7836SJohn.Forte@Sun.COM 		    &m_flag, DATASTORELOCATION, ISNSRESPONSE))) {
1102*7836SJohn.Forte@Sun.COM 		    if (m_flag == READER_MATCH) {
1103*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderRead(reader);
1104*7836SJohn.Forte@Sun.COM 			(void) printf("\tData Store Location: %s\n",
1105*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader) ?
1106*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader) : "-");
1107*7836SJohn.Forte@Sun.COM 		    }
1108*7836SJohn.Forte@Sun.COM 		}
1109*7836SJohn.Forte@Sun.COM 		m_flag = 0;
1110*7836SJohn.Forte@Sun.COM 		if ((reader = lookup_next_matching_elem(reader,
1111*7836SJohn.Forte@Sun.COM 		    &m_flag, ESIRETRYTHRESHOLD, ISNSRESPONSE))) {
1112*7836SJohn.Forte@Sun.COM 		    if (m_flag == READER_MATCH) {
1113*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderRead(reader);
1114*7836SJohn.Forte@Sun.COM 			(void) printf("\tEntity Status Inquiry Non-Response ");
1115*7836SJohn.Forte@Sun.COM 			(void) printf("Threshold: %d\n",
1116*7836SJohn.Forte@Sun.COM 			xmlTextReaderConstValue(reader) ?
1117*7836SJohn.Forte@Sun.COM 			atoi((const char *)xmlTextReaderConstValue(reader))
1118*7836SJohn.Forte@Sun.COM 			: 0);
1119*7836SJohn.Forte@Sun.COM 		    }
1120*7836SJohn.Forte@Sun.COM 		}
1121*7836SJohn.Forte@Sun.COM 		m_flag = 0;
1122*7836SJohn.Forte@Sun.COM 		if ((reader = lookup_next_matching_elem(reader,
1123*7836SJohn.Forte@Sun.COM 		    &m_flag, MANAGEMENTSCNENABLED, ISNSRESPONSE))) {
1124*7836SJohn.Forte@Sun.COM 		    if (m_flag == READER_MATCH) {
1125*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderRead(reader);
1126*7836SJohn.Forte@Sun.COM 			(void) printf("\tManagement SCN Enabled: %s\n",
1127*7836SJohn.Forte@Sun.COM 			(XMLNCMPVAL(reader, XMLTRUE) == 0) ?
1128*7836SJohn.Forte@Sun.COM 			"yes" : "no");
1129*7836SJohn.Forte@Sun.COM 		    }
1130*7836SJohn.Forte@Sun.COM 		}
1131*7836SJohn.Forte@Sun.COM 		m_flag = 0;
1132*7836SJohn.Forte@Sun.COM 		while ((reader = lookup_next_matching_elem(reader,
1133*7836SJohn.Forte@Sun.COM 		    &m_flag, CONTROLNODENAME, ISNSSERVER))) {
1134*7836SJohn.Forte@Sun.COM 		    if (m_flag == READER_MATCH) {
1135*7836SJohn.Forte@Sun.COM 			if (!xmlTextReaderIsEmptyElement(reader)) {
1136*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderRead(reader);
1137*7836SJohn.Forte@Sun.COM 			    if (mbstowcs(wc_name,
1138*7836SJohn.Forte@Sun.COM 				(const char *)xmlTextReaderConstValue(reader),
1139*7836SJohn.Forte@Sun.COM 				ISNS_MAX_NAME_LEN) == (size_t)-1) {
1140*7836SJohn.Forte@Sun.COM 				(void) wcscpy(wc_name, L"-");
1141*7836SJohn.Forte@Sun.COM 			    }
1142*7836SJohn.Forte@Sun.COM 			    if (tag_printed) {
1143*7836SJohn.Forte@Sun.COM 				if (xmlTextReaderConstValue(reader)) {
1144*7836SJohn.Forte@Sun.COM 				    if (mbstowcs(wc_name,
1145*7836SJohn.Forte@Sun.COM 					(const char *)
1146*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader),
1147*7836SJohn.Forte@Sun.COM 					ISNS_MAX_NAME_LEN) == (size_t)-1) {
1148*7836SJohn.Forte@Sun.COM 					(void) wcscpy(wc_name, L"-");
1149*7836SJohn.Forte@Sun.COM 				    }
1150*7836SJohn.Forte@Sun.COM 				    (void) printf(
1151*7836SJohn.Forte@Sun.COM 				    "\t                               %ws\n",
1152*7836SJohn.Forte@Sun.COM 					wc_name);
1153*7836SJohn.Forte@Sun.COM 				} else {
1154*7836SJohn.Forte@Sun.COM 				    (void) printf(
1155*7836SJohn.Forte@Sun.COM 				    "\t                               %s\n",
1156*7836SJohn.Forte@Sun.COM 				    "-");
1157*7836SJohn.Forte@Sun.COM 				}
1158*7836SJohn.Forte@Sun.COM 			    } else {
1159*7836SJohn.Forte@Sun.COM 				if (xmlTextReaderConstValue(reader)) {
1160*7836SJohn.Forte@Sun.COM 				    if (mbstowcs(wc_name,
1161*7836SJohn.Forte@Sun.COM 					(const char *)
1162*7836SJohn.Forte@Sun.COM 					xmlTextReaderConstValue(reader),
1163*7836SJohn.Forte@Sun.COM 					ISNS_MAX_NAME_LEN) == (size_t)-1) {
1164*7836SJohn.Forte@Sun.COM 					(void) wcscpy(wc_name, L"-");
1165*7836SJohn.Forte@Sun.COM 				    }
1166*7836SJohn.Forte@Sun.COM 				    (void) printf(
1167*7836SJohn.Forte@Sun.COM 				    "\tAuthorized Control Node Names: %ws\n",
1168*7836SJohn.Forte@Sun.COM 					wc_name);
1169*7836SJohn.Forte@Sun.COM 				} else {
1170*7836SJohn.Forte@Sun.COM 				    (void) printf(
1171*7836SJohn.Forte@Sun.COM 				    "\tAuthorized Control Node Names: %s\n",
1172*7836SJohn.Forte@Sun.COM 				    "-");
1173*7836SJohn.Forte@Sun.COM 				}
1174*7836SJohn.Forte@Sun.COM 				tag_printed = 1;
1175*7836SJohn.Forte@Sun.COM 			    }
1176*7836SJohn.Forte@Sun.COM 			} else {
1177*7836SJohn.Forte@Sun.COM 			    (void) printf(
1178*7836SJohn.Forte@Sun.COM 				"\tAuthorized Control Node Names: %s\n", "-");
1179*7836SJohn.Forte@Sun.COM 			    break;
1180*7836SJohn.Forte@Sun.COM 			}
1181*7836SJohn.Forte@Sun.COM 		    } else {
1182*7836SJohn.Forte@Sun.COM 			break;
1183*7836SJohn.Forte@Sun.COM 		    }
1184*7836SJohn.Forte@Sun.COM 		}
1185*7836SJohn.Forte@Sun.COM 		break;
1186*7836SJohn.Forte@Sun.COM 	    default:
1187*7836SJohn.Forte@Sun.COM 		ret = UNKNOWN;
1188*7836SJohn.Forte@Sun.COM 	}
1189*7836SJohn.Forte@Sun.COM 
1190*7836SJohn.Forte@Sun.COM out:
1191*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
1192*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
1193*7836SJohn.Forte@Sun.COM 	if (status == PARTIAL_SUCCESS) {
1194*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
1195*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_PARTIAL_SUCCESS));
1196*7836SJohn.Forte@Sun.COM 	    if (ret == 0) ret = status;
1197*7836SJohn.Forte@Sun.COM 	}
1198*7836SJohn.Forte@Sun.COM 	return (ret);
1199*7836SJohn.Forte@Sun.COM 
1200*7836SJohn.Forte@Sun.COM }
1201*7836SJohn.Forte@Sun.COM 
1202*7836SJohn.Forte@Sun.COM /*
1203*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1204*7836SJohn.Forte@Sun.COM  *
1205*7836SJohn.Forte@Sun.COM  * cvt_enumerate_rsp_to_get_req:
1206*7836SJohn.Forte@Sun.COM  *	pull out object info from enumerate response and calls
1207*7836SJohn.Forte@Sun.COM  *	build_get_xml_doc based on object type.
1208*7836SJohn.Forte@Sun.COM  *
1209*7836SJohn.Forte@Sun.COM  * doc		- enumerate resonse from the server.
1210*7836SJohn.Forte@Sun.COM  * req_do	- pointer to get request doc.
1211*7836SJohn.Forte@Sun.COM  * object_type	- isns object type.
1212*7836SJohn.Forte@Sun.COM  * flag		- user options
1213*7836SJohn.Forte@Sun.COM  *
1214*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1215*7836SJohn.Forte@Sun.COM  */
1216*7836SJohn.Forte@Sun.COM static int
cvt_enumerate_rsp_to_get_req(xmlChar * doc,xmlChar ** req_doc,object_type obj,uint32_t flag)1217*7836SJohn.Forte@Sun.COM cvt_enumerate_rsp_to_get_req(xmlChar *doc, xmlChar **req_doc,
1218*7836SJohn.Forte@Sun.COM 	object_type obj, uint32_t flag)
1219*7836SJohn.Forte@Sun.COM {
1220*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
1221*7836SJohn.Forte@Sun.COM 	xmlChar **argxmlv;
1222*7836SJohn.Forte@Sun.COM 	int ret = 0, status;
1223*7836SJohn.Forte@Sun.COM 	int i, argxmlc = 0, m_flag = 0;
1224*7836SJohn.Forte@Sun.COM 
1225*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory((const char *)doc,
1226*7836SJohn.Forte@Sun.COM 	    xmlStrlen(doc), NULL, NULL, 0)) == NULL) {
1227*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
1228*7836SJohn.Forte@Sun.COM 	}
1229*7836SJohn.Forte@Sun.COM 
1230*7836SJohn.Forte@Sun.COM 	/* if status is 0, continue on.  Otherwise return an error. */
1231*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, STATUSELEMENT,
1232*7836SJohn.Forte@Sun.COM 	    RESULTELEMENT)) {
1233*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
1234*7836SJohn.Forte@Sun.COM 		if (xmlTextReaderRead(reader) == 1) {
1235*7836SJohn.Forte@Sun.COM 		    status =
1236*7836SJohn.Forte@Sun.COM 		    atoi((const char *)xmlTextReaderConstValue(reader));
1237*7836SJohn.Forte@Sun.COM 		    if (status != 0) {
1238*7836SJohn.Forte@Sun.COM 			print_error_status(status, obj, reader);
1239*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderClose(reader);
1240*7836SJohn.Forte@Sun.COM 			(void) xmlFreeTextReader(reader);
1241*7836SJohn.Forte@Sun.COM 			return (status);
1242*7836SJohn.Forte@Sun.COM 		    }
1243*7836SJohn.Forte@Sun.COM 		} else {
1244*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderClose(reader);
1245*7836SJohn.Forte@Sun.COM 		    xmlFreeTextReader(reader);
1246*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
1247*7836SJohn.Forte@Sun.COM 		}
1248*7836SJohn.Forte@Sun.COM 	    } else {
1249*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_STATUS_ELEM_NOT_FOUND);
1250*7836SJohn.Forte@Sun.COM 	    }
1251*7836SJohn.Forte@Sun.COM 	} else {
1252*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
1253*7836SJohn.Forte@Sun.COM 	}
1254*7836SJohn.Forte@Sun.COM 
1255*7836SJohn.Forte@Sun.COM 	m_flag = 0;
1256*7836SJohn.Forte@Sun.COM 
1257*7836SJohn.Forte@Sun.COM 	argxmlv = (xmlChar **)malloc(sizeof (xmlChar *));
1258*7836SJohn.Forte@Sun.COM 
1259*7836SJohn.Forte@Sun.COM 	/* XXX - validate isnsResponse element from response doc. */
1260*7836SJohn.Forte@Sun.COM 	switch (obj) {
1261*7836SJohn.Forte@Sun.COM 	    case Node:
1262*7836SJohn.Forte@Sun.COM 		/* process the node elements */
1263*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
1264*7836SJohn.Forte@Sun.COM 		    NODEOBJECT, ISNSRESPONSE)) {
1265*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
1266*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
1267*7836SJohn.Forte@Sun.COM 			break;
1268*7836SJohn.Forte@Sun.COM 		    }
1269*7836SJohn.Forte@Sun.COM 
1270*7836SJohn.Forte@Sun.COM 		    /* check the type */
1271*7836SJohn.Forte@Sun.COM 		    if ((xmlTextReaderMoveToAttribute(reader,
1272*7836SJohn.Forte@Sun.COM 			(const xmlChar *)TYPEATTR)) == 1) {
1273*7836SJohn.Forte@Sun.COM 			if (((flag & TARGET_ONLY) == TARGET_ONLY) &&
1274*7836SJohn.Forte@Sun.COM 			    (XMLNCMPVAL(reader, TARGETTYPE) != 0)) {
1275*7836SJohn.Forte@Sun.COM 			    /* move to next node object. */
1276*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderMoveToElement(reader);
1277*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderNext(reader);
1278*7836SJohn.Forte@Sun.COM 			    continue;
1279*7836SJohn.Forte@Sun.COM 			}
1280*7836SJohn.Forte@Sun.COM 			if (((flag & INITIATOR_ONLY) == INITIATOR_ONLY) &&
1281*7836SJohn.Forte@Sun.COM 			    (XMLNCMPVAL(reader, INITIATORTYPE) != 0)) {
1282*7836SJohn.Forte@Sun.COM 			    /* move to next node object. */
1283*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderMoveToElement(reader);
1284*7836SJohn.Forte@Sun.COM 			    (void) xmlTextReaderNext(reader);
1285*7836SJohn.Forte@Sun.COM 			    continue;
1286*7836SJohn.Forte@Sun.COM 			}
1287*7836SJohn.Forte@Sun.COM 		    } else {
1288*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_TYPE_ATTR_NOT_FOUND;
1289*7836SJohn.Forte@Sun.COM 			goto out;
1290*7836SJohn.Forte@Sun.COM 		    }
1291*7836SJohn.Forte@Sun.COM 
1292*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
1293*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
1294*7836SJohn.Forte@Sun.COM 			xmlTextReaderConstValue(reader)) {
1295*7836SJohn.Forte@Sun.COM 			argxmlv = NEW_XMLARGV(argxmlv, argxmlc);
1296*7836SJohn.Forte@Sun.COM 			if (argxmlv == (xmlChar **)NULL) {
1297*7836SJohn.Forte@Sun.COM 			    ret = ERROR_MALLOC_FAILED;
1298*7836SJohn.Forte@Sun.COM 			    goto out;
1299*7836SJohn.Forte@Sun.COM 			}
1300*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc++] =
1301*7836SJohn.Forte@Sun.COM 			    xmlStrdup(xmlTextReaderConstValue(reader));
1302*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc] = NULL;
1303*7836SJohn.Forte@Sun.COM 		    } else {
1304*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_NAME_ATTR_NOT_FOUND;
1305*7836SJohn.Forte@Sun.COM 			goto out;
1306*7836SJohn.Forte@Sun.COM 		    }
1307*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderRead(reader);
1308*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1309*7836SJohn.Forte@Sun.COM 		} /* end for node while */
1310*7836SJohn.Forte@Sun.COM 		break;
1311*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
1312*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoamin elements */
1313*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
1314*7836SJohn.Forte@Sun.COM 		    DDOBJECT, ISNSRESPONSE)) {
1315*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
1316*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
1317*7836SJohn.Forte@Sun.COM 			break;
1318*7836SJohn.Forte@Sun.COM 		    }
1319*7836SJohn.Forte@Sun.COM 
1320*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
1321*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
1322*7836SJohn.Forte@Sun.COM 			xmlTextReaderConstValue(reader)) {
1323*7836SJohn.Forte@Sun.COM 			argxmlv = NEW_XMLARGV(argxmlv, argxmlc);
1324*7836SJohn.Forte@Sun.COM 			if (argxmlv == (xmlChar **)NULL) {
1325*7836SJohn.Forte@Sun.COM 			    ret = ERROR_MALLOC_FAILED;
1326*7836SJohn.Forte@Sun.COM 			    goto out;
1327*7836SJohn.Forte@Sun.COM 			}
1328*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc++] =
1329*7836SJohn.Forte@Sun.COM 			    xmlStrdup(xmlTextReaderConstValue(reader));
1330*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc] = NULL;
1331*7836SJohn.Forte@Sun.COM 		    } else {
1332*7836SJohn.Forte@Sun.COM 			    ret = ERROR_XML_NAME_ATTR_NOT_FOUND;
1333*7836SJohn.Forte@Sun.COM 			    goto out;
1334*7836SJohn.Forte@Sun.COM 		    }
1335*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1336*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderRead(reader);
1337*7836SJohn.Forte@Sun.COM 		}
1338*7836SJohn.Forte@Sun.COM 		break;
1339*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1340*7836SJohn.Forte@Sun.COM 		/* process the DiscoveryDoaminSet elements */
1341*7836SJohn.Forte@Sun.COM 		while (reader = lookup_next_matching_elem(reader, &m_flag,
1342*7836SJohn.Forte@Sun.COM 		    DDSETOBJECT, ISNSRESPONSE)) {
1343*7836SJohn.Forte@Sun.COM 		    if (m_flag == END_READER_MATCH) {
1344*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderNext(reader);
1345*7836SJohn.Forte@Sun.COM 			break;
1346*7836SJohn.Forte@Sun.COM 		    }
1347*7836SJohn.Forte@Sun.COM 
1348*7836SJohn.Forte@Sun.COM 		    if (((xmlTextReaderMoveToAttribute(reader,
1349*7836SJohn.Forte@Sun.COM 			(const xmlChar *)NAMEATTR)) == 1) &&
1350*7836SJohn.Forte@Sun.COM 			(const char *)xmlTextReaderConstValue(reader)) {
1351*7836SJohn.Forte@Sun.COM 			argxmlv = NEW_XMLARGV(argxmlv, argxmlc);
1352*7836SJohn.Forte@Sun.COM 			if (argxmlv == (xmlChar **)NULL) {
1353*7836SJohn.Forte@Sun.COM 			    ret = ERROR_MALLOC_FAILED;
1354*7836SJohn.Forte@Sun.COM 			    goto out;
1355*7836SJohn.Forte@Sun.COM 			}
1356*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc++] =
1357*7836SJohn.Forte@Sun.COM 			    xmlStrdup(xmlTextReaderConstValue(reader));
1358*7836SJohn.Forte@Sun.COM 			argxmlv[argxmlc] = NULL;
1359*7836SJohn.Forte@Sun.COM 		    } else {
1360*7836SJohn.Forte@Sun.COM 			ret = ERROR_XML_NAME_ATTR_NOT_FOUND;
1361*7836SJohn.Forte@Sun.COM 			goto out;
1362*7836SJohn.Forte@Sun.COM 		    }
1363*7836SJohn.Forte@Sun.COM 		    m_flag = 0;
1364*7836SJohn.Forte@Sun.COM 		    (void) xmlTextReaderRead(reader);
1365*7836SJohn.Forte@Sun.COM 		}
1366*7836SJohn.Forte@Sun.COM 		break;
1367*7836SJohn.Forte@Sun.COM 	    default:
1368*7836SJohn.Forte@Sun.COM 		ret = UNKNOWN;
1369*7836SJohn.Forte@Sun.COM 		goto out;
1370*7836SJohn.Forte@Sun.COM 	}
1371*7836SJohn.Forte@Sun.COM 
1372*7836SJohn.Forte@Sun.COM 	/* if no object found, stop here.  The status can be still 0. */
1373*7836SJohn.Forte@Sun.COM 	if (argxmlc != 0) {
1374*7836SJohn.Forte@Sun.COM 	    if ((ret = build_get_xml_doc(argxmlc, (char **)argxmlv, obj,
1375*7836SJohn.Forte@Sun.COM 		req_doc)) != 0) {
1376*7836SJohn.Forte@Sun.COM 		return (ret);
1377*7836SJohn.Forte@Sun.COM 	    }
1378*7836SJohn.Forte@Sun.COM 	} else {
1379*7836SJohn.Forte@Sun.COM 	    if (ret == 0) {
1380*7836SJohn.Forte@Sun.COM 		/* indicate there is no error but not object is found. */
1381*7836SJohn.Forte@Sun.COM 		ret = SUCCESS_WITH_NO_OBJECT;
1382*7836SJohn.Forte@Sun.COM 	    }
1383*7836SJohn.Forte@Sun.COM 	}
1384*7836SJohn.Forte@Sun.COM 
1385*7836SJohn.Forte@Sun.COM out:
1386*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
1387*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
1388*7836SJohn.Forte@Sun.COM 	if (argxmlc != 0) {
1389*7836SJohn.Forte@Sun.COM 	    for (i = 0; i < argxmlc; i++) {
1390*7836SJohn.Forte@Sun.COM 		xmlFree(argxmlv[i]);
1391*7836SJohn.Forte@Sun.COM 	    }
1392*7836SJohn.Forte@Sun.COM 	    (void) free(argxmlv);
1393*7836SJohn.Forte@Sun.COM 	}
1394*7836SJohn.Forte@Sun.COM 	return (ret);
1395*7836SJohn.Forte@Sun.COM 
1396*7836SJohn.Forte@Sun.COM }
1397*7836SJohn.Forte@Sun.COM 
1398*7836SJohn.Forte@Sun.COM /*
1399*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1400*7836SJohn.Forte@Sun.COM  *
1401*7836SJohn.Forte@Sun.COM  * build_delete_xml_doc -
1402*7836SJohn.Forte@Sun.COM  *	build remove request doc based the name.
1403*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
1404*7836SJohn.Forte@Sun.COM  *
1405*7836SJohn.Forte@Sun.COM  * name		- object type
1406*7836SJohn.Forte@Sun.COM  * assoc	- association type
1407*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
1408*7836SJohn.Forte@Sun.COM  *
1409*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1410*7836SJohn.Forte@Sun.COM  */
1411*7836SJohn.Forte@Sun.COM static int
build_delete_xml_doc(int operandLen,char ** operand,object_type obj,char * container,xmlChar ** doc)1412*7836SJohn.Forte@Sun.COM build_delete_xml_doc(int operandLen, char **operand, object_type obj,
1413*7836SJohn.Forte@Sun.COM 	char *container, xmlChar **doc)
1414*7836SJohn.Forte@Sun.COM {
1415*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
1416*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
1417*7836SJohn.Forte@Sun.COM 	int i, len;
1418*7836SJohn.Forte@Sun.COM 
1419*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
1420*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
1421*7836SJohn.Forte@Sun.COM 	}
1422*7836SJohn.Forte@Sun.COM 
1423*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
1424*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
1425*7836SJohn.Forte@Sun.COM 	}
1426*7836SJohn.Forte@Sun.COM 
1427*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
1428*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
1429*7836SJohn.Forte@Sun.COM 	}
1430*7836SJohn.Forte@Sun.COM 
1431*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
1432*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
1433*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
1434*7836SJohn.Forte@Sun.COM 	}
1435*7836SJohn.Forte@Sun.COM 
1436*7836SJohn.Forte@Sun.COM 	if ((xmlTextWriterWriteAttribute(writer,
1437*7836SJohn.Forte@Sun.COM 	    (xmlChar *)XMLNSATTR, (xmlChar *)XMLNSATTRVAL)) < 0) {
1438*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1439*7836SJohn.Forte@Sun.COM 	}
1440*7836SJohn.Forte@Sun.COM 
1441*7836SJohn.Forte@Sun.COM 	/* request delete operation to get the entire list of obejct. */
1442*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)DELETE) < 0) {
1443*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_ELEMENT_FAILED);
1444*7836SJohn.Forte@Sun.COM 	}
1445*7836SJohn.Forte@Sun.COM 
1446*7836SJohn.Forte@Sun.COM 	switch (obj) {
1447*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
1448*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1449*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain element. */
1450*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1451*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECT) < 0) {
1452*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1453*7836SJohn.Forte@Sun.COM 		    }
1454*7836SJohn.Forte@Sun.COM 
1455*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1456*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1457*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i])) < 0) {
1458*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1459*7836SJohn.Forte@Sun.COM 		    }
1460*7836SJohn.Forte@Sun.COM 
1461*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomain". */
1462*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1463*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1464*7836SJohn.Forte@Sun.COM 		    }
1465*7836SJohn.Forte@Sun.COM 		}
1466*7836SJohn.Forte@Sun.COM 		break;
1467*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1468*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1469*7836SJohn.Forte@Sun.COM 		    /* start Discovery DomainSet element. */
1470*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1471*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECT) < 0) {
1472*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1473*7836SJohn.Forte@Sun.COM 		    }
1474*7836SJohn.Forte@Sun.COM 
1475*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1476*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1477*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
1478*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1479*7836SJohn.Forte@Sun.COM 		    }
1480*7836SJohn.Forte@Sun.COM 
1481*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSet". */
1482*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1483*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1484*7836SJohn.Forte@Sun.COM 		    }
1485*7836SJohn.Forte@Sun.COM 		}
1486*7836SJohn.Forte@Sun.COM 		break;
1487*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainMember:
1488*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1489*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain Member element. */
1490*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1491*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECTMEMBER) < 0) {
1492*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1493*7836SJohn.Forte@Sun.COM 		    }
1494*7836SJohn.Forte@Sun.COM 
1495*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Name". */
1496*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1497*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDNAMEATTR, (xmlChar *)container) < 0) {
1498*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1499*7836SJohn.Forte@Sun.COM 		    }
1500*7836SJohn.Forte@Sun.COM 
1501*7836SJohn.Forte@Sun.COM 		    /* Start attr "Node Name". */
1502*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1503*7836SJohn.Forte@Sun.COM 			(xmlChar *)NODENAMEATTR, (xmlChar *)operand[i]) < 0) {
1504*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1505*7836SJohn.Forte@Sun.COM 		    }
1506*7836SJohn.Forte@Sun.COM 
1507*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainMember. */
1508*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1509*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1510*7836SJohn.Forte@Sun.COM 		    }
1511*7836SJohn.Forte@Sun.COM 		}
1512*7836SJohn.Forte@Sun.COM 		break;
1513*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSetMember:
1514*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1515*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain Member element. */
1516*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1517*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECTMEMBER) < 0) {
1518*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1519*7836SJohn.Forte@Sun.COM 		    }
1520*7836SJohn.Forte@Sun.COM 
1521*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Set Name". */
1522*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1523*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETNAMEATTR, (xmlChar *)(container)) < 0) {
1524*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1525*7836SJohn.Forte@Sun.COM 		    }
1526*7836SJohn.Forte@Sun.COM 
1527*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Name". */
1528*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1529*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDNAMEATTR, (xmlChar *)(operand[i])) < 0) {
1530*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1531*7836SJohn.Forte@Sun.COM 		    }
1532*7836SJohn.Forte@Sun.COM 
1533*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSetMember. */
1534*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1535*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1536*7836SJohn.Forte@Sun.COM 		    }
1537*7836SJohn.Forte@Sun.COM 		}
1538*7836SJohn.Forte@Sun.COM 		break;
1539*7836SJohn.Forte@Sun.COM 	    default:
1540*7836SJohn.Forte@Sun.COM 		    xmlFreeTextWriter(writer);
1541*7836SJohn.Forte@Sun.COM 		    return (UNKNOWN);
1542*7836SJohn.Forte@Sun.COM 	}
1543*7836SJohn.Forte@Sun.COM 
1544*7836SJohn.Forte@Sun.COM 	/* end createModify */
1545*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1546*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1547*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1548*7836SJohn.Forte@Sun.COM 	}
1549*7836SJohn.Forte@Sun.COM 
1550*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
1551*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1552*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1553*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1554*7836SJohn.Forte@Sun.COM 	}
1555*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
1556*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1557*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
1558*7836SJohn.Forte@Sun.COM 	}
1559*7836SJohn.Forte@Sun.COM 
1560*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
1561*7836SJohn.Forte@Sun.COM 
1562*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
1563*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
1564*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
1565*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
1566*7836SJohn.Forte@Sun.COM 	}
1567*7836SJohn.Forte@Sun.COM 
1568*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
1569*7836SJohn.Forte@Sun.COM 
1570*7836SJohn.Forte@Sun.COM 	return (0);
1571*7836SJohn.Forte@Sun.COM }
1572*7836SJohn.Forte@Sun.COM 
1573*7836SJohn.Forte@Sun.COM /*
1574*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1575*7836SJohn.Forte@Sun.COM  *
1576*7836SJohn.Forte@Sun.COM  * build_modify_xml_doc -
1577*7836SJohn.Forte@Sun.COM  *	build create request doc based the name.
1578*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
1579*7836SJohn.Forte@Sun.COM  *
1580*7836SJohn.Forte@Sun.COM  * operannLen	- number of objects
1581*7836SJohn.Forte@Sun.COM  * operand	- object list
1582*7836SJohn.Forte@Sun.COM  * enabled	- indication of enable and disable boolean type element.
1583*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
1584*7836SJohn.Forte@Sun.COM  *
1585*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1586*7836SJohn.Forte@Sun.COM  */
1587*7836SJohn.Forte@Sun.COM static int
build_modify_xml_doc(int operandLen,char ** operand,object_type obj,boolean_t enabled,xmlChar ** doc)1588*7836SJohn.Forte@Sun.COM build_modify_xml_doc(int operandLen, char **operand, object_type obj,
1589*7836SJohn.Forte@Sun.COM 	boolean_t enabled, xmlChar **doc)
1590*7836SJohn.Forte@Sun.COM {
1591*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
1592*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
1593*7836SJohn.Forte@Sun.COM 	int i, len;
1594*7836SJohn.Forte@Sun.COM 
1595*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
1596*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
1597*7836SJohn.Forte@Sun.COM 	}
1598*7836SJohn.Forte@Sun.COM 
1599*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
1600*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
1601*7836SJohn.Forte@Sun.COM 	}
1602*7836SJohn.Forte@Sun.COM 
1603*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
1604*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
1605*7836SJohn.Forte@Sun.COM 	}
1606*7836SJohn.Forte@Sun.COM 
1607*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
1608*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
1609*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
1610*7836SJohn.Forte@Sun.COM 	}
1611*7836SJohn.Forte@Sun.COM 
1612*7836SJohn.Forte@Sun.COM 	if ((xmlTextWriterWriteAttribute(writer,
1613*7836SJohn.Forte@Sun.COM 	    (xmlChar *)XMLNSATTR, (xmlChar *)XMLNSATTRVAL)) < 0) {
1614*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1615*7836SJohn.Forte@Sun.COM 	}
1616*7836SJohn.Forte@Sun.COM 
1617*7836SJohn.Forte@Sun.COM 	/* request createModify operation to get the entire list of obejct. */
1618*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)CREATEMODIFY) < 0) {
1619*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_ELEMENT_FAILED);
1620*7836SJohn.Forte@Sun.COM 	}
1621*7836SJohn.Forte@Sun.COM 
1622*7836SJohn.Forte@Sun.COM 	switch (obj) {
1623*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
1624*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1625*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain element. */
1626*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1627*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECT) < 0) {
1628*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1629*7836SJohn.Forte@Sun.COM 		    }
1630*7836SJohn.Forte@Sun.COM 
1631*7836SJohn.Forte@Sun.COM 		    /* write attr "name". */
1632*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1633*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i])) < 0) {
1634*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1635*7836SJohn.Forte@Sun.COM 		    }
1636*7836SJohn.Forte@Sun.COM 
1637*7836SJohn.Forte@Sun.COM 		    /* write bootlist_enabled elem */
1638*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteElement(writer,
1639*7836SJohn.Forte@Sun.COM 			(xmlChar *)BOOTLISTENABLEDELEM, (enabled)?
1640*7836SJohn.Forte@Sun.COM 			(xmlChar *)XMLTRUE : (xmlChar *)XMLFALSE) < 0) {
1641*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ELEMENT_FAILED);
1642*7836SJohn.Forte@Sun.COM 		    }
1643*7836SJohn.Forte@Sun.COM 
1644*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomain". */
1645*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1646*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1647*7836SJohn.Forte@Sun.COM 		    }
1648*7836SJohn.Forte@Sun.COM 		}
1649*7836SJohn.Forte@Sun.COM 		break;
1650*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1651*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1652*7836SJohn.Forte@Sun.COM 		    /* start Discovery DomainSet element. */
1653*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1654*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECT) < 0) {
1655*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1656*7836SJohn.Forte@Sun.COM 		    }
1657*7836SJohn.Forte@Sun.COM 
1658*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1659*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1660*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
1661*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1662*7836SJohn.Forte@Sun.COM 		    }
1663*7836SJohn.Forte@Sun.COM 
1664*7836SJohn.Forte@Sun.COM 		    /* write enabled elem */
1665*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteElement(writer,
1666*7836SJohn.Forte@Sun.COM 			(xmlChar *)ENABLEDELEM, (enabled) ?
1667*7836SJohn.Forte@Sun.COM 			(xmlChar *)XMLTRUE : (xmlChar *)XMLFALSE) < 0) {
1668*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ELEMENT_FAILED);
1669*7836SJohn.Forte@Sun.COM 		    }
1670*7836SJohn.Forte@Sun.COM 
1671*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSet". */
1672*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1673*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1674*7836SJohn.Forte@Sun.COM 		    }
1675*7836SJohn.Forte@Sun.COM 		}
1676*7836SJohn.Forte@Sun.COM 		break;
1677*7836SJohn.Forte@Sun.COM 	    default:
1678*7836SJohn.Forte@Sun.COM 		    xmlFreeTextWriter(writer);
1679*7836SJohn.Forte@Sun.COM 		    return (UNKNOWN);
1680*7836SJohn.Forte@Sun.COM 	}
1681*7836SJohn.Forte@Sun.COM 
1682*7836SJohn.Forte@Sun.COM 	/* end createModify */
1683*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1684*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1685*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1686*7836SJohn.Forte@Sun.COM 	}
1687*7836SJohn.Forte@Sun.COM 
1688*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
1689*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1690*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1691*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1692*7836SJohn.Forte@Sun.COM 	}
1693*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
1694*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1695*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
1696*7836SJohn.Forte@Sun.COM 	}
1697*7836SJohn.Forte@Sun.COM 
1698*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
1699*7836SJohn.Forte@Sun.COM 
1700*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
1701*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
1702*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
1703*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
1704*7836SJohn.Forte@Sun.COM 	}
1705*7836SJohn.Forte@Sun.COM 
1706*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
1707*7836SJohn.Forte@Sun.COM 
1708*7836SJohn.Forte@Sun.COM 	return (0);
1709*7836SJohn.Forte@Sun.COM }
1710*7836SJohn.Forte@Sun.COM 
1711*7836SJohn.Forte@Sun.COM /*
1712*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1713*7836SJohn.Forte@Sun.COM  *
1714*7836SJohn.Forte@Sun.COM  * build_rename_xml_doc -
1715*7836SJohn.Forte@Sun.COM  *	build create request doc based the name.
1716*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
1717*7836SJohn.Forte@Sun.COM  *
1718*7836SJohn.Forte@Sun.COM  * assoc	- a new name
1719*7836SJohn.Forte@Sun.COM  * id		- index of the object of which name  to be changed
1720*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
1721*7836SJohn.Forte@Sun.COM  *
1722*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1723*7836SJohn.Forte@Sun.COM  */
1724*7836SJohn.Forte@Sun.COM static int
build_rename_xml_doc(char * name,object_type obj,uint32_t id,xmlChar ** doc)1725*7836SJohn.Forte@Sun.COM build_rename_xml_doc(char *name, object_type obj, uint32_t id, xmlChar **doc)
1726*7836SJohn.Forte@Sun.COM {
1727*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
1728*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
1729*7836SJohn.Forte@Sun.COM 	int len;
1730*7836SJohn.Forte@Sun.COM 	char namebuf[32];
1731*7836SJohn.Forte@Sun.COM 
1732*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
1733*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
1734*7836SJohn.Forte@Sun.COM 	}
1735*7836SJohn.Forte@Sun.COM 
1736*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
1737*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
1738*7836SJohn.Forte@Sun.COM 	}
1739*7836SJohn.Forte@Sun.COM 
1740*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
1741*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
1742*7836SJohn.Forte@Sun.COM 	}
1743*7836SJohn.Forte@Sun.COM 
1744*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
1745*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
1746*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
1747*7836SJohn.Forte@Sun.COM 	}
1748*7836SJohn.Forte@Sun.COM 
1749*7836SJohn.Forte@Sun.COM 	if ((xmlTextWriterWriteAttribute(writer,
1750*7836SJohn.Forte@Sun.COM 	    (xmlChar *)XMLNSATTR, (xmlChar *)XMLNSATTRVAL)) < 0) {
1751*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1752*7836SJohn.Forte@Sun.COM 	}
1753*7836SJohn.Forte@Sun.COM 
1754*7836SJohn.Forte@Sun.COM 	/* request createModify operation to get the entire list of obejct. */
1755*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)CREATEMODIFY) < 0) {
1756*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_ELEMENT_FAILED);
1757*7836SJohn.Forte@Sun.COM 	}
1758*7836SJohn.Forte@Sun.COM 
1759*7836SJohn.Forte@Sun.COM 	switch (obj) {
1760*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
1761*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain element. */
1762*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1763*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECT) < 0) {
1764*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1765*7836SJohn.Forte@Sun.COM 		    }
1766*7836SJohn.Forte@Sun.COM 
1767*7836SJohn.Forte@Sun.COM 		    /* write attr "name". */
1768*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1769*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)name)) < 0) {
1770*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1771*7836SJohn.Forte@Sun.COM 		    }
1772*7836SJohn.Forte@Sun.COM 
1773*7836SJohn.Forte@Sun.COM 		    /* write attr "id". */
1774*7836SJohn.Forte@Sun.COM 		    (void) sprintf(namebuf, "%d", id);
1775*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1776*7836SJohn.Forte@Sun.COM 			(xmlChar *)IDATTR, (xmlChar *)namebuf)) < 0) {
1777*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1778*7836SJohn.Forte@Sun.COM 		    }
1779*7836SJohn.Forte@Sun.COM 
1780*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomain". */
1781*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1782*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1783*7836SJohn.Forte@Sun.COM 		    }
1784*7836SJohn.Forte@Sun.COM 		break;
1785*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1786*7836SJohn.Forte@Sun.COM 		    /* start Discovery DomainSet element. */
1787*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1788*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECT) < 0) {
1789*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1790*7836SJohn.Forte@Sun.COM 		    }
1791*7836SJohn.Forte@Sun.COM 
1792*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1793*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1794*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)name) < 0) {
1795*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1796*7836SJohn.Forte@Sun.COM 		    }
1797*7836SJohn.Forte@Sun.COM 
1798*7836SJohn.Forte@Sun.COM 		    /* write attr "id". */
1799*7836SJohn.Forte@Sun.COM 		    (void) sprintf(namebuf, "%d", id);
1800*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1801*7836SJohn.Forte@Sun.COM 			(xmlChar *)IDATTR, (xmlChar *)namebuf)) < 0) {
1802*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1803*7836SJohn.Forte@Sun.COM 		    }
1804*7836SJohn.Forte@Sun.COM 
1805*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSet". */
1806*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1807*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1808*7836SJohn.Forte@Sun.COM 		    }
1809*7836SJohn.Forte@Sun.COM 		break;
1810*7836SJohn.Forte@Sun.COM 	    default:
1811*7836SJohn.Forte@Sun.COM 		    xmlFreeTextWriter(writer);
1812*7836SJohn.Forte@Sun.COM 		    return (UNKNOWN);
1813*7836SJohn.Forte@Sun.COM 	}
1814*7836SJohn.Forte@Sun.COM 
1815*7836SJohn.Forte@Sun.COM 	/* end createModify */
1816*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1817*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1818*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1819*7836SJohn.Forte@Sun.COM 	}
1820*7836SJohn.Forte@Sun.COM 
1821*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
1822*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1823*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1824*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1825*7836SJohn.Forte@Sun.COM 	}
1826*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
1827*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1828*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
1829*7836SJohn.Forte@Sun.COM 	}
1830*7836SJohn.Forte@Sun.COM 
1831*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
1832*7836SJohn.Forte@Sun.COM 
1833*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
1834*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
1835*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
1836*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
1837*7836SJohn.Forte@Sun.COM 	}
1838*7836SJohn.Forte@Sun.COM 
1839*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
1840*7836SJohn.Forte@Sun.COM 
1841*7836SJohn.Forte@Sun.COM 	return (0);
1842*7836SJohn.Forte@Sun.COM }
1843*7836SJohn.Forte@Sun.COM 
1844*7836SJohn.Forte@Sun.COM /*
1845*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1846*7836SJohn.Forte@Sun.COM  *
1847*7836SJohn.Forte@Sun.COM  * build_create_xml_doc -
1848*7836SJohn.Forte@Sun.COM  *	build create request doc based the name.
1849*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
1850*7836SJohn.Forte@Sun.COM  *
1851*7836SJohn.Forte@Sun.COM  * name		- object type
1852*7836SJohn.Forte@Sun.COM  * assoc	- association type
1853*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
1854*7836SJohn.Forte@Sun.COM  *
1855*7836SJohn.Forte@Sun.COM  * ****************************************************************************
1856*7836SJohn.Forte@Sun.COM  */
1857*7836SJohn.Forte@Sun.COM static int
build_create_xml_doc(int operandLen,char ** operand,object_type obj,char * container,xmlChar ** doc)1858*7836SJohn.Forte@Sun.COM build_create_xml_doc(int operandLen, char **operand, object_type obj,
1859*7836SJohn.Forte@Sun.COM 	char *container, xmlChar **doc)
1860*7836SJohn.Forte@Sun.COM {
1861*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
1862*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
1863*7836SJohn.Forte@Sun.COM 	int i, len;
1864*7836SJohn.Forte@Sun.COM 
1865*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
1866*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
1867*7836SJohn.Forte@Sun.COM 	}
1868*7836SJohn.Forte@Sun.COM 
1869*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
1870*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
1871*7836SJohn.Forte@Sun.COM 	}
1872*7836SJohn.Forte@Sun.COM 
1873*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
1874*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
1875*7836SJohn.Forte@Sun.COM 	}
1876*7836SJohn.Forte@Sun.COM 
1877*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
1878*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
1879*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
1880*7836SJohn.Forte@Sun.COM 	}
1881*7836SJohn.Forte@Sun.COM 
1882*7836SJohn.Forte@Sun.COM 	/* request createModify operation to get the entire list of obejct. */
1883*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)CREATEMODIFY) < 0) {
1884*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_ELEMENT_FAILED);
1885*7836SJohn.Forte@Sun.COM 	}
1886*7836SJohn.Forte@Sun.COM 
1887*7836SJohn.Forte@Sun.COM 	switch (obj) {
1888*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomain:
1889*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1890*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain element. */
1891*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1892*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECT) < 0) {
1893*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1894*7836SJohn.Forte@Sun.COM 		    }
1895*7836SJohn.Forte@Sun.COM 
1896*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1897*7836SJohn.Forte@Sun.COM 		    if ((xmlTextWriterWriteAttribute(writer,
1898*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i])) < 0) {
1899*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1900*7836SJohn.Forte@Sun.COM 		    }
1901*7836SJohn.Forte@Sun.COM 
1902*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomain". */
1903*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1904*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1905*7836SJohn.Forte@Sun.COM 		    }
1906*7836SJohn.Forte@Sun.COM 		}
1907*7836SJohn.Forte@Sun.COM 		break;
1908*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSet:
1909*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1910*7836SJohn.Forte@Sun.COM 		    /* start Discovery DomainSet element. */
1911*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1912*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECT) < 0) {
1913*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1914*7836SJohn.Forte@Sun.COM 		    }
1915*7836SJohn.Forte@Sun.COM 
1916*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
1917*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1918*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
1919*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1920*7836SJohn.Forte@Sun.COM 		    }
1921*7836SJohn.Forte@Sun.COM 
1922*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSet". */
1923*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1924*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1925*7836SJohn.Forte@Sun.COM 		    }
1926*7836SJohn.Forte@Sun.COM 		}
1927*7836SJohn.Forte@Sun.COM 		break;
1928*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainMember:
1929*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1930*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain Member element. */
1931*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1932*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDOBJECTMEMBER) < 0) {
1933*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1934*7836SJohn.Forte@Sun.COM 		    }
1935*7836SJohn.Forte@Sun.COM 
1936*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Name". */
1937*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1938*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDNAMEATTR, (xmlChar *)container) < 0) {
1939*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1940*7836SJohn.Forte@Sun.COM 		    }
1941*7836SJohn.Forte@Sun.COM 
1942*7836SJohn.Forte@Sun.COM 		    /* Start attr "Node Name". */
1943*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1944*7836SJohn.Forte@Sun.COM 			(xmlChar *)NODENAMEATTR, (xmlChar *)operand[i]) < 0) {
1945*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1946*7836SJohn.Forte@Sun.COM 		    }
1947*7836SJohn.Forte@Sun.COM 
1948*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainMember. */
1949*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1950*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1951*7836SJohn.Forte@Sun.COM 		    }
1952*7836SJohn.Forte@Sun.COM 		}
1953*7836SJohn.Forte@Sun.COM 		break;
1954*7836SJohn.Forte@Sun.COM 	    case DiscoveryDomainSetMember:
1955*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
1956*7836SJohn.Forte@Sun.COM 		    /* start Discovery Domain Member element. */
1957*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
1958*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETOBJECTMEMBER) < 0) {
1959*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
1960*7836SJohn.Forte@Sun.COM 		    }
1961*7836SJohn.Forte@Sun.COM 
1962*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Set Name". */
1963*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1964*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDSETNAMEATTR, (xmlChar *)(container)) < 0) {
1965*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1966*7836SJohn.Forte@Sun.COM 		    }
1967*7836SJohn.Forte@Sun.COM 
1968*7836SJohn.Forte@Sun.COM 		    /* Start attr "DD Name". */
1969*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
1970*7836SJohn.Forte@Sun.COM 			(xmlChar *)DDNAMEATTR, (xmlChar *)(operand[i])) < 0) {
1971*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
1972*7836SJohn.Forte@Sun.COM 		    }
1973*7836SJohn.Forte@Sun.COM 
1974*7836SJohn.Forte@Sun.COM 		    /* End element "DiscoveryDomainSetMember. */
1975*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
1976*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
1977*7836SJohn.Forte@Sun.COM 		    }
1978*7836SJohn.Forte@Sun.COM 		}
1979*7836SJohn.Forte@Sun.COM 		break;
1980*7836SJohn.Forte@Sun.COM 	    default:
1981*7836SJohn.Forte@Sun.COM 		    xmlFreeTextWriter(writer);
1982*7836SJohn.Forte@Sun.COM 		    return (UNKNOWN);
1983*7836SJohn.Forte@Sun.COM 	}
1984*7836SJohn.Forte@Sun.COM 
1985*7836SJohn.Forte@Sun.COM 	/* end createModify */
1986*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1987*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1988*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1989*7836SJohn.Forte@Sun.COM 	}
1990*7836SJohn.Forte@Sun.COM 
1991*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
1992*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
1993*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1994*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
1995*7836SJohn.Forte@Sun.COM 	}
1996*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
1997*7836SJohn.Forte@Sun.COM 	    xmlFreeTextWriter(writer);
1998*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
1999*7836SJohn.Forte@Sun.COM 	}
2000*7836SJohn.Forte@Sun.COM 
2001*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
2002*7836SJohn.Forte@Sun.COM 
2003*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
2004*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
2005*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
2006*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
2007*7836SJohn.Forte@Sun.COM 	}
2008*7836SJohn.Forte@Sun.COM 
2009*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
2010*7836SJohn.Forte@Sun.COM 
2011*7836SJohn.Forte@Sun.COM 	return (0);
2012*7836SJohn.Forte@Sun.COM }
2013*7836SJohn.Forte@Sun.COM 
2014*7836SJohn.Forte@Sun.COM /*
2015*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2016*7836SJohn.Forte@Sun.COM  *
2017*7836SJohn.Forte@Sun.COM  * build_assoc_xml_doc -
2018*7836SJohn.Forte@Sun.COM  *	build association request doc based the name.
2019*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
2020*7836SJohn.Forte@Sun.COM  *
2021*7836SJohn.Forte@Sun.COM  * name		- object type
2022*7836SJohn.Forte@Sun.COM  * assoc	- association type
2023*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
2024*7836SJohn.Forte@Sun.COM  *
2025*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2026*7836SJohn.Forte@Sun.COM  */
2027*7836SJohn.Forte@Sun.COM static int
build_assoc_xml_doc(xmlChar * name,association_t assoc,xmlChar ** doc)2028*7836SJohn.Forte@Sun.COM build_assoc_xml_doc(xmlChar *name, association_t assoc, xmlChar **doc)
2029*7836SJohn.Forte@Sun.COM {
2030*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
2031*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
2032*7836SJohn.Forte@Sun.COM 	int len;
2033*7836SJohn.Forte@Sun.COM 
2034*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
2035*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
2036*7836SJohn.Forte@Sun.COM 	}
2037*7836SJohn.Forte@Sun.COM 
2038*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
2039*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
2040*7836SJohn.Forte@Sun.COM 	}
2041*7836SJohn.Forte@Sun.COM 
2042*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
2043*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
2044*7836SJohn.Forte@Sun.COM 	}
2045*7836SJohn.Forte@Sun.COM 
2046*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
2047*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
2048*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
2049*7836SJohn.Forte@Sun.COM 	}
2050*7836SJohn.Forte@Sun.COM 
2051*7836SJohn.Forte@Sun.COM 	/* request getAssociated operation to get the entire list of obejct. */
2052*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)GETASSOCIATED) < 0) {
2053*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_ELEMENT_FAILED);
2054*7836SJohn.Forte@Sun.COM 	}
2055*7836SJohn.Forte@Sun.COM 
2056*7836SJohn.Forte@Sun.COM 	switch (assoc) {
2057*7836SJohn.Forte@Sun.COM 	    case (node_to_dd):
2058*7836SJohn.Forte@Sun.COM 		/* write association type. */
2059*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2060*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ASSOCIATIONTYPE,
2061*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDOBJECTMEMBER) < 0) {
2062*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2063*7836SJohn.Forte@Sun.COM 		}
2064*7836SJohn.Forte@Sun.COM 
2065*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2066*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECT) < 0) {
2067*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2068*7836SJohn.Forte@Sun.COM 		}
2069*7836SJohn.Forte@Sun.COM 
2070*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2071*7836SJohn.Forte@Sun.COM 		    (xmlChar *)NODEOBJECT) < 0) {
2072*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2073*7836SJohn.Forte@Sun.COM 		}
2074*7836SJohn.Forte@Sun.COM 
2075*7836SJohn.Forte@Sun.COM 		/* Start attr "name". */
2076*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2077*7836SJohn.Forte@Sun.COM 		    (xmlChar *)NAMEATTR, name) < 0) {
2078*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2079*7836SJohn.Forte@Sun.COM 		}
2080*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2081*7836SJohn.Forte@Sun.COM 		    (xmlChar *)TYPEATTR, (xmlChar *)EMPTYSTR) < 0) {
2082*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2083*7836SJohn.Forte@Sun.COM 		}
2084*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2085*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ALIASATTR, (xmlChar *)EMPTYSTR) < 0) {
2086*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2087*7836SJohn.Forte@Sun.COM 		}
2088*7836SJohn.Forte@Sun.COM 
2089*7836SJohn.Forte@Sun.COM 		/* End element "Node". */
2090*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2091*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2092*7836SJohn.Forte@Sun.COM 		}
2093*7836SJohn.Forte@Sun.COM 
2094*7836SJohn.Forte@Sun.COM 		/* End element "isnsObject". */
2095*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2096*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2097*7836SJohn.Forte@Sun.COM 		}
2098*7836SJohn.Forte@Sun.COM 		break;
2099*7836SJohn.Forte@Sun.COM 	    case (dd_to_node):
2100*7836SJohn.Forte@Sun.COM 		/* write association type. */
2101*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2102*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ASSOCIATIONTYPE,
2103*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDOBJECTMEMBER) < 0) {
2104*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2105*7836SJohn.Forte@Sun.COM 		}
2106*7836SJohn.Forte@Sun.COM 
2107*7836SJohn.Forte@Sun.COM 		/* start isnsObject */
2108*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2109*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECT) < 0) {
2110*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2111*7836SJohn.Forte@Sun.COM 		}
2112*7836SJohn.Forte@Sun.COM 
2113*7836SJohn.Forte@Sun.COM 		/* start DiscoveryDomain */
2114*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2115*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDOBJECT) < 0) {
2116*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2117*7836SJohn.Forte@Sun.COM 		}
2118*7836SJohn.Forte@Sun.COM 
2119*7836SJohn.Forte@Sun.COM 		/* Start attr "name". */
2120*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2121*7836SJohn.Forte@Sun.COM 		    (xmlChar *)NAMEATTR, name) < 0) {
2122*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2123*7836SJohn.Forte@Sun.COM 		}
2124*7836SJohn.Forte@Sun.COM 
2125*7836SJohn.Forte@Sun.COM 		/* End element "DiscoveryDomain". */
2126*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2127*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2128*7836SJohn.Forte@Sun.COM 		}
2129*7836SJohn.Forte@Sun.COM 
2130*7836SJohn.Forte@Sun.COM 		/* End element "isnsObject". */
2131*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2132*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2133*7836SJohn.Forte@Sun.COM 		}
2134*7836SJohn.Forte@Sun.COM 		break;
2135*7836SJohn.Forte@Sun.COM 	    case (ddset_to_dd):
2136*7836SJohn.Forte@Sun.COM 		/* write association type. */
2137*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2138*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ASSOCIATIONTYPE,
2139*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDSETOBJECTMEMBER) < 0) {
2140*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2141*7836SJohn.Forte@Sun.COM 		}
2142*7836SJohn.Forte@Sun.COM 
2143*7836SJohn.Forte@Sun.COM 		/* start isnsObject */
2144*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2145*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECT) < 0) {
2146*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2147*7836SJohn.Forte@Sun.COM 		}
2148*7836SJohn.Forte@Sun.COM 
2149*7836SJohn.Forte@Sun.COM 		/* start DiscoveryDomainSet */
2150*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2151*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDSETOBJECT) < 0) {
2152*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2153*7836SJohn.Forte@Sun.COM 		}
2154*7836SJohn.Forte@Sun.COM 
2155*7836SJohn.Forte@Sun.COM 		/* Start attr "name". */
2156*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2157*7836SJohn.Forte@Sun.COM 		    (xmlChar *)NAMEATTR, name) < 0) {
2158*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2159*7836SJohn.Forte@Sun.COM 		}
2160*7836SJohn.Forte@Sun.COM 
2161*7836SJohn.Forte@Sun.COM 		/* End element "DiscoveryDomain". */
2162*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2163*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2164*7836SJohn.Forte@Sun.COM 		}
2165*7836SJohn.Forte@Sun.COM 
2166*7836SJohn.Forte@Sun.COM 		/* End element "isnsObject". */
2167*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2168*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2169*7836SJohn.Forte@Sun.COM 		}
2170*7836SJohn.Forte@Sun.COM 		break;
2171*7836SJohn.Forte@Sun.COM 	    case (dd_to_ddset):
2172*7836SJohn.Forte@Sun.COM 		/* write association type. */
2173*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2174*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ASSOCIATIONTYPE,
2175*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDSETOBJECTMEMBER) < 0) {
2176*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2177*7836SJohn.Forte@Sun.COM 		}
2178*7836SJohn.Forte@Sun.COM 
2179*7836SJohn.Forte@Sun.COM 		/* start isnsObject */
2180*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2181*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECT) < 0) {
2182*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2183*7836SJohn.Forte@Sun.COM 		}
2184*7836SJohn.Forte@Sun.COM 
2185*7836SJohn.Forte@Sun.COM 		/* start DiscoveryDomain */
2186*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2187*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDOBJECT) < 0) {
2188*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2189*7836SJohn.Forte@Sun.COM 		}
2190*7836SJohn.Forte@Sun.COM 
2191*7836SJohn.Forte@Sun.COM 		/* Start attr "name". */
2192*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteAttribute(writer,
2193*7836SJohn.Forte@Sun.COM 		    (xmlChar *)NAMEATTR, name) < 0) {
2194*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2195*7836SJohn.Forte@Sun.COM 		}
2196*7836SJohn.Forte@Sun.COM 
2197*7836SJohn.Forte@Sun.COM 		/* End element "DiscoveryDomain". */
2198*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2199*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2200*7836SJohn.Forte@Sun.COM 		}
2201*7836SJohn.Forte@Sun.COM 
2202*7836SJohn.Forte@Sun.COM 		/* End element "isnsObject". */
2203*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2204*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2205*7836SJohn.Forte@Sun.COM 		}
2206*7836SJohn.Forte@Sun.COM 		break;
2207*7836SJohn.Forte@Sun.COM 	    default:
2208*7836SJohn.Forte@Sun.COM 		return (UNKNOWN);
2209*7836SJohn.Forte@Sun.COM 	}
2210*7836SJohn.Forte@Sun.COM 
2211*7836SJohn.Forte@Sun.COM 	/* end getAssociated */
2212*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2213*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_END_ELEMENT_FAILED);
2214*7836SJohn.Forte@Sun.COM 	}
2215*7836SJohn.Forte@Sun.COM 
2216*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
2217*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2218*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
2219*7836SJohn.Forte@Sun.COM 	}
2220*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
2221*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
2222*7836SJohn.Forte@Sun.COM 	}
2223*7836SJohn.Forte@Sun.COM 
2224*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
2225*7836SJohn.Forte@Sun.COM 
2226*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
2227*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
2228*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
2229*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
2230*7836SJohn.Forte@Sun.COM 	}
2231*7836SJohn.Forte@Sun.COM 
2232*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
2233*7836SJohn.Forte@Sun.COM 	return (0);
2234*7836SJohn.Forte@Sun.COM }
2235*7836SJohn.Forte@Sun.COM 
2236*7836SJohn.Forte@Sun.COM /*
2237*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2238*7836SJohn.Forte@Sun.COM  *
2239*7836SJohn.Forte@Sun.COM  * build_enumerate_xml_doc -
2240*7836SJohn.Forte@Sun.COM  *	build association request doc based the name.
2241*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
2242*7836SJohn.Forte@Sun.COM  *
2243*7836SJohn.Forte@Sun.COM  * name		- object type
2244*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
2245*7836SJohn.Forte@Sun.COM  *
2246*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2247*7836SJohn.Forte@Sun.COM  */
2248*7836SJohn.Forte@Sun.COM static int
build_enumerate_xml_doc(object_type obj,xmlChar ** doc)2249*7836SJohn.Forte@Sun.COM build_enumerate_xml_doc(object_type obj, xmlChar **doc)
2250*7836SJohn.Forte@Sun.COM {
2251*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
2252*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
2253*7836SJohn.Forte@Sun.COM 	int len;
2254*7836SJohn.Forte@Sun.COM 
2255*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
2256*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
2257*7836SJohn.Forte@Sun.COM 	}
2258*7836SJohn.Forte@Sun.COM 
2259*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
2260*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
2261*7836SJohn.Forte@Sun.COM 	}
2262*7836SJohn.Forte@Sun.COM 
2263*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
2264*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
2265*7836SJohn.Forte@Sun.COM 	}
2266*7836SJohn.Forte@Sun.COM 
2267*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
2268*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
2269*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
2270*7836SJohn.Forte@Sun.COM 	}
2271*7836SJohn.Forte@Sun.COM 
2272*7836SJohn.Forte@Sun.COM 	/* Start attr "xmlns". */
2273*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterWriteAttribute(writer,
2274*7836SJohn.Forte@Sun.COM 	    (xmlChar *)"xmlns",
2275*7836SJohn.Forte@Sun.COM 	    (xmlChar *)"http://www.sun.com/schema/isnsmanagement")) {
2276*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2277*7836SJohn.Forte@Sun.COM 	}
2278*7836SJohn.Forte@Sun.COM 
2279*7836SJohn.Forte@Sun.COM 	/* request enumerate operation to get the entire list of obejct. */
2280*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ENUMERATE) < 0) {
2281*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
2282*7836SJohn.Forte@Sun.COM 	}
2283*7836SJohn.Forte@Sun.COM 
2284*7836SJohn.Forte@Sun.COM 	switch (obj) {
2285*7836SJohn.Forte@Sun.COM 	    case (Node):
2286*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2287*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECTTYPE, (xmlChar *)NODEOBJECT) < 0) {
2288*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2289*7836SJohn.Forte@Sun.COM 		}
2290*7836SJohn.Forte@Sun.COM 		break;
2291*7836SJohn.Forte@Sun.COM 	    case (DiscoveryDomain):
2292*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2293*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECTTYPE,
2294*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDOBJECT) < 0) {
2295*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2296*7836SJohn.Forte@Sun.COM 		}
2297*7836SJohn.Forte@Sun.COM 		break;
2298*7836SJohn.Forte@Sun.COM 	    case (DiscoveryDomainSet):
2299*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterWriteElement(writer,
2300*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSOBJECTTYPE,
2301*7836SJohn.Forte@Sun.COM 		    (xmlChar *)DDSETOBJECT) < 0) {
2302*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_WRITE_ELEMENT_FAILED);
2303*7836SJohn.Forte@Sun.COM 		}
2304*7836SJohn.Forte@Sun.COM 		break;
2305*7836SJohn.Forte@Sun.COM 	    default:
2306*7836SJohn.Forte@Sun.COM 		return (UNKNOWN);
2307*7836SJohn.Forte@Sun.COM 	}
2308*7836SJohn.Forte@Sun.COM 
2309*7836SJohn.Forte@Sun.COM 	/* end isns object type */
2310*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2311*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
2312*7836SJohn.Forte@Sun.COM 	}
2313*7836SJohn.Forte@Sun.COM 
2314*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
2315*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2316*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
2317*7836SJohn.Forte@Sun.COM 	}
2318*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
2319*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
2320*7836SJohn.Forte@Sun.COM 	}
2321*7836SJohn.Forte@Sun.COM 
2322*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
2323*7836SJohn.Forte@Sun.COM 
2324*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
2325*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
2326*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
2327*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
2328*7836SJohn.Forte@Sun.COM 	}
2329*7836SJohn.Forte@Sun.COM 
2330*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
2331*7836SJohn.Forte@Sun.COM 	return (0);
2332*7836SJohn.Forte@Sun.COM }
2333*7836SJohn.Forte@Sun.COM 
2334*7836SJohn.Forte@Sun.COM /*
2335*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2336*7836SJohn.Forte@Sun.COM  *
2337*7836SJohn.Forte@Sun.COM  * build_get_xml_doc -
2338*7836SJohn.Forte@Sun.COM  *	build association request doc based the name.
2339*7836SJohn.Forte@Sun.COM  *	the resulted doc is passed in the doc ptr.
2340*7836SJohn.Forte@Sun.COM  *
2341*7836SJohn.Forte@Sun.COM  * name		- object type
2342*7836SJohn.Forte@Sun.COM  * assoc	- association type
2343*7836SJohn.Forte@Sun.COM  * doc		- ptr to the resulted doc
2344*7836SJohn.Forte@Sun.COM  *
2345*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2346*7836SJohn.Forte@Sun.COM  */
2347*7836SJohn.Forte@Sun.COM static int
build_get_xml_doc(int operandLen,char ** operand,object_type obj,xmlChar ** doc)2348*7836SJohn.Forte@Sun.COM build_get_xml_doc(int operandLen, char **operand, object_type obj,
2349*7836SJohn.Forte@Sun.COM 	xmlChar **doc)
2350*7836SJohn.Forte@Sun.COM {
2351*7836SJohn.Forte@Sun.COM 	xmlTextWriterPtr writer;
2352*7836SJohn.Forte@Sun.COM 	xmlBufferPtr xbuf;
2353*7836SJohn.Forte@Sun.COM 	int i, len;
2354*7836SJohn.Forte@Sun.COM 
2355*7836SJohn.Forte@Sun.COM 	if ((xbuf = xmlBufferCreate()) == NULL) {
2356*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_BUFFER_FAILED);
2357*7836SJohn.Forte@Sun.COM 	}
2358*7836SJohn.Forte@Sun.COM 
2359*7836SJohn.Forte@Sun.COM 	if ((writer = xmlNewTextWriterMemory(xbuf, 0)) == NULL) {
2360*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_CREATE_WRITER_FAILED);
2361*7836SJohn.Forte@Sun.COM 	}
2362*7836SJohn.Forte@Sun.COM 
2363*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartDocument(writer, "1.0", NULL, NULL) < 0) {
2364*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_START_DOC_FAILED);
2365*7836SJohn.Forte@Sun.COM 	}
2366*7836SJohn.Forte@Sun.COM 
2367*7836SJohn.Forte@Sun.COM 	/* Start element "isnsRequest". */
2368*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)ISNSREQUEST) < 0) {
2369*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
2370*7836SJohn.Forte@Sun.COM 	}
2371*7836SJohn.Forte@Sun.COM 
2372*7836SJohn.Forte@Sun.COM 	/* Start attr "xmlns". */
2373*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterWriteAttribute(writer,
2374*7836SJohn.Forte@Sun.COM 	    (xmlChar *)"xmlns",
2375*7836SJohn.Forte@Sun.COM 	    (xmlChar *)"http://www.sun.com/schema/isnsmanagement")) {
2376*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2377*7836SJohn.Forte@Sun.COM 	}
2378*7836SJohn.Forte@Sun.COM 
2379*7836SJohn.Forte@Sun.COM 	/* Start element "get". */
2380*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterStartElement(writer, (xmlChar *)GET) < 0) {
2381*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_START_ELEMENT_FAILED);
2382*7836SJohn.Forte@Sun.COM 	}
2383*7836SJohn.Forte@Sun.COM 
2384*7836SJohn.Forte@Sun.COM 	switch (obj) {
2385*7836SJohn.Forte@Sun.COM 	    case (Node):
2386*7836SJohn.Forte@Sun.COM 		for (i = 0; i < operandLen; i++) {
2387*7836SJohn.Forte@Sun.COM 		    /* Start element "isnsObject". */
2388*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
2389*7836SJohn.Forte@Sun.COM 			(xmlChar *)ISNSOBJECT) < 0) {
2390*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
2391*7836SJohn.Forte@Sun.COM 		    }
2392*7836SJohn.Forte@Sun.COM 
2393*7836SJohn.Forte@Sun.COM 		    /* Start element Node. */
2394*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterStartElement(writer,
2395*7836SJohn.Forte@Sun.COM 			(xmlChar *)NODEOBJECT) < 0) {
2396*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_START_ELEMENT_FAILED);
2397*7836SJohn.Forte@Sun.COM 		    }
2398*7836SJohn.Forte@Sun.COM 
2399*7836SJohn.Forte@Sun.COM 		    /* Start attr "name". */
2400*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
2401*7836SJohn.Forte@Sun.COM 			(xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
2402*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2403*7836SJohn.Forte@Sun.COM 		    }
2404*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
2405*7836SJohn.Forte@Sun.COM 			(xmlChar *)TYPEATTR, (xmlChar *)EMPTYSTR) < 0) {
2406*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2407*7836SJohn.Forte@Sun.COM 		    }
2408*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterWriteAttribute(writer,
2409*7836SJohn.Forte@Sun.COM 			(xmlChar *)ALIASATTR, (xmlChar *)EMPTYSTR) < 0) {
2410*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2411*7836SJohn.Forte@Sun.COM 		    }
2412*7836SJohn.Forte@Sun.COM 
2413*7836SJohn.Forte@Sun.COM 		    /* End element "Node". */
2414*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
2415*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
2416*7836SJohn.Forte@Sun.COM 		    }
2417*7836SJohn.Forte@Sun.COM 
2418*7836SJohn.Forte@Sun.COM 		    /* End element "isnsObject". */
2419*7836SJohn.Forte@Sun.COM 		    if (xmlTextWriterEndElement(writer) < 0) {
2420*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_END_ELEMENT_FAILED);
2421*7836SJohn.Forte@Sun.COM 		    }
2422*7836SJohn.Forte@Sun.COM 		}
2423*7836SJohn.Forte@Sun.COM 		break;
2424*7836SJohn.Forte@Sun.COM 	    case (DiscoveryDomain):
2425*7836SJohn.Forte@Sun.COM 		    for (i = 0; i < operandLen; i++) {
2426*7836SJohn.Forte@Sun.COM 			/* Start element "isnsObject". */
2427*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterStartElement(writer,
2428*7836SJohn.Forte@Sun.COM 			    (xmlChar *)ISNSOBJECT) < 0) {
2429*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_START_ELEMENT_FAILED);
2430*7836SJohn.Forte@Sun.COM 			}
2431*7836SJohn.Forte@Sun.COM 
2432*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterStartElement(writer,
2433*7836SJohn.Forte@Sun.COM 			    (xmlChar *)DDOBJECT) < 0) {
2434*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_START_ELEMENT_FAILED);
2435*7836SJohn.Forte@Sun.COM 			}
2436*7836SJohn.Forte@Sun.COM 
2437*7836SJohn.Forte@Sun.COM 			/* Start attr "name". */
2438*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterWriteAttribute(writer,
2439*7836SJohn.Forte@Sun.COM 			    (xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
2440*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2441*7836SJohn.Forte@Sun.COM 			}
2442*7836SJohn.Forte@Sun.COM 
2443*7836SJohn.Forte@Sun.COM 			/* End element "DiscoveryDomain". */
2444*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterEndElement(writer) < 0) {
2445*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_END_ELEMENT_FAILED);
2446*7836SJohn.Forte@Sun.COM 			}
2447*7836SJohn.Forte@Sun.COM 
2448*7836SJohn.Forte@Sun.COM 			/* End element "isnsObject". */
2449*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterEndElement(writer) < 0) {
2450*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_END_ELEMENT_FAILED);
2451*7836SJohn.Forte@Sun.COM 			}
2452*7836SJohn.Forte@Sun.COM 		    }
2453*7836SJohn.Forte@Sun.COM 		    break;
2454*7836SJohn.Forte@Sun.COM 	    case (DiscoveryDomainSet):
2455*7836SJohn.Forte@Sun.COM 		    for (i = 0; i < operandLen; i++) {
2456*7836SJohn.Forte@Sun.COM 			/* Start element "isnsObject". */
2457*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterStartElement(writer,
2458*7836SJohn.Forte@Sun.COM 			    (xmlChar *)ISNSOBJECT) < 0) {
2459*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_START_ELEMENT_FAILED);
2460*7836SJohn.Forte@Sun.COM 			}
2461*7836SJohn.Forte@Sun.COM 
2462*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterStartElement(writer,
2463*7836SJohn.Forte@Sun.COM 			    (xmlChar *)DDSETOBJECT) < 0) {
2464*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_START_ELEMENT_FAILED);
2465*7836SJohn.Forte@Sun.COM 			}
2466*7836SJohn.Forte@Sun.COM 
2467*7836SJohn.Forte@Sun.COM 			/* Start attr "name". */
2468*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterWriteAttribute(writer,
2469*7836SJohn.Forte@Sun.COM 			    (xmlChar *)NAMEATTR, (xmlChar *)operand[i]) < 0) {
2470*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_WRITE_ATTRIBUTE_FAILED);
2471*7836SJohn.Forte@Sun.COM 			}
2472*7836SJohn.Forte@Sun.COM 
2473*7836SJohn.Forte@Sun.COM 			/* End element "DiscoveryDomain". */
2474*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterEndElement(writer) < 0) {
2475*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_END_ELEMENT_FAILED);
2476*7836SJohn.Forte@Sun.COM 			}
2477*7836SJohn.Forte@Sun.COM 
2478*7836SJohn.Forte@Sun.COM 			/* End element "isnsObject". */
2479*7836SJohn.Forte@Sun.COM 			if (xmlTextWriterEndElement(writer) < 0) {
2480*7836SJohn.Forte@Sun.COM 			    return (ERROR_XML_END_ELEMENT_FAILED);
2481*7836SJohn.Forte@Sun.COM 			}
2482*7836SJohn.Forte@Sun.COM 		    }
2483*7836SJohn.Forte@Sun.COM 		    break;
2484*7836SJohn.Forte@Sun.COM 	    case (ServerConfig):
2485*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterStartElement(writer,
2486*7836SJohn.Forte@Sun.COM 		    (xmlChar *)ISNSSERVER) < 0) {
2487*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_START_ELEMENT_FAILED);
2488*7836SJohn.Forte@Sun.COM 		}
2489*7836SJohn.Forte@Sun.COM 		if (xmlTextWriterEndElement(writer) < 0) {
2490*7836SJohn.Forte@Sun.COM 		    return (ERROR_XML_END_ELEMENT_FAILED);
2491*7836SJohn.Forte@Sun.COM 		}
2492*7836SJohn.Forte@Sun.COM 		break;
2493*7836SJohn.Forte@Sun.COM 	    default:
2494*7836SJohn.Forte@Sun.COM 	    return (UNKNOWN);
2495*7836SJohn.Forte@Sun.COM 	}
2496*7836SJohn.Forte@Sun.COM 
2497*7836SJohn.Forte@Sun.COM 	/* End element "get". */
2498*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2499*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
2500*7836SJohn.Forte@Sun.COM 	}
2501*7836SJohn.Forte@Sun.COM 	/* End element "isnsRequest". */
2502*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndElement(writer) < 0) {
2503*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_ELEMENT_FAILED);
2504*7836SJohn.Forte@Sun.COM 	}
2505*7836SJohn.Forte@Sun.COM 	if (xmlTextWriterEndDocument(writer) < 0) {
2506*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_END_DOC_FAILED);
2507*7836SJohn.Forte@Sun.COM 	}
2508*7836SJohn.Forte@Sun.COM 
2509*7836SJohn.Forte@Sun.COM 	xmlFreeTextWriter(writer);
2510*7836SJohn.Forte@Sun.COM 
2511*7836SJohn.Forte@Sun.COM 	len = xmlStrlen(xbuf->content) + 1;
2512*7836SJohn.Forte@Sun.COM 	/* XXX - copy NULL at the end by having one more extra byte */
2513*7836SJohn.Forte@Sun.COM 	if ((*doc = xmlStrndup(xbuf->content, len)) == NULL) {
2514*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_STRDUP_FAILED);
2515*7836SJohn.Forte@Sun.COM 	}
2516*7836SJohn.Forte@Sun.COM 
2517*7836SJohn.Forte@Sun.COM 	xmlBufferFree(xbuf);
2518*7836SJohn.Forte@Sun.COM 	return (0);
2519*7836SJohn.Forte@Sun.COM }
2520*7836SJohn.Forte@Sun.COM 
2521*7836SJohn.Forte@Sun.COM /*
2522*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2523*7836SJohn.Forte@Sun.COM  *
2524*7836SJohn.Forte@Sun.COM  * list_node_func -
2525*7836SJohn.Forte@Sun.COM  * 	isnsadm list-node [options] [<node name>, ...]
2526*7836SJohn.Forte@Sun.COM  *
2527*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
2528*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
2529*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
2530*7836SJohn.Forte@Sun.COM  *
2531*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2532*7836SJohn.Forte@Sun.COM  */
2533*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
2534*7836SJohn.Forte@Sun.COM static int
list_node_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)2535*7836SJohn.Forte@Sun.COM list_node_func(int operandLen, char *operand[], cmdOptions_t *options,
2536*7836SJohn.Forte@Sun.COM 	void *addarg)
2537*7836SJohn.Forte@Sun.COM {
2538*7836SJohn.Forte@Sun.COM 
2539*7836SJohn.Forte@Sun.COM 	cmdOptions_t *optionList = options;
2540*7836SJohn.Forte@Sun.COM 	xmlChar *doc, *e_doc;
2541*7836SJohn.Forte@Sun.COM 	int ret;
2542*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
2543*7836SJohn.Forte@Sun.COM 	int			fd, flag = 0;
2544*7836SJohn.Forte@Sun.COM 
2545*7836SJohn.Forte@Sun.COM 	for (; optionList->optval; optionList++) {
2546*7836SJohn.Forte@Sun.COM 	    switch (optionList->optval) {
2547*7836SJohn.Forte@Sun.COM 		case 'i':
2548*7836SJohn.Forte@Sun.COM 		    flag |= INITIATOR_ONLY;
2549*7836SJohn.Forte@Sun.COM 		    break;
2550*7836SJohn.Forte@Sun.COM 		case 't':
2551*7836SJohn.Forte@Sun.COM 		    flag |= TARGET_ONLY;
2552*7836SJohn.Forte@Sun.COM 		    break;
2553*7836SJohn.Forte@Sun.COM 		case 'v':
2554*7836SJohn.Forte@Sun.COM 		    flag |= VERBOSE;
2555*7836SJohn.Forte@Sun.COM 		    break;
2556*7836SJohn.Forte@Sun.COM 		default:
2557*7836SJohn.Forte@Sun.COM 		    return (UNKNOWN);
2558*7836SJohn.Forte@Sun.COM 	    }
2559*7836SJohn.Forte@Sun.COM 	}
2560*7836SJohn.Forte@Sun.COM 
2561*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
2562*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
2563*7836SJohn.Forte@Sun.COM 	    return (ret);
2564*7836SJohn.Forte@Sun.COM 	}
2565*7836SJohn.Forte@Sun.COM 
2566*7836SJohn.Forte@Sun.COM 	/* No operand specified. Issue enumerate. */
2567*7836SJohn.Forte@Sun.COM 	if (operandLen == 0) {
2568*7836SJohn.Forte@Sun.COM 	    ret = build_enumerate_xml_doc(Node, &doc);
2569*7836SJohn.Forte@Sun.COM 	    if (ret != 0) {
2570*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2571*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2572*7836SJohn.Forte@Sun.COM 		return (ret);
2573*7836SJohn.Forte@Sun.COM 	    }
2574*7836SJohn.Forte@Sun.COM 	    bzero(&darg, sizeof (darg));
2575*7836SJohn.Forte@Sun.COM 	    darg.data_ptr = (char *)doc;
2576*7836SJohn.Forte@Sun.COM 	    darg.data_size = xmlStrlen(doc) + 1;
2577*7836SJohn.Forte@Sun.COM 	    darg.rbuf = NULL;
2578*7836SJohn.Forte@Sun.COM 	    darg.rsize = 0;
2579*7836SJohn.Forte@Sun.COM 
2580*7836SJohn.Forte@Sun.COM 	    if ((flag & VERBOSE) == VERBOSE) {
2581*7836SJohn.Forte@Sun.COM 		if ((door_call(fd, &darg)) == -1) {
2582*7836SJohn.Forte@Sun.COM 		    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2583*7836SJohn.Forte@Sun.COM 		    (void) close(fd);
2584*7836SJohn.Forte@Sun.COM 		    (void) xmlFree(doc);
2585*7836SJohn.Forte@Sun.COM 		    return (ret);
2586*7836SJohn.Forte@Sun.COM 		}
2587*7836SJohn.Forte@Sun.COM 
2588*7836SJohn.Forte@Sun.COM 		if ((ret = cvt_enumerate_rsp_to_get_req((xmlChar *)darg.rbuf,
2589*7836SJohn.Forte@Sun.COM 		    &e_doc, Node, flag)) != 0) {
2590*7836SJohn.Forte@Sun.COM 		    (void) munmap(darg.rbuf, darg.rsize);
2591*7836SJohn.Forte@Sun.COM 		    (void) close(fd);
2592*7836SJohn.Forte@Sun.COM 		    (void) xmlFree(doc);
2593*7836SJohn.Forte@Sun.COM 		    if (ret != SUCCESS_WITH_NO_OBJECT) {
2594*7836SJohn.Forte@Sun.COM 			(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2595*7836SJohn.Forte@Sun.COM 		    } else {
2596*7836SJohn.Forte@Sun.COM 			ret = SUBCOMMAND_SUCCESS;
2597*7836SJohn.Forte@Sun.COM 		    }
2598*7836SJohn.Forte@Sun.COM 		    return (ret);
2599*7836SJohn.Forte@Sun.COM 		} else {
2600*7836SJohn.Forte@Sun.COM 		    (void) munmap(darg.rbuf, darg.rsize);
2601*7836SJohn.Forte@Sun.COM 		    (void) xmlFree(doc);
2602*7836SJohn.Forte@Sun.COM 		    doc = e_doc;
2603*7836SJohn.Forte@Sun.COM 		    bzero(&darg, sizeof (door_arg_t));
2604*7836SJohn.Forte@Sun.COM 		    darg.data_ptr = (char *)doc;
2605*7836SJohn.Forte@Sun.COM 		    darg.data_size = xmlStrlen(doc) + 1;
2606*7836SJohn.Forte@Sun.COM 		    darg.rbuf = NULL;
2607*7836SJohn.Forte@Sun.COM 		    darg.rsize = 0;
2608*7836SJohn.Forte@Sun.COM 		}
2609*7836SJohn.Forte@Sun.COM 	    }
2610*7836SJohn.Forte@Sun.COM 	} else {
2611*7836SJohn.Forte@Sun.COM 	    if ((ret = build_get_xml_doc(operandLen, operand, Node, &doc)) ==
2612*7836SJohn.Forte@Sun.COM 		0) {
2613*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
2614*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
2615*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
2616*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
2617*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
2618*7836SJohn.Forte@Sun.COM 	    } else {
2619*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2620*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2621*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2622*7836SJohn.Forte@Sun.COM 		return (ret);
2623*7836SJohn.Forte@Sun.COM 	    }
2624*7836SJohn.Forte@Sun.COM 	}
2625*7836SJohn.Forte@Sun.COM 
2626*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
2627*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2628*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2629*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2630*7836SJohn.Forte@Sun.COM 	    return (ret);
2631*7836SJohn.Forte@Sun.COM 	}
2632*7836SJohn.Forte@Sun.COM 
2633*7836SJohn.Forte@Sun.COM 	if ((ret = process_get_response(Node, (xmlChar *)darg.rbuf, flag)) !=
2634*7836SJohn.Forte@Sun.COM 	    0) {
2635*7836SJohn.Forte@Sun.COM 	/*
2636*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
2637*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
2638*7836SJohn.Forte@Sun.COM 	 */
2639*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
2640*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2641*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2642*7836SJohn.Forte@Sun.COM 	    return (ret);
2643*7836SJohn.Forte@Sun.COM 	}
2644*7836SJohn.Forte@Sun.COM 
2645*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
2646*7836SJohn.Forte@Sun.COM 	(void) close(fd);
2647*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
2648*7836SJohn.Forte@Sun.COM 
2649*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
2650*7836SJohn.Forte@Sun.COM }
2651*7836SJohn.Forte@Sun.COM 
2652*7836SJohn.Forte@Sun.COM /*
2653*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2654*7836SJohn.Forte@Sun.COM  *
2655*7836SJohn.Forte@Sun.COM  * list_dd_func -
2656*7836SJohn.Forte@Sun.COM  * 	isnsadm list-dd [options] [<dd name>, ...]
2657*7836SJohn.Forte@Sun.COM  *
2658*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
2659*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
2660*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
2661*7836SJohn.Forte@Sun.COM  *
2662*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2663*7836SJohn.Forte@Sun.COM  */
2664*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
2665*7836SJohn.Forte@Sun.COM static int
list_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)2666*7836SJohn.Forte@Sun.COM list_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
2667*7836SJohn.Forte@Sun.COM 	void *addarg)
2668*7836SJohn.Forte@Sun.COM {
2669*7836SJohn.Forte@Sun.COM 	cmdOptions_t *optionList = options;
2670*7836SJohn.Forte@Sun.COM 	xmlChar *doc, *e_doc;
2671*7836SJohn.Forte@Sun.COM 	int ret;
2672*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
2673*7836SJohn.Forte@Sun.COM 	int			fd, flag = 0;
2674*7836SJohn.Forte@Sun.COM 
2675*7836SJohn.Forte@Sun.COM 	for (; optionList->optval; optionList++) {
2676*7836SJohn.Forte@Sun.COM 	    switch (optionList->optval) {
2677*7836SJohn.Forte@Sun.COM 		case 'v':
2678*7836SJohn.Forte@Sun.COM 		    flag |= VERBOSE;
2679*7836SJohn.Forte@Sun.COM 		    break;
2680*7836SJohn.Forte@Sun.COM 	    }
2681*7836SJohn.Forte@Sun.COM 	}
2682*7836SJohn.Forte@Sun.COM 
2683*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
2684*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
2685*7836SJohn.Forte@Sun.COM 	    return (ret);
2686*7836SJohn.Forte@Sun.COM 	}
2687*7836SJohn.Forte@Sun.COM 
2688*7836SJohn.Forte@Sun.COM 	/* No operand specified. Issue enumerate. */
2689*7836SJohn.Forte@Sun.COM 	if (operandLen == 0) {
2690*7836SJohn.Forte@Sun.COM 	    ret = build_enumerate_xml_doc(DiscoveryDomain, &doc);
2691*7836SJohn.Forte@Sun.COM 	    if (ret != 0) {
2692*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2693*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2694*7836SJohn.Forte@Sun.COM 		return (ret);
2695*7836SJohn.Forte@Sun.COM 	    }
2696*7836SJohn.Forte@Sun.COM 	    /* get the enumerate resposne first. */
2697*7836SJohn.Forte@Sun.COM 	    bzero(&darg, sizeof (darg));
2698*7836SJohn.Forte@Sun.COM 	    darg.data_ptr = (char *)doc;
2699*7836SJohn.Forte@Sun.COM 	    darg.data_size = xmlStrlen(doc) + 1;
2700*7836SJohn.Forte@Sun.COM 	    darg.rbuf = NULL;
2701*7836SJohn.Forte@Sun.COM 	    darg.rsize = 0;
2702*7836SJohn.Forte@Sun.COM 	    if ((door_call(fd, &darg)) == -1) {
2703*7836SJohn.Forte@Sun.COM 		ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2704*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2705*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2706*7836SJohn.Forte@Sun.COM 		return (ret);
2707*7836SJohn.Forte@Sun.COM 	    }
2708*7836SJohn.Forte@Sun.COM 	    if ((ret = cvt_enumerate_rsp_to_get_req((xmlChar *)darg.rbuf,
2709*7836SJohn.Forte@Sun.COM 		&e_doc, DiscoveryDomain, flag)) != 0) {
2710*7836SJohn.Forte@Sun.COM 		(void) munmap(darg.rbuf, darg.rsize);
2711*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2712*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2713*7836SJohn.Forte@Sun.COM 		if (ret != SUCCESS_WITH_NO_OBJECT) {
2714*7836SJohn.Forte@Sun.COM 		    (void) fprintf(stderr, "%s\n", getTextMessage(ret));
2715*7836SJohn.Forte@Sun.COM 		} else {
2716*7836SJohn.Forte@Sun.COM 		    ret = SUBCOMMAND_SUCCESS;
2717*7836SJohn.Forte@Sun.COM 		}
2718*7836SJohn.Forte@Sun.COM 		return (ret);
2719*7836SJohn.Forte@Sun.COM 	    } else {
2720*7836SJohn.Forte@Sun.COM 		(void) munmap(darg.rbuf, darg.rsize);
2721*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2722*7836SJohn.Forte@Sun.COM 		doc = e_doc;
2723*7836SJohn.Forte@Sun.COM 	    }
2724*7836SJohn.Forte@Sun.COM 	} else {
2725*7836SJohn.Forte@Sun.COM 	    if ((ret = build_get_xml_doc(operandLen, operand,
2726*7836SJohn.Forte@Sun.COM 		DiscoveryDomain, &doc)) != 0) {
2727*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2728*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2729*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2730*7836SJohn.Forte@Sun.COM 		return (ret);
2731*7836SJohn.Forte@Sun.COM 	    }
2732*7836SJohn.Forte@Sun.COM 	}
2733*7836SJohn.Forte@Sun.COM 
2734*7836SJohn.Forte@Sun.COM 	bzero(&darg, sizeof (darg));
2735*7836SJohn.Forte@Sun.COM 	darg.data_ptr = (char *)doc;
2736*7836SJohn.Forte@Sun.COM 	darg.data_size = xmlStrlen(doc) + 1;
2737*7836SJohn.Forte@Sun.COM 	darg.rbuf = NULL;
2738*7836SJohn.Forte@Sun.COM 	darg.rsize = 0;
2739*7836SJohn.Forte@Sun.COM 
2740*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
2741*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2742*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2743*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2744*7836SJohn.Forte@Sun.COM 	    return (ret);
2745*7836SJohn.Forte@Sun.COM 	}
2746*7836SJohn.Forte@Sun.COM 
2747*7836SJohn.Forte@Sun.COM 	if ((ret = process_get_response(DiscoveryDomain, (xmlChar *)darg.rbuf,
2748*7836SJohn.Forte@Sun.COM 	    flag)) != 0) {
2749*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
2750*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2751*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2752*7836SJohn.Forte@Sun.COM 	    return (ret);
2753*7836SJohn.Forte@Sun.COM 	}
2754*7836SJohn.Forte@Sun.COM 
2755*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
2756*7836SJohn.Forte@Sun.COM 
2757*7836SJohn.Forte@Sun.COM 	(void) close(fd);
2758*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
2759*7836SJohn.Forte@Sun.COM 
2760*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
2761*7836SJohn.Forte@Sun.COM }
2762*7836SJohn.Forte@Sun.COM 
2763*7836SJohn.Forte@Sun.COM /*
2764*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2765*7836SJohn.Forte@Sun.COM  *
2766*7836SJohn.Forte@Sun.COM  * list_ddset_func -
2767*7836SJohn.Forte@Sun.COM  * 	isnsadm list-dd-set [options] [<dd set name>, ...]
2768*7836SJohn.Forte@Sun.COM  *
2769*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
2770*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
2771*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
2772*7836SJohn.Forte@Sun.COM  *
2773*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2774*7836SJohn.Forte@Sun.COM  */
2775*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
2776*7836SJohn.Forte@Sun.COM static int
list_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)2777*7836SJohn.Forte@Sun.COM list_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
2778*7836SJohn.Forte@Sun.COM 	void *addarg)
2779*7836SJohn.Forte@Sun.COM {
2780*7836SJohn.Forte@Sun.COM 	cmdOptions_t *optionList = options;
2781*7836SJohn.Forte@Sun.COM 	xmlChar *doc, *e_doc;
2782*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
2783*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
2784*7836SJohn.Forte@Sun.COM 	int			fd, flag = 0;
2785*7836SJohn.Forte@Sun.COM 
2786*7836SJohn.Forte@Sun.COM 	for (; optionList->optval; optionList++) {
2787*7836SJohn.Forte@Sun.COM 	    switch (optionList->optval) {
2788*7836SJohn.Forte@Sun.COM 		case 'v':
2789*7836SJohn.Forte@Sun.COM 		    flag |= VERBOSE;
2790*7836SJohn.Forte@Sun.COM 		    break;
2791*7836SJohn.Forte@Sun.COM 	    }
2792*7836SJohn.Forte@Sun.COM 	}
2793*7836SJohn.Forte@Sun.COM 
2794*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
2795*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
2796*7836SJohn.Forte@Sun.COM 	    return (ret);
2797*7836SJohn.Forte@Sun.COM 	}
2798*7836SJohn.Forte@Sun.COM 
2799*7836SJohn.Forte@Sun.COM 	/* No operand specified. Issue enumerate. */
2800*7836SJohn.Forte@Sun.COM 	if (operandLen == 0) {
2801*7836SJohn.Forte@Sun.COM 	    ret = build_enumerate_xml_doc(DiscoveryDomainSet, &doc);
2802*7836SJohn.Forte@Sun.COM 	    if (ret != 0) {
2803*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2804*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2805*7836SJohn.Forte@Sun.COM 		return (ret);
2806*7836SJohn.Forte@Sun.COM 	    }
2807*7836SJohn.Forte@Sun.COM 	    /* get the enumerate resposne. */
2808*7836SJohn.Forte@Sun.COM 	    bzero(&darg, sizeof (darg));
2809*7836SJohn.Forte@Sun.COM 	    darg.data_ptr = (char *)doc;
2810*7836SJohn.Forte@Sun.COM 	    darg.data_size = xmlStrlen(doc) + 1;
2811*7836SJohn.Forte@Sun.COM 	    darg.rbuf = NULL;
2812*7836SJohn.Forte@Sun.COM 	    darg.rsize = 0;
2813*7836SJohn.Forte@Sun.COM 	    if ((door_call(fd, &darg)) == -1) {
2814*7836SJohn.Forte@Sun.COM 		ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2815*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2816*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2817*7836SJohn.Forte@Sun.COM 		return (ret);
2818*7836SJohn.Forte@Sun.COM 	    }
2819*7836SJohn.Forte@Sun.COM 
2820*7836SJohn.Forte@Sun.COM 	    if ((ret = cvt_enumerate_rsp_to_get_req((xmlChar *)darg.rbuf,
2821*7836SJohn.Forte@Sun.COM 		&e_doc, DiscoveryDomainSet, flag)) != 0) {
2822*7836SJohn.Forte@Sun.COM 		(void) munmap(darg.rbuf, darg.rsize);
2823*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2824*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2825*7836SJohn.Forte@Sun.COM 		if (ret != SUCCESS_WITH_NO_OBJECT) {
2826*7836SJohn.Forte@Sun.COM 		    (void) fprintf(stderr, "%s\n", getTextMessage(ret));
2827*7836SJohn.Forte@Sun.COM 		} else {
2828*7836SJohn.Forte@Sun.COM 		    ret = SUBCOMMAND_SUCCESS;
2829*7836SJohn.Forte@Sun.COM 		}
2830*7836SJohn.Forte@Sun.COM 		return (ret);
2831*7836SJohn.Forte@Sun.COM 	    } else {
2832*7836SJohn.Forte@Sun.COM 		(void) munmap(darg.rbuf, darg.rsize);
2833*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
2834*7836SJohn.Forte@Sun.COM 		doc = e_doc;
2835*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
2836*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
2837*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
2838*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
2839*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
2840*7836SJohn.Forte@Sun.COM 	    }
2841*7836SJohn.Forte@Sun.COM 	} else {
2842*7836SJohn.Forte@Sun.COM 	    if ((ret = build_get_xml_doc(operandLen, operand,
2843*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet, &doc)) == 0) {
2844*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
2845*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
2846*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
2847*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
2848*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
2849*7836SJohn.Forte@Sun.COM 	    } else {
2850*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2851*7836SJohn.Forte@Sun.COM 	    }
2852*7836SJohn.Forte@Sun.COM 	}
2853*7836SJohn.Forte@Sun.COM 
2854*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
2855*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2856*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2857*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2858*7836SJohn.Forte@Sun.COM 	    return (ret);
2859*7836SJohn.Forte@Sun.COM 	}
2860*7836SJohn.Forte@Sun.COM 
2861*7836SJohn.Forte@Sun.COM 	/*
2862*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
2863*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
2864*7836SJohn.Forte@Sun.COM 	 */
2865*7836SJohn.Forte@Sun.COM 	if ((ret = process_get_response(DiscoveryDomainSet,
2866*7836SJohn.Forte@Sun.COM 	    (xmlChar *)darg.rbuf, flag)) != 0) {
2867*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
2868*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2869*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2870*7836SJohn.Forte@Sun.COM 	    return (ret);
2871*7836SJohn.Forte@Sun.COM 	}
2872*7836SJohn.Forte@Sun.COM 
2873*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
2874*7836SJohn.Forte@Sun.COM 	(void) close(fd);
2875*7836SJohn.Forte@Sun.COM 	(void) xmlFree(doc);
2876*7836SJohn.Forte@Sun.COM 
2877*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
2878*7836SJohn.Forte@Sun.COM }
2879*7836SJohn.Forte@Sun.COM 
2880*7836SJohn.Forte@Sun.COM /*
2881*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2882*7836SJohn.Forte@Sun.COM  *
2883*7836SJohn.Forte@Sun.COM  * create_dd_func -
2884*7836SJohn.Forte@Sun.COM  * 	create a DiscoveryDomain create-dd <dd name>, ...
2885*7836SJohn.Forte@Sun.COM  *
2886*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
2887*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
2888*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
2889*7836SJohn.Forte@Sun.COM  *
2890*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2891*7836SJohn.Forte@Sun.COM  */
2892*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
2893*7836SJohn.Forte@Sun.COM static int
create_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)2894*7836SJohn.Forte@Sun.COM create_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
2895*7836SJohn.Forte@Sun.COM 	void *addarg)
2896*7836SJohn.Forte@Sun.COM {
2897*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
2898*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
2899*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
2900*7836SJohn.Forte@Sun.COM 	int			fd;
2901*7836SJohn.Forte@Sun.COM 
2902*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
2903*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
2904*7836SJohn.Forte@Sun.COM 	    return (ret);
2905*7836SJohn.Forte@Sun.COM 	}
2906*7836SJohn.Forte@Sun.COM 
2907*7836SJohn.Forte@Sun.COM 	if ((ret = build_create_xml_doc(operandLen, operand,
2908*7836SJohn.Forte@Sun.COM 		DiscoveryDomain, NULL, &doc)) == 0) {
2909*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
2910*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
2911*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
2912*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
2913*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
2914*7836SJohn.Forte@Sun.COM 	} else {
2915*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2916*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2917*7836SJohn.Forte@Sun.COM 		return (ret);
2918*7836SJohn.Forte@Sun.COM 	}
2919*7836SJohn.Forte@Sun.COM 
2920*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
2921*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2922*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2923*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2924*7836SJohn.Forte@Sun.COM 	    return (ret);
2925*7836SJohn.Forte@Sun.COM 	}
2926*7836SJohn.Forte@Sun.COM 
2927*7836SJohn.Forte@Sun.COM 	/*
2928*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
2929*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
2930*7836SJohn.Forte@Sun.COM 	 */
2931*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
2932*7836SJohn.Forte@Sun.COM 		DiscoveryDomain)) != 0) {
2933*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
2934*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2935*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2936*7836SJohn.Forte@Sun.COM 	    return (ret);
2937*7836SJohn.Forte@Sun.COM 	}
2938*7836SJohn.Forte@Sun.COM 
2939*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
2940*7836SJohn.Forte@Sun.COM 	(void) close(fd);
2941*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
2942*7836SJohn.Forte@Sun.COM 
2943*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
2944*7836SJohn.Forte@Sun.COM }
2945*7836SJohn.Forte@Sun.COM 
2946*7836SJohn.Forte@Sun.COM /*
2947*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2948*7836SJohn.Forte@Sun.COM  *
2949*7836SJohn.Forte@Sun.COM  * create_ddset_func -
2950*7836SJohn.Forte@Sun.COM  * 	create a DiscoveryDomainSet create-dd-set <dd set name>, ...
2951*7836SJohn.Forte@Sun.COM  *
2952*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
2953*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
2954*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
2955*7836SJohn.Forte@Sun.COM  *
2956*7836SJohn.Forte@Sun.COM  * ****************************************************************************
2957*7836SJohn.Forte@Sun.COM  */
2958*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
2959*7836SJohn.Forte@Sun.COM static int
create_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)2960*7836SJohn.Forte@Sun.COM create_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
2961*7836SJohn.Forte@Sun.COM     void *addarg)
2962*7836SJohn.Forte@Sun.COM {
2963*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
2964*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
2965*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
2966*7836SJohn.Forte@Sun.COM 	int			fd;
2967*7836SJohn.Forte@Sun.COM 
2968*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
2969*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
2970*7836SJohn.Forte@Sun.COM 	    return (ret);
2971*7836SJohn.Forte@Sun.COM 	}
2972*7836SJohn.Forte@Sun.COM 
2973*7836SJohn.Forte@Sun.COM 	if ((ret = build_create_xml_doc(operandLen, operand,
2974*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet, NULL, &doc)) == 0) {
2975*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
2976*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
2977*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
2978*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
2979*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
2980*7836SJohn.Forte@Sun.COM 	} else {
2981*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
2982*7836SJohn.Forte@Sun.COM 		(void) close(fd);
2983*7836SJohn.Forte@Sun.COM 		return (ret);
2984*7836SJohn.Forte@Sun.COM 	}
2985*7836SJohn.Forte@Sun.COM 
2986*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
2987*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
2988*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
2989*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
2990*7836SJohn.Forte@Sun.COM 	    return (ret);
2991*7836SJohn.Forte@Sun.COM 	}
2992*7836SJohn.Forte@Sun.COM 
2993*7836SJohn.Forte@Sun.COM 	/*
2994*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
2995*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
2996*7836SJohn.Forte@Sun.COM 	 */
2997*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
2998*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet)) != 0) {
2999*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3000*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3001*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3002*7836SJohn.Forte@Sun.COM 	    return (ret);
3003*7836SJohn.Forte@Sun.COM 	}
3004*7836SJohn.Forte@Sun.COM 
3005*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3006*7836SJohn.Forte@Sun.COM 
3007*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3008*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3009*7836SJohn.Forte@Sun.COM 
3010*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3011*7836SJohn.Forte@Sun.COM }
3012*7836SJohn.Forte@Sun.COM 
3013*7836SJohn.Forte@Sun.COM /*
3014*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3015*7836SJohn.Forte@Sun.COM  *
3016*7836SJohn.Forte@Sun.COM  * modify_dd_func -
3017*7836SJohn.Forte@Sun.COM  * 	Modify a dd attr. currently rename function is supported
3018*7836SJohn.Forte@Sun.COM  *	modify-dd -n name <dd name>
3019*7836SJohn.Forte@Sun.COM  *
3020*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3021*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3022*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3023*7836SJohn.Forte@Sun.COM  *
3024*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3025*7836SJohn.Forte@Sun.COM  */
3026*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3027*7836SJohn.Forte@Sun.COM static int
modify_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3028*7836SJohn.Forte@Sun.COM modify_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
3029*7836SJohn.Forte@Sun.COM 	void *addarg)
3030*7836SJohn.Forte@Sun.COM {
3031*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3032*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
3033*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3034*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3035*7836SJohn.Forte@Sun.COM 	int	fd, m_flag = 0;
3036*7836SJohn.Forte@Sun.COM 	uint32_t    id;
3037*7836SJohn.Forte@Sun.COM 
3038*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3039*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3040*7836SJohn.Forte@Sun.COM 	    return (ret);
3041*7836SJohn.Forte@Sun.COM 	}
3042*7836SJohn.Forte@Sun.COM 
3043*7836SJohn.Forte@Sun.COM 	if ((ret = build_get_xml_doc(operandLen, operand,
3044*7836SJohn.Forte@Sun.COM 		DiscoveryDomain, &doc)) == 0) {
3045*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3046*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3047*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3048*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3049*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3050*7836SJohn.Forte@Sun.COM 	} else {
3051*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3052*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3053*7836SJohn.Forte@Sun.COM 		return (ret);
3054*7836SJohn.Forte@Sun.COM 	}
3055*7836SJohn.Forte@Sun.COM 
3056*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3057*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3058*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3059*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3060*7836SJohn.Forte@Sun.COM 	    return (ret);
3061*7836SJohn.Forte@Sun.COM 	}
3062*7836SJohn.Forte@Sun.COM 
3063*7836SJohn.Forte@Sun.COM 	/* Free the request that is created by xmlStrnDup. */
3064*7836SJohn.Forte@Sun.COM 	(void) xmlFree(doc);
3065*7836SJohn.Forte@Sun.COM 
3066*7836SJohn.Forte@Sun.COM 	/*
3067*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3068*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3069*7836SJohn.Forte@Sun.COM 	 */
3070*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3071*7836SJohn.Forte@Sun.COM 		DiscoveryDomain)) != 0) {
3072*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3073*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3074*7836SJohn.Forte@Sun.COM 	    return (ret);
3075*7836SJohn.Forte@Sun.COM 	}
3076*7836SJohn.Forte@Sun.COM 
3077*7836SJohn.Forte@Sun.COM 	/* setup xml parser on the response. */
3078*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory
3079*7836SJohn.Forte@Sun.COM 	    ((const char *)darg.rbuf, xmlStrlen((xmlChar *)darg.rbuf),
3080*7836SJohn.Forte@Sun.COM 	    NULL, NULL, 0)) == NULL) {
3081*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3082*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3083*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
3084*7836SJohn.Forte@Sun.COM 	}
3085*7836SJohn.Forte@Sun.COM 
3086*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, DDOBJECT,
3087*7836SJohn.Forte@Sun.COM 	    ISNSRESPONSE)) {
3088*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
3089*7836SJohn.Forte@Sun.COM 		if ((xmlTextReaderMoveToAttribute(reader,
3090*7836SJohn.Forte@Sun.COM 			(const xmlChar *)IDATTR)) == 1) {
3091*7836SJohn.Forte@Sun.COM 		    id = atoi((const char *)xmlTextReaderConstValue(reader));
3092*7836SJohn.Forte@Sun.COM 		} else {
3093*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderClose(reader);
3094*7836SJohn.Forte@Sun.COM 			(void) xmlFreeTextReader(reader);
3095*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_ID_ATTR_NOT_FOUND);
3096*7836SJohn.Forte@Sun.COM 		}
3097*7836SJohn.Forte@Sun.COM 	    } else {
3098*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderClose(reader);
3099*7836SJohn.Forte@Sun.COM 		(void) xmlFreeTextReader(reader);
3100*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_DD_OBJECT_NOT_FOUND);
3101*7836SJohn.Forte@Sun.COM 	    }
3102*7836SJohn.Forte@Sun.COM 	} else {
3103*7836SJohn.Forte@Sun.COM 	    (void) fprintf(stderr, "%s\n",
3104*7836SJohn.Forte@Sun.COM 		getTextMessage(ERROR_XML_READER_NULL));
3105*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
3106*7836SJohn.Forte@Sun.COM 	}
3107*7836SJohn.Forte@Sun.COM 
3108*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
3109*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
3110*7836SJohn.Forte@Sun.COM 
3111*7836SJohn.Forte@Sun.COM 	if ((ret = build_rename_xml_doc(options->optarg, DiscoveryDomain,
3112*7836SJohn.Forte@Sun.COM 		id, &doc)) == 0) {
3113*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3114*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3115*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3116*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3117*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3118*7836SJohn.Forte@Sun.COM 	} else {
3119*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3120*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3121*7836SJohn.Forte@Sun.COM 		return (ret);
3122*7836SJohn.Forte@Sun.COM 	}
3123*7836SJohn.Forte@Sun.COM 
3124*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3125*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3126*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3127*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3128*7836SJohn.Forte@Sun.COM 	    return (ret);
3129*7836SJohn.Forte@Sun.COM 	}
3130*7836SJohn.Forte@Sun.COM 
3131*7836SJohn.Forte@Sun.COM 	/*
3132*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3133*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3134*7836SJohn.Forte@Sun.COM 	 */
3135*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3136*7836SJohn.Forte@Sun.COM 		DiscoveryDomain)) != 0) {
3137*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3138*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3139*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3140*7836SJohn.Forte@Sun.COM 	    return (ret);
3141*7836SJohn.Forte@Sun.COM 	}
3142*7836SJohn.Forte@Sun.COM 
3143*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3144*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3145*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3146*7836SJohn.Forte@Sun.COM 
3147*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3148*7836SJohn.Forte@Sun.COM }
3149*7836SJohn.Forte@Sun.COM 
3150*7836SJohn.Forte@Sun.COM /*
3151*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3152*7836SJohn.Forte@Sun.COM  *
3153*7836SJohn.Forte@Sun.COM  * modify_ddset_func -
3154*7836SJohn.Forte@Sun.COM  * 	Modify a dd attr. currently rename function is supported
3155*7836SJohn.Forte@Sun.COM  *	modify-dd-set -n name <dd name>
3156*7836SJohn.Forte@Sun.COM  *
3157*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3158*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3159*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3160*7836SJohn.Forte@Sun.COM  *
3161*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3162*7836SJohn.Forte@Sun.COM  */
3163*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3164*7836SJohn.Forte@Sun.COM static int
modify_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3165*7836SJohn.Forte@Sun.COM modify_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
3166*7836SJohn.Forte@Sun.COM 	void *addarg)
3167*7836SJohn.Forte@Sun.COM {
3168*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3169*7836SJohn.Forte@Sun.COM 	xmlTextReaderPtr reader;
3170*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3171*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3172*7836SJohn.Forte@Sun.COM 	int	fd, m_flag = 0;
3173*7836SJohn.Forte@Sun.COM 	uint32_t    id;
3174*7836SJohn.Forte@Sun.COM 
3175*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3176*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3177*7836SJohn.Forte@Sun.COM 	    return (ret);
3178*7836SJohn.Forte@Sun.COM 	}
3179*7836SJohn.Forte@Sun.COM 
3180*7836SJohn.Forte@Sun.COM 	if ((ret = build_get_xml_doc(operandLen, operand,
3181*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet, &doc)) == 0) {
3182*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3183*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3184*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3185*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3186*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3187*7836SJohn.Forte@Sun.COM 	} else {
3188*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3189*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3190*7836SJohn.Forte@Sun.COM 		return (ret);
3191*7836SJohn.Forte@Sun.COM 	}
3192*7836SJohn.Forte@Sun.COM 
3193*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3194*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3195*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3196*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3197*7836SJohn.Forte@Sun.COM 	    return (ret);
3198*7836SJohn.Forte@Sun.COM 	}
3199*7836SJohn.Forte@Sun.COM 
3200*7836SJohn.Forte@Sun.COM 	/* Free the request that is created by xmlStrnDup. */
3201*7836SJohn.Forte@Sun.COM 	(void) xmlFree(doc);
3202*7836SJohn.Forte@Sun.COM 
3203*7836SJohn.Forte@Sun.COM 	/*
3204*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3205*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3206*7836SJohn.Forte@Sun.COM 	 */
3207*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3208*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet)) != 0) {
3209*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3210*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3211*7836SJohn.Forte@Sun.COM 	    return (ret);
3212*7836SJohn.Forte@Sun.COM 	}
3213*7836SJohn.Forte@Sun.COM 
3214*7836SJohn.Forte@Sun.COM 	/* setup xml parser on the response. */
3215*7836SJohn.Forte@Sun.COM 	if ((reader = (xmlTextReaderPtr)xmlReaderForMemory
3216*7836SJohn.Forte@Sun.COM 	    ((const char *)darg.rbuf, xmlStrlen((xmlChar *)darg.rbuf),
3217*7836SJohn.Forte@Sun.COM 	    NULL, NULL, 0)) == NULL) {
3218*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3219*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3220*7836SJohn.Forte@Sun.COM 	    return (ERROR_XML_READER_NULL);
3221*7836SJohn.Forte@Sun.COM 	}
3222*7836SJohn.Forte@Sun.COM 
3223*7836SJohn.Forte@Sun.COM 	if (reader = lookup_next_matching_elem(reader, &m_flag, DDSETOBJECT,
3224*7836SJohn.Forte@Sun.COM 	    ISNSRESPONSE)) {
3225*7836SJohn.Forte@Sun.COM 	    if (m_flag == READER_MATCH) {
3226*7836SJohn.Forte@Sun.COM 		if ((xmlTextReaderMoveToAttribute(reader,
3227*7836SJohn.Forte@Sun.COM 			(const xmlChar *)IDATTR)) == 1) {
3228*7836SJohn.Forte@Sun.COM 		    id = atoi((const char *)xmlTextReaderConstValue(reader));
3229*7836SJohn.Forte@Sun.COM 		} else {
3230*7836SJohn.Forte@Sun.COM 			(void) xmlTextReaderClose(reader);
3231*7836SJohn.Forte@Sun.COM 			(void) xmlFreeTextReader(reader);
3232*7836SJohn.Forte@Sun.COM 			return (ERROR_XML_ID_ATTR_NOT_FOUND);
3233*7836SJohn.Forte@Sun.COM 		}
3234*7836SJohn.Forte@Sun.COM 	    } else {
3235*7836SJohn.Forte@Sun.COM 		(void) xmlTextReaderClose(reader);
3236*7836SJohn.Forte@Sun.COM 		(void) xmlFreeTextReader(reader);
3237*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n",
3238*7836SJohn.Forte@Sun.COM 		    getTextMessage(ERROR_XML_NAME_ATTR_NOT_FOUND));
3239*7836SJohn.Forte@Sun.COM 		return (ERROR_XML_DD_SET_OBJECT_NOT_FOUND);
3240*7836SJohn.Forte@Sun.COM 	    }
3241*7836SJohn.Forte@Sun.COM 	}
3242*7836SJohn.Forte@Sun.COM 
3243*7836SJohn.Forte@Sun.COM 	(void) xmlTextReaderClose(reader);
3244*7836SJohn.Forte@Sun.COM 	(void) xmlFreeTextReader(reader);
3245*7836SJohn.Forte@Sun.COM 
3246*7836SJohn.Forte@Sun.COM 	if ((ret = build_rename_xml_doc(options->optarg, DiscoveryDomainSet,
3247*7836SJohn.Forte@Sun.COM 		id, &doc)) == 0) {
3248*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3249*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3250*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3251*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3252*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3253*7836SJohn.Forte@Sun.COM 	} else {
3254*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3255*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3256*7836SJohn.Forte@Sun.COM 		return (ret);
3257*7836SJohn.Forte@Sun.COM 	}
3258*7836SJohn.Forte@Sun.COM 
3259*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3260*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3261*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3262*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3263*7836SJohn.Forte@Sun.COM 	    return (ret);
3264*7836SJohn.Forte@Sun.COM 	}
3265*7836SJohn.Forte@Sun.COM 
3266*7836SJohn.Forte@Sun.COM 	/*
3267*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3268*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3269*7836SJohn.Forte@Sun.COM 	 */
3270*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3271*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet)) != 0) {
3272*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3273*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3274*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3275*7836SJohn.Forte@Sun.COM 	    return (ret);
3276*7836SJohn.Forte@Sun.COM 	}
3277*7836SJohn.Forte@Sun.COM 
3278*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3279*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3280*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3281*7836SJohn.Forte@Sun.COM 
3282*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3283*7836SJohn.Forte@Sun.COM }
3284*7836SJohn.Forte@Sun.COM 
3285*7836SJohn.Forte@Sun.COM /*
3286*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3287*7836SJohn.Forte@Sun.COM  *
3288*7836SJohn.Forte@Sun.COM  * add_node_func -
3289*7836SJohn.Forte@Sun.COM  * 	Add a node to a DiscoveryDomain add-node -d dd-name <node name>, ...
3290*7836SJohn.Forte@Sun.COM  *
3291*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3292*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3293*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3294*7836SJohn.Forte@Sun.COM  *
3295*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3296*7836SJohn.Forte@Sun.COM  */
3297*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3298*7836SJohn.Forte@Sun.COM static int
add_node_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3299*7836SJohn.Forte@Sun.COM add_node_func(int operandLen, char *operand[], cmdOptions_t *options,
3300*7836SJohn.Forte@Sun.COM 	void *addarg)
3301*7836SJohn.Forte@Sun.COM {
3302*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3303*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3304*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3305*7836SJohn.Forte@Sun.COM 	int	fd;
3306*7836SJohn.Forte@Sun.COM 
3307*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3308*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3309*7836SJohn.Forte@Sun.COM 	    return (ret);
3310*7836SJohn.Forte@Sun.COM 	}
3311*7836SJohn.Forte@Sun.COM 
3312*7836SJohn.Forte@Sun.COM 	if ((ret = build_create_xml_doc(operandLen, operand,
3313*7836SJohn.Forte@Sun.COM 		DiscoveryDomainMember, options->optarg, &doc)) == 0) {
3314*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3315*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3316*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3317*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3318*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3319*7836SJohn.Forte@Sun.COM 	} else {
3320*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3321*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3322*7836SJohn.Forte@Sun.COM 		return (ret);
3323*7836SJohn.Forte@Sun.COM 	}
3324*7836SJohn.Forte@Sun.COM 
3325*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3326*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3327*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3328*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3329*7836SJohn.Forte@Sun.COM 	    return (ret);
3330*7836SJohn.Forte@Sun.COM 	}
3331*7836SJohn.Forte@Sun.COM 
3332*7836SJohn.Forte@Sun.COM 	/*
3333*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3334*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3335*7836SJohn.Forte@Sun.COM 	 */
3336*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3337*7836SJohn.Forte@Sun.COM 		DiscoveryDomainMember)) != 0) {
3338*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3339*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3340*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3341*7836SJohn.Forte@Sun.COM 	    return (ret);
3342*7836SJohn.Forte@Sun.COM 	}
3343*7836SJohn.Forte@Sun.COM 
3344*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3345*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3346*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3347*7836SJohn.Forte@Sun.COM 
3348*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3349*7836SJohn.Forte@Sun.COM }
3350*7836SJohn.Forte@Sun.COM 
3351*7836SJohn.Forte@Sun.COM /*
3352*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3353*7836SJohn.Forte@Sun.COM  *
3354*7836SJohn.Forte@Sun.COM  * add_dd_func -
3355*7836SJohn.Forte@Sun.COM  * 	Add a dd to a DiscoveryDomainSet add-dd -s dd-set name <dd name>, ...
3356*7836SJohn.Forte@Sun.COM  *
3357*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3358*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3359*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3360*7836SJohn.Forte@Sun.COM  *
3361*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3362*7836SJohn.Forte@Sun.COM  */
3363*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3364*7836SJohn.Forte@Sun.COM static int
add_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3365*7836SJohn.Forte@Sun.COM add_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
3366*7836SJohn.Forte@Sun.COM 	void *addarg)
3367*7836SJohn.Forte@Sun.COM {
3368*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3369*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3370*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3371*7836SJohn.Forte@Sun.COM 	int	fd;
3372*7836SJohn.Forte@Sun.COM 
3373*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3374*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3375*7836SJohn.Forte@Sun.COM 	    return (ret);
3376*7836SJohn.Forte@Sun.COM 	}
3377*7836SJohn.Forte@Sun.COM 
3378*7836SJohn.Forte@Sun.COM 	if ((ret = build_create_xml_doc(operandLen, operand,
3379*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSetMember, options->optarg, &doc)) == 0) {
3380*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3381*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3382*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3383*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3384*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3385*7836SJohn.Forte@Sun.COM 	} else {
3386*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3387*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3388*7836SJohn.Forte@Sun.COM 		return (ret);
3389*7836SJohn.Forte@Sun.COM 	}
3390*7836SJohn.Forte@Sun.COM 
3391*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3392*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3393*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3394*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3395*7836SJohn.Forte@Sun.COM 	    return (ret);
3396*7836SJohn.Forte@Sun.COM 	}
3397*7836SJohn.Forte@Sun.COM 
3398*7836SJohn.Forte@Sun.COM 	/*
3399*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3400*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3401*7836SJohn.Forte@Sun.COM 	 */
3402*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3403*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSetMember)) != 0) {
3404*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3405*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3406*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3407*7836SJohn.Forte@Sun.COM 	    return (ret);
3408*7836SJohn.Forte@Sun.COM 	}
3409*7836SJohn.Forte@Sun.COM 
3410*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3411*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3412*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3413*7836SJohn.Forte@Sun.COM 
3414*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3415*7836SJohn.Forte@Sun.COM }
3416*7836SJohn.Forte@Sun.COM 
3417*7836SJohn.Forte@Sun.COM /*
3418*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3419*7836SJohn.Forte@Sun.COM  *
3420*7836SJohn.Forte@Sun.COM  * remove_node_func -
3421*7836SJohn.Forte@Sun.COM  * 	Remove a node from DiscoveryDomain
3422*7836SJohn.Forte@Sun.COM  *	remov-node -d dd-name <node name>, ...
3423*7836SJohn.Forte@Sun.COM  *
3424*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3425*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3426*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3427*7836SJohn.Forte@Sun.COM  *
3428*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3429*7836SJohn.Forte@Sun.COM  */
3430*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3431*7836SJohn.Forte@Sun.COM static int
remove_node_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3432*7836SJohn.Forte@Sun.COM remove_node_func(int operandLen, char *operand[], cmdOptions_t *options,
3433*7836SJohn.Forte@Sun.COM 	void *addarg)
3434*7836SJohn.Forte@Sun.COM {
3435*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3436*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3437*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3438*7836SJohn.Forte@Sun.COM 	int	fd;
3439*7836SJohn.Forte@Sun.COM 
3440*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3441*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3442*7836SJohn.Forte@Sun.COM 	    return (ret);
3443*7836SJohn.Forte@Sun.COM 	}
3444*7836SJohn.Forte@Sun.COM 
3445*7836SJohn.Forte@Sun.COM 	if ((ret = build_delete_xml_doc(operandLen, operand,
3446*7836SJohn.Forte@Sun.COM 		DiscoveryDomainMember, options->optarg, &doc)) == 0) {
3447*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3448*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3449*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3450*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3451*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3452*7836SJohn.Forte@Sun.COM 	} else {
3453*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3454*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3455*7836SJohn.Forte@Sun.COM 		return (ret);
3456*7836SJohn.Forte@Sun.COM 	}
3457*7836SJohn.Forte@Sun.COM 
3458*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3459*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3460*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3461*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3462*7836SJohn.Forte@Sun.COM 	    return (ret);
3463*7836SJohn.Forte@Sun.COM 	}
3464*7836SJohn.Forte@Sun.COM 
3465*7836SJohn.Forte@Sun.COM 	/*
3466*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3467*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3468*7836SJohn.Forte@Sun.COM 	 */
3469*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3470*7836SJohn.Forte@Sun.COM 		DiscoveryDomainMember)) != 0) {
3471*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3472*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3473*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3474*7836SJohn.Forte@Sun.COM 	    return (ret);
3475*7836SJohn.Forte@Sun.COM 	}
3476*7836SJohn.Forte@Sun.COM 
3477*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3478*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3479*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3480*7836SJohn.Forte@Sun.COM 
3481*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3482*7836SJohn.Forte@Sun.COM }
3483*7836SJohn.Forte@Sun.COM 
3484*7836SJohn.Forte@Sun.COM /*
3485*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3486*7836SJohn.Forte@Sun.COM  *
3487*7836SJohn.Forte@Sun.COM  * remove_dd_func -
3488*7836SJohn.Forte@Sun.COM  * 	Remove a dd from DiscoveryDomainSet
3489*7836SJohn.Forte@Sun.COM  *	remove-dd -s dd-set name <dd name>, ...
3490*7836SJohn.Forte@Sun.COM  *
3491*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3492*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3493*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3494*7836SJohn.Forte@Sun.COM  *
3495*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3496*7836SJohn.Forte@Sun.COM  */
3497*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3498*7836SJohn.Forte@Sun.COM static int
remove_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3499*7836SJohn.Forte@Sun.COM remove_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
3500*7836SJohn.Forte@Sun.COM 	void *addarg)
3501*7836SJohn.Forte@Sun.COM {
3502*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3503*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3504*7836SJohn.Forte@Sun.COM 	door_arg_t	darg;
3505*7836SJohn.Forte@Sun.COM 	int	fd;
3506*7836SJohn.Forte@Sun.COM 
3507*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3508*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3509*7836SJohn.Forte@Sun.COM 	    return (ret);
3510*7836SJohn.Forte@Sun.COM 	}
3511*7836SJohn.Forte@Sun.COM 
3512*7836SJohn.Forte@Sun.COM 	if ((ret = build_delete_xml_doc(operandLen, operand,
3513*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSetMember, options->optarg, &doc)) == 0) {
3514*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3515*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3516*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3517*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3518*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3519*7836SJohn.Forte@Sun.COM 	} else {
3520*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3521*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3522*7836SJohn.Forte@Sun.COM 		return (ret);
3523*7836SJohn.Forte@Sun.COM 	}
3524*7836SJohn.Forte@Sun.COM 
3525*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3526*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3527*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3528*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3529*7836SJohn.Forte@Sun.COM 	    return (ret);
3530*7836SJohn.Forte@Sun.COM 	}
3531*7836SJohn.Forte@Sun.COM 
3532*7836SJohn.Forte@Sun.COM 	/*
3533*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3534*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3535*7836SJohn.Forte@Sun.COM 	 */
3536*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3537*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSetMember)) != 0) {
3538*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3539*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3540*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3541*7836SJohn.Forte@Sun.COM 	    return (ret);
3542*7836SJohn.Forte@Sun.COM 	}
3543*7836SJohn.Forte@Sun.COM 
3544*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3545*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3546*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3547*7836SJohn.Forte@Sun.COM 
3548*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3549*7836SJohn.Forte@Sun.COM }
3550*7836SJohn.Forte@Sun.COM 
3551*7836SJohn.Forte@Sun.COM /*
3552*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3553*7836SJohn.Forte@Sun.COM  *
3554*7836SJohn.Forte@Sun.COM  * delete_dd_func -
3555*7836SJohn.Forte@Sun.COM  * 	remove a DiscoveryDomain remove-dd <dd name>, ...
3556*7836SJohn.Forte@Sun.COM  *
3557*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3558*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3559*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3560*7836SJohn.Forte@Sun.COM  *
3561*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3562*7836SJohn.Forte@Sun.COM  */
3563*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3564*7836SJohn.Forte@Sun.COM static int
delete_dd_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3565*7836SJohn.Forte@Sun.COM delete_dd_func(int operandLen, char *operand[], cmdOptions_t *options,
3566*7836SJohn.Forte@Sun.COM 	void *addarg)
3567*7836SJohn.Forte@Sun.COM {
3568*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3569*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3570*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
3571*7836SJohn.Forte@Sun.COM 	int			fd;
3572*7836SJohn.Forte@Sun.COM 
3573*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3574*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3575*7836SJohn.Forte@Sun.COM 	    return (ret);
3576*7836SJohn.Forte@Sun.COM 	}
3577*7836SJohn.Forte@Sun.COM 
3578*7836SJohn.Forte@Sun.COM 	if ((ret = build_delete_xml_doc(operandLen, operand,
3579*7836SJohn.Forte@Sun.COM 		DiscoveryDomain, NULL, &doc)) == 0) {
3580*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3581*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3582*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3583*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3584*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3585*7836SJohn.Forte@Sun.COM 	} else {
3586*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3587*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3588*7836SJohn.Forte@Sun.COM 		return (ret);
3589*7836SJohn.Forte@Sun.COM 	}
3590*7836SJohn.Forte@Sun.COM 
3591*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3592*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3593*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3594*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3595*7836SJohn.Forte@Sun.COM 	    return (ret);
3596*7836SJohn.Forte@Sun.COM 	}
3597*7836SJohn.Forte@Sun.COM 
3598*7836SJohn.Forte@Sun.COM 	/*
3599*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3600*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3601*7836SJohn.Forte@Sun.COM 	 */
3602*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3603*7836SJohn.Forte@Sun.COM 		DiscoveryDomain)) != 0) {
3604*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3605*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3606*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3607*7836SJohn.Forte@Sun.COM 	    return (ret);
3608*7836SJohn.Forte@Sun.COM 	}
3609*7836SJohn.Forte@Sun.COM 
3610*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3611*7836SJohn.Forte@Sun.COM 
3612*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3613*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3614*7836SJohn.Forte@Sun.COM 
3615*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3616*7836SJohn.Forte@Sun.COM }
3617*7836SJohn.Forte@Sun.COM 
3618*7836SJohn.Forte@Sun.COM /*
3619*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3620*7836SJohn.Forte@Sun.COM  *
3621*7836SJohn.Forte@Sun.COM  * delete_ddset_func -
3622*7836SJohn.Forte@Sun.COM  * 	delete DiscoveryDomainSet(s) delete-dd-set <dd set name>, ...
3623*7836SJohn.Forte@Sun.COM  *
3624*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3625*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3626*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3627*7836SJohn.Forte@Sun.COM  *
3628*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3629*7836SJohn.Forte@Sun.COM  */
3630*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3631*7836SJohn.Forte@Sun.COM static int
delete_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3632*7836SJohn.Forte@Sun.COM delete_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
3633*7836SJohn.Forte@Sun.COM     void *addarg)
3634*7836SJohn.Forte@Sun.COM {
3635*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3636*7836SJohn.Forte@Sun.COM 	msg_code_t ret;
3637*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
3638*7836SJohn.Forte@Sun.COM 	int			fd;
3639*7836SJohn.Forte@Sun.COM 
3640*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3641*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3642*7836SJohn.Forte@Sun.COM 	    return (ret);
3643*7836SJohn.Forte@Sun.COM 	}
3644*7836SJohn.Forte@Sun.COM 
3645*7836SJohn.Forte@Sun.COM 	if ((ret = build_delete_xml_doc(operandLen, operand,
3646*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet, NULL, &doc)) == 0) {
3647*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3648*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3649*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3650*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3651*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3652*7836SJohn.Forte@Sun.COM 	} else {
3653*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3654*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3655*7836SJohn.Forte@Sun.COM 		return (ret);
3656*7836SJohn.Forte@Sun.COM 	}
3657*7836SJohn.Forte@Sun.COM 
3658*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3659*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3660*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3661*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3662*7836SJohn.Forte@Sun.COM 	    return (ret);
3663*7836SJohn.Forte@Sun.COM 	}
3664*7836SJohn.Forte@Sun.COM 
3665*7836SJohn.Forte@Sun.COM 	/*
3666*7836SJohn.Forte@Sun.COM 	 * door frame work allocated a buffer when the date lager that rbuf.
3667*7836SJohn.Forte@Sun.COM 	 * indicate if munmap is required on rbuf.
3668*7836SJohn.Forte@Sun.COM 	 */
3669*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3670*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet)) != 0) {
3671*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3672*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3673*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3674*7836SJohn.Forte@Sun.COM 	    return (ret);
3675*7836SJohn.Forte@Sun.COM 	}
3676*7836SJohn.Forte@Sun.COM 
3677*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3678*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3679*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3680*7836SJohn.Forte@Sun.COM 
3681*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3682*7836SJohn.Forte@Sun.COM }
3683*7836SJohn.Forte@Sun.COM 
3684*7836SJohn.Forte@Sun.COM /*
3685*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3686*7836SJohn.Forte@Sun.COM  *
3687*7836SJohn.Forte@Sun.COM  * i_enableddset
3688*7836SJohn.Forte@Sun.COM  * 	enables/disables DiscoveryDomainSet(s)
3689*7836SJohn.Forte@Sun.COM  *
3690*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3691*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3692*7836SJohn.Forte@Sun.COM  * enable	- indication of enable/disable
3693*7836SJohn.Forte@Sun.COM  *
3694*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3695*7836SJohn.Forte@Sun.COM  */
3696*7836SJohn.Forte@Sun.COM static int
i_enableddset(int operandLen,char * operand[],boolean_t enable)3697*7836SJohn.Forte@Sun.COM i_enableddset(int operandLen, char *operand[], boolean_t enable)
3698*7836SJohn.Forte@Sun.COM {
3699*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3700*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
3701*7836SJohn.Forte@Sun.COM 	int fd, ret = 0;
3702*7836SJohn.Forte@Sun.COM 
3703*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3704*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3705*7836SJohn.Forte@Sun.COM 	    return (ret);
3706*7836SJohn.Forte@Sun.COM 	}
3707*7836SJohn.Forte@Sun.COM 
3708*7836SJohn.Forte@Sun.COM 	if ((ret = build_modify_xml_doc(operandLen, operand,
3709*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet, enable, &doc)) == 0) {
3710*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3711*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3712*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3713*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3714*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3715*7836SJohn.Forte@Sun.COM 	} else {
3716*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3717*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3718*7836SJohn.Forte@Sun.COM 		return (ret);
3719*7836SJohn.Forte@Sun.COM 	}
3720*7836SJohn.Forte@Sun.COM 
3721*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3722*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3723*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3724*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3725*7836SJohn.Forte@Sun.COM 	    return (ret);
3726*7836SJohn.Forte@Sun.COM 	}
3727*7836SJohn.Forte@Sun.COM 
3728*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3729*7836SJohn.Forte@Sun.COM 
3730*7836SJohn.Forte@Sun.COM 	if ((ret = process_result_response((xmlChar *)darg.rbuf,
3731*7836SJohn.Forte@Sun.COM 		DiscoveryDomainSet)) != 0) {
3732*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3733*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3734*7836SJohn.Forte@Sun.COM 	    return (ret);
3735*7836SJohn.Forte@Sun.COM 	}
3736*7836SJohn.Forte@Sun.COM 
3737*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3738*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3739*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3740*7836SJohn.Forte@Sun.COM }
3741*7836SJohn.Forte@Sun.COM 
3742*7836SJohn.Forte@Sun.COM /*
3743*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3744*7836SJohn.Forte@Sun.COM  *
3745*7836SJohn.Forte@Sun.COM  * enable_ddset_func -
3746*7836SJohn.Forte@Sun.COM  * 	enables DiscoveryDomainSet(s) enable-dd-set <dd set name>, ...
3747*7836SJohn.Forte@Sun.COM  *
3748*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3749*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3750*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3751*7836SJohn.Forte@Sun.COM  *
3752*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3753*7836SJohn.Forte@Sun.COM  */
3754*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3755*7836SJohn.Forte@Sun.COM static int
enable_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3756*7836SJohn.Forte@Sun.COM enable_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
3757*7836SJohn.Forte@Sun.COM     void *addarg)
3758*7836SJohn.Forte@Sun.COM {
3759*7836SJohn.Forte@Sun.COM 	return (i_enableddset(operandLen, operand, B_TRUE));
3760*7836SJohn.Forte@Sun.COM }
3761*7836SJohn.Forte@Sun.COM 
3762*7836SJohn.Forte@Sun.COM /*
3763*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3764*7836SJohn.Forte@Sun.COM  *
3765*7836SJohn.Forte@Sun.COM  * disabledsetFunc -
3766*7836SJohn.Forte@Sun.COM  * 	disable DiscoveryDomainSet(s) disable-dd-set <dd set name>, ...
3767*7836SJohn.Forte@Sun.COM  *
3768*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3769*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3770*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3771*7836SJohn.Forte@Sun.COM  *
3772*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3773*7836SJohn.Forte@Sun.COM  */
3774*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3775*7836SJohn.Forte@Sun.COM static int
disable_ddset_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3776*7836SJohn.Forte@Sun.COM disable_ddset_func(int operandLen, char *operand[], cmdOptions_t *options,
3777*7836SJohn.Forte@Sun.COM     void *addarg)
3778*7836SJohn.Forte@Sun.COM {
3779*7836SJohn.Forte@Sun.COM 	return (i_enableddset(operandLen, operand, B_FALSE));
3780*7836SJohn.Forte@Sun.COM }
3781*7836SJohn.Forte@Sun.COM 
3782*7836SJohn.Forte@Sun.COM /*
3783*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3784*7836SJohn.Forte@Sun.COM  *
3785*7836SJohn.Forte@Sun.COM  * show_config_func -
3786*7836SJohn.Forte@Sun.COM  * 	isnsadm show-config
3787*7836SJohn.Forte@Sun.COM  *
3788*7836SJohn.Forte@Sun.COM  * operandLen	- number of operands user passed into the cli
3789*7836SJohn.Forte@Sun.COM  * operand	- pointer to operand list from user
3790*7836SJohn.Forte@Sun.COM  * options	- pointer to option list from user
3791*7836SJohn.Forte@Sun.COM  *
3792*7836SJohn.Forte@Sun.COM  * ****************************************************************************
3793*7836SJohn.Forte@Sun.COM  */
3794*7836SJohn.Forte@Sun.COM /*ARGSUSED*/
3795*7836SJohn.Forte@Sun.COM static int
show_config_func(int operandLen,char * operand[],cmdOptions_t * options,void * addarg)3796*7836SJohn.Forte@Sun.COM show_config_func(int operandLen, char *operand[], cmdOptions_t *options,
3797*7836SJohn.Forte@Sun.COM 	void *addarg)
3798*7836SJohn.Forte@Sun.COM {
3799*7836SJohn.Forte@Sun.COM 	xmlChar *doc;
3800*7836SJohn.Forte@Sun.COM 	int ret;
3801*7836SJohn.Forte@Sun.COM 	door_arg_t		darg;
3802*7836SJohn.Forte@Sun.COM 	int			fd, flag = 0;
3803*7836SJohn.Forte@Sun.COM 
3804*7836SJohn.Forte@Sun.COM 	if ((fd = open(ISNS_DOOR_NAME, 0)) == -1) {
3805*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_OPEN_FAILED, errno);
3806*7836SJohn.Forte@Sun.COM 	    return (ret);
3807*7836SJohn.Forte@Sun.COM 	}
3808*7836SJohn.Forte@Sun.COM 
3809*7836SJohn.Forte@Sun.COM 	if ((ret = build_get_xml_doc(operandLen, operand,
3810*7836SJohn.Forte@Sun.COM 		ServerConfig, &doc)) == 0) {
3811*7836SJohn.Forte@Sun.COM 		bzero(&darg, sizeof (darg));
3812*7836SJohn.Forte@Sun.COM 		darg.data_ptr = (char *)doc;
3813*7836SJohn.Forte@Sun.COM 		darg.data_size = xmlStrlen(doc) + 1;
3814*7836SJohn.Forte@Sun.COM 		darg.rbuf = NULL;
3815*7836SJohn.Forte@Sun.COM 		darg.rsize = 0;
3816*7836SJohn.Forte@Sun.COM 	} else {
3817*7836SJohn.Forte@Sun.COM 		(void) fprintf(stderr, "%s\n", getTextMessage(ret));
3818*7836SJohn.Forte@Sun.COM 		(void) close(fd);
3819*7836SJohn.Forte@Sun.COM 		(void) xmlFree(doc);
3820*7836SJohn.Forte@Sun.COM 		return (ret);
3821*7836SJohn.Forte@Sun.COM 	}
3822*7836SJohn.Forte@Sun.COM 
3823*7836SJohn.Forte@Sun.COM 	if ((door_call(fd, &darg)) == -1) {
3824*7836SJohn.Forte@Sun.COM 	    ret = check_door_error(ERROR_DOOR_CALL_FAILED, errno);
3825*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3826*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3827*7836SJohn.Forte@Sun.COM 	    return (ret);
3828*7836SJohn.Forte@Sun.COM 	}
3829*7836SJohn.Forte@Sun.COM 
3830*7836SJohn.Forte@Sun.COM 	if ((ret = process_get_response(ServerConfig, (xmlChar *)darg.rbuf,
3831*7836SJohn.Forte@Sun.COM 	    flag)) != 0) {
3832*7836SJohn.Forte@Sun.COM 	    (void) munmap(darg.rbuf, darg.rsize);
3833*7836SJohn.Forte@Sun.COM 	    (void) close(fd);
3834*7836SJohn.Forte@Sun.COM 	    (void) xmlFree(doc);
3835*7836SJohn.Forte@Sun.COM 	    return (ret);
3836*7836SJohn.Forte@Sun.COM 	}
3837*7836SJohn.Forte@Sun.COM 
3838*7836SJohn.Forte@Sun.COM 	(void) munmap(darg.rbuf, darg.rsize);
3839*7836SJohn.Forte@Sun.COM 	(void) close(fd);
3840*7836SJohn.Forte@Sun.COM 	xmlFree(doc);
3841*7836SJohn.Forte@Sun.COM 
3842*7836SJohn.Forte@Sun.COM 	return (SUBCOMMAND_SUCCESS);
3843*7836SJohn.Forte@Sun.COM }
3844*7836SJohn.Forte@Sun.COM 
3845*7836SJohn.Forte@Sun.COM /*
3846*7836SJohn.Forte@Sun.COM  * *************************************************************************
3847*7836SJohn.Forte@Sun.COM  *
3848*7836SJohn.Forte@Sun.COM  * main
3849*7836SJohn.Forte@Sun.COM  *
3850*7836SJohn.Forte@Sun.COM  * *************************************************************************
3851*7836SJohn.Forte@Sun.COM  */
3852*7836SJohn.Forte@Sun.COM int
main(int argc,char * argv[])3853*7836SJohn.Forte@Sun.COM main(int argc, char *argv[])
3854*7836SJohn.Forte@Sun.COM {
3855*7836SJohn.Forte@Sun.COM 	synTables_t 			synTables;
3856*7836SJohn.Forte@Sun.COM 	char 				versionString[VERSION_STRING_MAX_LEN];
3857*7836SJohn.Forte@Sun.COM 	int 				ret;
3858*7836SJohn.Forte@Sun.COM 	int 				funcRet;
3859*7836SJohn.Forte@Sun.COM 	void 				*subcommandArgs = NULL;
3860*7836SJohn.Forte@Sun.COM 
3861*7836SJohn.Forte@Sun.COM 	(void) setlocale(LC_ALL, "");
3862*7836SJohn.Forte@Sun.COM 
3863*7836SJohn.Forte@Sun.COM 	(void) sprintf(versionString, "%2s.%2s",
3864*7836SJohn.Forte@Sun.COM 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
3865*7836SJohn.Forte@Sun.COM 	synTables.versionString = versionString;
3866*7836SJohn.Forte@Sun.COM 	synTables.longOptionTbl = &longOptions[0];
3867*7836SJohn.Forte@Sun.COM 	synTables.subCommandPropsTbl = &subcommands[0];
3868*7836SJohn.Forte@Sun.COM 
3869*7836SJohn.Forte@Sun.COM 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
3870*7836SJohn.Forte@Sun.COM 
3871*7836SJohn.Forte@Sun.COM 	if (ret == 1) {
3872*7836SJohn.Forte@Sun.COM 		return (COMMAND_SYNTAX_FAILED);
3873*7836SJohn.Forte@Sun.COM 	} else if (ret == -1) {
3874*7836SJohn.Forte@Sun.COM 		perror(argv[0]);
3875*7836SJohn.Forte@Sun.COM 		return (1);
3876*7836SJohn.Forte@Sun.COM 	} else if (ret == 0) {
3877*7836SJohn.Forte@Sun.COM 		/*
3878*7836SJohn.Forte@Sun.COM 		 * strawman way to sort out the error code.
3879*7836SJohn.Forte@Sun.COM 		 * isnsi server protocol error range 0 - 99
3880*7836SJohn.Forte@Sun.COM 		 * isns server maangement op error range 100 -199
3881*7836SJohn.Forte@Sun.COM 		 * isnsadm error range 200 -299
3882*7836SJohn.Forte@Sun.COM 		 */
3883*7836SJohn.Forte@Sun.COM 	    if (funcRet == SUBCOMMAND_SUCCESS) {
3884*7836SJohn.Forte@Sun.COM 		return (0);
3885*7836SJohn.Forte@Sun.COM 	    } else if (funcRet > SUBCOMMAND_SUCCESS) {
3886*7836SJohn.Forte@Sun.COM 		if (funcRet != ERROR_DOOR_CALL_FAILED &&
3887*7836SJohn.Forte@Sun.COM 		    funcRet != ERROR_DOOR_OPEN_FAILED) {
3888*7836SJohn.Forte@Sun.COM 		    (void) fprintf(stderr, "%s\n", getTextMessage(funcRet));
3889*7836SJohn.Forte@Sun.COM 		}
3890*7836SJohn.Forte@Sun.COM 		return (1);
3891*7836SJohn.Forte@Sun.COM 	    } else {
3892*7836SJohn.Forte@Sun.COM 		return (1);
3893*7836SJohn.Forte@Sun.COM 	    }
3894*7836SJohn.Forte@Sun.COM 	}
3895*7836SJohn.Forte@Sun.COM 
3896*7836SJohn.Forte@Sun.COM 	return (0);
3897*7836SJohn.Forte@Sun.COM } /* end main */
3898