5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: zones.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Group: libinstzones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Provide "zones" interface for install consolidation code
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_create_zone_admin_file - Given a location to create the file, and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * optionally an existing administration file, generate an
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file that can be used to perform "non-interactive"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * operations in a non-global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_free_zone_list - free contents of zoneList_t object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_get_nonglobal_zone_list - return zoneList_t object describing all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global native zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_get_nonglobal_zone_list_by_brand - return zoneList_t object describing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all non-global zones matching the list of zone brands passed in.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_free_brand_list - free contents of a zoneBrandList_t object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_make_brand_list - return a zoneBrandList_t object describing the list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of all zone brands passed in.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_get_zonename - return the name of the current zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_global_only - Determine if the global zone is only zone on the spec list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_lock_this_zone - lock this zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_lock_zones - lock specified zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_mount_in_lz - Mount global zone directory in specified zone's root file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_non_global_zones_exist - Determine if any non-global native zones exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_on_zone_spec - Determine if named zone is on the zone_spec list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_running_in_global_zone - Determine if running in the "global" zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_set_output_functions - Link program specific output functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_set_zone_root - Set root for zones library operations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_set_zone_spec - Set list of zones on which actions will be performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_umount_lz_mount - Unmount directory mounted with z_mount_in_lz
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_unlock_this_zone - unlock this zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_unlock_zones - unlock specified zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_verify_zone_spec - Verify list of zones on which actions will be performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_change_zone_state - Change the current state of the specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_get_current_state - Determine the current kernel state of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_get_original_state - Return the original kernal state of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_get_scratch - Determine name of scratch zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_get_zonename - Determine name of specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_get_zonepath - Determine zonepath of specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zlist_restore_zone_state - Return the zone to the state it was originally
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zone_exec - Execute a Unix command in a specified zone and return results
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_zones_are_implemented - Determine if any zone operations can be performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_is_zone_branded - determine if zone has a non-native brand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_is_zone_brand_in_list - determine if the zone's brand matches the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * brand list passed in.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_brands_are_implemented - determine if branded zones are implemented on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * System includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/sysmacros.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <time.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stropts.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <wait.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <zone.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/brand.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libzonecfg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libcontract.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/contract/process.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/ctfs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dlfcn.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <link.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <time.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When _INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA is defined,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * instzones_lib.h will define the z_global_data structure.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Otherwise an extern to the structure is inserted.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define _INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "instzones_lib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "zones_strings.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private structures
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CLUSTER_BRAND_NAME "cluster"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* maximum number of arguments to exec() call */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define UUID_FORMAT "%02d%02d%02d%03d-%02d%02d%02d%d-%016llx"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Library Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define streq(a, b) (strcmp((a), (b)) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Local Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global internal (private) declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_create_zone_admin_file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a location to create the file, and optionally an existing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file, generate an administration file that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can be used to perform "non-interactive" operations in a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zoneAdminFilename - pointer to string representing the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * full path of zone admin file to create
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_userAdminFilename - pointer to string representing the path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to an existing "user" administration file - the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file created will contain the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * settings contained in this file, modified as
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate to supress any interaction;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is == NULL then the administration file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * created will not contain any extra settings
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - admin file created
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failed to create admin file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_create_zone_admin_file(char *a_zoneAdminFilename, char *a_userAdminFilename)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *zFp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *uFp = (FILE *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneAdminFilename != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneAdminFilename != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create temporary zone admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zFp = fopen(a_zoneAdminFilename, "w");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zFp == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open user admin file if specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_userAdminFilename != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland uFp = fopen(a_userAdminFilename, "r");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create default admin file for zone pkg ops if no user admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (uFp == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create default admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "action=nocheck\nauthentication=nocheck\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "basedir=default\nconflict=nocheck\nidepend=nocheck\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "instance=unique\npartial=nocheck\nrdepend=nocheck\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "runlevel=nocheck\nsetuid=nocheck\nspace=nocheck\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "mail=\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* copy user admin file substitute/change appropriate entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[LINE_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read next line of user admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = fgets(buf, sizeof (buf), uFp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(uFp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* modify / replace / accept as appropriate */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strncmp(buf, "instance=quit", 13) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "%s", "instance=unique\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*LINTED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "keystore=", 9) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "action=", 7) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "action=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "authentication=", 15) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "authentication=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "conflict=", 9) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "conflict=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "idepend=", 8) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "idepend=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "mail=", 5) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "mail=\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "partial=", 8) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "partial=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "rdepend=", 8) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "rdepend=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "runlevel=", 9) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "runlevel=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "setuid=", 7) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "setuid=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(buf, "space=", 6) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "space=nocheck\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(zFp, "%s", buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close admin file and return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(zFp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_brands_are_implemented
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if any branded zones may be present
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - branded zones are supported
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - branded zones are not supported
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_brands_are_implemented(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t _brandsImplementedDetermined = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t _brandsAreImplemented = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if availability has not been determined, cache it now */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!_brandsImplementedDetermined) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _brandsImplementedDetermined = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _brandsAreImplemented = _z_brands_are_implemented();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_brandsAreImplemented) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_BRANDS_ARE_IMPLEMENTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_BRANDS_NOT_IMPLEMENTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return cached answer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_brandsAreImplemented);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_free_zone_list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: free contents of zoneList_t object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object to free
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_free_zone_list(zoneList_t a_zlst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int numzones;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free each entry in the zone list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (numzones = 0; a_zlst[numzones]._zlName != (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland numzones++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneListElement_t *zelm = &a_zlst[numzones];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free zone name string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(zelm->_zlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free zonepath string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zelm->_zlPath != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(zelm->_zlPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free handle to the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_get_nonglobal_zone_list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: return zoneList_t object describing all non-global
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * native zones - branded zones are not included in list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: zoneList_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - error, list could not be generated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - success, list returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any zoneList_t returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'z_free_zone_list' to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dispose of the storage once the list is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandzoneList_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_get_nonglobal_zone_list(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneList_t zones;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneBrandList_t *brands = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((brands = z_make_brand_list("native cluster", " ")) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zones = z_get_nonglobal_zone_list_by_brand(brands);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_free_brand_list(brands);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (zones);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_free_brand_list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Free contents of zoneBrandList_t object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: brands - pointer to zoneBrandList_t object to free
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_free_brand_list(zoneBrandList_t *brands)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (brands != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneBrandList_t *temp = brands;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(brands->string_ptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brands = brands->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_make_brand_list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a string with a list of brand name delimited by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the delimeter passed in, build a zoneBrandList_t structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with the list of brand names and return it to the caller.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * brands - const char pointer to string list of brand names
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * delim - const char pointer to string representing the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * delimeter for brands string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: zoneBrandList_t *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - error, list could not be generated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - success, list returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any zoneBrandList_t returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'z_free_brand_list' to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dispose of the storage once the list is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandzoneBrandList_t *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_make_brand_list(const char *brands, const char *delim)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneBrandList_t *brand = NULL, *head = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *blist = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *str = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((blist = strdup(brands)) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((str = strtok(blist, delim)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((brand = (zoneBrandList_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland malloc(sizeof (struct _zoneBrandList))) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland head = brand;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brand->string_ptr = strdup(str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brand->next = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((str = strtok(NULL, delim)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((brand->next = (zoneBrandList_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland malloc(sizeof (struct _zoneBrandList))) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brand = brand->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brand->string_ptr = strdup(str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland brand->next = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(blist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (head);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_get_nonglobal_zone_list_by_brand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: return zoneList_t object describing all non-global
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zones matching the list of brands passed in.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: brands - The list of zone brands to look for.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: zoneList_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - error, list could not be generated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - success, list returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any zoneList_t returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'z_free_zone_list' to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dispose of the storage once the list is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandzoneList_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_get_nonglobal_zone_list_by_brand(zoneBrandList_t *brands)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *zoneIndexFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int numzones = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct zoneent *ze;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneList_t zlst = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *mapFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zonename[ZONENAME_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Open the zone index file. Note that getzoneent_private() handles
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndexFP = setzoneent();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mapFP = zonecfg_open_scratch("", B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index file open; scan all zones; see if any are at least installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_state_t st;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(ze->zone_name, GLOBAL_ZONENAME) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * skip any zones with brands not on the brand list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_is_zone_brand_in_list(ze->zone_name, brands)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the user specified an explicit zone list, then ignore any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zones that aren't on that list.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((zent = _z_global_data._zone_spec) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (zent != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent = zent->zl_next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zent == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* non-global zone: create entry for this zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (numzones == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst = (zoneList_t)_z_calloc(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (zoneListElement_t)*2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst = (zoneList_t)_z_realloc(zlst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (zoneListElement_t)*(numzones+2));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(&zlst[numzones], 0L,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (zoneListElement_t)*2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remember the zone name, zonepath and the current
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zone state of the zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlName = _z_strdup(ze->zone_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlPath = _z_strdup(ze->zone_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlOrigInstallState = ze->zone_state;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlCurrInstallState = ze->zone_state;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get the zone kernel status */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zone_get_state(ze->zone_name, &st) != Z_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland st = ZONE_STATE_INCOMPLETE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_NGZ_LIST_STATES,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ze->zone_name, ze->zone_state, st);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * For a scratch zone, we need to know the kernel zone name.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zonecfg_in_alt_root() && mapFP != NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_find_scratch(mapFP, ze->zone_name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_get_root(), zonename, sizeof (zonename)) != -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(zlst[numzones]._zlScratchName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlScratchName = _z_strdup(zonename);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remember the current kernel status of the zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlOrigKernelStatus = st;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst[numzones]._zlCurrKernelStatus = st;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland numzones++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the index file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endzoneent(zoneIndexFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapFP != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_close_scratch(mapFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return generated list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_get_zonename
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: return the name of the current zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - pointer to string representing the name of the current
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'Free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_get_zonename(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ssize_t zonenameLen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zonename[ZONENAME_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t zoneid = (zoneid_t)-1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return "" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_strdup(""));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get the zone i.d. of the current zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid = getzoneid();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get the name of the current zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonenameLen = getzonenamebyid(zoneid, zonename, sizeof (zonename));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return "" if could not get zonename */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zonenameLen < 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_strdup(""));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_strdup(zonename));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_global_only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if the global zone is only zone on the spec list.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE if global zone is the only zone on the list,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE otherwise.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_global_only(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if zones are not implemented - treate as global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if this is the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._zone_spec != NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._zone_spec->zl_next == NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(_z_global_data._zone_spec->zl_name, GLOBAL_ZONENAME) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return false - not the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_lock_this_zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: lock this zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_lflags - [RO, *RO] - (ZLOCKS_T)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Flags indicating which locks to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - success specified locks acquired
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failure specified locks not acquired
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: the lock objects for "this zone" are maintained internally.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_lock_this_zone(ZLOCKS_T a_lflags)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *zoneName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t pid = (pid_t)0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_lflags != ZLOCKS_NONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_LCK_THIS, a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid = getpid();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lock zone administration */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_lflags & ZLOCKS_ZONE_ADMIN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_lock_zone_object(&_z_global_data._z_ObjectLocks,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName, LOBJ_ZONEADMIN, pid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_ZONES_LCK_THIS_ZONEADM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_ZONES_LCK_THIS_ZONEADM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!b) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lock package administration always */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_lflags & ZLOCKS_PKG_ADMIN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_lock_zone_object(&_z_global_data._z_ObjectLocks,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName, LOBJ_PKGADMIN, pid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_ZONES_LCK_THIS_PKGADM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_ZONES_LCK_THIS_PKGADM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!b) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) z_unlock_this_zone(a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_lock_zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: lock specified zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - zoneList_t object describing zones to lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_lflags - [RO, *RO] - (ZLOCKS_T)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Flags indicating which locks to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - success, zones locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failure, zones not locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_lock_zones(zoneList_t a_zlst, ZLOCKS_T a_lflags)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_lflags != ZLOCKS_NONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES, a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return TRUE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_UNIMP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lock this zone first before locking other zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_lock_this_zone(a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (b);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_NOZONES);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* zones exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_LCK_ZONES_EXIST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock each listed zone that is currently running
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (a_zlst[i]._zlName != (char *)NULL); i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore zone if already locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlStatus & ZST_LOCKED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore zone if not running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_RUNNING &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mark zone locked - if interrupted out during lock, an attempt
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * will be made to release the lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlStatus |= ZST_LOCKED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lock this zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_lock_zone(&a_zlst[i], a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* on failure unlock all zones and return error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONES_LCK_ZONES_FAILED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) z_unlock_zones(a_zlst, a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_mount_in_lz
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Mount global zone directory in specified zone's root file system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_lzMountPoint - pointer to handle to string - on success, the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * full path to the mount point relative to the global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * root file system is returned here - this is needed to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unmount the directory when it is no longer needed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_lzRootPath - pointer to handle to string - on success, the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * full path to the mount point relative to the specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zone's root file system is returned here - this is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * passed to any command executing in the specified zone to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * access the directory mounted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneName - pointer to string representing the name of the zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to mount the specified global zone directory in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_gzPath - pointer to string representing the full absolute path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the global zone directory to LOFS mount inside of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified non-global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_mountPointPrefix - pointer to string representing the prefix
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be used when creating the mount point name in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified zone's root directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - global zone directory mounted successfully
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failed to mount directory in specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any strings returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'Free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the strings are no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_mount_in_lz(char **r_lzMountPoint, char **r_lzRootPath, char *a_zoneName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_gzPath, char *a_mountPointPrefix)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char lzRootPath[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char uuid[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char gzMountPoint[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char lzMountPoint[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hrtime_t hretime;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int slen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct tm tstruct;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t thetime;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t zid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_gzPath != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_gzPath != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_lzMountPoint != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_lzRootPath != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_MOUNT_IN_LZ_ENTRY, a_zoneName, a_gzPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned non-global zone mount point path handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_lzMountPoint = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_lzRootPath = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if global zone path is not absolute */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_gzPath != '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZPATH_NOT_ABSOLUTE, a_gzPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if global zone path does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_is_directory(a_gzPath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZPATH_NOT_DIR, a_gzPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify that specified non-global zone exists */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = zone_get_id(a_zoneName, &zid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != Z_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GET_ZONEID, a_zoneName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_strerror(err));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* obtain global zone path to non-global zones root file system */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = zone_get_rootpath(a_zoneName, lzRootPath, sizeof (lzRootPath));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != Z_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_NO_ZONE_ROOTPATH, a_zoneName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_strerror(err));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lzRootPath[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ROOTPATH_EMPTY, a_zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lofs resolve the non-global zone's root path first in case
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * its in a path that's been lofs mounted read-only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_resolve_lofs(lzRootPath, sizeof (lzRootPath));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify that the root path exists */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_is_directory(lzRootPath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_LZROOT_NOTDIR, lzRootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generate a unique key - the key is the same length as unique uid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * but contains different information that is as unique as can be made;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * include current hires time (nanosecond real timer). Such a unique
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * i.d. will look like:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0203104092-1145345-0004e94d6af481a0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hretime = gethrtime();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thetime = time((time_t *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) localtime_r(&thetime, &tstruct);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland slen = snprintf(uuid, sizeof (uuid),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland UUID_FORMAT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_mday, tstruct.tm_mon, tstruct.tm_year,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_yday, tstruct.tm_hour, tstruct.tm_min,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_sec, tstruct.tm_wday, hretime);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (slen > sizeof (uuid)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFUUID_FAILED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland UUID_FORMAT, sizeof (uuid));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create the global zone mount point */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland slen = snprintf(gzMountPoint, sizeof (gzMountPoint), "%s/.SUNW_%s_%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lzRootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_mountPointPrefix ? a_mountPointPrefix : "zones", uuid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (slen > sizeof (gzMountPoint)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFGMP_FAILED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/.SUNW_%s_%s", lzRootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_mountPointPrefix ? a_mountPointPrefix : "zones",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland uuid, sizeof (gzMountPoint));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland slen = snprintf(lzMountPoint, sizeof (lzMountPoint), "%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gzMountPoint+strlen(lzRootPath));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (slen > sizeof (lzMountPoint)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZMOUNT_SNPRINTFLMP_FAILED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s", gzMountPoint+strlen(lzRootPath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (lzMountPoint));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_MNTPT_NAMES, a_gzPath, a_zoneName, gzMountPoint,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if the mount point already exists */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_is_directory(gzMountPoint) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONEROOT_NOTDIR, gzMountPoint,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zoneName, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create the temporary mount point */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(gzMountPoint, 0600) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_MNTPT_MKDIR, gzMountPoint, a_zoneName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* mount the global zone path on the non-global zone root file system */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = mount(a_gzPath, gzMountPoint, MS_RDONLY|MS_DATA, "lofs",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL, 0, (char *)NULL, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZMOUNT_FAILED, a_gzPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gzMountPoint, a_zoneName, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success - return both mountpoints to caller */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_lzMountPoint = _z_strdup(gzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_lzRootPath = _z_strdup(lzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_non_global_zones_exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if any non-global native zones exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - at least one non-global native zone exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - no non-global native zone exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_non_global_zones_exist(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *zoneIndexFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t anyExist = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct zoneent *ze;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine if any zones are configured */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndexFP = setzoneent();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneIndexFP == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index file open; scan all zones; see if any are at least installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the user specified an explicit zone list, then ignore any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zones that aren't on that list.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((zent = _z_global_data._zone_spec) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (zent != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent = zent->zl_next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zent == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(ze->zone_name, GLOBAL_ZONENAME) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip any branded zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_is_zone_branded(ze->zone_name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is this zone installed? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ze->zone_state >= ZONE_STATE_INSTALLED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland anyExist = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the index file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endzoneent(zoneIndexFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (anyExist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_on_zone_spec
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if named zone is on the zone_spec list.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: Pointer to name to test.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE if named zone is on the list or if the user specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * no list at all (all zones is the default), B_FALSE otherwise.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_on_zone_spec(const char *zonename)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(zonename != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*zonename != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if zones not implemented or no zone spec list defined */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented() || _z_global_data._zone_spec == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if named zone is on the zone spec list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zent = _z_global_data._zone_spec;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent != NULL; zent = zent->zl_next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(zent->zl_name, zonename) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* named zone is not on the zone spec list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_running_in_global_zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if running in the "global" zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - running in global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - not running in global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_running_in_global_zone(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static boolean_t _zoneIdDetermined = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static boolean_t _zoneIsGlobal = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if ID has not been determined, cache it now */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!_zoneIdDetermined) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _zoneIdDetermined = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _zoneIsGlobal = _z_running_in_global_zone();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_zoneIsGlobal);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_set_output_functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Link program specific output functions to this library.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_echo_fcn - (_z_printf_fcn_t)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Function to call to cause "normal operation" messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be output/displayed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_echo_debug_fcn - (_z_printf_fcn_t)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Function to call to cause "debugging" messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be output/displayed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_progerr_fcn - (_z_printf_fcn_t)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Function to call to cause "program error" messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be output/displayed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: If NULL is specified for any function, then the functionality
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * associated with that function is disabled.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The function pointers provided must call a function that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * takes two arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * function(char *format, char *message)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Any registered function will be called like:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * function("%s", "message")
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_set_output_functions(_z_printf_fcn_t a_echo_fcn,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_printf_fcn_t a_echo_debug_fcn,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_printf_fcn_t a_progerr_fcn)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_echo = a_echo_fcn;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_echo_debug = a_echo_debug_fcn;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_progerr = a_progerr_fcn;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_set_zone_root
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Set root for zones library operations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: Path to root of boot environment containing zone; must be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * absolute.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: None.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Must be called before performing any zone-related operations.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (Currently called directly by set_inst_root() during -R
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * argument handling.)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_set_zone_root(const char *zroot)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rootdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(zroot != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootdir = _z_strdup((char *)zroot);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_canoninplace(rootdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(rootdir, "/") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootdir[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free any existing cached root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*_z_global_data._z_root_dir != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(_z_global_data._z_root_dir);
94a65b20fd6706171eba5212ea3ca67570ba7e12Abhinandan Ekande _z_global_data._z_root_dir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* store duplicate of new zone root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*rootdir != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_root_dir = _z_strdup(rootdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
94a65b20fd6706171eba5212ea3ca67570ba7e12Abhinandan Ekande _z_global_data._z_root_dir = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set zone root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonecfg_set_root(rootdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rootdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_set_zone_spec
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Set list of zones on which actions will be performed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: Whitespace-separated list of zone names.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: 0 on success, -1 on error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTES: Will call _z_program_error if argument can't be parsed or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * memory not available.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_set_zone_spec(const char *zlist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland const char *zend;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ptrdiff_t zlen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zhead;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t **znextp = &zhead;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(zlist != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parse list to zone_spec_t list, store in global data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isspace(*zlist)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlist++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*zlist == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zend = zlist; *zend != '\0'; zend++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isspace(*zend)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlen = ((ptrdiff_t)zend) - ((ptrdiff_t)zlist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zlen >= ZONENAME_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONE_NAME_ILLEGAL, zlen, zlist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent = _z_malloc(sizeof (*zent));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(zent->zl_name, zlist, zlen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent->zl_name[zlen] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent->zl_used = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *znextp = zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland znextp = &zent->zl_next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlist = zend;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *znextp = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zhead == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONE_LIST_EMPTY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._zone_spec = zhead;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_umount_lz_mount
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Unmount directory mounted with z_mount_in_lz
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_lzMountPointer - pointer to string returned by z_mount_in_lz
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - successfully unmounted directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failed to unmount directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_umount_lz_mount(char *a_lzMountPoint)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_lzMountPoint != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_lzMountPoint != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_UNMOUNT_FROM_LZ_ENTRY, a_lzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return TRUE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if global zone path is not absolute */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_lzMountPoint != '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_LZMNTPT_NOT_ABSOLUTE, a_lzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify mount point exists */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_is_directory(a_lzMountPoint) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_LZMNTPT_NOTDIR, a_lzMountPoint,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unmount */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = umount2(a_lzMountPoint, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_GZUMOUNT_FAILED, a_lzMountPoint,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove the mount point */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(a_lzMountPoint);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_unlock_this_zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: unlock this zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_lflags - [RO, *RO] - (ZLOCKS_T)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Flags indicating which locks to release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - success specified locks released
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failure specified locks may not be released
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: the lock objects for "this zone" are maintained internally.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_unlock_this_zone(ZLOCKS_T a_lflags)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t errors = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *zoneName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_lflags != ZLOCKS_NONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ULK_THIS, a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if no objects locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((_z_global_data._z_ObjectLocks == (char *)NULL) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*_z_global_data._z_ObjectLocks == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock package administration */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_lflags & ZLOCKS_PKG_ADMIN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_unlock_zone_object(&_z_global_data._z_ObjectLocks,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName, LOBJ_PKGADMIN, ERR_ZONES_ULK_THIS_PACKAGE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!b) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock zone administration */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_lflags & ZLOCKS_ZONE_ADMIN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_unlock_zone_object(&_z_global_data._z_ObjectLocks,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName, LOBJ_ZONEADMIN, ERR_ZONES_ULK_THIS_ZONES);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!b) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (!errors);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_unlock_zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: unlock specified zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - zoneList_t object describing zones to unlock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_lflags - [RO, *RO] - (ZLOCKS_T)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Flags indicating which locks to release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - success, zones unlocked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - failure, zones not unlocked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_unlock_zones(zoneList_t a_zlst, ZLOCKS_T a_lflags)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t errors = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_lflags != ZLOCKS_NONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES, a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return TRUE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_UNIMP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_NOZONES);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock this zone before returning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (z_unlock_this_zone(a_lflags));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* zones exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ULK_ZONES_EXIST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unlock each listed zone that is currently running
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (a_zlst[i]._zlName != (char *)NULL); i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore zone if not locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(a_zlst[i]._zlStatus & ZST_LOCKED)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore zone if not running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_RUNNING &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlCurrKernelStatus != ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock this zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = _z_unlock_zone(&a_zlst[i], a_lflags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* mark zone as unlocked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlStatus &= ~ZST_LOCKED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock this zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_unlock_this_zone(a_lflags) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errors);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_verify_zone_spec
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Verify list of zones on which actions will be performed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: 0 on success, -1 on error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTES: Will call _z_program_error if there are zones on the specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * list that don't exist on the system. Requires that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_set_zone_root is called first (if it is called at all).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_verify_zone_spec(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *zoneIndexFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t errors;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zoneIndexPath[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct zoneent *ze;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_spec_t *zent;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONES_NOT_IMPLEMENTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndexFP = setzoneent();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneIndexFP == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONEINDEX_OPEN, zoneIndexPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((ze = getzoneent_private(zoneIndexFP)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zent = _z_global_data._zone_spec;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent != NULL; zent = zent->zl_next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(zent->zl_name, ze->zone_name) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent->zl_used = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(ze);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endzoneent(zoneIndexFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zent = _z_global_data._zone_spec;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zent != NULL; zent = zent->zl_next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!zent->zl_used) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_ZONE_NONEXISTENT, zent->zl_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errors = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errors ? -1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_change_zone_state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Change the current state of the specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_newState - the state to put the specified zone in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - the zone is in the new state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - unable to transition the zone to the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This changes the "current kernel" state of the specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zone. For example, to boot the zone, change the state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to "ZONE_STATE_RUNNING". To halt the zone, change the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * state to "ZONE_STATE_INSTALLED".
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_change_zone_state(zoneList_t a_zlst, int a_zoneIndex,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_state_t a_newState)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_CHG_Z_STATE_ENTRY, a_zoneIndex, a_newState);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success if the zone is already in this state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlCurrKernelStatus == a_newState) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* take action on new state to set zone to */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_CHG_Z_STATE, a_zlst[i]._zlName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlCurrKernelStatus, a_newState);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (a_newState) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_RUNNING:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_MOUNTED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* these states mean "boot the zone" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_make_zone_running(&a_zlst[i]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_DOWN:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_INSTALLED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* these states mean "halt the zone" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_make_zone_down(&a_zlst[i]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_READY:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_z_make_zone_ready(&a_zlst[i]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_CONFIGURED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_INCOMPLETE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_SHUTTING_DOWN:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* do not know how to change zone to this state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_is_zone_branded
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine whether zone has a non-native brand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zoneName - name of the zone to check for branding
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - zone has a non-native brand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - zone is native
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_is_zone_branded(char *zoneName)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char brandname[MAXNAMELEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if brands are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_brands_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = zone_get_brand(zoneName, brandname, sizeof (brandname));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != Z_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_BRAND_GETBRAND, zonecfg_strerror(err));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Both "native" and "cluster" are native brands
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that use the standard facilities in the areas
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * of packaging/installation/update.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(brandname, NATIVE_BRAND_NAME) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland streq(brandname, CLUSTER_BRAND_NAME)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_is_zone_brand_in_list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine whether zone's brand has a match in the list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * brands passed in.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: zoneName - name of the zone to check for branding
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * list - list of brands to check the zone against
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - zone has a matching brand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - zone brand is not in list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_is_zone_brand_in_list(char *zoneName, zoneBrandList_t *list)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char brandname[MAXNAMELEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneBrandList_t *sp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName == NULL || list == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_zones_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if brands are not implemented, return FALSE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!z_brands_are_implemented()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = zone_get_brand(zoneName, brandname, sizeof (brandname));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (err != Z_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_BRAND_GETBRAND, zonecfg_strerror(err));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (sp = list; sp != NULL; sp = sp->next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sp->string_ptr != NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(sp->string_ptr, brandname) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_get_current_state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine the current kernel state of the specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: zone_state_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The current state of the specified zone is returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandzone_state_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_get_current_state(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ZONE_STATE_INCOMPLETE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ZONE_STATE_INCOMPLETE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return selected zone's current kernel state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_GET_ZONE_STATE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlName ? a_zlst[i]._zlName : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlCurrKernelStatus);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_zlst[i]._zlCurrKernelStatus);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_get_original_state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Return the original kernal state of the specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: zone_state_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The original state of the specified zone is returned.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This is the state of the zone when the zoneList_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object was first generated.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandzone_state_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_get_original_state(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ZONE_STATE_INCOMPLETE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ZONE_STATE_INCOMPLETE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return selected zone's original kernel state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_zlst[i]._zlOrigKernelStatus);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_get_scratch
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine name of scratch zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to use
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - zone name could not be determined
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - pointer to string representing scratch zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any name returned is placed in static storage that must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NEVER be free()ed by the caller.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_get_scratch(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i != a_zoneIndex; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return selected zone's scratch name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_zlst[i]._zlScratchName == NULL ? a_zlst[i]._zlName :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst[i]._zlScratchName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_get_zonename
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine name of specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - zone name could not be determined
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - pointer to string representing zone name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any zoneList_t returned is placed in static storage that must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NEVER be free()ed by the caller.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_get_zonename(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return selected zone's name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_zlst[i]._zlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_get_zonepath
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine zonepath of specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - zonepath could not be determined
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - pointer to string representing zonepath
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any zoneList_t returned is placed in static storage that must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NEVER be free()ed by the caller.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_get_zonepath(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return selected zone's zonepath */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_zlst[i]._zlPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_is_zone_runnable(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* choose based on current state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (a_zlst[i]._zlCurrKernelStatus) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_RUNNING:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_MOUNTED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* already running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_INSTALLED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_DOWN:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_READY:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_SHUTTING_DOWN:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return false if the zone cannot be booted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlStatus & ZST_NOT_BOOTABLE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_CONFIGURED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ZONE_STATE_INCOMPLETE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* cannot transition (boot) these states */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zlist_restore_zone_state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Return the zone to the state it was originally in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zlst - handle to zoneList_t object describing all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneIndex - index into a_zlst of the zone to return the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - the zone's state has been restored
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - unable to transition the zone to its
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * original state
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zlist_restore_zone_state(zoneList_t a_zlst, int a_zoneIndex)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore empty list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified zone in the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (i != a_zoneIndex) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_zlst[i]._zlName != (char *)NULL); i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if the specified zone does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst[i]._zlName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* transition the zone back to its original state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (z_zlist_change_zone_state(a_zlst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zoneIndex, a_zlst[i]._zlOrigKernelStatus));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zone_exec
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Execute a Unix command in a specified zone and return results
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_zoneName - pointer to string representing the name of the zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to execute the specified command in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_path - pointer to string representing the full path *in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zone named by a_zoneName* of the Unix command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be executed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_argv[] - Pointer to array of character strings representing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the arguments to be passed to the Unix command. The list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * must be termianted with an element that is (char *)NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: a_argv[0] is the "command name" passed to the command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_stdoutPath - Pointer to string representing the path to a file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * into which all output to "stdout" from the Unix command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is placed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - leave stdout open and pass through
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == "/dev/null" - discard stdout output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_strerrPath - Pointer to string representing the path to a file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * into which all output to "stderr" from the Unix command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is placed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - leave stderr open and pass through
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == "/dev/null" - discard stderr output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fds - Pointer to array of integers representing file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * descriptors to remain open during the call - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file descriptors above STDERR_FILENO not in this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * list will be closed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The return (exit) code from the specified Unix command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Special return codes:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -1 : failure to exec process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -2 : could not create contract for greenline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -3 : fork() failed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -4 : could not open stdout capture file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -5 : error from 'waitpid' other than EINTR
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -6 : zones are not supported
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: All file descriptores other than 0, 1 and 2 are closed except
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for those file descriptors listed in the a_fds array.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zone_exec(const char *a_zoneName, const char *a_path, char *a_argv[],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_stdoutPath, char *a_stderrPath, int *a_fds)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int final_status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int lerrno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int tmpl_fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t child_pid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t result_pid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction nact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction oact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void (*funcSighup)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void (*funcSigint)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if zones are not implemented, return TRUE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-6); /* -6 : zones are not supported */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmpl_fd = _zexec_init_template()) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_CANNOT_CREATE_CONTRACT, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-2); /* -2 : could not create greenline contract */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * hold SIGINT/SIGHUP signals and reset signal received counter;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * after the fork1() the parent and child need to setup their respective
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * interrupt handling and release the hold on the signals
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_SigReceived = 0; /* no signals received */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fork off a new process to execute command in;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fork1() is used instead of vfork() so the child process can
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * perform operations that would modify the parent process if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * vfork() were used
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland child_pid = fork1();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (child_pid < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fork failed!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ct_tmpl_clear(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_FORK, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-3); /* -3 : fork() failed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (child_pid == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This is the forked (child) process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ct_tmpl_clear(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset any signals to default */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < NSIG; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigset(i, SIG_DFL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * close all file descriptors not in the a_fds list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fdwalk(&_z_close_file_descriptors, (void *)a_fds);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if a file for stdout is present, open the file and use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file to capture stdout from the _zexec process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_stdoutPath != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int stdoutfd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stdoutfd = open(a_stdoutPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland O_WRONLY|O_CREAT|O_TRUNC, 0600);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stdoutfd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_CAPTURE_FILE, a_stdoutPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-4);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) dup2(stdoutfd, STDOUT_FILENO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(stdoutfd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if a file for stderr is present, open the file and use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file to capture stderr from the _zexec process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_stderrPath != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int stderrfd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stderrfd = open(a_stderrPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland O_WRONLY|O_CREAT|O_TRUNC, 0600);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stderrfd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_program_error(ERR_CAPTURE_FILE, a_stderrPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-4);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) dup2(stderrfd, STDERR_FILENO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(stderrfd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release all held signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute command in the specified non-global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _exit(_zexec(a_zoneName, a_path, a_argv));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This is the forking (parent) process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* register child process i.d. so signal handlers can pass signal on */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_ChildProcessId = child_pid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * setup signal handlers for SIGINT and SIGHUP and release hold
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hook SIGINT to _z_sig_trap() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = _z_sig_trap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGINT, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSigint = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSigint = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hook SIGHUP to _z_sig_trap() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = _z_sig_trap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGHUP, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSighup = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSighup = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ct_tmpl_clear(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(tmpl_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * wait for the process to exit, reap child exit status
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result_pid = waitpid(child_pid, &status, 0L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lerrno = (result_pid == -1 ? errno : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break loop if child process status reaped */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result_pid != -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break loop if not interrupted out of waitpid */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (errno != EINTR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset child process i.d. so signal handlers do not pass signals on */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_ChildProcessId = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the child process terminated due to a call to exit(), then
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * set results equal to the 8-bit exit status of the child process;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise, set the exit status to "-1" indicating that the child
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * exited via a signal.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (WIFEXITED(status)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final_status = WEXITSTATUS(status);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((_z_global_data._z_SigReceived != 0) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (final_status == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final_status = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final_status = -1; /* -1 : failure to exec process */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine proper exit code */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result_pid == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final_status = -5; /* -5 : error from waitpid not EINTR */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (_z_global_data._z_SigReceived != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final_status = -7; /* -7 : interrupt received */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * reset signal handlers
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset SIGINT */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = funcSigint;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGINT, &nact, (struct sigaction *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset SIGHUP */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = funcSighup;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGHUP, &nact, (struct sigaction *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if signal received during command execution, interrupt
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this process now.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._z_SigReceived != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) kill(getpid(), SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set errno and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = lerrno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (final_status);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: z_zones_are_implemented
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if any zone operations can be performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - zone operations are available
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - no zone operations can be done
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandz_zones_are_implemented(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static boolean_t _zonesImplementedDetermined = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static boolean_t _zonesAreImplemented = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if availability has not been determined, cache it now */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!_zonesImplementedDetermined) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _zonesImplementedDetermined = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _zonesAreImplemented = _z_zones_are_implemented();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!_zonesAreImplemented) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_NOT_IMPLEMENTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_ZONES_ARE_IMPLEMENTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (_zonesAreImplemented);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}