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