15c51f124SMoriah Waterland /* 25c51f124SMoriah Waterland * CDDL HEADER START 35c51f124SMoriah Waterland * 45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 55c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 65c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 75c51f124SMoriah Waterland * 85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 105c51f124SMoriah Waterland * See the License for the specific language governing permissions 115c51f124SMoriah Waterland * and limitations under the License. 125c51f124SMoriah Waterland * 135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 185c51f124SMoriah Waterland * 195c51f124SMoriah Waterland * CDDL HEADER END 205c51f124SMoriah Waterland */ 215c51f124SMoriah Waterland 225c51f124SMoriah Waterland /* 23*6e1ae2a3SGary Pennington * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 245c51f124SMoriah Waterland */ 255c51f124SMoriah Waterland 265c51f124SMoriah Waterland 275c51f124SMoriah Waterland /* 285c51f124SMoriah Waterland * Module: zones.c 295c51f124SMoriah Waterland * Group: libinstzones 305c51f124SMoriah Waterland * Description: Provide "zones" interface for install consolidation code 315c51f124SMoriah Waterland * 325c51f124SMoriah Waterland * Public Methods: 335c51f124SMoriah Waterland * z_create_zone_admin_file - Given a location to create the file, and 345c51f124SMoriah Waterland * optionally an existing administration file, generate an 355c51f124SMoriah Waterland * administration file that can be used to perform "non-interactive" 365c51f124SMoriah Waterland * operations in a non-global zone. 375c51f124SMoriah Waterland * z_free_zone_list - free contents of zoneList_t object 385c51f124SMoriah Waterland * z_get_nonglobal_zone_list - return zoneList_t object describing all 395c51f124SMoriah Waterland * non-global native zones 405c51f124SMoriah Waterland * z_get_nonglobal_zone_list_by_brand - return zoneList_t object describing 415c51f124SMoriah Waterland * all non-global zones matching the list of zone brands passed in. 425c51f124SMoriah Waterland * z_free_brand_list - free contents of a zoneBrandList_t object 435c51f124SMoriah Waterland * z_make_brand_list - return a zoneBrandList_t object describing the list 445c51f124SMoriah Waterland * of all zone brands passed in. 455c51f124SMoriah Waterland * z_get_zonename - return the name of the current zone 465c51f124SMoriah Waterland * z_global_only - Determine if the global zone is only zone on the spec list 475c51f124SMoriah Waterland * z_lock_this_zone - lock this zone 485c51f124SMoriah Waterland * z_lock_zones - lock specified zones 495c51f124SMoriah Waterland * z_mount_in_lz - Mount global zone directory in specified zone's root file 505c51f124SMoriah Waterland * system 515c51f124SMoriah Waterland * z_non_global_zones_exist - Determine if any non-global native zones exist 525c51f124SMoriah Waterland * z_on_zone_spec - Determine if named zone is on the zone_spec list 535c51f124SMoriah Waterland * z_running_in_global_zone - Determine if running in the "global" zone 545c51f124SMoriah Waterland * z_set_output_functions - Link program specific output functions 555c51f124SMoriah Waterland * z_set_zone_root - Set root for zones library operations 565c51f124SMoriah Waterland * z_set_zone_spec - Set list of zones on which actions will be performed 575c51f124SMoriah Waterland * z_umount_lz_mount - Unmount directory mounted with z_mount_in_lz 585c51f124SMoriah Waterland * z_unlock_this_zone - unlock this zone 595c51f124SMoriah Waterland * z_unlock_zones - unlock specified zones 605c51f124SMoriah Waterland * z_verify_zone_spec - Verify list of zones on which actions will be performed 615c51f124SMoriah Waterland * z_zlist_change_zone_state - Change the current state of the specified zone 625c51f124SMoriah Waterland * z_zlist_get_current_state - Determine the current kernel state of the 635c51f124SMoriah Waterland * specified zone 645c51f124SMoriah Waterland * z_zlist_get_original_state - Return the original kernal state of the 655c51f124SMoriah Waterland * specified zone 665c51f124SMoriah Waterland * z_zlist_get_scratch - Determine name of scratch zone 675c51f124SMoriah Waterland * z_zlist_get_zonename - Determine name of specified zone 685c51f124SMoriah Waterland * z_zlist_get_zonepath - Determine zonepath of specified zone 695c51f124SMoriah Waterland * z_zlist_restore_zone_state - Return the zone to the state it was originally 705c51f124SMoriah Waterland * in 715c51f124SMoriah Waterland * z_zone_exec - Execute a Unix command in a specified zone and return results 725c51f124SMoriah Waterland * z_zones_are_implemented - Determine if any zone operations can be performed 735c51f124SMoriah Waterland * z_is_zone_branded - determine if zone has a non-native brand 745c51f124SMoriah Waterland * z_is_zone_brand_in_list - determine if the zone's brand matches the 755c51f124SMoriah Waterland * brand list passed in. 765c51f124SMoriah Waterland * z_brands_are_implemented - determine if branded zones are implemented on 775c51f124SMoriah Waterland * this system 785c51f124SMoriah Waterland */ 795c51f124SMoriah Waterland 805c51f124SMoriah Waterland /* 815c51f124SMoriah Waterland * System includes 825c51f124SMoriah Waterland */ 835c51f124SMoriah Waterland 845c51f124SMoriah Waterland #include <stdio.h> 855c51f124SMoriah Waterland #include <stdlib.h> 865c51f124SMoriah Waterland #include <unistd.h> 875c51f124SMoriah Waterland #include <fcntl.h> 885c51f124SMoriah Waterland #include <ctype.h> 895c51f124SMoriah Waterland #include <sys/types.h> 905c51f124SMoriah Waterland #include <sys/param.h> 915c51f124SMoriah Waterland #include <sys/sysmacros.h> 925c51f124SMoriah Waterland #include <string.h> 935c51f124SMoriah Waterland #include <strings.h> 945c51f124SMoriah Waterland #include <sys/stat.h> 955c51f124SMoriah Waterland #include <stdarg.h> 965c51f124SMoriah Waterland #include <limits.h> 975c51f124SMoriah Waterland #include <errno.h> 985c51f124SMoriah Waterland #include <time.h> 995c51f124SMoriah Waterland #include <signal.h> 1005c51f124SMoriah Waterland #include <stropts.h> 1015c51f124SMoriah Waterland #include <wait.h> 1025c51f124SMoriah Waterland #include <zone.h> 1035c51f124SMoriah Waterland #include <sys/brand.h> 1045c51f124SMoriah Waterland #include <libintl.h> 1055c51f124SMoriah Waterland #include <locale.h> 1065c51f124SMoriah Waterland #include <libzonecfg.h> 1075c51f124SMoriah Waterland #include <libcontract.h> 1085c51f124SMoriah Waterland #include <sys/contract/process.h> 1095c51f124SMoriah Waterland #include <sys/ctfs.h> 1105c51f124SMoriah Waterland #include <assert.h> 1115c51f124SMoriah Waterland #include <dlfcn.h> 1125c51f124SMoriah Waterland #include <link.h> 1135c51f124SMoriah Waterland #include <time.h> 1145c51f124SMoriah Waterland 1155c51f124SMoriah Waterland /* 1165c51f124SMoriah Waterland * local includes 1175c51f124SMoriah Waterland */ 1185c51f124SMoriah Waterland 1195c51f124SMoriah Waterland /* 1205c51f124SMoriah Waterland * When _INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA is defined, 1215c51f124SMoriah Waterland * instzones_lib.h will define the z_global_data structure. 1225c51f124SMoriah Waterland * Otherwise an extern to the structure is inserted. 1235c51f124SMoriah Waterland */ 1245c51f124SMoriah Waterland 1255c51f124SMoriah Waterland #define _INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA 1265c51f124SMoriah Waterland #include "instzones_lib.h" 1275c51f124SMoriah Waterland #include "zones_strings.h" 1285c51f124SMoriah Waterland 1295c51f124SMoriah Waterland /* 1305c51f124SMoriah Waterland * Private structures 1315c51f124SMoriah Waterland */ 1325c51f124SMoriah Waterland 1335c51f124SMoriah Waterland #define CLUSTER_BRAND_NAME "cluster" 1345c51f124SMoriah Waterland 1355c51f124SMoriah Waterland /* maximum number of arguments to exec() call */ 1365c51f124SMoriah Waterland 1375c51f124SMoriah Waterland #define UUID_FORMAT "%02d%02d%02d%03d-%02d%02d%02d%d-%016llx" 1385c51f124SMoriah Waterland 1395c51f124SMoriah Waterland /* 1405c51f124SMoriah Waterland * Library Function Prototypes 1415c51f124SMoriah Waterland */ 1425c51f124SMoriah Waterland 1435c51f124SMoriah Waterland #define streq(a, b) (strcmp((a), (b)) == 0) 1445c51f124SMoriah Waterland 1455c51f124SMoriah Waterland /* 1465c51f124SMoriah Waterland * Local Function Prototypes 1475c51f124SMoriah Waterland */ 1485c51f124SMoriah Waterland 1495c51f124SMoriah Waterland /* 1505c51f124SMoriah Waterland * global internal (private) declarations 1515c51f124SMoriah Waterland */ 1525c51f124SMoriah Waterland 1535c51f124SMoriah Waterland /* 1545c51f124SMoriah Waterland * ***************************************************************************** 1555c51f124SMoriah Waterland * global external (public) functions 1565c51f124SMoriah Waterland * ***************************************************************************** 1575c51f124SMoriah Waterland */ 1585c51f124SMoriah Waterland 1595c51f124SMoriah Waterland /* 1605c51f124SMoriah Waterland * Name: z_create_zone_admin_file 1615c51f124SMoriah Waterland * Description: Given a location to create the file, and optionally an existing 1625c51f124SMoriah Waterland * administration file, generate an administration file that 1635c51f124SMoriah Waterland * can be used to perform "non-interactive" operations in a 1645c51f124SMoriah Waterland * non-global zone. 1655c51f124SMoriah Waterland * Arguments: a_zoneAdminFilename - pointer to string representing the 1665c51f124SMoriah Waterland * full path of zone admin file to create 1675c51f124SMoriah Waterland * a_userAdminFilename - pointer to string representing the path 1685c51f124SMoriah Waterland * to an existing "user" administration file - the 1695c51f124SMoriah Waterland * administration file created will contain the 1705c51f124SMoriah Waterland * settings contained in this file, modified as 1715c51f124SMoriah Waterland * appropriate to supress any interaction; 1725c51f124SMoriah Waterland * If this is == NULL then the administration file 1735c51f124SMoriah Waterland * created will not contain any extra settings 1745c51f124SMoriah Waterland * Returns: boolean_t 1755c51f124SMoriah Waterland * == B_TRUE - admin file created 1765c51f124SMoriah Waterland * == B_FALSE - failed to create admin file 1775c51f124SMoriah Waterland */ 1785c51f124SMoriah Waterland 1795c51f124SMoriah Waterland boolean_t 1805c51f124SMoriah Waterland z_create_zone_admin_file(char *a_zoneAdminFilename, char *a_userAdminFilename) 1815c51f124SMoriah Waterland { 1825c51f124SMoriah Waterland FILE *zFp; 1835c51f124SMoriah Waterland FILE *uFp = (FILE *)NULL; 1845c51f124SMoriah Waterland 1855c51f124SMoriah Waterland /* entry assertions */ 1865c51f124SMoriah Waterland 1875c51f124SMoriah Waterland assert(a_zoneAdminFilename != NULL); 1885c51f124SMoriah Waterland assert(*a_zoneAdminFilename != '\0'); 1895c51f124SMoriah Waterland 1905c51f124SMoriah Waterland /* create temporary zone admin file */ 1915c51f124SMoriah Waterland 1925c51f124SMoriah Waterland zFp = fopen(a_zoneAdminFilename, "w"); 1935c51f124SMoriah Waterland if (zFp == (FILE *)NULL) { 1945c51f124SMoriah Waterland return (B_FALSE); 1955c51f124SMoriah Waterland } 1965c51f124SMoriah Waterland 1975c51f124SMoriah Waterland /* open user admin file if specified */ 1985c51f124SMoriah Waterland 1995c51f124SMoriah Waterland if (a_userAdminFilename != (char *)NULL) { 2005c51f124SMoriah Waterland uFp = fopen(a_userAdminFilename, "r"); 2015c51f124SMoriah Waterland } 2025c51f124SMoriah Waterland 2035c51f124SMoriah Waterland /* create default admin file for zone pkg ops if no user admin file */ 2045c51f124SMoriah Waterland 2055c51f124SMoriah Waterland if (uFp == (FILE *)NULL) { 2065c51f124SMoriah Waterland /* create default admin file */ 2075c51f124SMoriah Waterland (void) fprintf(zFp, "action=nocheck\nauthentication=nocheck\n" 2085c51f124SMoriah Waterland "basedir=default\nconflict=nocheck\nidepend=nocheck\n" 2095c51f124SMoriah Waterland "instance=unique\npartial=nocheck\nrdepend=nocheck\n" 2105c51f124SMoriah Waterland "runlevel=nocheck\nsetuid=nocheck\nspace=nocheck\n" 2115c51f124SMoriah Waterland "mail=\n"); 2125c51f124SMoriah Waterland } else for (;;) { 2135c51f124SMoriah Waterland /* copy user admin file substitute/change appropriate entries */ 2145c51f124SMoriah Waterland char buf[LINE_MAX+1]; 2155c51f124SMoriah Waterland char *p; 2165c51f124SMoriah Waterland 2175c51f124SMoriah Waterland /* read next line of user admin file */ 2185c51f124SMoriah Waterland 2195c51f124SMoriah Waterland p = fgets(buf, sizeof (buf), uFp); 2205c51f124SMoriah Waterland if (p == (char *)NULL) { 2215c51f124SMoriah Waterland (void) fclose(uFp); 2225c51f124SMoriah Waterland break; 2235c51f124SMoriah Waterland } 2245c51f124SMoriah Waterland 2255c51f124SMoriah Waterland /* modify / replace / accept as appropriate */ 2265c51f124SMoriah Waterland 2275c51f124SMoriah Waterland if (strncmp(buf, "instance=quit", 13) == 0) { 2285c51f124SMoriah Waterland (void) fprintf(zFp, "%s", "instance=unique\n"); 2295c51f124SMoriah Waterland /*LINTED*/ 2305c51f124SMoriah Waterland } else if (strncmp(buf, "keystore=", 9) == 0) { 2315c51f124SMoriah Waterland } else if (strncmp(buf, "action=", 7) == 0) { 2325c51f124SMoriah Waterland (void) fprintf(zFp, "action=nocheck\n"); 2335c51f124SMoriah Waterland } else if (strncmp(buf, "authentication=", 15) == 0) { 2345c51f124SMoriah Waterland (void) fprintf(zFp, "authentication=nocheck\n"); 2355c51f124SMoriah Waterland } else if (strncmp(buf, "conflict=", 9) == 0) { 2365c51f124SMoriah Waterland (void) fprintf(zFp, "conflict=nocheck\n"); 2375c51f124SMoriah Waterland } else if (strncmp(buf, "idepend=", 8) == 0) { 2385c51f124SMoriah Waterland (void) fprintf(zFp, "idepend=nocheck\n"); 2395c51f124SMoriah Waterland } else if (strncmp(buf, "mail=", 5) == 0) { 2405c51f124SMoriah Waterland (void) fprintf(zFp, "mail=\n"); 2415c51f124SMoriah Waterland } else if (strncmp(buf, "partial=", 8) == 0) { 2425c51f124SMoriah Waterland (void) fprintf(zFp, "partial=nocheck\n"); 2435c51f124SMoriah Waterland } else if (strncmp(buf, "rdepend=", 8) == 0) { 2445c51f124SMoriah Waterland (void) fprintf(zFp, "rdepend=nocheck\n"); 2455c51f124SMoriah Waterland } else if (strncmp(buf, "runlevel=", 9) == 0) { 2465c51f124SMoriah Waterland (void) fprintf(zFp, "runlevel=nocheck\n"); 2475c51f124SMoriah Waterland } else if (strncmp(buf, "setuid=", 7) == 0) { 2485c51f124SMoriah Waterland (void) fprintf(zFp, "setuid=nocheck\n"); 2495c51f124SMoriah Waterland } else if (strncmp(buf, "space=", 6) == 0) { 2505c51f124SMoriah Waterland (void) fprintf(zFp, "space=nocheck\n"); 2515c51f124SMoriah Waterland } else { 2525c51f124SMoriah Waterland (void) fprintf(zFp, "%s", buf); 2535c51f124SMoriah Waterland } 2545c51f124SMoriah Waterland } 2555c51f124SMoriah Waterland 2565c51f124SMoriah Waterland /* close admin file and return success */ 2575c51f124SMoriah Waterland 2585c51f124SMoriah Waterland (void) fclose(zFp); 2595c51f124SMoriah Waterland return (B_TRUE); 2605c51f124SMoriah Waterland } 2615c51f124SMoriah Waterland 2625c51f124SMoriah Waterland /* 2635c51f124SMoriah Waterland * Name: z_brands_are_implemented 2645c51f124SMoriah Waterland * Description: Determine if any branded zones may be present 2655c51f124SMoriah Waterland * Arguments: void 2665c51f124SMoriah Waterland * Returns: boolean_t 2675c51f124SMoriah Waterland * == B_TRUE - branded zones are supported 2685c51f124SMoriah Waterland * == B_FALSE - branded zones are not supported 2695c51f124SMoriah Waterland */ 2705c51f124SMoriah Waterland 2715c51f124SMoriah Waterland boolean_t 2725c51f124SMoriah Waterland z_brands_are_implemented(void) 2735c51f124SMoriah Waterland { 2745c51f124SMoriah Waterland static boolean_t _brandsImplementedDetermined = B_FALSE; 2755c51f124SMoriah Waterland static boolean_t _brandsAreImplemented = B_FALSE; 2765c51f124SMoriah Waterland 2775c51f124SMoriah Waterland /* if availability has not been determined, cache it now */ 2785c51f124SMoriah Waterland 2795c51f124SMoriah Waterland if (!_brandsImplementedDetermined) { 2805c51f124SMoriah Waterland _brandsImplementedDetermined = B_TRUE; 2815c51f124SMoriah Waterland _brandsAreImplemented = _z_brands_are_implemented(); 2825c51f124SMoriah Waterland if (_brandsAreImplemented) { 2835c51f124SMoriah Waterland _z_echoDebug(DBG_BRANDS_ARE_IMPLEMENTED); 2845c51f124SMoriah Waterland } else { 2855c51f124SMoriah Waterland _z_echoDebug(DBG_BRANDS_NOT_IMPLEMENTED); 2865c51f124SMoriah Waterland } 2875c51f124SMoriah Waterland } 2885c51f124SMoriah Waterland 2895c51f124SMoriah Waterland /* return cached answer */ 2905c51f124SMoriah Waterland 2915c51f124SMoriah Waterland return (_brandsAreImplemented); 2925c51f124SMoriah Waterland } 2935c51f124SMoriah Waterland 2945c51f124SMoriah Waterland /* 2955c51f124SMoriah Waterland * Name: z_free_zone_list 2965c51f124SMoriah Waterland * Description: free contents of zoneList_t object 2975c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object to free 2985c51f124SMoriah Waterland * Returns: void 2995c51f124SMoriah Waterland */ 3005c51f124SMoriah Waterland 3015c51f124SMoriah Waterland void 3025c51f124SMoriah Waterland z_free_zone_list(zoneList_t a_zlst) 3035c51f124SMoriah Waterland { 3045c51f124SMoriah Waterland int numzones; 3055c51f124SMoriah Waterland 3065c51f124SMoriah Waterland /* ignore empty list */ 3075c51f124SMoriah Waterland 3085c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 3095c51f124SMoriah Waterland return; 3105c51f124SMoriah Waterland } 3115c51f124SMoriah Waterland 3125c51f124SMoriah Waterland /* free each entry in the zone list */ 3135c51f124SMoriah Waterland 3145c51f124SMoriah Waterland for (numzones = 0; a_zlst[numzones]._zlName != (char *)NULL; 3155c51f124SMoriah Waterland numzones++) { 3165c51f124SMoriah Waterland zoneListElement_t *zelm = &a_zlst[numzones]; 3175c51f124SMoriah Waterland 3185c51f124SMoriah Waterland /* free zone name string */ 3195c51f124SMoriah Waterland 3205c51f124SMoriah Waterland free(zelm->_zlName); 3215c51f124SMoriah Waterland 3225c51f124SMoriah Waterland /* free zonepath string */ 3235c51f124SMoriah Waterland 3245c51f124SMoriah Waterland if (zelm->_zlPath != (char *)NULL) { 3255c51f124SMoriah Waterland free(zelm->_zlPath); 3265c51f124SMoriah Waterland } 3275c51f124SMoriah Waterland 3285c51f124SMoriah Waterland } 3295c51f124SMoriah Waterland 3305c51f124SMoriah Waterland /* free handle to the list */ 3315c51f124SMoriah Waterland 3325c51f124SMoriah Waterland free(a_zlst); 3335c51f124SMoriah Waterland } 3345c51f124SMoriah Waterland 3355c51f124SMoriah Waterland /* 3365c51f124SMoriah Waterland * Name: z_get_nonglobal_zone_list 3375c51f124SMoriah Waterland * Description: return zoneList_t object describing all non-global 3385c51f124SMoriah Waterland * native zones - branded zones are not included in list 3395c51f124SMoriah Waterland * Arguments: None. 3405c51f124SMoriah Waterland * Returns: zoneList_t 3415c51f124SMoriah Waterland * == NULL - error, list could not be generated 3425c51f124SMoriah Waterland * != NULL - success, list returned 3435c51f124SMoriah Waterland * NOTE: Any zoneList_t returned is placed in new storage for the 3445c51f124SMoriah Waterland * calling function. The caller must use 'z_free_zone_list' to 3455c51f124SMoriah Waterland * dispose of the storage once the list is no longer needed. 3465c51f124SMoriah Waterland */ 3475c51f124SMoriah Waterland 3485c51f124SMoriah Waterland zoneList_t 3495c51f124SMoriah Waterland z_get_nonglobal_zone_list(void) 3505c51f124SMoriah Waterland { 3515c51f124SMoriah Waterland zoneList_t zones; 3525c51f124SMoriah Waterland zoneBrandList_t *brands = NULL; 3535c51f124SMoriah Waterland 3545c51f124SMoriah Waterland if ((brands = z_make_brand_list("native cluster", " ")) == NULL) 3555c51f124SMoriah Waterland return (NULL); 3565c51f124SMoriah Waterland 3575c51f124SMoriah Waterland zones = z_get_nonglobal_zone_list_by_brand(brands); 3585c51f124SMoriah Waterland 3595c51f124SMoriah Waterland z_free_brand_list(brands); 3605c51f124SMoriah Waterland 3615c51f124SMoriah Waterland return (zones); 3625c51f124SMoriah Waterland } 3635c51f124SMoriah Waterland 3645c51f124SMoriah Waterland /* 3655c51f124SMoriah Waterland * Name: z_free_brand_list 3665c51f124SMoriah Waterland * Description: Free contents of zoneBrandList_t object 3675c51f124SMoriah Waterland * Arguments: brands - pointer to zoneBrandList_t object to free 3685c51f124SMoriah Waterland * Returns: void 3695c51f124SMoriah Waterland */ 3705c51f124SMoriah Waterland void 3715c51f124SMoriah Waterland z_free_brand_list(zoneBrandList_t *brands) 3725c51f124SMoriah Waterland { 3735c51f124SMoriah Waterland while (brands != NULL) { 3745c51f124SMoriah Waterland zoneBrandList_t *temp = brands; 3755c51f124SMoriah Waterland free(brands->string_ptr); 3765c51f124SMoriah Waterland brands = brands->next; 3775c51f124SMoriah Waterland free(temp); 3785c51f124SMoriah Waterland } 3795c51f124SMoriah Waterland } 3805c51f124SMoriah Waterland 3815c51f124SMoriah Waterland /* 3825c51f124SMoriah Waterland * Name: z_make_brand_list 3835c51f124SMoriah Waterland * Description: Given a string with a list of brand name delimited by 3845c51f124SMoriah Waterland * the delimeter passed in, build a zoneBrandList_t structure 3855c51f124SMoriah Waterland * with the list of brand names and return it to the caller. 3865c51f124SMoriah Waterland * Arguments: 3875c51f124SMoriah Waterland * brands - const char pointer to string list of brand names 3885c51f124SMoriah Waterland * delim - const char pointer to string representing the 3895c51f124SMoriah Waterland * delimeter for brands string. 3905c51f124SMoriah Waterland * Returns: zoneBrandList_t * 3915c51f124SMoriah Waterland * == NULL - error, list could not be generated 3925c51f124SMoriah Waterland * != NULL - success, list returned 3935c51f124SMoriah Waterland * NOTE: Any zoneBrandList_t returned is placed in new storage for the 3945c51f124SMoriah Waterland * calling function. The caller must use 'z_free_brand_list' to 3955c51f124SMoriah Waterland * dispose of the storage once the list is no longer needed. 3965c51f124SMoriah Waterland */ 3975c51f124SMoriah Waterland zoneBrandList_t * 3985c51f124SMoriah Waterland z_make_brand_list(const char *brands, const char *delim) 3995c51f124SMoriah Waterland { 4005c51f124SMoriah Waterland zoneBrandList_t *brand = NULL, *head = NULL; 4015c51f124SMoriah Waterland char *blist = NULL; 4025c51f124SMoriah Waterland char *str = NULL; 4035c51f124SMoriah Waterland 4045c51f124SMoriah Waterland if ((blist = strdup(brands)) == NULL) 4055c51f124SMoriah Waterland return (NULL); 4065c51f124SMoriah Waterland 4075c51f124SMoriah Waterland if ((str = strtok(blist, delim)) != NULL) { 4085c51f124SMoriah Waterland if ((brand = (zoneBrandList_t *) 4095c51f124SMoriah Waterland malloc(sizeof (struct _zoneBrandList))) == NULL) { 4105c51f124SMoriah Waterland return (NULL); 4115c51f124SMoriah Waterland } 4125c51f124SMoriah Waterland 4135c51f124SMoriah Waterland head = brand; 4145c51f124SMoriah Waterland brand->string_ptr = strdup(str); 4155c51f124SMoriah Waterland brand->next = NULL; 4165c51f124SMoriah Waterland 4175c51f124SMoriah Waterland while ((str = strtok(NULL, delim)) != NULL) { 4185c51f124SMoriah Waterland if ((brand->next = (zoneBrandList_t *) 4195c51f124SMoriah Waterland malloc(sizeof (struct _zoneBrandList))) == NULL) { 4205c51f124SMoriah Waterland return (NULL); 4215c51f124SMoriah Waterland } 4225c51f124SMoriah Waterland 4235c51f124SMoriah Waterland brand = brand->next; 4245c51f124SMoriah Waterland brand->string_ptr = strdup(str); 4255c51f124SMoriah Waterland brand->next = NULL; 4265c51f124SMoriah Waterland } 4275c51f124SMoriah Waterland } 4285c51f124SMoriah Waterland 4295c51f124SMoriah Waterland free(blist); 4305c51f124SMoriah Waterland return (head); 4315c51f124SMoriah Waterland } 4325c51f124SMoriah Waterland 4335c51f124SMoriah Waterland /* 4345c51f124SMoriah Waterland * Name: z_get_nonglobal_zone_list_by_brand 4355c51f124SMoriah Waterland * Description: return zoneList_t object describing all non-global 4365c51f124SMoriah Waterland * zones matching the list of brands passed in. 4375c51f124SMoriah Waterland * Arguments: brands - The list of zone brands to look for. 4385c51f124SMoriah Waterland * Returns: zoneList_t 4395c51f124SMoriah Waterland * == NULL - error, list could not be generated 4405c51f124SMoriah Waterland * != NULL - success, list returned 4415c51f124SMoriah Waterland * NOTE: Any zoneList_t returned is placed in new storage for the 4425c51f124SMoriah Waterland * calling function. The caller must use 'z_free_zone_list' to 4435c51f124SMoriah Waterland * dispose of the storage once the list is no longer needed. 4445c51f124SMoriah Waterland */ 4455c51f124SMoriah Waterland zoneList_t 4465c51f124SMoriah Waterland z_get_nonglobal_zone_list_by_brand(zoneBrandList_t *brands) 4475c51f124SMoriah Waterland { 4485c51f124SMoriah Waterland FILE *zoneIndexFP; 4495c51f124SMoriah Waterland int numzones = 0; 4505c51f124SMoriah Waterland struct zoneent *ze; 4515c51f124SMoriah Waterland zoneList_t zlst = NULL; 4525c51f124SMoriah Waterland FILE *mapFP; 4535c51f124SMoriah Waterland char zonename[ZONENAME_MAX]; 4545c51f124SMoriah Waterland zone_spec_t *zent; 4555c51f124SMoriah Waterland 4565c51f124SMoriah Waterland /* if zones are not implemented, return empty list */ 4575c51f124SMoriah Waterland 4585c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 4595c51f124SMoriah Waterland return ((zoneList_t)NULL); 4605c51f124SMoriah Waterland } 4615c51f124SMoriah Waterland 4625c51f124SMoriah Waterland /* 4635c51f124SMoriah Waterland * Open the zone index file. Note that getzoneent_private() handles 4645c51f124SMoriah Waterland * NULL. 4655c51f124SMoriah Waterland */ 4665c51f124SMoriah Waterland zoneIndexFP = setzoneent(); 4675c51f124SMoriah Waterland 4685c51f124SMoriah Waterland mapFP = zonecfg_open_scratch("", B_FALSE); 4695c51f124SMoriah Waterland 4705c51f124SMoriah Waterland /* index file open; scan all zones; see if any are at least installed */ 4715c51f124SMoriah Waterland 4725c51f124SMoriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) { 4735c51f124SMoriah Waterland zone_state_t st; 4745c51f124SMoriah Waterland 4755c51f124SMoriah Waterland /* skip the global zone */ 4765c51f124SMoriah Waterland 4775c51f124SMoriah Waterland if (strcmp(ze->zone_name, GLOBAL_ZONENAME) == 0) { 4785c51f124SMoriah Waterland free(ze); 4795c51f124SMoriah Waterland continue; 4805c51f124SMoriah Waterland } 4815c51f124SMoriah Waterland 4825c51f124SMoriah Waterland /* 4835c51f124SMoriah Waterland * skip any zones with brands not on the brand list 4845c51f124SMoriah Waterland */ 4855c51f124SMoriah Waterland if (!z_is_zone_brand_in_list(ze->zone_name, brands)) { 4865c51f124SMoriah Waterland free(ze); 4875c51f124SMoriah Waterland continue; 4885c51f124SMoriah Waterland } 4895c51f124SMoriah Waterland 4905c51f124SMoriah Waterland /* 4915c51f124SMoriah Waterland * If the user specified an explicit zone list, then ignore any 4925c51f124SMoriah Waterland * zones that aren't on that list. 4935c51f124SMoriah Waterland */ 4945c51f124SMoriah Waterland if ((zent = _z_global_data._zone_spec) != NULL) { 4955c51f124SMoriah Waterland while (zent != NULL) { 4965c51f124SMoriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0) 4975c51f124SMoriah Waterland break; 4985c51f124SMoriah Waterland zent = zent->zl_next; 4995c51f124SMoriah Waterland } 5005c51f124SMoriah Waterland if (zent == NULL) { 5015c51f124SMoriah Waterland free(ze); 5025c51f124SMoriah Waterland continue; 5035c51f124SMoriah Waterland } 5045c51f124SMoriah Waterland } 5055c51f124SMoriah Waterland 5065c51f124SMoriah Waterland /* non-global zone: create entry for this zone */ 5075c51f124SMoriah Waterland 5085c51f124SMoriah Waterland if (numzones == 0) { 5095c51f124SMoriah Waterland zlst = (zoneList_t)_z_calloc( 5105c51f124SMoriah Waterland sizeof (zoneListElement_t)*2); 5115c51f124SMoriah Waterland } else { 5125c51f124SMoriah Waterland zlst = (zoneList_t)_z_realloc(zlst, 5135c51f124SMoriah Waterland sizeof (zoneListElement_t)*(numzones+2)); 5145c51f124SMoriah Waterland (void) memset(&zlst[numzones], 0L, 5155c51f124SMoriah Waterland sizeof (zoneListElement_t)*2); 5165c51f124SMoriah Waterland } 5175c51f124SMoriah Waterland 5185c51f124SMoriah Waterland /* 5195c51f124SMoriah Waterland * remember the zone name, zonepath and the current 5205c51f124SMoriah Waterland * zone state of the zone. 5215c51f124SMoriah Waterland */ 5225c51f124SMoriah Waterland zlst[numzones]._zlName = _z_strdup(ze->zone_name); 5235c51f124SMoriah Waterland zlst[numzones]._zlPath = _z_strdup(ze->zone_path); 5245c51f124SMoriah Waterland zlst[numzones]._zlOrigInstallState = ze->zone_state; 5255c51f124SMoriah Waterland zlst[numzones]._zlCurrInstallState = ze->zone_state; 5265c51f124SMoriah Waterland 5275c51f124SMoriah Waterland /* get the zone kernel status */ 5285c51f124SMoriah Waterland 5295c51f124SMoriah Waterland if (zone_get_state(ze->zone_name, &st) != Z_OK) { 5305c51f124SMoriah Waterland st = ZONE_STATE_INCOMPLETE; 5315c51f124SMoriah Waterland } 5325c51f124SMoriah Waterland 5335c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_NGZ_LIST_STATES, 5345c51f124SMoriah Waterland ze->zone_name, ze->zone_state, st); 5355c51f124SMoriah Waterland 5365c51f124SMoriah Waterland /* 5375c51f124SMoriah Waterland * For a scratch zone, we need to know the kernel zone name. 5385c51f124SMoriah Waterland */ 5395c51f124SMoriah Waterland if (zonecfg_in_alt_root() && mapFP != NULL && 5405c51f124SMoriah Waterland zonecfg_find_scratch(mapFP, ze->zone_name, 5415c51f124SMoriah Waterland zonecfg_get_root(), zonename, sizeof (zonename)) != -1) { 5425c51f124SMoriah Waterland free(zlst[numzones]._zlScratchName); 5435c51f124SMoriah Waterland zlst[numzones]._zlScratchName = _z_strdup(zonename); 5445c51f124SMoriah Waterland } 5455c51f124SMoriah Waterland 5465c51f124SMoriah Waterland /* 5475c51f124SMoriah Waterland * remember the current kernel status of the zone. 5485c51f124SMoriah Waterland */ 5495c51f124SMoriah Waterland 5505c51f124SMoriah Waterland zlst[numzones]._zlOrigKernelStatus = st; 5515c51f124SMoriah Waterland zlst[numzones]._zlCurrKernelStatus = st; 5525c51f124SMoriah Waterland 5535c51f124SMoriah Waterland numzones++; 5545c51f124SMoriah Waterland free(ze); 5555c51f124SMoriah Waterland } 5565c51f124SMoriah Waterland 5575c51f124SMoriah Waterland /* close the index file */ 5585c51f124SMoriah Waterland endzoneent(zoneIndexFP); 5595c51f124SMoriah Waterland 5605c51f124SMoriah Waterland if (mapFP != NULL) 5615c51f124SMoriah Waterland zonecfg_close_scratch(mapFP); 5625c51f124SMoriah Waterland 5635c51f124SMoriah Waterland /* return generated list */ 5645c51f124SMoriah Waterland 5655c51f124SMoriah Waterland return (zlst); 5665c51f124SMoriah Waterland } 5675c51f124SMoriah Waterland 5685c51f124SMoriah Waterland /* 5695c51f124SMoriah Waterland * Name: z_get_zonename 5705c51f124SMoriah Waterland * Description: return the name of the current zone 5715c51f124SMoriah Waterland * Arguments: void 5725c51f124SMoriah Waterland * Returns: char * 5735c51f124SMoriah Waterland * - pointer to string representing the name of the current 5745c51f124SMoriah Waterland * zone 5755c51f124SMoriah Waterland * NOTE: Any string returned is placed in new storage for the 5765c51f124SMoriah Waterland * calling function. The caller must use 'Free' to dispose 5775c51f124SMoriah Waterland * of the storage once the string is no longer needed. 5785c51f124SMoriah Waterland */ 5795c51f124SMoriah Waterland 5805c51f124SMoriah Waterland char * 5815c51f124SMoriah Waterland z_get_zonename(void) 5825c51f124SMoriah Waterland { 5835c51f124SMoriah Waterland ssize_t zonenameLen; 5845c51f124SMoriah Waterland char zonename[ZONENAME_MAX]; 5855c51f124SMoriah Waterland zoneid_t zoneid = (zoneid_t)-1; 5865c51f124SMoriah Waterland 5875c51f124SMoriah Waterland /* if zones are not implemented, return "" */ 5885c51f124SMoriah Waterland 5895c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 5905c51f124SMoriah Waterland return (_z_strdup("")); 5915c51f124SMoriah Waterland } 5925c51f124SMoriah Waterland 5935c51f124SMoriah Waterland /* get the zone i.d. of the current zone */ 5945c51f124SMoriah Waterland 5955c51f124SMoriah Waterland zoneid = getzoneid(); 5965c51f124SMoriah Waterland 5975c51f124SMoriah Waterland /* get the name of the current zone */ 5985c51f124SMoriah Waterland 5995c51f124SMoriah Waterland zonenameLen = getzonenamebyid(zoneid, zonename, sizeof (zonename)); 6005c51f124SMoriah Waterland 6015c51f124SMoriah Waterland /* return "" if could not get zonename */ 6025c51f124SMoriah Waterland 6035c51f124SMoriah Waterland if (zonenameLen < 1) { 6045c51f124SMoriah Waterland return (_z_strdup("")); 6055c51f124SMoriah Waterland } 6065c51f124SMoriah Waterland 6075c51f124SMoriah Waterland return (_z_strdup(zonename)); 6085c51f124SMoriah Waterland } 6095c51f124SMoriah Waterland 6105c51f124SMoriah Waterland /* 6115c51f124SMoriah Waterland * Name: z_global_only 6125c51f124SMoriah Waterland * Description: Determine if the global zone is only zone on the spec list. 6135c51f124SMoriah Waterland * Arguments: None 6145c51f124SMoriah Waterland * Returns: B_TRUE if global zone is the only zone on the list, 6155c51f124SMoriah Waterland * B_FALSE otherwise. 6165c51f124SMoriah Waterland */ 6175c51f124SMoriah Waterland 6185c51f124SMoriah Waterland boolean_t 6195c51f124SMoriah Waterland z_global_only(void) 6205c51f124SMoriah Waterland { 6215c51f124SMoriah Waterland /* return true if zones are not implemented - treate as global zone */ 6225c51f124SMoriah Waterland 6235c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 6245c51f124SMoriah Waterland return (B_TRUE); 6255c51f124SMoriah Waterland } 6265c51f124SMoriah Waterland 6275c51f124SMoriah Waterland /* return true if this is the global zone */ 6285c51f124SMoriah Waterland 6295c51f124SMoriah Waterland if (_z_global_data._zone_spec != NULL && 6305c51f124SMoriah Waterland _z_global_data._zone_spec->zl_next == NULL && 6315c51f124SMoriah Waterland strcmp(_z_global_data._zone_spec->zl_name, GLOBAL_ZONENAME) == 0) { 6325c51f124SMoriah Waterland return (B_TRUE); 6335c51f124SMoriah Waterland } 6345c51f124SMoriah Waterland 6355c51f124SMoriah Waterland /* return false - not the global zone */ 6365c51f124SMoriah Waterland 6375c51f124SMoriah Waterland return (B_FALSE); 6385c51f124SMoriah Waterland } 6395c51f124SMoriah Waterland 6405c51f124SMoriah Waterland /* 6415c51f124SMoriah Waterland * Name: z_lock_this_zone 6425c51f124SMoriah Waterland * Description: lock this zone 6435c51f124SMoriah Waterland * Arguments: a_lflags - [RO, *RO] - (ZLOCKS_T) 6445c51f124SMoriah Waterland * Flags indicating which locks to acquire 6455c51f124SMoriah Waterland * Returns: boolean_t 6465c51f124SMoriah Waterland * == B_TRUE - success specified locks acquired 6475c51f124SMoriah Waterland * == B_FALSE - failure specified locks not acquired 6485c51f124SMoriah Waterland * NOTE: the lock objects for "this zone" are maintained internally. 6495c51f124SMoriah Waterland */ 6505c51f124SMoriah Waterland 6515c51f124SMoriah Waterland boolean_t 6525c51f124SMoriah Waterland z_lock_this_zone(ZLOCKS_T a_lflags) 6535c51f124SMoriah Waterland { 6545c51f124SMoriah Waterland boolean_t b; 6555c51f124SMoriah Waterland char *zoneName; 6565c51f124SMoriah Waterland pid_t pid = (pid_t)0; 6575c51f124SMoriah Waterland 6585c51f124SMoriah Waterland /* entry assertions */ 6595c51f124SMoriah Waterland 6605c51f124SMoriah Waterland assert(a_lflags != ZLOCKS_NONE); 6615c51f124SMoriah Waterland 6625c51f124SMoriah Waterland /* entry debugging info */ 6635c51f124SMoriah Waterland 6645c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_LCK_THIS, a_lflags); 6655c51f124SMoriah Waterland 6665c51f124SMoriah Waterland zoneName = z_get_zonename(); 6675c51f124SMoriah Waterland pid = getpid(); 6685c51f124SMoriah Waterland 6695c51f124SMoriah Waterland /* lock zone administration */ 6705c51f124SMoriah Waterland 6715c51f124SMoriah Waterland if (a_lflags & ZLOCKS_ZONE_ADMIN) { 6725c51f124SMoriah Waterland b = _z_lock_zone_object(&_z_global_data._z_ObjectLocks, 6735c51f124SMoriah Waterland zoneName, LOBJ_ZONEADMIN, pid, 6745c51f124SMoriah Waterland MSG_ZONES_LCK_THIS_ZONEADM, 6755c51f124SMoriah Waterland ERR_ZONES_LCK_THIS_ZONEADM); 6765c51f124SMoriah Waterland if (!b) { 6775c51f124SMoriah Waterland (void) free(zoneName); 6785c51f124SMoriah Waterland return (B_FALSE); 6795c51f124SMoriah Waterland } 6805c51f124SMoriah Waterland } 6815c51f124SMoriah Waterland 6825c51f124SMoriah Waterland /* lock package administration always */ 6835c51f124SMoriah Waterland 6845c51f124SMoriah Waterland if (a_lflags & ZLOCKS_PKG_ADMIN) { 6855c51f124SMoriah Waterland b = _z_lock_zone_object(&_z_global_data._z_ObjectLocks, 6865c51f124SMoriah Waterland zoneName, LOBJ_PKGADMIN, pid, 6875c51f124SMoriah Waterland MSG_ZONES_LCK_THIS_PKGADM, 6885c51f124SMoriah Waterland ERR_ZONES_LCK_THIS_PKGADM); 6895c51f124SMoriah Waterland if (!b) { 6905c51f124SMoriah Waterland (void) z_unlock_this_zone(a_lflags); 6915c51f124SMoriah Waterland (void) free(zoneName); 6925c51f124SMoriah Waterland return (B_FALSE); 6935c51f124SMoriah Waterland } 6945c51f124SMoriah Waterland } 6955c51f124SMoriah Waterland 6965c51f124SMoriah Waterland /* lock patch administration always */ 6975c51f124SMoriah Waterland 6985c51f124SMoriah Waterland if (a_lflags & ZLOCKS_PATCH_ADMIN) { 6995c51f124SMoriah Waterland b = _z_lock_zone_object(&_z_global_data._z_ObjectLocks, 7005c51f124SMoriah Waterland zoneName, LOBJ_PATCHADMIN, pid, 7015c51f124SMoriah Waterland MSG_ZONES_LCK_THIS_PATCHADM, 7025c51f124SMoriah Waterland ERR_ZONES_LCK_THIS_PATCHADM); 7035c51f124SMoriah Waterland if (!b) { 7045c51f124SMoriah Waterland (void) z_unlock_this_zone(a_lflags); 7055c51f124SMoriah Waterland (void) free(zoneName); 7065c51f124SMoriah Waterland return (B_FALSE); 7075c51f124SMoriah Waterland } 7085c51f124SMoriah Waterland } 7095c51f124SMoriah Waterland 7105c51f124SMoriah Waterland (void) free(zoneName); 7115c51f124SMoriah Waterland 7125c51f124SMoriah Waterland return (B_TRUE); 7135c51f124SMoriah Waterland } 7145c51f124SMoriah Waterland 7155c51f124SMoriah Waterland /* 7165c51f124SMoriah Waterland * Name: z_lock_zones 7175c51f124SMoriah Waterland * Description: lock specified zones 7185c51f124SMoriah Waterland * Arguments: a_zlst - zoneList_t object describing zones to lock 7195c51f124SMoriah Waterland * a_lflags - [RO, *RO] - (ZLOCKS_T) 7205c51f124SMoriah Waterland * Flags indicating which locks to acquire 7215c51f124SMoriah Waterland * Returns: boolean_t 7225c51f124SMoriah Waterland * == B_TRUE - success, zones locked 7235c51f124SMoriah Waterland * == B_FALSE - failure, zones not locked 7245c51f124SMoriah Waterland */ 7255c51f124SMoriah Waterland 7265c51f124SMoriah Waterland boolean_t 7275c51f124SMoriah Waterland z_lock_zones(zoneList_t a_zlst, ZLOCKS_T a_lflags) 7285c51f124SMoriah Waterland { 7295c51f124SMoriah Waterland boolean_t b; 7305c51f124SMoriah Waterland int i; 7315c51f124SMoriah Waterland 7325c51f124SMoriah Waterland /* entry assertions */ 7335c51f124SMoriah Waterland 7345c51f124SMoriah Waterland assert(a_lflags != ZLOCKS_NONE); 7355c51f124SMoriah Waterland 7365c51f124SMoriah Waterland /* entry debugging info */ 7375c51f124SMoriah Waterland 7385c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES, a_lflags); 7395c51f124SMoriah Waterland 7405c51f124SMoriah Waterland /* if zones are not implemented, return TRUE */ 7415c51f124SMoriah Waterland 7425c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 7435c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_UNIMP); 7445c51f124SMoriah Waterland return (B_TRUE); 7455c51f124SMoriah Waterland } 7465c51f124SMoriah Waterland 7475c51f124SMoriah Waterland /* lock this zone first before locking other zones */ 7485c51f124SMoriah Waterland 7495c51f124SMoriah Waterland b = z_lock_this_zone(a_lflags); 7505c51f124SMoriah Waterland if (b == B_FALSE) { 7515c51f124SMoriah Waterland return (b); 7525c51f124SMoriah Waterland } 7535c51f124SMoriah Waterland 7545c51f124SMoriah Waterland /* ignore empty list */ 7555c51f124SMoriah Waterland 7565c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 7575c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_NOZONES); 7585c51f124SMoriah Waterland return (B_FALSE); 7595c51f124SMoriah Waterland } 7605c51f124SMoriah Waterland 7615c51f124SMoriah Waterland /* zones exist */ 7625c51f124SMoriah Waterland 7635c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_EXIST); 7645c51f124SMoriah Waterland 7655c51f124SMoriah Waterland /* 7665c51f124SMoriah Waterland * lock each listed zone that is currently running 7675c51f124SMoriah Waterland */ 7685c51f124SMoriah Waterland 7695c51f124SMoriah Waterland for (i = 0; (a_zlst[i]._zlName != (char *)NULL); i++) { 7705c51f124SMoriah Waterland /* ignore zone if already locked */ 7715c51f124SMoriah Waterland if (a_zlst[i]._zlStatus & ZST_LOCKED) { 7725c51f124SMoriah Waterland continue; 7735c51f124SMoriah Waterland } 7745c51f124SMoriah Waterland 7755c51f124SMoriah Waterland /* ignore zone if not running */ 7765c51f124SMoriah Waterland if (a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_RUNNING && 7775c51f124SMoriah Waterland a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_MOUNTED) { 7785c51f124SMoriah Waterland continue; 7795c51f124SMoriah Waterland } 7805c51f124SMoriah Waterland 7815c51f124SMoriah Waterland /* 7825c51f124SMoriah Waterland * mark zone locked - if interrupted out during lock, an attempt 7835c51f124SMoriah Waterland * will be made to release the lock 7845c51f124SMoriah Waterland */ 7855c51f124SMoriah Waterland a_zlst[i]._zlStatus |= ZST_LOCKED; 7865c51f124SMoriah Waterland 7875c51f124SMoriah Waterland /* lock this zone */ 7885c51f124SMoriah Waterland b = _z_lock_zone(&a_zlst[i], a_lflags); 7895c51f124SMoriah Waterland 7905c51f124SMoriah Waterland /* on failure unlock all zones and return error */ 7915c51f124SMoriah Waterland if (b != B_TRUE) { 7925c51f124SMoriah Waterland _z_program_error(ERR_ZONES_LCK_ZONES_FAILED, 7935c51f124SMoriah Waterland a_zlst[i]._zlName); 7945c51f124SMoriah Waterland (void) z_unlock_zones(a_zlst, a_lflags); 7955c51f124SMoriah Waterland return (B_FALSE); 7965c51f124SMoriah Waterland } 7975c51f124SMoriah Waterland } 7985c51f124SMoriah Waterland 7995c51f124SMoriah Waterland /* success */ 8005c51f124SMoriah Waterland 8015c51f124SMoriah Waterland return (B_TRUE); 8025c51f124SMoriah Waterland } 8035c51f124SMoriah Waterland 8045c51f124SMoriah Waterland /* 8055c51f124SMoriah Waterland * Name: z_mount_in_lz 8065c51f124SMoriah Waterland * Description: Mount global zone directory in specified zone's root file system 8075c51f124SMoriah Waterland * Arguments: r_lzMountPoint - pointer to handle to string - on success, the 8085c51f124SMoriah Waterland * full path to the mount point relative to the global zone 8095c51f124SMoriah Waterland * root file system is returned here - this is needed to 8105c51f124SMoriah Waterland * unmount the directory when it is no longer needed 8115c51f124SMoriah Waterland * r_lzRootPath - pointer to handle to string - on success, the 8125c51f124SMoriah Waterland * full path to the mount point relative to the specified 8135c51f124SMoriah Waterland * zone's root file system is returned here - this is 8145c51f124SMoriah Waterland * passed to any command executing in the specified zone to 8155c51f124SMoriah Waterland * access the directory mounted 8165c51f124SMoriah Waterland * a_zoneName - pointer to string representing the name of the zone 8175c51f124SMoriah Waterland * to mount the specified global zone directory in 8185c51f124SMoriah Waterland * a_gzPath - pointer to string representing the full absolute path 8195c51f124SMoriah Waterland * of the global zone directory to LOFS mount inside of the 8205c51f124SMoriah Waterland * specified non-global zone 8215c51f124SMoriah Waterland * a_mountPointPrefix - pointer to string representing the prefix 8225c51f124SMoriah Waterland * to be used when creating the mount point name in the 8235c51f124SMoriah Waterland * specified zone's root directory 8245c51f124SMoriah Waterland * Returns: boolean_t 8255c51f124SMoriah Waterland * == B_TRUE - global zone directory mounted successfully 8265c51f124SMoriah Waterland * == B_FALSE - failed to mount directory in specified zone 8275c51f124SMoriah Waterland * NOTE: Any strings returned is placed in new storage for the 8285c51f124SMoriah Waterland * calling function. The caller must use 'Free' to dispose 8295c51f124SMoriah Waterland * of the storage once the strings are no longer needed. 8305c51f124SMoriah Waterland */ 8315c51f124SMoriah Waterland 8325c51f124SMoriah Waterland boolean_t 8335c51f124SMoriah Waterland z_mount_in_lz(char **r_lzMountPoint, char **r_lzRootPath, char *a_zoneName, 8345c51f124SMoriah Waterland char *a_gzPath, char *a_mountPointPrefix) 8355c51f124SMoriah Waterland { 8365c51f124SMoriah Waterland char lzRootPath[MAXPATHLEN] = {'\0'}; 8375c51f124SMoriah Waterland char uuid[MAXPATHLEN] = {'\0'}; 8385c51f124SMoriah Waterland char gzMountPoint[MAXPATHLEN] = {'\0'}; 8395c51f124SMoriah Waterland char lzMountPoint[MAXPATHLEN] = {'\0'}; 8405c51f124SMoriah Waterland hrtime_t hretime; 8415c51f124SMoriah Waterland int err; 8425c51f124SMoriah Waterland int slen; 8435c51f124SMoriah Waterland struct tm tstruct; 8445c51f124SMoriah Waterland time_t thetime; 8455c51f124SMoriah Waterland zoneid_t zid; 8465c51f124SMoriah Waterland 8475c51f124SMoriah Waterland /* entry assertions */ 8485c51f124SMoriah Waterland 8495c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL); 8505c51f124SMoriah Waterland assert(*a_zoneName != '\0'); 8515c51f124SMoriah Waterland assert(a_gzPath != (char *)NULL); 8525c51f124SMoriah Waterland assert(*a_gzPath != '\0'); 8535c51f124SMoriah Waterland assert(r_lzMountPoint != (char **)NULL); 8545c51f124SMoriah Waterland assert(r_lzRootPath != (char **)NULL); 8555c51f124SMoriah Waterland 8565c51f124SMoriah Waterland /* entry debugging info */ 8575c51f124SMoriah Waterland 8585c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_MOUNT_IN_LZ_ENTRY, a_zoneName, a_gzPath); 8595c51f124SMoriah Waterland 8605c51f124SMoriah Waterland /* reset returned non-global zone mount point path handle */ 8615c51f124SMoriah Waterland 8625c51f124SMoriah Waterland *r_lzMountPoint = (char *)NULL; 8635c51f124SMoriah Waterland *r_lzRootPath = (char *)NULL; 8645c51f124SMoriah Waterland 8655c51f124SMoriah Waterland /* if zones are not implemented, return FALSE */ 8665c51f124SMoriah Waterland 8675c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 8685c51f124SMoriah Waterland return (B_FALSE); 8695c51f124SMoriah Waterland } 8705c51f124SMoriah Waterland 8715c51f124SMoriah Waterland /* error if global zone path is not absolute */ 8725c51f124SMoriah Waterland 8735c51f124SMoriah Waterland if (*a_gzPath != '/') { 8745c51f124SMoriah Waterland _z_program_error(ERR_GZPATH_NOT_ABSOLUTE, a_gzPath); 8755c51f124SMoriah Waterland return (B_FALSE); 8765c51f124SMoriah Waterland } 8775c51f124SMoriah Waterland 8785c51f124SMoriah Waterland /* error if global zone path does not exist */ 8795c51f124SMoriah Waterland 8805c51f124SMoriah Waterland if (_z_is_directory(a_gzPath) != 0) { 8815c51f124SMoriah Waterland _z_program_error(ERR_GZPATH_NOT_DIR, a_gzPath, strerror(errno)); 8825c51f124SMoriah Waterland return (B_FALSE); 8835c51f124SMoriah Waterland } 8845c51f124SMoriah Waterland 8855c51f124SMoriah Waterland /* verify that specified non-global zone exists */ 8865c51f124SMoriah Waterland 8875c51f124SMoriah Waterland err = zone_get_id(a_zoneName, &zid); 8885c51f124SMoriah Waterland if (err != Z_OK) { 8895c51f124SMoriah Waterland _z_program_error(ERR_GET_ZONEID, a_zoneName, 8905c51f124SMoriah Waterland zonecfg_strerror(err)); 8915c51f124SMoriah Waterland return (B_FALSE); 8925c51f124SMoriah Waterland } 8935c51f124SMoriah Waterland 8945c51f124SMoriah Waterland /* obtain global zone path to non-global zones root file system */ 8955c51f124SMoriah Waterland 8965c51f124SMoriah Waterland err = zone_get_rootpath(a_zoneName, lzRootPath, sizeof (lzRootPath)); 8975c51f124SMoriah Waterland if (err != Z_OK) { 8985c51f124SMoriah Waterland _z_program_error(ERR_NO_ZONE_ROOTPATH, a_zoneName, 8995c51f124SMoriah Waterland zonecfg_strerror(err)); 9005c51f124SMoriah Waterland return (B_FALSE); 9015c51f124SMoriah Waterland } 9025c51f124SMoriah Waterland 9035c51f124SMoriah Waterland if (lzRootPath[0] == '\0') { 9045c51f124SMoriah Waterland _z_program_error(ERR_ROOTPATH_EMPTY, a_zoneName); 9055c51f124SMoriah Waterland return (B_FALSE); 9065c51f124SMoriah Waterland } 9075c51f124SMoriah Waterland 9085c51f124SMoriah Waterland /* 9095c51f124SMoriah Waterland * lofs resolve the non-global zone's root path first in case 9105c51f124SMoriah Waterland * its in a path that's been lofs mounted read-only. 9115c51f124SMoriah Waterland * (e.g. This happens when we're tyring to patch a zone in an ABE 9125c51f124SMoriah Waterland * that lives on a filesystem that the ABE shares with the currently 9135c51f124SMoriah Waterland * running BE.) 9145c51f124SMoriah Waterland */ 9155c51f124SMoriah Waterland z_resolve_lofs(lzRootPath, sizeof (lzRootPath)); 9165c51f124SMoriah Waterland 9175c51f124SMoriah Waterland /* verify that the root path exists */ 9185c51f124SMoriah Waterland 9195c51f124SMoriah Waterland if (_z_is_directory(lzRootPath) != 0) { 9205c51f124SMoriah Waterland _z_program_error(ERR_LZROOT_NOTDIR, lzRootPath, 9215c51f124SMoriah Waterland strerror(errno)); 9225c51f124SMoriah Waterland return (B_FALSE); 9235c51f124SMoriah Waterland } 9245c51f124SMoriah Waterland 9255c51f124SMoriah Waterland /* 9265c51f124SMoriah Waterland * generate a unique key - the key is the same length as unique uid 9275c51f124SMoriah Waterland * but contains different information that is as unique as can be made; 9285c51f124SMoriah Waterland * include current hires time (nanosecond real timer). Such a unique 9295c51f124SMoriah Waterland * i.d. will look like: 9305c51f124SMoriah Waterland * 0203104092-1145345-0004e94d6af481a0 9315c51f124SMoriah Waterland */ 9325c51f124SMoriah Waterland 9335c51f124SMoriah Waterland hretime = gethrtime(); 9345c51f124SMoriah Waterland 9355c51f124SMoriah Waterland thetime = time((time_t *)NULL); 9365c51f124SMoriah Waterland (void) localtime_r(&thetime, &tstruct); 9375c51f124SMoriah Waterland 9385c51f124SMoriah Waterland slen = snprintf(uuid, sizeof (uuid), 9395c51f124SMoriah Waterland UUID_FORMAT, 9405c51f124SMoriah Waterland tstruct.tm_mday, tstruct.tm_mon, tstruct.tm_year, 9415c51f124SMoriah Waterland tstruct.tm_yday, tstruct.tm_hour, tstruct.tm_min, 9425c51f124SMoriah Waterland tstruct.tm_sec, tstruct.tm_wday, hretime); 9435c51f124SMoriah Waterland if (slen > sizeof (uuid)) { 9445c51f124SMoriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFUUID_FAILED, 9455c51f124SMoriah Waterland UUID_FORMAT, sizeof (uuid)); 9465c51f124SMoriah Waterland return (B_FALSE); 9475c51f124SMoriah Waterland } 9485c51f124SMoriah Waterland 9495c51f124SMoriah Waterland /* create the global zone mount point */ 9505c51f124SMoriah Waterland 9515c51f124SMoriah Waterland slen = snprintf(gzMountPoint, sizeof (gzMountPoint), "%s/.SUNW_%s_%s", 9525c51f124SMoriah Waterland lzRootPath, 9535c51f124SMoriah Waterland a_mountPointPrefix ? a_mountPointPrefix : "zones", uuid); 9545c51f124SMoriah Waterland if (slen > sizeof (gzMountPoint)) { 9555c51f124SMoriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFGMP_FAILED, 9565c51f124SMoriah Waterland "%s/.SUNW_%s_%s", lzRootPath, 9575c51f124SMoriah Waterland a_mountPointPrefix ? a_mountPointPrefix : "zones", 9585c51f124SMoriah Waterland uuid, sizeof (gzMountPoint)); 9595c51f124SMoriah Waterland return (B_FALSE); 9605c51f124SMoriah Waterland } 9615c51f124SMoriah Waterland 9625c51f124SMoriah Waterland slen = snprintf(lzMountPoint, sizeof (lzMountPoint), "%s", 9635c51f124SMoriah Waterland gzMountPoint+strlen(lzRootPath)); 9645c51f124SMoriah Waterland if (slen > sizeof (lzMountPoint)) { 9655c51f124SMoriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFLMP_FAILED, 9665c51f124SMoriah Waterland "%s", gzMountPoint+strlen(lzRootPath), 9675c51f124SMoriah Waterland sizeof (lzMountPoint)); 9685c51f124SMoriah Waterland return (B_FALSE); 9695c51f124SMoriah Waterland } 9705c51f124SMoriah Waterland 9715c51f124SMoriah Waterland _z_echoDebug(DBG_MNTPT_NAMES, a_gzPath, a_zoneName, gzMountPoint, 9725c51f124SMoriah Waterland lzMountPoint); 9735c51f124SMoriah Waterland 9745c51f124SMoriah Waterland /* error if the mount point already exists */ 9755c51f124SMoriah Waterland 9765c51f124SMoriah Waterland if (_z_is_directory(gzMountPoint) == 0) { 9775c51f124SMoriah Waterland _z_program_error(ERR_ZONEROOT_NOTDIR, gzMountPoint, 9785c51f124SMoriah Waterland a_zoneName, strerror(errno)); 9795c51f124SMoriah Waterland return (B_FALSE); 9805c51f124SMoriah Waterland } 9815c51f124SMoriah Waterland 9825c51f124SMoriah Waterland /* create the temporary mount point */ 9835c51f124SMoriah Waterland 9845c51f124SMoriah Waterland if (mkdir(gzMountPoint, 0600) != 0) { 9855c51f124SMoriah Waterland _z_program_error(ERR_MNTPT_MKDIR, gzMountPoint, a_zoneName, 9865c51f124SMoriah Waterland strerror(errno)); 9875c51f124SMoriah Waterland return (B_FALSE); 9885c51f124SMoriah Waterland } 9895c51f124SMoriah Waterland 9905c51f124SMoriah Waterland /* mount the global zone path on the non-global zone root file system */ 9915c51f124SMoriah Waterland 9925c51f124SMoriah Waterland err = mount(a_gzPath, gzMountPoint, MS_RDONLY|MS_DATA, "lofs", 9935c51f124SMoriah Waterland (char *)NULL, 0, (char *)NULL, 0); 9945c51f124SMoriah Waterland if (err != 0) { 9955c51f124SMoriah Waterland _z_program_error(ERR_GZMOUNT_FAILED, a_gzPath, 9965c51f124SMoriah Waterland gzMountPoint, a_zoneName, strerror(errno)); 9975c51f124SMoriah Waterland return (B_FALSE); 9985c51f124SMoriah Waterland } 9995c51f124SMoriah Waterland 10005c51f124SMoriah Waterland /* success - return both mountpoints to caller */ 10015c51f124SMoriah Waterland 10025c51f124SMoriah Waterland *r_lzMountPoint = _z_strdup(gzMountPoint); 10035c51f124SMoriah Waterland 10045c51f124SMoriah Waterland *r_lzRootPath = _z_strdup(lzMountPoint); 10055c51f124SMoriah Waterland 10065c51f124SMoriah Waterland /* return success */ 10075c51f124SMoriah Waterland 10085c51f124SMoriah Waterland return (B_TRUE); 10095c51f124SMoriah Waterland } 10105c51f124SMoriah Waterland 10115c51f124SMoriah Waterland /* 10125c51f124SMoriah Waterland * Name: z_non_global_zones_exist 10135c51f124SMoriah Waterland * Description: Determine if any non-global native zones exist 10145c51f124SMoriah Waterland * Arguments: None. 10155c51f124SMoriah Waterland * Returns: boolean_t 10165c51f124SMoriah Waterland * == B_TRUE - at least one non-global native zone exists 10175c51f124SMoriah Waterland * == B_FALSE - no non-global native zone exists 10185c51f124SMoriah Waterland */ 10195c51f124SMoriah Waterland 10205c51f124SMoriah Waterland boolean_t 10215c51f124SMoriah Waterland z_non_global_zones_exist(void) 10225c51f124SMoriah Waterland { 10235c51f124SMoriah Waterland FILE *zoneIndexFP; 10245c51f124SMoriah Waterland boolean_t anyExist = B_FALSE; 10255c51f124SMoriah Waterland struct zoneent *ze; 10265c51f124SMoriah Waterland zone_spec_t *zent; 10275c51f124SMoriah Waterland 10285c51f124SMoriah Waterland /* if zones are not implemented, return FALSE */ 10295c51f124SMoriah Waterland 10305c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 10315c51f124SMoriah Waterland return (B_FALSE); 10325c51f124SMoriah Waterland } 10335c51f124SMoriah Waterland 10345c51f124SMoriah Waterland /* determine if any zones are configured */ 10355c51f124SMoriah Waterland zoneIndexFP = setzoneent(); 10365c51f124SMoriah Waterland if (zoneIndexFP == NULL) { 10375c51f124SMoriah Waterland return (B_FALSE); 10385c51f124SMoriah Waterland } 10395c51f124SMoriah Waterland 10405c51f124SMoriah Waterland /* index file open; scan all zones; see if any are at least installed */ 10415c51f124SMoriah Waterland 10425c51f124SMoriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) { 10435c51f124SMoriah Waterland /* 10445c51f124SMoriah Waterland * If the user specified an explicit zone list, then ignore any 10455c51f124SMoriah Waterland * zones that aren't on that list. 10465c51f124SMoriah Waterland */ 10475c51f124SMoriah Waterland if ((zent = _z_global_data._zone_spec) != NULL) { 10485c51f124SMoriah Waterland while (zent != NULL) { 10495c51f124SMoriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0) 10505c51f124SMoriah Waterland break; 10515c51f124SMoriah Waterland zent = zent->zl_next; 10525c51f124SMoriah Waterland } 10535c51f124SMoriah Waterland if (zent == NULL) { 10545c51f124SMoriah Waterland free(ze); 10555c51f124SMoriah Waterland continue; 10565c51f124SMoriah Waterland } 10575c51f124SMoriah Waterland } 10585c51f124SMoriah Waterland 10595c51f124SMoriah Waterland /* skip the global zone */ 10605c51f124SMoriah Waterland if (strcmp(ze->zone_name, GLOBAL_ZONENAME) == 0) { 10615c51f124SMoriah Waterland free(ze); 10625c51f124SMoriah Waterland continue; 10635c51f124SMoriah Waterland } 10645c51f124SMoriah Waterland 10655c51f124SMoriah Waterland /* skip any branded zones */ 10665c51f124SMoriah Waterland if (z_is_zone_branded(ze->zone_name)) { 10675c51f124SMoriah Waterland free(ze); 10685c51f124SMoriah Waterland continue; 10695c51f124SMoriah Waterland } 10705c51f124SMoriah Waterland 10715c51f124SMoriah Waterland /* is this zone installed? */ 10725c51f124SMoriah Waterland if (ze->zone_state >= ZONE_STATE_INSTALLED) { 10735c51f124SMoriah Waterland free(ze); 10745c51f124SMoriah Waterland anyExist = B_TRUE; 10755c51f124SMoriah Waterland break; 10765c51f124SMoriah Waterland } 10775c51f124SMoriah Waterland free(ze); 10785c51f124SMoriah Waterland } 10795c51f124SMoriah Waterland 10805c51f124SMoriah Waterland /* close the index file */ 10815c51f124SMoriah Waterland 10825c51f124SMoriah Waterland endzoneent(zoneIndexFP); 10835c51f124SMoriah Waterland 10845c51f124SMoriah Waterland /* return results */ 10855c51f124SMoriah Waterland 10865c51f124SMoriah Waterland return (anyExist); 10875c51f124SMoriah Waterland } 10885c51f124SMoriah Waterland 10895c51f124SMoriah Waterland /* 10905c51f124SMoriah Waterland * Name: z_on_zone_spec 10915c51f124SMoriah Waterland * Description: Determine if named zone is on the zone_spec list. 10925c51f124SMoriah Waterland * Arguments: Pointer to name to test. 10935c51f124SMoriah Waterland * Returns: B_TRUE if named zone is on the list or if the user specified 10945c51f124SMoriah Waterland * no list at all (all zones is the default), B_FALSE otherwise. 10955c51f124SMoriah Waterland */ 10965c51f124SMoriah Waterland 10975c51f124SMoriah Waterland boolean_t 10985c51f124SMoriah Waterland z_on_zone_spec(const char *zonename) 10995c51f124SMoriah Waterland { 11005c51f124SMoriah Waterland zone_spec_t *zent; 11015c51f124SMoriah Waterland 11025c51f124SMoriah Waterland /* entry assertions */ 11035c51f124SMoriah Waterland 11045c51f124SMoriah Waterland assert(zonename != NULL); 11055c51f124SMoriah Waterland assert(*zonename != '\0'); 11065c51f124SMoriah Waterland 11075c51f124SMoriah Waterland /* return true if zones not implemented or no zone spec list defined */ 11085c51f124SMoriah Waterland 11095c51f124SMoriah Waterland if (!z_zones_are_implemented() || _z_global_data._zone_spec == NULL) { 11105c51f124SMoriah Waterland return (B_TRUE); 11115c51f124SMoriah Waterland } 11125c51f124SMoriah Waterland 11135c51f124SMoriah Waterland /* return true if named zone is on the zone spec list */ 11145c51f124SMoriah Waterland 11155c51f124SMoriah Waterland for (zent = _z_global_data._zone_spec; 11165c51f124SMoriah Waterland zent != NULL; zent = zent->zl_next) { 11175c51f124SMoriah Waterland if (strcmp(zent->zl_name, zonename) == 0) 11185c51f124SMoriah Waterland return (B_TRUE); 11195c51f124SMoriah Waterland } 11205c51f124SMoriah Waterland 11215c51f124SMoriah Waterland /* named zone is not on the zone spec list */ 11225c51f124SMoriah Waterland 11235c51f124SMoriah Waterland return (B_FALSE); 11245c51f124SMoriah Waterland } 11255c51f124SMoriah Waterland 11265c51f124SMoriah Waterland /* 11275c51f124SMoriah Waterland * Name: z_running_in_global_zone 11285c51f124SMoriah Waterland * Description: Determine if running in the "global" zone 11295c51f124SMoriah Waterland * Arguments: void 11305c51f124SMoriah Waterland * Returns: boolean_t 11315c51f124SMoriah Waterland * == B_TRUE - running in global zone 11325c51f124SMoriah Waterland * == B_FALSE - not running in global zone 11335c51f124SMoriah Waterland */ 11345c51f124SMoriah Waterland 11355c51f124SMoriah Waterland boolean_t 11365c51f124SMoriah Waterland z_running_in_global_zone(void) 11375c51f124SMoriah Waterland { 11385c51f124SMoriah Waterland static boolean_t _zoneIdDetermined = B_FALSE; 11395c51f124SMoriah Waterland static boolean_t _zoneIsGlobal = B_FALSE; 11405c51f124SMoriah Waterland 11415c51f124SMoriah Waterland /* if ID has not been determined, cache it now */ 11425c51f124SMoriah Waterland 11435c51f124SMoriah Waterland if (!_zoneIdDetermined) { 11445c51f124SMoriah Waterland _zoneIdDetermined = B_TRUE; 11455c51f124SMoriah Waterland _zoneIsGlobal = _z_running_in_global_zone(); 11465c51f124SMoriah Waterland } 11475c51f124SMoriah Waterland 11485c51f124SMoriah Waterland return (_zoneIsGlobal); 11495c51f124SMoriah Waterland } 11505c51f124SMoriah Waterland 11515c51f124SMoriah Waterland /* 11525c51f124SMoriah Waterland * Name: z_set_output_functions 11535c51f124SMoriah Waterland * Description: Link program specific output functions to this library. 11545c51f124SMoriah Waterland * Arguments: a_echo_fcn - (_z_printf_fcn_t) 11555c51f124SMoriah Waterland * Function to call to cause "normal operation" messages 11565c51f124SMoriah Waterland * to be output/displayed 11575c51f124SMoriah Waterland * a_echo_debug_fcn - (_z_printf_fcn_t) 11585c51f124SMoriah Waterland * Function to call to cause "debugging" messages 11595c51f124SMoriah Waterland * to be output/displayed 11605c51f124SMoriah Waterland * a_progerr_fcn - (_z_printf_fcn_t) 11615c51f124SMoriah Waterland * Function to call to cause "program error" messages 11625c51f124SMoriah Waterland * to be output/displayed 11635c51f124SMoriah Waterland * Returns: void 11645c51f124SMoriah Waterland * NOTE: If NULL is specified for any function, then the functionality 11655c51f124SMoriah Waterland * associated with that function is disabled. 11665c51f124SMoriah Waterland * NOTE: The function pointers provided must call a function that 11675c51f124SMoriah Waterland * takes two arguments: 11685c51f124SMoriah Waterland * function(char *format, char *message) 11695c51f124SMoriah Waterland * Any registered function will be called like: 11705c51f124SMoriah Waterland * function("%s", "message") 11715c51f124SMoriah Waterland */ 11725c51f124SMoriah Waterland 11735c51f124SMoriah Waterland void 11745c51f124SMoriah Waterland z_set_output_functions(_z_printf_fcn_t a_echo_fcn, 11755c51f124SMoriah Waterland _z_printf_fcn_t a_echo_debug_fcn, 11765c51f124SMoriah Waterland _z_printf_fcn_t a_progerr_fcn) 11775c51f124SMoriah Waterland { 11785c51f124SMoriah Waterland _z_global_data._z_echo = a_echo_fcn; 11795c51f124SMoriah Waterland _z_global_data._z_echo_debug = a_echo_debug_fcn; 11805c51f124SMoriah Waterland _z_global_data._z_progerr = a_progerr_fcn; 11815c51f124SMoriah Waterland } 11825c51f124SMoriah Waterland 11835c51f124SMoriah Waterland /* 11845c51f124SMoriah Waterland * Name: z_set_zone_root 11855c51f124SMoriah Waterland * Description: Set root for zones library operations 11865c51f124SMoriah Waterland * Arguments: Path to root of boot environment containing zone; must be 11875c51f124SMoriah Waterland * absolute. 11885c51f124SMoriah Waterland * Returns: None. 11895c51f124SMoriah Waterland * NOTE: Must be called before performing any zone-related operations. 11905c51f124SMoriah Waterland * (Currently called directly by set_inst_root() during -R 11915c51f124SMoriah Waterland * argument handling.) 11925c51f124SMoriah Waterland */ 11935c51f124SMoriah Waterland 11945c51f124SMoriah Waterland void 11955c51f124SMoriah Waterland z_set_zone_root(const char *zroot) 11965c51f124SMoriah Waterland { 11975c51f124SMoriah Waterland char *rootdir; 11985c51f124SMoriah Waterland 11995c51f124SMoriah Waterland /* if zones are not implemented, just return */ 12005c51f124SMoriah Waterland 12015c51f124SMoriah Waterland if (!z_zones_are_implemented()) 12025c51f124SMoriah Waterland return; 12035c51f124SMoriah Waterland 12045c51f124SMoriah Waterland /* entry assertions */ 12055c51f124SMoriah Waterland 12065c51f124SMoriah Waterland assert(zroot != NULL); 12075c51f124SMoriah Waterland 12085c51f124SMoriah Waterland rootdir = _z_strdup((char *)zroot); 12095c51f124SMoriah Waterland z_canoninplace(rootdir); 12105c51f124SMoriah Waterland 12115c51f124SMoriah Waterland if (strcmp(rootdir, "/") == 0) { 12125c51f124SMoriah Waterland rootdir[0] = '\0'; 12135c51f124SMoriah Waterland } 12145c51f124SMoriah Waterland 12155c51f124SMoriah Waterland /* free any existing cached root path */ 12165c51f124SMoriah Waterland if (*_z_global_data._z_root_dir != '\0') { 12175c51f124SMoriah Waterland free(_z_global_data._z_root_dir); 121894a65b20SAbhinandan Ekande _z_global_data._z_root_dir = NULL; 12195c51f124SMoriah Waterland } 12205c51f124SMoriah Waterland 12215c51f124SMoriah Waterland /* store duplicate of new zone root path */ 12225c51f124SMoriah Waterland 12235c51f124SMoriah Waterland if (*rootdir != '\0') { 12245c51f124SMoriah Waterland _z_global_data._z_root_dir = _z_strdup(rootdir); 12255c51f124SMoriah Waterland } else { 122694a65b20SAbhinandan Ekande _z_global_data._z_root_dir = ""; 12275c51f124SMoriah Waterland } 12285c51f124SMoriah Waterland 12295c51f124SMoriah Waterland /* set zone root path */ 12305c51f124SMoriah Waterland 12315c51f124SMoriah Waterland zonecfg_set_root(rootdir); 12325c51f124SMoriah Waterland 12335c51f124SMoriah Waterland free(rootdir); 12345c51f124SMoriah Waterland } 12355c51f124SMoriah Waterland 12365c51f124SMoriah Waterland /* 12375c51f124SMoriah Waterland * Name: z_set_zone_spec 12385c51f124SMoriah Waterland * Description: Set list of zones on which actions will be performed. 12395c51f124SMoriah Waterland * Arguments: Whitespace-separated list of zone names. 12405c51f124SMoriah Waterland * Returns: 0 on success, -1 on error. 12415c51f124SMoriah Waterland * NOTES: Will call _z_program_error if argument can't be parsed or 12425c51f124SMoriah Waterland * memory not available. 12435c51f124SMoriah Waterland */ 12445c51f124SMoriah Waterland 12455c51f124SMoriah Waterland int 12465c51f124SMoriah Waterland z_set_zone_spec(const char *zlist) 12475c51f124SMoriah Waterland { 12485c51f124SMoriah Waterland const char *zend; 12495c51f124SMoriah Waterland ptrdiff_t zlen; 12505c51f124SMoriah Waterland zone_spec_t *zent; 12515c51f124SMoriah Waterland zone_spec_t *zhead; 12525c51f124SMoriah Waterland zone_spec_t **znextp = &zhead; 12535c51f124SMoriah Waterland 12545c51f124SMoriah Waterland /* entry assertions */ 12555c51f124SMoriah Waterland 12565c51f124SMoriah Waterland assert(zlist != NULL); 12575c51f124SMoriah Waterland 12585c51f124SMoriah Waterland /* parse list to zone_spec_t list, store in global data */ 12595c51f124SMoriah Waterland 12605c51f124SMoriah Waterland for (;;) { 12615c51f124SMoriah Waterland while (isspace(*zlist)) { 12625c51f124SMoriah Waterland zlist++; 12635c51f124SMoriah Waterland } 12645c51f124SMoriah Waterland if (*zlist == '\0') { 12655c51f124SMoriah Waterland break; 12665c51f124SMoriah Waterland } 12675c51f124SMoriah Waterland for (zend = zlist; *zend != '\0'; zend++) { 12685c51f124SMoriah Waterland if (isspace(*zend)) { 12695c51f124SMoriah Waterland break; 12705c51f124SMoriah Waterland } 12715c51f124SMoriah Waterland } 12725c51f124SMoriah Waterland zlen = ((ptrdiff_t)zend) - ((ptrdiff_t)zlist); 12735c51f124SMoriah Waterland if (zlen >= ZONENAME_MAX) { 12745c51f124SMoriah Waterland _z_program_error(ERR_ZONE_NAME_ILLEGAL, zlen, zlist); 12755c51f124SMoriah Waterland return (-1); 12765c51f124SMoriah Waterland } 12775c51f124SMoriah Waterland zent = _z_malloc(sizeof (*zent)); 12785c51f124SMoriah Waterland (void) memcpy(zent->zl_name, zlist, zlen); 12795c51f124SMoriah Waterland zent->zl_name[zlen] = '\0'; 12805c51f124SMoriah Waterland zent->zl_used = B_FALSE; 12815c51f124SMoriah Waterland *znextp = zent; 12825c51f124SMoriah Waterland znextp = &zent->zl_next; 12835c51f124SMoriah Waterland zlist = zend; 12845c51f124SMoriah Waterland } 12855c51f124SMoriah Waterland *znextp = NULL; 12865c51f124SMoriah Waterland 12875c51f124SMoriah Waterland if (zhead == NULL) { 12885c51f124SMoriah Waterland _z_program_error(ERR_ZONE_LIST_EMPTY); 12895c51f124SMoriah Waterland return (-1); 12905c51f124SMoriah Waterland } 12915c51f124SMoriah Waterland 12925c51f124SMoriah Waterland _z_global_data._zone_spec = zhead; 12935c51f124SMoriah Waterland return (0); 12945c51f124SMoriah Waterland } 12955c51f124SMoriah Waterland 12965c51f124SMoriah Waterland /* 12975c51f124SMoriah Waterland * Name: z_umount_lz_mount 12985c51f124SMoriah Waterland * Description: Unmount directory mounted with z_mount_in_lz 12995c51f124SMoriah Waterland * Arguments: a_lzMountPointer - pointer to string returned by z_mount_in_lz 13005c51f124SMoriah Waterland * Returns: boolean_t 13015c51f124SMoriah Waterland * == B_TRUE - successfully unmounted directory 13025c51f124SMoriah Waterland * == B_FALSE - failed to unmount directory 13035c51f124SMoriah Waterland */ 13045c51f124SMoriah Waterland 13055c51f124SMoriah Waterland boolean_t 13065c51f124SMoriah Waterland z_umount_lz_mount(char *a_lzMountPoint) 13075c51f124SMoriah Waterland { 13085c51f124SMoriah Waterland int err; 13095c51f124SMoriah Waterland 13105c51f124SMoriah Waterland /* entry assertions */ 13115c51f124SMoriah Waterland 13125c51f124SMoriah Waterland assert(a_lzMountPoint != (char *)NULL); 13135c51f124SMoriah Waterland assert(*a_lzMountPoint != '\0'); 13145c51f124SMoriah Waterland 13155c51f124SMoriah Waterland /* entry debugging info */ 13165c51f124SMoriah Waterland 13175c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_UNMOUNT_FROM_LZ_ENTRY, a_lzMountPoint); 13185c51f124SMoriah Waterland 13195c51f124SMoriah Waterland /* if zones are not implemented, return TRUE */ 13205c51f124SMoriah Waterland 13215c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 13225c51f124SMoriah Waterland return (B_FALSE); 13235c51f124SMoriah Waterland } 13245c51f124SMoriah Waterland 13255c51f124SMoriah Waterland /* error if global zone path is not absolute */ 13265c51f124SMoriah Waterland 13275c51f124SMoriah Waterland if (*a_lzMountPoint != '/') { 13285c51f124SMoriah Waterland _z_program_error(ERR_LZMNTPT_NOT_ABSOLUTE, a_lzMountPoint); 13295c51f124SMoriah Waterland return (B_FALSE); 13305c51f124SMoriah Waterland } 13315c51f124SMoriah Waterland 13325c51f124SMoriah Waterland /* verify mount point exists */ 13335c51f124SMoriah Waterland 13345c51f124SMoriah Waterland if (_z_is_directory(a_lzMountPoint) != 0) { 13355c51f124SMoriah Waterland _z_program_error(ERR_LZMNTPT_NOTDIR, a_lzMountPoint, 13365c51f124SMoriah Waterland strerror(errno)); 13375c51f124SMoriah Waterland return (B_FALSE); 13385c51f124SMoriah Waterland } 13395c51f124SMoriah Waterland 13405c51f124SMoriah Waterland /* unmount */ 13415c51f124SMoriah Waterland 13425c51f124SMoriah Waterland err = umount2(a_lzMountPoint, 0); 13435c51f124SMoriah Waterland if (err != 0) { 13445c51f124SMoriah Waterland _z_program_error(ERR_GZUMOUNT_FAILED, a_lzMountPoint, 13455c51f124SMoriah Waterland strerror(errno)); 13465c51f124SMoriah Waterland return (B_FALSE); 13475c51f124SMoriah Waterland } 13485c51f124SMoriah Waterland 13495c51f124SMoriah Waterland /* remove the mount point */ 13505c51f124SMoriah Waterland 13515c51f124SMoriah Waterland (void) remove(a_lzMountPoint); 13525c51f124SMoriah Waterland 13535c51f124SMoriah Waterland /* return success */ 13545c51f124SMoriah Waterland 13555c51f124SMoriah Waterland return (B_TRUE); 13565c51f124SMoriah Waterland } 13575c51f124SMoriah Waterland 13585c51f124SMoriah Waterland /* 13595c51f124SMoriah Waterland * Name: z_unlock_this_zone 13605c51f124SMoriah Waterland * Description: unlock this zone 13615c51f124SMoriah Waterland * Arguments: a_lflags - [RO, *RO] - (ZLOCKS_T) 13625c51f124SMoriah Waterland * Flags indicating which locks to release 13635c51f124SMoriah Waterland * Returns: boolean_t 13645c51f124SMoriah Waterland * == B_TRUE - success specified locks released 13655c51f124SMoriah Waterland * == B_FALSE - failure specified locks may not be released 13665c51f124SMoriah Waterland * NOTE: the lock objects for "this zone" are maintained internally. 13675c51f124SMoriah Waterland */ 13685c51f124SMoriah Waterland 13695c51f124SMoriah Waterland boolean_t 13705c51f124SMoriah Waterland z_unlock_this_zone(ZLOCKS_T a_lflags) 13715c51f124SMoriah Waterland { 13725c51f124SMoriah Waterland boolean_t b; 13735c51f124SMoriah Waterland boolean_t errors = B_FALSE; 13745c51f124SMoriah Waterland char *zoneName; 13755c51f124SMoriah Waterland 13765c51f124SMoriah Waterland /* entry assertions */ 13775c51f124SMoriah Waterland 13785c51f124SMoriah Waterland assert(a_lflags != ZLOCKS_NONE); 13795c51f124SMoriah Waterland 13805c51f124SMoriah Waterland /* entry debugging info */ 13815c51f124SMoriah Waterland 13825c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ULK_THIS, a_lflags); 13835c51f124SMoriah Waterland 13845c51f124SMoriah Waterland /* return if no objects locked */ 13855c51f124SMoriah Waterland 13865c51f124SMoriah Waterland if ((_z_global_data._z_ObjectLocks == (char *)NULL) || 13875c51f124SMoriah Waterland (*_z_global_data._z_ObjectLocks == '\0')) { 13885c51f124SMoriah Waterland return (B_TRUE); 13895c51f124SMoriah Waterland } 13905c51f124SMoriah Waterland 13915c51f124SMoriah Waterland zoneName = z_get_zonename(); 13925c51f124SMoriah Waterland 13935c51f124SMoriah Waterland /* unlock patch administration */ 13945c51f124SMoriah Waterland 13955c51f124SMoriah Waterland if (a_lflags & ZLOCKS_PATCH_ADMIN) { 13965c51f124SMoriah Waterland b = _z_unlock_zone_object(&_z_global_data._z_ObjectLocks, 13975c51f124SMoriah Waterland zoneName, LOBJ_PATCHADMIN, ERR_ZONES_ULK_THIS_PATCH); 13985c51f124SMoriah Waterland if (!b) { 13995c51f124SMoriah Waterland errors = B_TRUE; 14005c51f124SMoriah Waterland } 14015c51f124SMoriah Waterland } 14025c51f124SMoriah Waterland 14035c51f124SMoriah Waterland /* unlock package administration */ 14045c51f124SMoriah Waterland 14055c51f124SMoriah Waterland if (a_lflags & ZLOCKS_PKG_ADMIN) { 14065c51f124SMoriah Waterland b = _z_unlock_zone_object(&_z_global_data._z_ObjectLocks, 14075c51f124SMoriah Waterland zoneName, LOBJ_PKGADMIN, ERR_ZONES_ULK_THIS_PACKAGE); 14085c51f124SMoriah Waterland if (!b) { 14095c51f124SMoriah Waterland errors = B_TRUE; 14105c51f124SMoriah Waterland } 14115c51f124SMoriah Waterland } 14125c51f124SMoriah Waterland 14135c51f124SMoriah Waterland /* unlock zone administration */ 14145c51f124SMoriah Waterland 14155c51f124SMoriah Waterland if (a_lflags & ZLOCKS_ZONE_ADMIN) { 14165c51f124SMoriah Waterland b = _z_unlock_zone_object(&_z_global_data._z_ObjectLocks, 14175c51f124SMoriah Waterland zoneName, LOBJ_ZONEADMIN, ERR_ZONES_ULK_THIS_ZONES); 14185c51f124SMoriah Waterland if (!b) { 14195c51f124SMoriah Waterland errors = B_TRUE; 14205c51f124SMoriah Waterland } 14215c51f124SMoriah Waterland } 14225c51f124SMoriah Waterland 14235c51f124SMoriah Waterland (void) free(zoneName); 14245c51f124SMoriah Waterland return (!errors); 14255c51f124SMoriah Waterland } 14265c51f124SMoriah Waterland 14275c51f124SMoriah Waterland /* 14285c51f124SMoriah Waterland * Name: z_unlock_zones 14295c51f124SMoriah Waterland * Description: unlock specified zones 14305c51f124SMoriah Waterland * Arguments: a_zlst - zoneList_t object describing zones to unlock 14315c51f124SMoriah Waterland * a_lflags - [RO, *RO] - (ZLOCKS_T) 14325c51f124SMoriah Waterland * Flags indicating which locks to release 14335c51f124SMoriah Waterland * Returns: boolean_t 14345c51f124SMoriah Waterland * == B_TRUE - success, zones unlocked 14355c51f124SMoriah Waterland * == B_FALSE - failure, zones not unlocked 14365c51f124SMoriah Waterland */ 14375c51f124SMoriah Waterland 14385c51f124SMoriah Waterland boolean_t 14395c51f124SMoriah Waterland z_unlock_zones(zoneList_t a_zlst, ZLOCKS_T a_lflags) 14405c51f124SMoriah Waterland { 14415c51f124SMoriah Waterland boolean_t b; 14425c51f124SMoriah Waterland boolean_t errors = B_FALSE; 14435c51f124SMoriah Waterland int i; 14445c51f124SMoriah Waterland 14455c51f124SMoriah Waterland /* entry assertions */ 14465c51f124SMoriah Waterland 14475c51f124SMoriah Waterland assert(a_lflags != ZLOCKS_NONE); 14485c51f124SMoriah Waterland 14495c51f124SMoriah Waterland /* entry debugging info */ 14505c51f124SMoriah Waterland 14515c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES, a_lflags); 14525c51f124SMoriah Waterland 14535c51f124SMoriah Waterland /* if zones are not implemented, return TRUE */ 14545c51f124SMoriah Waterland 14555c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 14565c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_UNIMP); 14575c51f124SMoriah Waterland return (B_TRUE); 14585c51f124SMoriah Waterland } 14595c51f124SMoriah Waterland 14605c51f124SMoriah Waterland /* ignore empty list */ 14615c51f124SMoriah Waterland 14625c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 14635c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_NOZONES); 14645c51f124SMoriah Waterland /* unlock this zone before returning */ 14655c51f124SMoriah Waterland return (z_unlock_this_zone(a_lflags)); 14665c51f124SMoriah Waterland } 14675c51f124SMoriah Waterland 14685c51f124SMoriah Waterland /* zones exist */ 14695c51f124SMoriah Waterland 14705c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_EXIST); 14715c51f124SMoriah Waterland 14725c51f124SMoriah Waterland /* 14735c51f124SMoriah Waterland * unlock each listed zone that is currently running 14745c51f124SMoriah Waterland */ 14755c51f124SMoriah Waterland 14765c51f124SMoriah Waterland for (i = 0; (a_zlst[i]._zlName != (char *)NULL); i++) { 14775c51f124SMoriah Waterland /* ignore zone if not locked */ 14785c51f124SMoriah Waterland if (!(a_zlst[i]._zlStatus & ZST_LOCKED)) { 14795c51f124SMoriah Waterland continue; 14805c51f124SMoriah Waterland } 14815c51f124SMoriah Waterland 14825c51f124SMoriah Waterland /* ignore zone if not running */ 14835c51f124SMoriah Waterland if (a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_RUNNING && 14845c51f124SMoriah Waterland a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_MOUNTED) { 14855c51f124SMoriah Waterland continue; 14865c51f124SMoriah Waterland } 14875c51f124SMoriah Waterland 14885c51f124SMoriah Waterland /* unlock this zone */ 14895c51f124SMoriah Waterland b = _z_unlock_zone(&a_zlst[i], a_lflags); 14905c51f124SMoriah Waterland 14915c51f124SMoriah Waterland if (b != B_TRUE) { 14925c51f124SMoriah Waterland errors = B_TRUE; 14935c51f124SMoriah Waterland } else { 14945c51f124SMoriah Waterland /* mark zone as unlocked */ 14955c51f124SMoriah Waterland a_zlst[i]._zlStatus &= ~ZST_LOCKED; 14965c51f124SMoriah Waterland } 14975c51f124SMoriah Waterland } 14985c51f124SMoriah Waterland 14995c51f124SMoriah Waterland /* unlock this zone */ 15005c51f124SMoriah Waterland 15015c51f124SMoriah Waterland if (z_unlock_this_zone(a_lflags) != B_TRUE) { 15025c51f124SMoriah Waterland errors = B_TRUE; 15035c51f124SMoriah Waterland } 15045c51f124SMoriah Waterland 15055c51f124SMoriah Waterland return (errors); 15065c51f124SMoriah Waterland } 15075c51f124SMoriah Waterland 15085c51f124SMoriah Waterland /* 15095c51f124SMoriah Waterland * Name: z_verify_zone_spec 15105c51f124SMoriah Waterland * Description: Verify list of zones on which actions will be performed. 15115c51f124SMoriah Waterland * Arguments: None. 15125c51f124SMoriah Waterland * Returns: 0 on success, -1 on error. 15135c51f124SMoriah Waterland * NOTES: Will call _z_program_error if there are zones on the specified 15145c51f124SMoriah Waterland * list that don't exist on the system. Requires that 15155c51f124SMoriah Waterland * z_set_zone_root is called first (if it is called at all). 15165c51f124SMoriah Waterland */ 15175c51f124SMoriah Waterland 15185c51f124SMoriah Waterland int 15195c51f124SMoriah Waterland z_verify_zone_spec(void) 15205c51f124SMoriah Waterland { 15215c51f124SMoriah Waterland FILE *zoneIndexFP; 15225c51f124SMoriah Waterland boolean_t errors; 15235c51f124SMoriah Waterland char zoneIndexPath[MAXPATHLEN]; 15245c51f124SMoriah Waterland struct zoneent *ze; 15255c51f124SMoriah Waterland zone_spec_t *zent; 15265c51f124SMoriah Waterland 15275c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 15285c51f124SMoriah Waterland _z_program_error(ERR_ZONES_NOT_IMPLEMENTED); 15295c51f124SMoriah Waterland return (-1); 15305c51f124SMoriah Waterland } 15315c51f124SMoriah Waterland 15325c51f124SMoriah Waterland zoneIndexFP = setzoneent(); 15335c51f124SMoriah Waterland if (zoneIndexFP == NULL) { 15345c51f124SMoriah Waterland _z_program_error(ERR_ZONEINDEX_OPEN, zoneIndexPath, 15355c51f124SMoriah Waterland strerror(errno)); 15365c51f124SMoriah Waterland return (-1); 15375c51f124SMoriah Waterland } 15385c51f124SMoriah Waterland 15395c51f124SMoriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) { 15405c51f124SMoriah Waterland for (zent = _z_global_data._zone_spec; 15415c51f124SMoriah Waterland zent != NULL; zent = zent->zl_next) { 15425c51f124SMoriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0) { 15435c51f124SMoriah Waterland zent->zl_used = B_TRUE; 15445c51f124SMoriah Waterland break; 15455c51f124SMoriah Waterland } 15465c51f124SMoriah Waterland } 15475c51f124SMoriah Waterland free(ze); 15485c51f124SMoriah Waterland } 15495c51f124SMoriah Waterland endzoneent(zoneIndexFP); 15505c51f124SMoriah Waterland 15515c51f124SMoriah Waterland errors = B_FALSE; 15525c51f124SMoriah Waterland for (zent = _z_global_data._zone_spec; 15535c51f124SMoriah Waterland zent != NULL; zent = zent->zl_next) { 15545c51f124SMoriah Waterland if (!zent->zl_used) { 15555c51f124SMoriah Waterland _z_program_error(ERR_ZONE_NONEXISTENT, zent->zl_name); 15565c51f124SMoriah Waterland errors = B_TRUE; 15575c51f124SMoriah Waterland } 15585c51f124SMoriah Waterland } 15595c51f124SMoriah Waterland return (errors ? -1 : 0); 15605c51f124SMoriah Waterland } 15615c51f124SMoriah Waterland 15625c51f124SMoriah Waterland /* 15635c51f124SMoriah Waterland * Name: z_zlist_change_zone_state 15645c51f124SMoriah Waterland * Description: Change the current state of the specified zone 15655c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 15665c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the 15675c51f124SMoriah Waterland * a_newState - the state to put the specified zone in 15685c51f124SMoriah Waterland * Returns: boolean_t 15695c51f124SMoriah Waterland * == B_TRUE - the zone is in the new state 15705c51f124SMoriah Waterland * == B_FALSE - unable to transition the zone to the 15715c51f124SMoriah Waterland * specified state 15725c51f124SMoriah Waterland * NOTE: This changes the "current kernel" state of the specified 15735c51f124SMoriah Waterland * zone. For example, to boot the zone, change the state 15745c51f124SMoriah Waterland * to "ZONE_STATE_RUNNING". To halt the zone, change the 15755c51f124SMoriah Waterland * state to "ZONE_STATE_INSTALLED". 15765c51f124SMoriah Waterland */ 15775c51f124SMoriah Waterland 15785c51f124SMoriah Waterland boolean_t 15795c51f124SMoriah Waterland z_zlist_change_zone_state(zoneList_t a_zlst, int a_zoneIndex, 15805c51f124SMoriah Waterland zone_state_t a_newState) 15815c51f124SMoriah Waterland { 15825c51f124SMoriah Waterland int i; 15835c51f124SMoriah Waterland 15845c51f124SMoriah Waterland /* entry debugging info */ 15855c51f124SMoriah Waterland 15865c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_CHG_Z_STATE_ENTRY, a_zoneIndex, a_newState); 15875c51f124SMoriah Waterland 15885c51f124SMoriah Waterland /* ignore empty list */ 15895c51f124SMoriah Waterland 15905c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 15915c51f124SMoriah Waterland return (B_FALSE); 15925c51f124SMoriah Waterland } 15935c51f124SMoriah Waterland 15945c51f124SMoriah Waterland /* find the specified zone in the list */ 15955c51f124SMoriah Waterland 15965c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 15975c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 15985c51f124SMoriah Waterland ; 15995c51f124SMoriah Waterland 16005c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 16015c51f124SMoriah Waterland 16025c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 16035c51f124SMoriah Waterland return (B_FALSE); 16045c51f124SMoriah Waterland } 16055c51f124SMoriah Waterland 16065c51f124SMoriah Waterland /* return success if the zone is already in this state */ 16075c51f124SMoriah Waterland 16085c51f124SMoriah Waterland if (a_zlst[i]._zlCurrKernelStatus == a_newState) { 16095c51f124SMoriah Waterland return (B_TRUE); 16105c51f124SMoriah Waterland } 16115c51f124SMoriah Waterland 16125c51f124SMoriah Waterland /* take action on new state to set zone to */ 16135c51f124SMoriah Waterland 16145c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_CHG_Z_STATE, a_zlst[i]._zlName, 16155c51f124SMoriah Waterland a_zlst[i]._zlCurrKernelStatus, a_newState); 16165c51f124SMoriah Waterland 16175c51f124SMoriah Waterland switch (a_newState) { 16185c51f124SMoriah Waterland case ZONE_STATE_RUNNING: 16195c51f124SMoriah Waterland case ZONE_STATE_MOUNTED: 16205c51f124SMoriah Waterland /* these states mean "boot the zone" */ 16215c51f124SMoriah Waterland return (_z_make_zone_running(&a_zlst[i])); 16225c51f124SMoriah Waterland 16235c51f124SMoriah Waterland case ZONE_STATE_DOWN: 16245c51f124SMoriah Waterland case ZONE_STATE_INSTALLED: 16255c51f124SMoriah Waterland /* these states mean "halt the zone" */ 16265c51f124SMoriah Waterland return (_z_make_zone_down(&a_zlst[i])); 16275c51f124SMoriah Waterland 16285c51f124SMoriah Waterland case ZONE_STATE_READY: 16295c51f124SMoriah Waterland return (_z_make_zone_ready(&a_zlst[i])); 16305c51f124SMoriah Waterland 16315c51f124SMoriah Waterland case ZONE_STATE_CONFIGURED: 16325c51f124SMoriah Waterland case ZONE_STATE_INCOMPLETE: 16335c51f124SMoriah Waterland case ZONE_STATE_SHUTTING_DOWN: 16345c51f124SMoriah Waterland default: 16355c51f124SMoriah Waterland /* do not know how to change zone to this state */ 16365c51f124SMoriah Waterland return (B_FALSE); 16375c51f124SMoriah Waterland } 16385c51f124SMoriah Waterland } 16395c51f124SMoriah Waterland 16405c51f124SMoriah Waterland /* 16415c51f124SMoriah Waterland * Name: z_is_zone_branded 16425c51f124SMoriah Waterland * Description: Determine whether zone has a non-native brand 16435c51f124SMoriah Waterland * Arguments: a_zoneName - name of the zone to check for branding 16445c51f124SMoriah Waterland * Returns: boolean_t 16455c51f124SMoriah Waterland * == B_TRUE - zone has a non-native brand 16465c51f124SMoriah Waterland * == B_FALSE - zone is native 16475c51f124SMoriah Waterland */ 16485c51f124SMoriah Waterland boolean_t 16495c51f124SMoriah Waterland z_is_zone_branded(char *zoneName) 16505c51f124SMoriah Waterland { 16515c51f124SMoriah Waterland char brandname[MAXNAMELEN]; 16525c51f124SMoriah Waterland int err; 16535c51f124SMoriah Waterland 16545c51f124SMoriah Waterland /* if zones are not implemented, return FALSE */ 16555c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 16565c51f124SMoriah Waterland return (B_FALSE); 16575c51f124SMoriah Waterland } 16585c51f124SMoriah Waterland 16595c51f124SMoriah Waterland /* if brands are not implemented, return FALSE */ 16605c51f124SMoriah Waterland if (!z_brands_are_implemented()) { 16615c51f124SMoriah Waterland return (B_FALSE); 16625c51f124SMoriah Waterland } 16635c51f124SMoriah Waterland 16645c51f124SMoriah Waterland err = zone_get_brand(zoneName, brandname, sizeof (brandname)); 16655c51f124SMoriah Waterland if (err != Z_OK) { 16665c51f124SMoriah Waterland _z_program_error(ERR_BRAND_GETBRAND, zonecfg_strerror(err)); 16675c51f124SMoriah Waterland return (B_FALSE); 16685c51f124SMoriah Waterland } 16695c51f124SMoriah Waterland 16705c51f124SMoriah Waterland /* 16715c51f124SMoriah Waterland * Both "native" and "cluster" are native brands 16725c51f124SMoriah Waterland * that use the standard facilities in the areas 16735c51f124SMoriah Waterland * of packaging/installation/patching/update. 16745c51f124SMoriah Waterland */ 16755c51f124SMoriah Waterland if (streq(brandname, NATIVE_BRAND_NAME) || 16765c51f124SMoriah Waterland streq(brandname, CLUSTER_BRAND_NAME)) { 16775c51f124SMoriah Waterland return (B_FALSE); 16785c51f124SMoriah Waterland } else { 16795c51f124SMoriah Waterland return (B_TRUE); 16805c51f124SMoriah Waterland } 16815c51f124SMoriah Waterland } 16825c51f124SMoriah Waterland 16835c51f124SMoriah Waterland /* 16845c51f124SMoriah Waterland * Name: z_is_zone_brand_in_list 16855c51f124SMoriah Waterland * Description: Determine whether zone's brand has a match in the list 16865c51f124SMoriah Waterland * brands passed in. 16875c51f124SMoriah Waterland * Arguments: zoneName - name of the zone to check for branding 16885c51f124SMoriah Waterland * list - list of brands to check the zone against 16895c51f124SMoriah Waterland * Returns: boolean_t 16905c51f124SMoriah Waterland * == B_TRUE - zone has a matching brand 16915c51f124SMoriah Waterland * == B_FALSE - zone brand is not in list 16925c51f124SMoriah Waterland */ 16935c51f124SMoriah Waterland boolean_t 16945c51f124SMoriah Waterland z_is_zone_brand_in_list(char *zoneName, zoneBrandList_t *list) 16955c51f124SMoriah Waterland { 16965c51f124SMoriah Waterland char brandname[MAXNAMELEN]; 16975c51f124SMoriah Waterland int err; 16985c51f124SMoriah Waterland zoneBrandList_t *sp; 16995c51f124SMoriah Waterland 17005c51f124SMoriah Waterland if (zoneName == NULL || list == NULL) 17015c51f124SMoriah Waterland return (B_FALSE); 17025c51f124SMoriah Waterland 17035c51f124SMoriah Waterland /* if zones are not implemented, return FALSE */ 17045c51f124SMoriah Waterland if (!z_zones_are_implemented()) { 17055c51f124SMoriah Waterland return (B_FALSE); 17065c51f124SMoriah Waterland } 17075c51f124SMoriah Waterland 17085c51f124SMoriah Waterland /* if brands are not implemented, return FALSE */ 17095c51f124SMoriah Waterland if (!z_brands_are_implemented()) { 17105c51f124SMoriah Waterland return (B_FALSE); 17115c51f124SMoriah Waterland } 17125c51f124SMoriah Waterland 17135c51f124SMoriah Waterland err = zone_get_brand(zoneName, brandname, sizeof (brandname)); 17145c51f124SMoriah Waterland if (err != Z_OK) { 17155c51f124SMoriah Waterland _z_program_error(ERR_BRAND_GETBRAND, zonecfg_strerror(err)); 17165c51f124SMoriah Waterland return (B_FALSE); 17175c51f124SMoriah Waterland } 17185c51f124SMoriah Waterland 17195c51f124SMoriah Waterland for (sp = list; sp != NULL; sp = sp->next) { 17205c51f124SMoriah Waterland if (sp->string_ptr != NULL && 17215c51f124SMoriah Waterland strcmp(sp->string_ptr, brandname) == 0) { 17225c51f124SMoriah Waterland return (B_TRUE); 17235c51f124SMoriah Waterland } 17245c51f124SMoriah Waterland } 17255c51f124SMoriah Waterland 17265c51f124SMoriah Waterland return (B_FALSE); 17275c51f124SMoriah Waterland } 17285c51f124SMoriah Waterland 17295c51f124SMoriah Waterland /* 17305c51f124SMoriah Waterland * Name: z_zlist_get_current_state 17315c51f124SMoriah Waterland * Description: Determine the current kernel state of the specified zone 17325c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 17335c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return 17345c51f124SMoriah Waterland * Returns: zone_state_t 17355c51f124SMoriah Waterland * The current state of the specified zone is returned 17365c51f124SMoriah Waterland */ 17375c51f124SMoriah Waterland 17385c51f124SMoriah Waterland zone_state_t 17395c51f124SMoriah Waterland z_zlist_get_current_state(zoneList_t a_zlst, int a_zoneIndex) 17405c51f124SMoriah Waterland { 17415c51f124SMoriah Waterland int i; 17425c51f124SMoriah Waterland 17435c51f124SMoriah Waterland /* ignore empty list */ 17445c51f124SMoriah Waterland 17455c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 17465c51f124SMoriah Waterland return (ZONE_STATE_INCOMPLETE); 17475c51f124SMoriah Waterland } 17485c51f124SMoriah Waterland 17495c51f124SMoriah Waterland /* find the specified zone in the list */ 17505c51f124SMoriah Waterland 17515c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 17525c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 17535c51f124SMoriah Waterland ; 17545c51f124SMoriah Waterland 17555c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 17565c51f124SMoriah Waterland 17575c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 17585c51f124SMoriah Waterland return (ZONE_STATE_INCOMPLETE); 17595c51f124SMoriah Waterland } 17605c51f124SMoriah Waterland 17615c51f124SMoriah Waterland /* return selected zone's current kernel state */ 17625c51f124SMoriah Waterland 17635c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_GET_ZONE_STATE, 17645c51f124SMoriah Waterland a_zlst[i]._zlName ? a_zlst[i]._zlName : "", 17655c51f124SMoriah Waterland a_zlst[i]._zlCurrKernelStatus); 17665c51f124SMoriah Waterland 17675c51f124SMoriah Waterland return (a_zlst[i]._zlCurrKernelStatus); 17685c51f124SMoriah Waterland } 17695c51f124SMoriah Waterland 17705c51f124SMoriah Waterland /* 17715c51f124SMoriah Waterland * Name: z_zlist_get_original_state 17725c51f124SMoriah Waterland * Description: Return the original kernal state of the specified zone 17735c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 17745c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the 17755c51f124SMoriah Waterland * Returns: zone_state_t 17765c51f124SMoriah Waterland * The original state of the specified zone is returned. 17775c51f124SMoriah Waterland * This is the state of the zone when the zoneList_t 17785c51f124SMoriah Waterland * object was first generated. 17795c51f124SMoriah Waterland */ 17805c51f124SMoriah Waterland 17815c51f124SMoriah Waterland zone_state_t 17825c51f124SMoriah Waterland z_zlist_get_original_state(zoneList_t a_zlst, int a_zoneIndex) 17835c51f124SMoriah Waterland { 17845c51f124SMoriah Waterland int i; 17855c51f124SMoriah Waterland 17865c51f124SMoriah Waterland /* ignore empty list */ 17875c51f124SMoriah Waterland 17885c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 17895c51f124SMoriah Waterland return (ZONE_STATE_INCOMPLETE); 17905c51f124SMoriah Waterland } 17915c51f124SMoriah Waterland 17925c51f124SMoriah Waterland /* find the specified zone in the list */ 17935c51f124SMoriah Waterland 17945c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 17955c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 17965c51f124SMoriah Waterland ; 17975c51f124SMoriah Waterland 17985c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 17995c51f124SMoriah Waterland 18005c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 18015c51f124SMoriah Waterland return (ZONE_STATE_INCOMPLETE); 18025c51f124SMoriah Waterland } 18035c51f124SMoriah Waterland 18045c51f124SMoriah Waterland /* return selected zone's original kernel state */ 18055c51f124SMoriah Waterland 18065c51f124SMoriah Waterland return (a_zlst[i]._zlOrigKernelStatus); 18075c51f124SMoriah Waterland } 18085c51f124SMoriah Waterland 18095c51f124SMoriah Waterland /* 18105c51f124SMoriah Waterland * Name: z_zlist_get_scratch 18115c51f124SMoriah Waterland * Description: Determine name of scratch zone 18125c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 18135c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to use 18145c51f124SMoriah Waterland * Return: char * 18155c51f124SMoriah Waterland * == NULL - zone name could not be determined 18165c51f124SMoriah Waterland * != NULL - pointer to string representing scratch zone 18175c51f124SMoriah Waterland * NOTE: Any name returned is placed in static storage that must 18185c51f124SMoriah Waterland * NEVER be free()ed by the caller. 18195c51f124SMoriah Waterland */ 18205c51f124SMoriah Waterland 18215c51f124SMoriah Waterland char * 18225c51f124SMoriah Waterland z_zlist_get_scratch(zoneList_t a_zlst, int a_zoneIndex) 18235c51f124SMoriah Waterland { 18245c51f124SMoriah Waterland int i; 18255c51f124SMoriah Waterland 18265c51f124SMoriah Waterland /* ignore empty list */ 18275c51f124SMoriah Waterland 18285c51f124SMoriah Waterland if (a_zlst == NULL) 18295c51f124SMoriah Waterland return (NULL); 18305c51f124SMoriah Waterland 18315c51f124SMoriah Waterland /* find the specified zone in the list */ 18325c51f124SMoriah Waterland 18335c51f124SMoriah Waterland for (i = 0; i != a_zoneIndex; i++) { 18345c51f124SMoriah Waterland if (a_zlst[i]._zlName == NULL) 18355c51f124SMoriah Waterland return (NULL); 18365c51f124SMoriah Waterland } 18375c51f124SMoriah Waterland 18385c51f124SMoriah Waterland /* return selected zone's scratch name */ 18395c51f124SMoriah Waterland 18405c51f124SMoriah Waterland return (a_zlst[i]._zlScratchName == NULL ? a_zlst[i]._zlName : 18415c51f124SMoriah Waterland a_zlst[i]._zlScratchName); 18425c51f124SMoriah Waterland } 18435c51f124SMoriah Waterland 18445c51f124SMoriah Waterland /* 18455c51f124SMoriah Waterland * Name: z_zlist_get_zonename 18465c51f124SMoriah Waterland * Description: Determine name of specified zone 18475c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 18485c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the 18495c51f124SMoriah Waterland * Return: char * 18505c51f124SMoriah Waterland * == NULL - zone name could not be determined 18515c51f124SMoriah Waterland * != NULL - pointer to string representing zone name 18525c51f124SMoriah Waterland * NOTE: Any zoneList_t returned is placed in static storage that must 18535c51f124SMoriah Waterland * NEVER be free()ed by the caller. 18545c51f124SMoriah Waterland */ 18555c51f124SMoriah Waterland 18565c51f124SMoriah Waterland char * 18575c51f124SMoriah Waterland z_zlist_get_zonename(zoneList_t a_zlst, int a_zoneIndex) 18585c51f124SMoriah Waterland { 18595c51f124SMoriah Waterland int i; 18605c51f124SMoriah Waterland 18615c51f124SMoriah Waterland /* ignore empty list */ 18625c51f124SMoriah Waterland 18635c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 18645c51f124SMoriah Waterland return ((char *)NULL); 18655c51f124SMoriah Waterland } 18665c51f124SMoriah Waterland 18675c51f124SMoriah Waterland /* find the specified zone in the list */ 18685c51f124SMoriah Waterland 18695c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 18705c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 18715c51f124SMoriah Waterland ; 18725c51f124SMoriah Waterland 18735c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 18745c51f124SMoriah Waterland 18755c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 18765c51f124SMoriah Waterland return (NULL); 18775c51f124SMoriah Waterland } 18785c51f124SMoriah Waterland 18795c51f124SMoriah Waterland /* return selected zone's name */ 18805c51f124SMoriah Waterland 18815c51f124SMoriah Waterland return (a_zlst[i]._zlName); 18825c51f124SMoriah Waterland } 18835c51f124SMoriah Waterland 18845c51f124SMoriah Waterland /* 18855c51f124SMoriah Waterland * Name: z_zlist_get_zonepath 18865c51f124SMoriah Waterland * Description: Determine zonepath of specified zone 18875c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 18885c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return 18895c51f124SMoriah Waterland * Return: char * 18905c51f124SMoriah Waterland * == NULL - zonepath could not be determined 18915c51f124SMoriah Waterland * != NULL - pointer to string representing zonepath 18925c51f124SMoriah Waterland * NOTE: Any zoneList_t returned is placed in static storage that must 18935c51f124SMoriah Waterland * NEVER be free()ed by the caller. 18945c51f124SMoriah Waterland */ 18955c51f124SMoriah Waterland 18965c51f124SMoriah Waterland char * 18975c51f124SMoriah Waterland z_zlist_get_zonepath(zoneList_t a_zlst, int a_zoneIndex) 18985c51f124SMoriah Waterland { 18995c51f124SMoriah Waterland int i; 19005c51f124SMoriah Waterland 19015c51f124SMoriah Waterland /* ignore empty list */ 19025c51f124SMoriah Waterland 19035c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 19045c51f124SMoriah Waterland return ((char *)NULL); 19055c51f124SMoriah Waterland } 19065c51f124SMoriah Waterland 19075c51f124SMoriah Waterland /* find the specified zone in the list */ 19085c51f124SMoriah Waterland 19095c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 19105c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 19115c51f124SMoriah Waterland ; 19125c51f124SMoriah Waterland 19135c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 19145c51f124SMoriah Waterland 19155c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 19165c51f124SMoriah Waterland return (NULL); 19175c51f124SMoriah Waterland } 19185c51f124SMoriah Waterland 19195c51f124SMoriah Waterland /* return selected zone's zonepath */ 19205c51f124SMoriah Waterland 19215c51f124SMoriah Waterland return (a_zlst[i]._zlPath); 19225c51f124SMoriah Waterland } 19235c51f124SMoriah Waterland 19245c51f124SMoriah Waterland boolean_t 19255c51f124SMoriah Waterland z_zlist_is_zone_runnable(zoneList_t a_zlst, int a_zoneIndex) 19265c51f124SMoriah Waterland { 19275c51f124SMoriah Waterland int i; 19285c51f124SMoriah Waterland 19295c51f124SMoriah Waterland /* if zones are not implemented, return error */ 19305c51f124SMoriah Waterland 19315c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 19325c51f124SMoriah Waterland return (B_FALSE); 19335c51f124SMoriah Waterland } 19345c51f124SMoriah Waterland 19355c51f124SMoriah Waterland /* ignore empty list */ 19365c51f124SMoriah Waterland 19375c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 19385c51f124SMoriah Waterland return (B_FALSE); 19395c51f124SMoriah Waterland } 19405c51f124SMoriah Waterland 19415c51f124SMoriah Waterland /* find the specified zone in the list */ 19425c51f124SMoriah Waterland 19435c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 19445c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 19455c51f124SMoriah Waterland ; 19465c51f124SMoriah Waterland 19475c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 19485c51f124SMoriah Waterland 19495c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 19505c51f124SMoriah Waterland return (B_FALSE); 19515c51f124SMoriah Waterland } 19525c51f124SMoriah Waterland 19535c51f124SMoriah Waterland /* choose based on current state */ 19545c51f124SMoriah Waterland 19555c51f124SMoriah Waterland switch (a_zlst[i]._zlCurrKernelStatus) { 19565c51f124SMoriah Waterland case ZONE_STATE_RUNNING: 19575c51f124SMoriah Waterland case ZONE_STATE_MOUNTED: 19585c51f124SMoriah Waterland /* already running */ 19595c51f124SMoriah Waterland return (B_TRUE); 19605c51f124SMoriah Waterland 19615c51f124SMoriah Waterland case ZONE_STATE_INSTALLED: 19625c51f124SMoriah Waterland case ZONE_STATE_DOWN: 19635c51f124SMoriah Waterland case ZONE_STATE_READY: 19645c51f124SMoriah Waterland case ZONE_STATE_SHUTTING_DOWN: 19655c51f124SMoriah Waterland /* return false if the zone cannot be booted */ 19665c51f124SMoriah Waterland 19675c51f124SMoriah Waterland if (a_zlst[i]._zlStatus & ZST_NOT_BOOTABLE) { 19685c51f124SMoriah Waterland return (B_FALSE); 19695c51f124SMoriah Waterland } 19705c51f124SMoriah Waterland 19715c51f124SMoriah Waterland return (B_TRUE); 19725c51f124SMoriah Waterland 19735c51f124SMoriah Waterland case ZONE_STATE_CONFIGURED: 19745c51f124SMoriah Waterland case ZONE_STATE_INCOMPLETE: 19755c51f124SMoriah Waterland default: 19765c51f124SMoriah Waterland /* cannot transition (boot) these states */ 19775c51f124SMoriah Waterland return (B_FALSE); 19785c51f124SMoriah Waterland } 19795c51f124SMoriah Waterland } 19805c51f124SMoriah Waterland 19815c51f124SMoriah Waterland /* 19825c51f124SMoriah Waterland * Name: z_zlist_restore_zone_state 19835c51f124SMoriah Waterland * Description: Return the zone to the state it was originally in 19845c51f124SMoriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones 19855c51f124SMoriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the 19865c51f124SMoriah Waterland * Returns: boolean_t 19875c51f124SMoriah Waterland * == B_TRUE - the zone's state has been restored 19885c51f124SMoriah Waterland * == B_FALSE - unable to transition the zone to its 19895c51f124SMoriah Waterland * original state 19905c51f124SMoriah Waterland */ 19915c51f124SMoriah Waterland 19925c51f124SMoriah Waterland boolean_t 19935c51f124SMoriah Waterland z_zlist_restore_zone_state(zoneList_t a_zlst, int a_zoneIndex) 19945c51f124SMoriah Waterland { 19955c51f124SMoriah Waterland int i; 19965c51f124SMoriah Waterland 19975c51f124SMoriah Waterland /* ignore empty list */ 19985c51f124SMoriah Waterland 19995c51f124SMoriah Waterland if (a_zlst == (zoneList_t)NULL) { 20005c51f124SMoriah Waterland return (B_FALSE); 20015c51f124SMoriah Waterland } 20025c51f124SMoriah Waterland 20035c51f124SMoriah Waterland /* find the specified zone in the list */ 20045c51f124SMoriah Waterland 20055c51f124SMoriah Waterland for (i = 0; (i != a_zoneIndex) && 20065c51f124SMoriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++) 20075c51f124SMoriah Waterland ; 20085c51f124SMoriah Waterland 20095c51f124SMoriah Waterland /* return error if the specified zone does not exist */ 20105c51f124SMoriah Waterland 20115c51f124SMoriah Waterland if (a_zlst[i]._zlName == (char *)NULL) { 20125c51f124SMoriah Waterland return (B_FALSE); 20135c51f124SMoriah Waterland } 20145c51f124SMoriah Waterland 20155c51f124SMoriah Waterland /* transition the zone back to its original state */ 20165c51f124SMoriah Waterland 20175c51f124SMoriah Waterland return (z_zlist_change_zone_state(a_zlst, 20185c51f124SMoriah Waterland a_zoneIndex, a_zlst[i]._zlOrigKernelStatus)); 20195c51f124SMoriah Waterland } 20205c51f124SMoriah Waterland 20215c51f124SMoriah Waterland /* 20225c51f124SMoriah Waterland * Name: z_zone_exec 20235c51f124SMoriah Waterland * Description: Execute a Unix command in a specified zone and return results 20245c51f124SMoriah Waterland * Arguments: a_zoneName - pointer to string representing the name of the zone 20255c51f124SMoriah Waterland * to execute the specified command in 20265c51f124SMoriah Waterland * a_path - pointer to string representing the full path *in the 20275c51f124SMoriah Waterland * non-global zone named by a_zoneName* of the Unix command 20285c51f124SMoriah Waterland * to be executed 20295c51f124SMoriah Waterland * a_argv[] - Pointer to array of character strings representing 20305c51f124SMoriah Waterland * the arguments to be passed to the Unix command. The list 20315c51f124SMoriah Waterland * must be termianted with an element that is (char *)NULL 20325c51f124SMoriah Waterland * NOTE: a_argv[0] is the "command name" passed to the command 20335c51f124SMoriah Waterland * a_stdoutPath - Pointer to string representing the path to a file 20345c51f124SMoriah Waterland * into which all output to "stdout" from the Unix command 20355c51f124SMoriah Waterland * is placed. 20365c51f124SMoriah Waterland * == (char *)NULL - leave stdout open and pass through 20375c51f124SMoriah Waterland * == "/dev/null" - discard stdout output 20385c51f124SMoriah Waterland * a_strerrPath - Pointer to string representing the path to a file 20395c51f124SMoriah Waterland * into which all output to "stderr" from the Unix command 20405c51f124SMoriah Waterland * is placed. 20415c51f124SMoriah Waterland * == (char *)NULL - leave stderr open and pass through 20425c51f124SMoriah Waterland * == "/dev/null" - discard stderr output 20435c51f124SMoriah Waterland * a_fds - Pointer to array of integers representing file 20445c51f124SMoriah Waterland * descriptors to remain open during the call - all 20455c51f124SMoriah Waterland * file descriptors above STDERR_FILENO not in this 20465c51f124SMoriah Waterland * list will be closed. 20475c51f124SMoriah Waterland * Returns: int 20485c51f124SMoriah Waterland * The return (exit) code from the specified Unix command 20495c51f124SMoriah Waterland * Special return codes: 20505c51f124SMoriah Waterland * -1 : failure to exec process 20515c51f124SMoriah Waterland * -2 : could not create contract for greenline 20525c51f124SMoriah Waterland * -3 : fork() failed 20535c51f124SMoriah Waterland * -4 : could not open stdout capture file 20545c51f124SMoriah Waterland * -5 : error from 'waitpid' other than EINTR 20555c51f124SMoriah Waterland * -6 : zones are not supported 20565c51f124SMoriah Waterland * NOTE: All file descriptores other than 0, 1 and 2 are closed except 20575c51f124SMoriah Waterland * for those file descriptors listed in the a_fds array. 20585c51f124SMoriah Waterland */ 20595c51f124SMoriah Waterland 20605c51f124SMoriah Waterland int 20615c51f124SMoriah Waterland z_zone_exec(const char *a_zoneName, const char *a_path, char *a_argv[], 20625c51f124SMoriah Waterland char *a_stdoutPath, char *a_stderrPath, int *a_fds) 20635c51f124SMoriah Waterland { 20645c51f124SMoriah Waterland int final_status; 20655c51f124SMoriah Waterland int lerrno; 20665c51f124SMoriah Waterland int status; 20675c51f124SMoriah Waterland int tmpl_fd; 20685c51f124SMoriah Waterland pid_t child_pid; 20695c51f124SMoriah Waterland pid_t result_pid; 20705c51f124SMoriah Waterland struct sigaction nact; 20715c51f124SMoriah Waterland struct sigaction oact; 20725c51f124SMoriah Waterland void (*funcSighup)(); 20735c51f124SMoriah Waterland void (*funcSigint)(); 20745c51f124SMoriah Waterland 20755c51f124SMoriah Waterland /* if zones are not implemented, return TRUE */ 20765c51f124SMoriah Waterland 20775c51f124SMoriah Waterland if (z_zones_are_implemented() == B_FALSE) { 20785c51f124SMoriah Waterland return (-6); /* -6 : zones are not supported */ 20795c51f124SMoriah Waterland } 20805c51f124SMoriah Waterland 20815c51f124SMoriah Waterland if ((tmpl_fd = _zexec_init_template()) == -1) { 20825c51f124SMoriah Waterland _z_program_error(ERR_CANNOT_CREATE_CONTRACT, strerror(errno)); 20835c51f124SMoriah Waterland return (-2); /* -2 : could not create greenline contract */ 20845c51f124SMoriah Waterland } 20855c51f124SMoriah Waterland 20865c51f124SMoriah Waterland /* 20875c51f124SMoriah Waterland * hold SIGINT/SIGHUP signals and reset signal received counter; 20885c51f124SMoriah Waterland * after the fork1() the parent and child need to setup their respective 20895c51f124SMoriah Waterland * interrupt handling and release the hold on the signals 20905c51f124SMoriah Waterland */ 20915c51f124SMoriah Waterland 20925c51f124SMoriah Waterland (void) sighold(SIGINT); 20935c51f124SMoriah Waterland (void) sighold(SIGHUP); 20945c51f124SMoriah Waterland 20955c51f124SMoriah Waterland _z_global_data._z_SigReceived = 0; /* no signals received */ 20965c51f124SMoriah Waterland 20975c51f124SMoriah Waterland /* 20985c51f124SMoriah Waterland * fork off a new process to execute command in; 20995c51f124SMoriah Waterland * fork1() is used instead of vfork() so the child process can 21005c51f124SMoriah Waterland * perform operations that would modify the parent process if 21015c51f124SMoriah Waterland * vfork() were used 21025c51f124SMoriah Waterland */ 21035c51f124SMoriah Waterland 21045c51f124SMoriah Waterland child_pid = fork1(); 21055c51f124SMoriah Waterland 21065c51f124SMoriah Waterland if (child_pid < 0) { 21075c51f124SMoriah Waterland /* 21085c51f124SMoriah Waterland * ************************************************************* 21095c51f124SMoriah Waterland * fork failed! 21105c51f124SMoriah Waterland * ************************************************************* 21115c51f124SMoriah Waterland */ 21125c51f124SMoriah Waterland 21135c51f124SMoriah Waterland (void) ct_tmpl_clear(tmpl_fd); 21145c51f124SMoriah Waterland (void) close(tmpl_fd); 21155c51f124SMoriah Waterland _z_program_error(ERR_FORK, strerror(errno)); 21165c51f124SMoriah Waterland 21175c51f124SMoriah Waterland /* release hold on signals */ 21185c51f124SMoriah Waterland 21195c51f124SMoriah Waterland (void) sigrelse(SIGHUP); 21205c51f124SMoriah Waterland (void) sigrelse(SIGINT); 21215c51f124SMoriah Waterland 21225c51f124SMoriah Waterland return (-3); /* -3 : fork() failed */ 21235c51f124SMoriah Waterland } 21245c51f124SMoriah Waterland 21255c51f124SMoriah Waterland if (child_pid == 0) { 21265c51f124SMoriah Waterland int i; 21275c51f124SMoriah Waterland 21285c51f124SMoriah Waterland /* 21295c51f124SMoriah Waterland * ************************************************************* 21305c51f124SMoriah Waterland * This is the forked (child) process 21315c51f124SMoriah Waterland * ************************************************************* 21325c51f124SMoriah Waterland */ 21335c51f124SMoriah Waterland 21345c51f124SMoriah Waterland (void) ct_tmpl_clear(tmpl_fd); 21355c51f124SMoriah Waterland (void) close(tmpl_fd); 21365c51f124SMoriah Waterland 21375c51f124SMoriah Waterland /* reset any signals to default */ 21385c51f124SMoriah Waterland 21395c51f124SMoriah Waterland for (i = 0; i < NSIG; i++) { 21405c51f124SMoriah Waterland (void) sigset(i, SIG_DFL); 21415c51f124SMoriah Waterland } 21425c51f124SMoriah Waterland 21435c51f124SMoriah Waterland /* 21445c51f124SMoriah Waterland * close all file descriptors not in the a_fds list 21455c51f124SMoriah Waterland */ 21465c51f124SMoriah Waterland 21475c51f124SMoriah Waterland (void) fdwalk(&_z_close_file_descriptors, (void *)a_fds); 21485c51f124SMoriah Waterland 21495c51f124SMoriah Waterland /* 21505c51f124SMoriah Waterland * if a file for stdout is present, open the file and use the 21515c51f124SMoriah Waterland * file to capture stdout from the _zexec process 21525c51f124SMoriah Waterland */ 21535c51f124SMoriah Waterland 21545c51f124SMoriah Waterland if (a_stdoutPath != (char *)NULL) { 21555c51f124SMoriah Waterland int stdoutfd; 21565c51f124SMoriah Waterland 21575c51f124SMoriah Waterland stdoutfd = open(a_stdoutPath, 21585c51f124SMoriah Waterland O_WRONLY|O_CREAT|O_TRUNC, 0600); 21595c51f124SMoriah Waterland if (stdoutfd < 0) { 21605c51f124SMoriah Waterland _z_program_error(ERR_CAPTURE_FILE, a_stdoutPath, 21615c51f124SMoriah Waterland strerror(errno)); 21625c51f124SMoriah Waterland return (-4); 21635c51f124SMoriah Waterland } 21645c51f124SMoriah Waterland 21655c51f124SMoriah Waterland (void) dup2(stdoutfd, STDOUT_FILENO); 21665c51f124SMoriah Waterland (void) close(stdoutfd); 21675c51f124SMoriah Waterland } 21685c51f124SMoriah Waterland 21695c51f124SMoriah Waterland /* 21705c51f124SMoriah Waterland * if a file for stderr is present, open the file and use the 21715c51f124SMoriah Waterland * file to capture stderr from the _zexec process 21725c51f124SMoriah Waterland */ 21735c51f124SMoriah Waterland 21745c51f124SMoriah Waterland if (a_stderrPath != (char *)NULL) { 21755c51f124SMoriah Waterland int stderrfd; 21765c51f124SMoriah Waterland 21775c51f124SMoriah Waterland stderrfd = open(a_stderrPath, 21785c51f124SMoriah Waterland O_WRONLY|O_CREAT|O_TRUNC, 0600); 21795c51f124SMoriah Waterland if (stderrfd < 0) { 21805c51f124SMoriah Waterland _z_program_error(ERR_CAPTURE_FILE, a_stderrPath, 21815c51f124SMoriah Waterland strerror(errno)); 21825c51f124SMoriah Waterland return (-4); 21835c51f124SMoriah Waterland } 21845c51f124SMoriah Waterland 21855c51f124SMoriah Waterland (void) dup2(stderrfd, STDERR_FILENO); 21865c51f124SMoriah Waterland (void) close(stderrfd); 21875c51f124SMoriah Waterland } 21885c51f124SMoriah Waterland 21895c51f124SMoriah Waterland /* release all held signals */ 21905c51f124SMoriah Waterland 21915c51f124SMoriah Waterland (void) sigrelse(SIGHUP); 21925c51f124SMoriah Waterland (void) sigrelse(SIGINT); 21935c51f124SMoriah Waterland 21945c51f124SMoriah Waterland /* execute command in the specified non-global zone */ 21955c51f124SMoriah Waterland 21965c51f124SMoriah Waterland _exit(_zexec(a_zoneName, a_path, a_argv)); 21975c51f124SMoriah Waterland } 21985c51f124SMoriah Waterland 21995c51f124SMoriah Waterland /* 22005c51f124SMoriah Waterland * ********************************************************************* 22015c51f124SMoriah Waterland * This is the forking (parent) process 22025c51f124SMoriah Waterland * ********************************************************************* 22035c51f124SMoriah Waterland */ 22045c51f124SMoriah Waterland 22055c51f124SMoriah Waterland /* register child process i.d. so signal handlers can pass signal on */ 22065c51f124SMoriah Waterland 22075c51f124SMoriah Waterland _z_global_data._z_ChildProcessId = child_pid; 22085c51f124SMoriah Waterland 22095c51f124SMoriah Waterland /* 22105c51f124SMoriah Waterland * setup signal handlers for SIGINT and SIGHUP and release hold 22115c51f124SMoriah Waterland */ 22125c51f124SMoriah Waterland 22135c51f124SMoriah Waterland /* hook SIGINT to _z_sig_trap() */ 22145c51f124SMoriah Waterland 22155c51f124SMoriah Waterland nact.sa_handler = _z_sig_trap; 22165c51f124SMoriah Waterland nact.sa_flags = SA_RESTART; 22175c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask); 22185c51f124SMoriah Waterland 22195c51f124SMoriah Waterland if (sigaction(SIGINT, &nact, &oact) < 0) { 22205c51f124SMoriah Waterland funcSigint = SIG_DFL; 22215c51f124SMoriah Waterland } else { 22225c51f124SMoriah Waterland funcSigint = oact.sa_handler; 22235c51f124SMoriah Waterland } 22245c51f124SMoriah Waterland 22255c51f124SMoriah Waterland /* hook SIGHUP to _z_sig_trap() */ 22265c51f124SMoriah Waterland 22275c51f124SMoriah Waterland nact.sa_handler = _z_sig_trap; 22285c51f124SMoriah Waterland nact.sa_flags = SA_RESTART; 22295c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask); 22305c51f124SMoriah Waterland 22315c51f124SMoriah Waterland if (sigaction(SIGHUP, &nact, &oact) < 0) { 22325c51f124SMoriah Waterland funcSighup = SIG_DFL; 22335c51f124SMoriah Waterland } else { 22345c51f124SMoriah Waterland funcSighup = oact.sa_handler; 22355c51f124SMoriah Waterland } 22365c51f124SMoriah Waterland 22375c51f124SMoriah Waterland /* release hold on signals */ 22385c51f124SMoriah Waterland 22395c51f124SMoriah Waterland (void) sigrelse(SIGHUP); 22405c51f124SMoriah Waterland (void) sigrelse(SIGINT); 22415c51f124SMoriah Waterland 22425c51f124SMoriah Waterland (void) ct_tmpl_clear(tmpl_fd); 22435c51f124SMoriah Waterland (void) close(tmpl_fd); 22445c51f124SMoriah Waterland 22455c51f124SMoriah Waterland /* 22465c51f124SMoriah Waterland * wait for the process to exit, reap child exit status 22475c51f124SMoriah Waterland */ 22485c51f124SMoriah Waterland 22495c51f124SMoriah Waterland for (;;) { 22505c51f124SMoriah Waterland result_pid = waitpid(child_pid, &status, 0L); 22515c51f124SMoriah Waterland lerrno = (result_pid == -1 ? errno : 0); 22525c51f124SMoriah Waterland 22535c51f124SMoriah Waterland /* break loop if child process status reaped */ 22545c51f124SMoriah Waterland 22555c51f124SMoriah Waterland if (result_pid != -1) { 22565c51f124SMoriah Waterland break; 22575c51f124SMoriah Waterland } 22585c51f124SMoriah Waterland 22595c51f124SMoriah Waterland /* break loop if not interrupted out of waitpid */ 22605c51f124SMoriah Waterland 22615c51f124SMoriah Waterland if (errno != EINTR) { 22625c51f124SMoriah Waterland break; 22635c51f124SMoriah Waterland } 22645c51f124SMoriah Waterland } 22655c51f124SMoriah Waterland 22665c51f124SMoriah Waterland /* reset child process i.d. so signal handlers do not pass signals on */ 22675c51f124SMoriah Waterland 22685c51f124SMoriah Waterland _z_global_data._z_ChildProcessId = -1; 22695c51f124SMoriah Waterland 22705c51f124SMoriah Waterland /* 22715c51f124SMoriah Waterland * If the child process terminated due to a call to exit(), then 22725c51f124SMoriah Waterland * set results equal to the 8-bit exit status of the child process; 22735c51f124SMoriah Waterland * otherwise, set the exit status to "-1" indicating that the child 22745c51f124SMoriah Waterland * exited via a signal. 22755c51f124SMoriah Waterland */ 22765c51f124SMoriah Waterland 22775c51f124SMoriah Waterland if (WIFEXITED(status)) { 22785c51f124SMoriah Waterland final_status = WEXITSTATUS(status); 22795c51f124SMoriah Waterland if ((_z_global_data._z_SigReceived != 0) && 22805c51f124SMoriah Waterland (final_status == 0)) { 22815c51f124SMoriah Waterland final_status = 1; 22825c51f124SMoriah Waterland } 22835c51f124SMoriah Waterland } else { 22845c51f124SMoriah Waterland final_status = -1; /* -1 : failure to exec process */ 22855c51f124SMoriah Waterland } 22865c51f124SMoriah Waterland 22875c51f124SMoriah Waterland /* determine proper exit code */ 22885c51f124SMoriah Waterland 22895c51f124SMoriah Waterland if (result_pid == -1) { 22905c51f124SMoriah Waterland final_status = -5; /* -5 : error from waitpid not EINTR */ 22915c51f124SMoriah Waterland } else if (_z_global_data._z_SigReceived != 0) { 22925c51f124SMoriah Waterland final_status = -7; /* -7 : interrupt received */ 22935c51f124SMoriah Waterland } 22945c51f124SMoriah Waterland 22955c51f124SMoriah Waterland /* 22965c51f124SMoriah Waterland * reset signal handlers 22975c51f124SMoriah Waterland */ 22985c51f124SMoriah Waterland 22995c51f124SMoriah Waterland /* reset SIGINT */ 23005c51f124SMoriah Waterland 23015c51f124SMoriah Waterland nact.sa_handler = funcSigint; 23025c51f124SMoriah Waterland nact.sa_flags = SA_RESTART; 23035c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask); 23045c51f124SMoriah Waterland 23055c51f124SMoriah Waterland (void) sigaction(SIGINT, &nact, (struct sigaction *)NULL); 23065c51f124SMoriah Waterland 23075c51f124SMoriah Waterland /* reset SIGHUP */ 23085c51f124SMoriah Waterland 23095c51f124SMoriah Waterland nact.sa_handler = funcSighup; 23105c51f124SMoriah Waterland nact.sa_flags = SA_RESTART; 23115c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask); 23125c51f124SMoriah Waterland 23135c51f124SMoriah Waterland (void) sigaction(SIGHUP, &nact, (struct sigaction *)NULL); 23145c51f124SMoriah Waterland 23155c51f124SMoriah Waterland /* 23165c51f124SMoriah Waterland * if signal received during command execution, interrupt 23175c51f124SMoriah Waterland * this process now. 23185c51f124SMoriah Waterland */ 23195c51f124SMoriah Waterland 23205c51f124SMoriah Waterland if (_z_global_data._z_SigReceived != 0) { 23215c51f124SMoriah Waterland (void) kill(getpid(), SIGINT); 23225c51f124SMoriah Waterland } 23235c51f124SMoriah Waterland 23245c51f124SMoriah Waterland /* set errno and return */ 23255c51f124SMoriah Waterland 23265c51f124SMoriah Waterland errno = lerrno; 23275c51f124SMoriah Waterland 23285c51f124SMoriah Waterland return (final_status); 23295c51f124SMoriah Waterland } 23305c51f124SMoriah Waterland 23315c51f124SMoriah Waterland /* 23325c51f124SMoriah Waterland * Name: z_zones_are_implemented 23335c51f124SMoriah Waterland * Description: Determine if any zone operations can be performed 23345c51f124SMoriah Waterland * Arguments: void 23355c51f124SMoriah Waterland * Returns: boolean_t 23365c51f124SMoriah Waterland * == B_TRUE - zone operations are available 23375c51f124SMoriah Waterland * == B_FALSE - no zone operations can be done 23385c51f124SMoriah Waterland */ 23395c51f124SMoriah Waterland 23405c51f124SMoriah Waterland boolean_t 23415c51f124SMoriah Waterland z_zones_are_implemented(void) 23425c51f124SMoriah Waterland { 23435c51f124SMoriah Waterland static boolean_t _zonesImplementedDetermined = B_FALSE; 23445c51f124SMoriah Waterland static boolean_t _zonesAreImplemented = B_FALSE; 23455c51f124SMoriah Waterland 23465c51f124SMoriah Waterland /* if availability has not been determined, cache it now */ 23475c51f124SMoriah Waterland 23485c51f124SMoriah Waterland if (!_zonesImplementedDetermined) { 23495c51f124SMoriah Waterland _zonesImplementedDetermined = B_TRUE; 23505c51f124SMoriah Waterland _zonesAreImplemented = _z_zones_are_implemented(); 23515c51f124SMoriah Waterland if (!_zonesAreImplemented) { 23525c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_NOT_IMPLEMENTED); 23535c51f124SMoriah Waterland } else { 23545c51f124SMoriah Waterland _z_echoDebug(DBG_ZONES_ARE_IMPLEMENTED); 23555c51f124SMoriah Waterland } 23565c51f124SMoriah Waterland } 23575c51f124SMoriah Waterland 23585c51f124SMoriah Waterland return (_zonesAreImplemented); 23595c51f124SMoriah Waterland } 2360