182629e30SMike Christensen /* 282629e30SMike Christensen * CDDL HEADER START 382629e30SMike Christensen * 482629e30SMike Christensen * The contents of this file are subject to the terms of the 582629e30SMike Christensen * Common Development and Distribution License (the "License"). 682629e30SMike Christensen * You may not use this file except in compliance with the License. 782629e30SMike Christensen * 882629e30SMike Christensen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 982629e30SMike Christensen * or http://www.opensolaris.org/os/licensing. 1082629e30SMike Christensen * See the License for the specific language governing permissions 1182629e30SMike Christensen * and limitations under the License. 1282629e30SMike Christensen * 1382629e30SMike Christensen * When distributing Covered Code, include this CDDL HEADER in each 1482629e30SMike Christensen * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1582629e30SMike Christensen * If applicable, add the following below this CDDL HEADER, with the 1682629e30SMike Christensen * fields enclosed by brackets "[]" replaced with your own identifying 1782629e30SMike Christensen * information: Portions Copyright [yyyy] [name of copyright owner] 1882629e30SMike Christensen * 1982629e30SMike Christensen * CDDL HEADER END 2082629e30SMike Christensen */ 2182629e30SMike Christensen 2282629e30SMike Christensen /* 2382629e30SMike Christensen * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2482629e30SMike Christensen * Use is subject to license terms. 2582629e30SMike Christensen */ 2682629e30SMike Christensen 2782629e30SMike Christensen #include <errno.h> 2882629e30SMike Christensen #include <stdio.h> 2982629e30SMike Christensen #include <stdlib.h> 3082629e30SMike Christensen #include <strings.h> 3182629e30SMike Christensen #include <unistd.h> 3282629e30SMike Christensen #include <libgen.h> 3382629e30SMike Christensen #include <libintl.h> 3482629e30SMike Christensen #include <libv12n.h> 35*5bcb2410SMike Christensen #include <locale.h> 3682629e30SMike Christensen #include <zone.h> 3782629e30SMike Christensen #include <sys/types.h> 3882629e30SMike Christensen #include <sys/param.h> 3982629e30SMike Christensen #include <uuid/uuid.h> 4082629e30SMike Christensen 41*5bcb2410SMike Christensen #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ 42*5bcb2410SMike Christensen #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it wasn't */ 43*5bcb2410SMike Christensen #endif 44*5bcb2410SMike Christensen 4582629e30SMike Christensen static char *cmdname; 4682629e30SMike Christensen 4782629e30SMike Christensen char *options = "acdpstu"; 4882629e30SMike Christensen 4982629e30SMike Christensen static void 5082629e30SMike Christensen virtinfo_usage() 5182629e30SMike Christensen { 5282629e30SMike Christensen (void) fprintf(stderr, gettext("usage: %s [-%s]\n"), cmdname, options); 5382629e30SMike Christensen exit(1); 5482629e30SMike Christensen } 5582629e30SMike Christensen 5682629e30SMike Christensen static char * 5782629e30SMike Christensen virtinfo_cap_to_impl(int cap) 5882629e30SMike Christensen { 5982629e30SMike Christensen if (cap & V12N_CAP_IMPL_LDOMS) 6082629e30SMike Christensen return ("LDoms"); 6182629e30SMike Christensen return ("Unknown"); 6282629e30SMike Christensen } 6382629e30SMike Christensen 6482629e30SMike Christensen 6582629e30SMike Christensen int 6682629e30SMike Christensen main(int argc, char *argv[]) 6782629e30SMike Christensen { 6882629e30SMike Christensen int cap; 6982629e30SMike Christensen int roles; 7082629e30SMike Christensen size_t rv; 7182629e30SMike Christensen int opt; 7282629e30SMike Christensen int errflg = 0; 7382629e30SMike Christensen int aflg = 0, cflg = 0, dflg = 0, pflg = 0, sflg = 0, tflg = 0, 7482629e30SMike Christensen uflg = 0; 7582629e30SMike Christensen 76*5bcb2410SMike Christensen /* Set locale environment variables local definitions */ 77*5bcb2410SMike Christensen (void) setlocale(LC_ALL, ""); 78*5bcb2410SMike Christensen (void) textdomain(TEXT_DOMAIN); 79*5bcb2410SMike Christensen 8082629e30SMike Christensen cmdname = basename(argv[0]); 8182629e30SMike Christensen 8282629e30SMike Christensen /* disable getopt error messages */ 8382629e30SMike Christensen opterr = 0; 8482629e30SMike Christensen 8582629e30SMike Christensen while ((opt = getopt(argc, argv, options)) != EOF) { 8682629e30SMike Christensen 8782629e30SMike Christensen switch (opt) { 8882629e30SMike Christensen case 'a': 8982629e30SMike Christensen aflg = 1; 9082629e30SMike Christensen break; 9182629e30SMike Christensen case 'c': 9282629e30SMike Christensen cflg = 1; 9382629e30SMike Christensen break; 9482629e30SMike Christensen case 'd': 9582629e30SMike Christensen dflg = 1; 9682629e30SMike Christensen break; 9782629e30SMike Christensen case 'p': 9882629e30SMike Christensen pflg = 1; 9982629e30SMike Christensen break; 10082629e30SMike Christensen case 's': 10182629e30SMike Christensen sflg = 1; 10282629e30SMike Christensen break; 10382629e30SMike Christensen case 't': 10482629e30SMike Christensen tflg = 1; 10582629e30SMike Christensen break; 10682629e30SMike Christensen case 'u': 10782629e30SMike Christensen uflg = 1; 10882629e30SMike Christensen break; 10982629e30SMike Christensen case '?': 11082629e30SMike Christensen default: 11182629e30SMike Christensen errflg = 1; 11282629e30SMike Christensen break; 11382629e30SMike Christensen } 11482629e30SMike Christensen } 11582629e30SMike Christensen 11682629e30SMike Christensen if (errflg || optind != argc) 11782629e30SMike Christensen virtinfo_usage(); 11882629e30SMike Christensen 11982629e30SMike Christensen if (aflg) { 12082629e30SMike Christensen /* aflg -> set all flags except -p */ 12182629e30SMike Christensen cflg = dflg = sflg = tflg = uflg = 1; 12282629e30SMike Christensen } else if (cflg == 0 && dflg == 0 && sflg == 0 && tflg == 0 && 12382629e30SMike Christensen uflg == 0) { 12482629e30SMike Christensen /* no flag set, default to '-t' */ 12582629e30SMike Christensen tflg = 1; 12682629e30SMike Christensen } 12782629e30SMike Christensen 12882629e30SMike Christensen if (getzoneid() != GLOBAL_ZONEID) { 12982629e30SMike Christensen (void) printf(gettext( 13082629e30SMike Christensen "%s can only be run from the global zone\n"), cmdname); 13182629e30SMike Christensen exit(0); 13282629e30SMike Christensen } 13382629e30SMike Christensen 13482629e30SMike Christensen cap = v12n_capabilities(); 13582629e30SMike Christensen if ((cap & V12N_CAP_SUPPORTED) == 0) { 13682629e30SMike Christensen (void) printf(gettext("Virtual machines are not supported\n")); 13782629e30SMike Christensen exit(0); 13882629e30SMike Christensen } else if ((cap & V12N_CAP_ENABLED) == 0) { 13982629e30SMike Christensen (void) printf(gettext( 14082629e30SMike Christensen "Virtual machines (%s) are supported but not enabled\n"), 14182629e30SMike Christensen virtinfo_cap_to_impl(cap)); 14282629e30SMike Christensen exit(0); 14382629e30SMike Christensen } 14482629e30SMike Christensen 14582629e30SMike Christensen if (pflg) { 14682629e30SMike Christensen (void) printf("VERSION 1.0\n"); 14782629e30SMike Christensen } 14882629e30SMike Christensen 14982629e30SMike Christensen if (tflg) { 15082629e30SMike Christensen char *impl = "", *role = "", *io = "", *service = "", 15182629e30SMike Christensen *root = ""; 15282629e30SMike Christensen 15382629e30SMike Christensen roles = v12n_domain_roles(); 15482629e30SMike Christensen 15582629e30SMike Christensen if (roles == -1 || (cap & V12N_CAP_IMPL_LDOMS) == 0) { 15682629e30SMike Christensen if (pflg) 15782629e30SMike Christensen impl = "impl=Unknown"; 15882629e30SMike Christensen else 15982629e30SMike Christensen impl = "Unknown"; 16082629e30SMike Christensen } else if (pflg) { 16182629e30SMike Christensen impl = "impl=LDoms"; 16282629e30SMike Christensen role = (roles & V12N_ROLE_CONTROL) ? 16382629e30SMike Christensen "|control=true" : "|control=false"; 16482629e30SMike Christensen io = (roles & V12N_ROLE_IO) ? 16582629e30SMike Christensen "|io=true" : "|io=false"; 16682629e30SMike Christensen service = (roles & V12N_ROLE_SERVICE) ? 16782629e30SMike Christensen "|service=true" : "|service=false"; 16882629e30SMike Christensen root = (roles & V12N_ROLE_ROOT) ? 16982629e30SMike Christensen "|root=true" : "|root=false"; 17082629e30SMike Christensen } else { 17182629e30SMike Christensen impl = "LDoms"; 17282629e30SMike Christensen role = (roles & V12N_ROLE_CONTROL) ? 17382629e30SMike Christensen " control" : " guest"; 17482629e30SMike Christensen io = (roles & V12N_ROLE_IO) ? 17582629e30SMike Christensen " I/O" : ""; 17682629e30SMike Christensen service = (roles & V12N_ROLE_SERVICE) ? 17782629e30SMike Christensen " service" : ""; 17882629e30SMike Christensen root = (roles & V12N_ROLE_ROOT) ? 17982629e30SMike Christensen " root" : ""; 18082629e30SMike Christensen } 18182629e30SMike Christensen (void) printf("%s%s%s%s%s%s\n", pflg ? "DOMAINROLE|" : 18282629e30SMike Christensen gettext("Domain role: "), impl, role, io, service, root); 18382629e30SMike Christensen } 18482629e30SMike Christensen 18582629e30SMike Christensen if (dflg) { 18682629e30SMike Christensen char domain_name[V12N_NAME_MAX]; 18782629e30SMike Christensen 18882629e30SMike Christensen rv = v12n_domain_name(domain_name, sizeof (domain_name)); 18982629e30SMike Christensen if (rv == (size_t)(-1)) { 19082629e30SMike Christensen (void) strcpy(domain_name, "Unknown"); 19182629e30SMike Christensen } 19282629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINNAME|name=" : 19382629e30SMike Christensen gettext("Domain name: "), domain_name); 19482629e30SMike Christensen } 19582629e30SMike Christensen 19682629e30SMike Christensen if (uflg) { 19782629e30SMike Christensen uuid_t uuid; 19882629e30SMike Christensen char uuid_str[UUID_PRINTABLE_STRING_LENGTH]; 19982629e30SMike Christensen 20082629e30SMike Christensen rv = v12n_domain_uuid(uuid); 20182629e30SMike Christensen 20282629e30SMike Christensen if (rv == (size_t)(-1)) { 20382629e30SMike Christensen (void) strcpy(uuid_str, "Unknown"); 20482629e30SMike Christensen } else { 20582629e30SMike Christensen uuid_unparse(uuid, uuid_str); 20682629e30SMike Christensen } 20782629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINUUID|uuid=" : 20882629e30SMike Christensen gettext("Domain UUID: "), uuid_str); 20982629e30SMike Christensen } 21082629e30SMike Christensen 21182629e30SMike Christensen if (cflg) { 21282629e30SMike Christensen char ctrl_name[V12N_NAME_MAX]; 21382629e30SMike Christensen 21482629e30SMike Christensen rv = v12n_ctrl_domain(ctrl_name, sizeof (ctrl_name)); 21582629e30SMike Christensen 21682629e30SMike Christensen if (rv == (size_t)(-1)) { 21782629e30SMike Christensen (void) strcpy(ctrl_name, "Unknown"); 21882629e30SMike Christensen } 21982629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINCONTROL|name=" : 22082629e30SMike Christensen gettext("Control domain: "), ctrl_name); 22182629e30SMike Christensen } 22282629e30SMike Christensen 22382629e30SMike Christensen if (sflg) { 22482629e30SMike Christensen char serial_no[V12N_NAME_MAX]; 22582629e30SMike Christensen 22682629e30SMike Christensen rv = v12n_chassis_serialno(serial_no, sizeof (serial_no)); 22782629e30SMike Christensen 22882629e30SMike Christensen if (rv == (size_t)(-1)) { 22982629e30SMike Christensen (void) strcpy(serial_no, "Unknown"); 23082629e30SMike Christensen } 23182629e30SMike Christensen (void) printf("%s%s\n", pflg ? "DOMAINCHASSIS|serialno=" : 23282629e30SMike Christensen gettext("Chassis serial#: "), serial_no); 23382629e30SMike Christensen } 23482629e30SMike Christensen return (0); 23582629e30SMike Christensen } 236