1*82629e30SMike Christensen /* 2*82629e30SMike Christensen * CDDL HEADER START 3*82629e30SMike Christensen * 4*82629e30SMike Christensen * The contents of this file are subject to the terms of the 5*82629e30SMike Christensen * Common Development and Distribution License (the "License"). 6*82629e30SMike Christensen * You may not use this file except in compliance with the License. 7*82629e30SMike Christensen * 8*82629e30SMike Christensen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*82629e30SMike Christensen * or http://www.opensolaris.org/os/licensing. 10*82629e30SMike Christensen * See the License for the specific language governing permissions 11*82629e30SMike Christensen * and limitations under the License. 12*82629e30SMike Christensen * 13*82629e30SMike Christensen * When distributing Covered Code, include this CDDL HEADER in each 14*82629e30SMike Christensen * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*82629e30SMike Christensen * If applicable, add the following below this CDDL HEADER, with the 16*82629e30SMike Christensen * fields enclosed by brackets "[]" replaced with your own identifying 17*82629e30SMike Christensen * information: Portions Copyright [yyyy] [name of copyright owner] 18*82629e30SMike Christensen * 19*82629e30SMike Christensen * CDDL HEADER END 20*82629e30SMike Christensen */ 21*82629e30SMike Christensen 22*82629e30SMike Christensen /* 23*82629e30SMike Christensen * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24*82629e30SMike Christensen * Use is subject to license terms. 25*82629e30SMike Christensen */ 26*82629e30SMike Christensen 27*82629e30SMike Christensen #include <errno.h> 28*82629e30SMike Christensen #include <stdio.h> 29*82629e30SMike Christensen #include <stdlib.h> 30*82629e30SMike Christensen #include <strings.h> 31*82629e30SMike Christensen #include <unistd.h> 32*82629e30SMike Christensen #include <libgen.h> 33*82629e30SMike Christensen #include <libintl.h> 34*82629e30SMike Christensen #include <libv12n.h> 35*82629e30SMike Christensen #include <zone.h> 36*82629e30SMike Christensen #include <sys/types.h> 37*82629e30SMike Christensen #include <sys/param.h> 38*82629e30SMike Christensen #include <uuid/uuid.h> 39*82629e30SMike Christensen 40*82629e30SMike Christensen static char *cmdname; 41*82629e30SMike Christensen 42*82629e30SMike Christensen char *options = "acdpstu"; 43*82629e30SMike Christensen 44*82629e30SMike Christensen static void 45*82629e30SMike Christensen virtinfo_usage() 46*82629e30SMike Christensen { 47*82629e30SMike Christensen (void) fprintf(stderr, gettext("usage: %s [-%s]\n"), cmdname, options); 48*82629e30SMike Christensen exit(1); 49*82629e30SMike Christensen } 50*82629e30SMike Christensen 51*82629e30SMike Christensen static char * 52*82629e30SMike Christensen virtinfo_cap_to_impl(int cap) 53*82629e30SMike Christensen { 54*82629e30SMike Christensen if (cap & V12N_CAP_IMPL_LDOMS) 55*82629e30SMike Christensen return ("LDoms"); 56*82629e30SMike Christensen return ("Unknown"); 57*82629e30SMike Christensen } 58*82629e30SMike Christensen 59*82629e30SMike Christensen 60*82629e30SMike Christensen int 61*82629e30SMike Christensen main(int argc, char *argv[]) 62*82629e30SMike Christensen { 63*82629e30SMike Christensen int cap; 64*82629e30SMike Christensen int roles; 65*82629e30SMike Christensen size_t rv; 66*82629e30SMike Christensen int opt; 67*82629e30SMike Christensen int errflg = 0; 68*82629e30SMike Christensen int aflg = 0, cflg = 0, dflg = 0, pflg = 0, sflg = 0, tflg = 0, 69*82629e30SMike Christensen uflg = 0; 70*82629e30SMike Christensen 71*82629e30SMike Christensen cmdname = basename(argv[0]); 72*82629e30SMike Christensen 73*82629e30SMike Christensen /* disable getopt error messages */ 74*82629e30SMike Christensen opterr = 0; 75*82629e30SMike Christensen 76*82629e30SMike Christensen while ((opt = getopt(argc, argv, options)) != EOF) { 77*82629e30SMike Christensen 78*82629e30SMike Christensen switch (opt) { 79*82629e30SMike Christensen case 'a': 80*82629e30SMike Christensen aflg = 1; 81*82629e30SMike Christensen break; 82*82629e30SMike Christensen case 'c': 83*82629e30SMike Christensen cflg = 1; 84*82629e30SMike Christensen break; 85*82629e30SMike Christensen case 'd': 86*82629e30SMike Christensen dflg = 1; 87*82629e30SMike Christensen break; 88*82629e30SMike Christensen case 'p': 89*82629e30SMike Christensen pflg = 1; 90*82629e30SMike Christensen break; 91*82629e30SMike Christensen case 's': 92*82629e30SMike Christensen sflg = 1; 93*82629e30SMike Christensen break; 94*82629e30SMike Christensen case 't': 95*82629e30SMike Christensen tflg = 1; 96*82629e30SMike Christensen break; 97*82629e30SMike Christensen case 'u': 98*82629e30SMike Christensen uflg = 1; 99*82629e30SMike Christensen break; 100*82629e30SMike Christensen case '?': 101*82629e30SMike Christensen default: 102*82629e30SMike Christensen errflg = 1; 103*82629e30SMike Christensen break; 104*82629e30SMike Christensen } 105*82629e30SMike Christensen } 106*82629e30SMike Christensen 107*82629e30SMike Christensen if (errflg || optind != argc) 108*82629e30SMike Christensen virtinfo_usage(); 109*82629e30SMike Christensen 110*82629e30SMike Christensen if (aflg) { 111*82629e30SMike Christensen /* aflg -> set all flags except -p */ 112*82629e30SMike Christensen cflg = dflg = sflg = tflg = uflg = 1; 113*82629e30SMike Christensen } else if (cflg == 0 && dflg == 0 && sflg == 0 && tflg == 0 && 114*82629e30SMike Christensen uflg == 0) { 115*82629e30SMike Christensen /* no flag set, default to '-t' */ 116*82629e30SMike Christensen tflg = 1; 117*82629e30SMike Christensen } 118*82629e30SMike Christensen 119*82629e30SMike Christensen if (getzoneid() != GLOBAL_ZONEID) { 120*82629e30SMike Christensen (void) printf(gettext( 121*82629e30SMike Christensen "%s can only be run from the global zone\n"), cmdname); 122*82629e30SMike Christensen exit(0); 123*82629e30SMike Christensen } 124*82629e30SMike Christensen 125*82629e30SMike Christensen cap = v12n_capabilities(); 126*82629e30SMike Christensen if ((cap & V12N_CAP_SUPPORTED) == 0) { 127*82629e30SMike Christensen (void) printf(gettext("Virtual machines are not supported\n")); 128*82629e30SMike Christensen exit(0); 129*82629e30SMike Christensen } else if ((cap & V12N_CAP_ENABLED) == 0) { 130*82629e30SMike Christensen (void) printf(gettext( 131*82629e30SMike Christensen "Virtual machines (%s) are supported but not enabled\n"), 132*82629e30SMike Christensen virtinfo_cap_to_impl(cap)); 133*82629e30SMike Christensen exit(0); 134*82629e30SMike Christensen } 135*82629e30SMike Christensen 136*82629e30SMike Christensen if (pflg) { 137*82629e30SMike Christensen (void) printf("VERSION 1.0\n"); 138*82629e30SMike Christensen } 139*82629e30SMike Christensen 140*82629e30SMike Christensen if (tflg) { 141*82629e30SMike Christensen char *impl = "", *role = "", *io = "", *service = "", 142*82629e30SMike Christensen *root = ""; 143*82629e30SMike Christensen 144*82629e30SMike Christensen roles = v12n_domain_roles(); 145*82629e30SMike Christensen 146*82629e30SMike Christensen if (roles == -1 || (cap & V12N_CAP_IMPL_LDOMS) == 0) { 147*82629e30SMike Christensen if (pflg) 148*82629e30SMike Christensen impl = "impl=Unknown"; 149*82629e30SMike Christensen else 150*82629e30SMike Christensen impl = "Unknown"; 151*82629e30SMike Christensen } else if (pflg) { 152*82629e30SMike Christensen impl = "impl=LDoms"; 153*82629e30SMike Christensen role = (roles & V12N_ROLE_CONTROL) ? 154*82629e30SMike Christensen "|control=true" : "|control=false"; 155*82629e30SMike Christensen io = (roles & V12N_ROLE_IO) ? 156*82629e30SMike Christensen "|io=true" : "|io=false"; 157*82629e30SMike Christensen service = (roles & V12N_ROLE_SERVICE) ? 158*82629e30SMike Christensen "|service=true" : "|service=false"; 159*82629e30SMike Christensen root = (roles & V12N_ROLE_ROOT) ? 160*82629e30SMike Christensen "|root=true" : "|root=false"; 161*82629e30SMike Christensen } else { 162*82629e30SMike Christensen impl = "LDoms"; 163*82629e30SMike Christensen role = (roles & V12N_ROLE_CONTROL) ? 164*82629e30SMike Christensen " control" : " guest"; 165*82629e30SMike Christensen io = (roles & V12N_ROLE_IO) ? 166*82629e30SMike Christensen " I/O" : ""; 167*82629e30SMike Christensen service = (roles & V12N_ROLE_SERVICE) ? 168*82629e30SMike Christensen " service" : ""; 169*82629e30SMike Christensen root = (roles & V12N_ROLE_ROOT) ? 170*82629e30SMike Christensen " root" : ""; 171*82629e30SMike Christensen } 172*82629e30SMike Christensen (void) printf("%s%s%s%s%s%s\n", pflg ? "DOMAINROLE|" : 173*82629e30SMike Christensen gettext("Domain role: "), impl, role, io, service, root); 174*82629e30SMike Christensen } 175*82629e30SMike Christensen 176*82629e30SMike Christensen if (dflg) { 177*82629e30SMike Christensen char domain_name[V12N_NAME_MAX]; 178*82629e30SMike Christensen 179*82629e30SMike Christensen rv = v12n_domain_name(domain_name, sizeof (domain_name)); 180*82629e30SMike Christensen if (rv == (size_t)(-1)) { 181*82629e30SMike Christensen (void) strcpy(domain_name, "Unknown"); 182*82629e30SMike Christensen } 183*82629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINNAME|name=" : 184*82629e30SMike Christensen gettext("Domain name: "), domain_name); 185*82629e30SMike Christensen } 186*82629e30SMike Christensen 187*82629e30SMike Christensen if (uflg) { 188*82629e30SMike Christensen uuid_t uuid; 189*82629e30SMike Christensen char uuid_str[UUID_PRINTABLE_STRING_LENGTH]; 190*82629e30SMike Christensen 191*82629e30SMike Christensen rv = v12n_domain_uuid(uuid); 192*82629e30SMike Christensen 193*82629e30SMike Christensen if (rv == (size_t)(-1)) { 194*82629e30SMike Christensen (void) strcpy(uuid_str, "Unknown"); 195*82629e30SMike Christensen } else { 196*82629e30SMike Christensen uuid_unparse(uuid, uuid_str); 197*82629e30SMike Christensen } 198*82629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINUUID|uuid=" : 199*82629e30SMike Christensen gettext("Domain UUID: "), uuid_str); 200*82629e30SMike Christensen } 201*82629e30SMike Christensen 202*82629e30SMike Christensen if (cflg) { 203*82629e30SMike Christensen char ctrl_name[V12N_NAME_MAX]; 204*82629e30SMike Christensen 205*82629e30SMike Christensen rv = v12n_ctrl_domain(ctrl_name, sizeof (ctrl_name)); 206*82629e30SMike Christensen 207*82629e30SMike Christensen if (rv == (size_t)(-1)) { 208*82629e30SMike Christensen (void) strcpy(ctrl_name, "Unknown"); 209*82629e30SMike Christensen } 210*82629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINCONTROL|name=" : 211*82629e30SMike Christensen gettext("Control domain: "), ctrl_name); 212*82629e30SMike Christensen } 213*82629e30SMike Christensen 214*82629e30SMike Christensen if (sflg) { 215*82629e30SMike Christensen char serial_no[V12N_NAME_MAX]; 216*82629e30SMike Christensen 217*82629e30SMike Christensen rv = v12n_chassis_serialno(serial_no, sizeof (serial_no)); 218*82629e30SMike Christensen 219*82629e30SMike Christensen if (rv == (size_t)(-1)) { 220*82629e30SMike Christensen (void) strcpy(serial_no, "Unknown"); 221*82629e30SMike Christensen } 222*82629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINCHASSIS|serialno=" : 223*82629e30SMike Christensen gettext("Chassis serial#: "), serial_no); 224*82629e30SMike Christensen } 225*82629e30SMike Christensen return (0); 226*82629e30SMike Christensen } 227