1*789Sahrens /*
2*789Sahrens  * CDDL HEADER START
3*789Sahrens  *
4*789Sahrens  * The contents of this file are subject to the terms of the
5*789Sahrens  * Common Development and Distribution License, Version 1.0 only
6*789Sahrens  * (the "License").  You may not use this file except in compliance
7*789Sahrens  * with the License.
8*789Sahrens  *
9*789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*789Sahrens  * or http://www.opensolaris.org/os/licensing.
11*789Sahrens  * See the License for the specific language governing permissions
12*789Sahrens  * and limitations under the License.
13*789Sahrens  *
14*789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
15*789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
17*789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
18*789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
19*789Sahrens  *
20*789Sahrens  * CDDL HEADER END
21*789Sahrens  */
22*789Sahrens /*
23*789Sahrens  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*789Sahrens  * Use is subject to license terms.
25*789Sahrens  */
26*789Sahrens 
27*789Sahrens #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*789Sahrens 
29*789Sahrens #include "availdevs.h"
30*789Sahrens #include <libzfs_jni_diskmgt.h>
31*789Sahrens #include <libxml/parser.h>
32*789Sahrens 
33*789Sahrens /*
34*789Sahrens  * Function prototypes
35*789Sahrens  */
36*789Sahrens 
37*789Sahrens static void handle_error(const char *, va_list);
38*789Sahrens static int add_disk_to_xml(dmgt_disk_t *, void *);
39*789Sahrens static xmlDocPtr create_doc();
40*789Sahrens int main();
41*789Sahrens 
42*789Sahrens /*
43*789Sahrens  * Static functions
44*789Sahrens  */
45*789Sahrens 
46*789Sahrens static void
47*789Sahrens handle_error(const char *fmt, va_list ap)
48*789Sahrens {
49*789Sahrens 	(void) vfprintf(stderr, fmt, ap);
50*789Sahrens 	(void) fprintf(stderr, "\n");
51*789Sahrens }
52*789Sahrens 
53*789Sahrens static int
54*789Sahrens add_disk_to_xml(dmgt_disk_t *dp, void *data)
55*789Sahrens {
56*789Sahrens 	int i, n;
57*789Sahrens 	char tmp[64];
58*789Sahrens 	xmlNodePtr available = *((xmlNodePtr *)data);
59*789Sahrens 
60*789Sahrens 	xmlNodePtr disk = xmlNewChild(
61*789Sahrens 	    available, NULL, (xmlChar *)ELEMENT_DISK, NULL);
62*789Sahrens 	xmlSetProp(disk,
63*789Sahrens 	    (xmlChar *)ATTR_DISK_NAME, (xmlChar *)dp->name);
64*789Sahrens 	n = snprintf(tmp, sizeof (tmp) - 1, "%llu", dp->size);
65*789Sahrens 	tmp[n] = '\0';
66*789Sahrens 	xmlSetProp(disk, (xmlChar *)ATTR_DISK_SIZE, (xmlChar *)tmp);
67*789Sahrens 
68*789Sahrens 	if (dp->aliases != NULL) {
69*789Sahrens 		for (i = 0; dp->aliases[i] != NULL; i++) {
70*789Sahrens 			xmlNodePtr alias = xmlNewChild(
71*789Sahrens 			    disk, NULL, (xmlChar *)ELEMENT_ALIAS, NULL);
72*789Sahrens 			xmlSetProp(alias,
73*789Sahrens 			    (xmlChar *)ATTR_ALIAS_NAME,
74*789Sahrens 			    (xmlChar *)dp->aliases[i]);
75*789Sahrens 		}
76*789Sahrens 	}
77*789Sahrens 
78*789Sahrens 	if (dp->slices != NULL) {
79*789Sahrens 		for (i = 0; dp->slices[i] != NULL; i++) {
80*789Sahrens 			dmgt_slice_t *sp = dp->slices[i];
81*789Sahrens 			xmlNodePtr slice = xmlNewChild(
82*789Sahrens 			    disk, NULL, (xmlChar *)ELEMENT_SLICE, NULL);
83*789Sahrens 			xmlSetProp(slice,
84*789Sahrens 			    (xmlChar *)ATTR_SLICE_NAME, (xmlChar *)sp->name);
85*789Sahrens 
86*789Sahrens 			n = snprintf(tmp, sizeof (tmp) - 1, "%llu", sp->size);
87*789Sahrens 			tmp[n] = '\0';
88*789Sahrens 			xmlSetProp(slice, (xmlChar *)ATTR_SLICE_SIZE,
89*789Sahrens 			    (xmlChar *)tmp);
90*789Sahrens 
91*789Sahrens 			n = snprintf(tmp, sizeof (tmp) - 1, "%llu", sp->start);
92*789Sahrens 			tmp[n] = '\0';
93*789Sahrens 			xmlSetProp(slice, (xmlChar *)ATTR_SLICE_START,
94*789Sahrens 			    (xmlChar *)tmp);
95*789Sahrens 
96*789Sahrens 			if (sp->used_name != NULL) {
97*789Sahrens 				xmlSetProp(slice,
98*789Sahrens 				    (xmlChar *)ATTR_SLICE_USED_NAME,
99*789Sahrens 				    (xmlChar *)sp->used_name);
100*789Sahrens 			}
101*789Sahrens 
102*789Sahrens 			if (sp->used_by != NULL) {
103*789Sahrens 				xmlSetProp(slice, (xmlChar *)ATTR_SLICE_USED_BY,
104*789Sahrens 				    (xmlChar *)sp->used_by);
105*789Sahrens 			}
106*789Sahrens 		}
107*789Sahrens 	}
108*789Sahrens 
109*789Sahrens 	return (0);
110*789Sahrens }
111*789Sahrens 
112*789Sahrens static xmlDocPtr
113*789Sahrens create_doc(void)
114*789Sahrens {
115*789Sahrens 	/* Create the XML document */
116*789Sahrens 	xmlDocPtr doc = xmlNewDoc((xmlChar *)"1.0");
117*789Sahrens 
118*789Sahrens 	/* Create the root node */
119*789Sahrens 	xmlNodePtr root = xmlNewDocNode(
120*789Sahrens 	    doc, NULL, (xmlChar *)ELEMENT_ROOT, NULL);
121*789Sahrens 	xmlAddChild((xmlNodePtr) doc, (xmlNodePtr)root);
122*789Sahrens 
123*789Sahrens 	/* Create the available node */
124*789Sahrens 	xmlNewChild(root, NULL, (xmlChar *)ELEMENT_AVAILABLE, NULL);
125*789Sahrens 
126*789Sahrens 	return (doc);
127*789Sahrens }
128*789Sahrens 
129*789Sahrens /*
130*789Sahrens  * Main entry to availdisks.
131*789Sahrens  *
132*789Sahrens  * @return      0 on successful exit, non-zero otherwise
133*789Sahrens  */
134*789Sahrens int
135*789Sahrens main(void)
136*789Sahrens {
137*789Sahrens 	int error;
138*789Sahrens 	xmlDocPtr doc;
139*789Sahrens 	xmlNodePtr root;
140*789Sahrens 	xmlNodePtr available;
141*789Sahrens 
142*789Sahrens 	/* diskmgt.o error handler */
143*789Sahrens 	dmgt_set_error_handler(handle_error);
144*789Sahrens 
145*789Sahrens 	doc = create_doc();
146*789Sahrens 	root = xmlDocGetRootElement(doc);
147*789Sahrens 	available = xmlGetLastChild(root);
148*789Sahrens 
149*789Sahrens 	error = dmgt_avail_disk_iter(add_disk_to_xml, &available);
150*789Sahrens 	if (!error) {
151*789Sahrens 		/* Print out XML */
152*789Sahrens 		xmlDocFormatDump(stdout, doc, 1);
153*789Sahrens 	}
154*789Sahrens 
155*789Sahrens 	xmlFreeDoc(doc);
156*789Sahrens 
157*789Sahrens 	return (error != 0);
158*789Sahrens }
159