1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * CDDL HEADER START 3*5c51f124SMoriah Waterland * 4*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 5*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 6*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 7*5c51f124SMoriah Waterland * 8*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 10*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 11*5c51f124SMoriah Waterland * and limitations under the License. 12*5c51f124SMoriah Waterland * 13*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 14*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 16*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 17*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 18*5c51f124SMoriah Waterland * 19*5c51f124SMoriah Waterland * CDDL HEADER END 20*5c51f124SMoriah Waterland */ 21*5c51f124SMoriah Waterland 22*5c51f124SMoriah Waterland /* 23*5c51f124SMoriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*5c51f124SMoriah Waterland * Use is subject to license terms. 25*5c51f124SMoriah Waterland */ 26*5c51f124SMoriah Waterland 27*5c51f124SMoriah Waterland 28*5c51f124SMoriah Waterland /* 29*5c51f124SMoriah Waterland * Module: zones_states.c 30*5c51f124SMoriah Waterland * Group: libinstzones 31*5c51f124SMoriah Waterland * Description: Provide "zones" state interfaces for install consolidation code 32*5c51f124SMoriah Waterland * 33*5c51f124SMoriah Waterland * Public Methods: 34*5c51f124SMoriah Waterland * 35*5c51f124SMoriah Waterland * z_make_zone_running - change state of non-global zone to "running" 36*5c51f124SMoriah Waterland * _z_make_zone_ready - change state of non-global zone to "ready" 37*5c51f124SMoriah Waterland * _z_make_zone_down - change state of non-global zone to "down" 38*5c51f124SMoriah Waterland */ 39*5c51f124SMoriah Waterland 40*5c51f124SMoriah Waterland /* 41*5c51f124SMoriah Waterland * System includes 42*5c51f124SMoriah Waterland */ 43*5c51f124SMoriah Waterland 44*5c51f124SMoriah Waterland #include <stdio.h> 45*5c51f124SMoriah Waterland #include <stdlib.h> 46*5c51f124SMoriah Waterland #include <unistd.h> 47*5c51f124SMoriah Waterland #include <fcntl.h> 48*5c51f124SMoriah Waterland #include <ctype.h> 49*5c51f124SMoriah Waterland #include <sys/types.h> 50*5c51f124SMoriah Waterland #include <sys/param.h> 51*5c51f124SMoriah Waterland #include <string.h> 52*5c51f124SMoriah Waterland #include <strings.h> 53*5c51f124SMoriah Waterland #include <sys/stat.h> 54*5c51f124SMoriah Waterland #include <stdarg.h> 55*5c51f124SMoriah Waterland #include <limits.h> 56*5c51f124SMoriah Waterland #include <errno.h> 57*5c51f124SMoriah Waterland #include <stropts.h> 58*5c51f124SMoriah Waterland #include <libintl.h> 59*5c51f124SMoriah Waterland #include <locale.h> 60*5c51f124SMoriah Waterland #include <assert.h> 61*5c51f124SMoriah Waterland 62*5c51f124SMoriah Waterland /* 63*5c51f124SMoriah Waterland * local includes 64*5c51f124SMoriah Waterland */ 65*5c51f124SMoriah Waterland 66*5c51f124SMoriah Waterland #include "instzones_lib.h" 67*5c51f124SMoriah Waterland #include "zones_strings.h" 68*5c51f124SMoriah Waterland 69*5c51f124SMoriah Waterland /* 70*5c51f124SMoriah Waterland * Private structures 71*5c51f124SMoriah Waterland */ 72*5c51f124SMoriah Waterland 73*5c51f124SMoriah Waterland /* 74*5c51f124SMoriah Waterland * Library Function Prototypes 75*5c51f124SMoriah Waterland */ 76*5c51f124SMoriah Waterland 77*5c51f124SMoriah Waterland /* 78*5c51f124SMoriah Waterland * Local Function Prototypes 79*5c51f124SMoriah Waterland */ 80*5c51f124SMoriah Waterland 81*5c51f124SMoriah Waterland /* 82*5c51f124SMoriah Waterland * global internal (private) declarations 83*5c51f124SMoriah Waterland */ 84*5c51f124SMoriah Waterland 85*5c51f124SMoriah Waterland /* 86*5c51f124SMoriah Waterland * ***************************************************************************** 87*5c51f124SMoriah Waterland * global external (public) functions 88*5c51f124SMoriah Waterland * ***************************************************************************** 89*5c51f124SMoriah Waterland */ 90*5c51f124SMoriah Waterland 91*5c51f124SMoriah Waterland /* 92*5c51f124SMoriah Waterland * Name: _z_make_zone_running 93*5c51f124SMoriah Waterland * Description: Given a zone element entry for the non-global zone to affect, 94*5c51f124SMoriah Waterland * change the state of that non-global zone to "running" 95*5c51f124SMoriah Waterland * Arguments: a_zlem - [RO, *RW] - (zoneListElement_t) 96*5c51f124SMoriah Waterland * Zone list element describing the non-global zone to 97*5c51f124SMoriah Waterland * make running 98*5c51f124SMoriah Waterland * Returns: boolean_t 99*5c51f124SMoriah Waterland * B_TRUE - non-global zone state changed successfully 100*5c51f124SMoriah Waterland * B_FALSE - failed to make the non-global zone run 101*5c51f124SMoriah Waterland */ 102*5c51f124SMoriah Waterland 103*5c51f124SMoriah Waterland boolean_t 104*5c51f124SMoriah Waterland _z_make_zone_running(zoneListElement_t *a_zlem) 105*5c51f124SMoriah Waterland { 106*5c51f124SMoriah Waterland FILE *fp; 107*5c51f124SMoriah Waterland argArray_t *args; 108*5c51f124SMoriah Waterland char zonename[ZONENAME_MAX]; 109*5c51f124SMoriah Waterland char *results = (char *)NULL; 110*5c51f124SMoriah Waterland int ret; 111*5c51f124SMoriah Waterland int status = 0; 112*5c51f124SMoriah Waterland 113*5c51f124SMoriah Waterland /* entry assertions */ 114*5c51f124SMoriah Waterland 115*5c51f124SMoriah Waterland assert(a_zlem != NULL); 116*5c51f124SMoriah Waterland 117*5c51f124SMoriah Waterland /* act based on the zone's current kernel state */ 118*5c51f124SMoriah Waterland 119*5c51f124SMoriah Waterland switch (a_zlem->_zlCurrKernelStatus) { 120*5c51f124SMoriah Waterland case ZONE_STATE_RUNNING: 121*5c51f124SMoriah Waterland case ZONE_STATE_MOUNTED: 122*5c51f124SMoriah Waterland /* already running */ 123*5c51f124SMoriah Waterland return (B_TRUE); 124*5c51f124SMoriah Waterland 125*5c51f124SMoriah Waterland case ZONE_STATE_READY: 126*5c51f124SMoriah Waterland /* This should never happen */ 127*5c51f124SMoriah Waterland if (zonecfg_in_alt_root()) 128*5c51f124SMoriah Waterland return (B_FALSE); 129*5c51f124SMoriah Waterland 130*5c51f124SMoriah Waterland /* 131*5c51f124SMoriah Waterland * We're going to upset the zone anyway, so might as well just 132*5c51f124SMoriah Waterland * halt it now and fall through to normal mounting. 133*5c51f124SMoriah Waterland */ 134*5c51f124SMoriah Waterland 135*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONEHALT, a_zlem->_zlName); 136*5c51f124SMoriah Waterland 137*5c51f124SMoriah Waterland args = _z_new_args(5); /* generate new arg list */ 138*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 139*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 140*5c51f124SMoriah Waterland (void) _z_add_arg(args, a_zlem->_zlName); 141*5c51f124SMoriah Waterland (void) _z_add_arg(args, "halt"); 142*5c51f124SMoriah Waterland 143*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, (char *)NULL, 144*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 145*5c51f124SMoriah Waterland 146*5c51f124SMoriah Waterland /* free generated argument list */ 147*5c51f124SMoriah Waterland 148*5c51f124SMoriah Waterland _z_free_args(args); 149*5c51f124SMoriah Waterland 150*5c51f124SMoriah Waterland if (ret != 0) { 151*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEHALT_EXEC, ZONEADM_CMD, 152*5c51f124SMoriah Waterland strerror(errno)); 153*5c51f124SMoriah Waterland free(results); 154*5c51f124SMoriah Waterland return (B_FALSE); 155*5c51f124SMoriah Waterland } 156*5c51f124SMoriah Waterland if (status != 0) { 157*5c51f124SMoriah Waterland if (status == -1) { 158*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_SIGNAL, 159*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName); 160*5c51f124SMoriah Waterland } else { 161*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_ERROR, 162*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName, status, 163*5c51f124SMoriah Waterland results == NULL ? "" : "\n", 164*5c51f124SMoriah Waterland results == NULL ? "" : results); 165*5c51f124SMoriah Waterland } 166*5c51f124SMoriah Waterland free(results); 167*5c51f124SMoriah Waterland return (B_FALSE); 168*5c51f124SMoriah Waterland } 169*5c51f124SMoriah Waterland 170*5c51f124SMoriah Waterland free(results); 171*5c51f124SMoriah Waterland 172*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_INSTALLED; 173*5c51f124SMoriah Waterland /* FALLTHROUGH */ 174*5c51f124SMoriah Waterland 175*5c51f124SMoriah Waterland case ZONE_STATE_INSTALLED: 176*5c51f124SMoriah Waterland case ZONE_STATE_DOWN: 177*5c51f124SMoriah Waterland /* return false if the zone cannot be booted */ 178*5c51f124SMoriah Waterland 179*5c51f124SMoriah Waterland if (a_zlem->_zlStatus & ZST_NOT_BOOTABLE) { 180*5c51f124SMoriah Waterland return (B_FALSE); 181*5c51f124SMoriah Waterland } 182*5c51f124SMoriah Waterland 183*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONERUNNING, a_zlem->_zlName); 184*5c51f124SMoriah Waterland 185*5c51f124SMoriah Waterland /* these states can be booted - do so */ 186*5c51f124SMoriah Waterland 187*5c51f124SMoriah Waterland args = _z_new_args(10); /* generate new arg list */ 188*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 189*5c51f124SMoriah Waterland if (zonecfg_in_alt_root()) { 190*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-R"); 191*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", 192*5c51f124SMoriah Waterland (char *)zonecfg_get_root()); 193*5c51f124SMoriah Waterland } 194*5c51f124SMoriah Waterland 195*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 196*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", a_zlem->_zlName); 197*5c51f124SMoriah Waterland (void) _z_add_arg(args, "mount"); 198*5c51f124SMoriah Waterland 199*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, (char *)NULL, 200*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 201*5c51f124SMoriah Waterland 202*5c51f124SMoriah Waterland /* free generated argument list */ 203*5c51f124SMoriah Waterland 204*5c51f124SMoriah Waterland _z_free_args(args); 205*5c51f124SMoriah Waterland 206*5c51f124SMoriah Waterland if (ret != 0) { 207*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_EXEC, ZONEADM_CMD, 208*5c51f124SMoriah Waterland strerror(errno)); 209*5c51f124SMoriah Waterland free(results); 210*5c51f124SMoriah Waterland return (B_FALSE); 211*5c51f124SMoriah Waterland } 212*5c51f124SMoriah Waterland 213*5c51f124SMoriah Waterland if (status != 0) { 214*5c51f124SMoriah Waterland if (status == -1) { 215*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_SIGNAL, 216*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName); 217*5c51f124SMoriah Waterland } else { 218*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_ERROR, 219*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName, status, 220*5c51f124SMoriah Waterland results == NULL ? "" : "\n", 221*5c51f124SMoriah Waterland results == NULL ? "" : results); 222*5c51f124SMoriah Waterland } 223*5c51f124SMoriah Waterland free(results); 224*5c51f124SMoriah Waterland 225*5c51f124SMoriah Waterland /* remember this zone cannot be booted */ 226*5c51f124SMoriah Waterland 227*5c51f124SMoriah Waterland a_zlem->_zlStatus |= ZST_NOT_BOOTABLE; 228*5c51f124SMoriah Waterland 229*5c51f124SMoriah Waterland return (B_FALSE); 230*5c51f124SMoriah Waterland } 231*5c51f124SMoriah Waterland free(results); 232*5c51f124SMoriah Waterland 233*5c51f124SMoriah Waterland if (zonecfg_in_alt_root()) { 234*5c51f124SMoriah Waterland if ((fp = zonecfg_open_scratch("", B_FALSE)) == NULL || 235*5c51f124SMoriah Waterland zonecfg_find_scratch(fp, a_zlem->_zlName, 236*5c51f124SMoriah Waterland zonecfg_get_root(), zonename, 237*5c51f124SMoriah Waterland sizeof (zonename)) == -1) { 238*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_DIDNT_BOOT, 239*5c51f124SMoriah Waterland a_zlem->_zlName); 240*5c51f124SMoriah Waterland if (fp != NULL) 241*5c51f124SMoriah Waterland zonecfg_close_scratch(fp); 242*5c51f124SMoriah Waterland return (B_FALSE); 243*5c51f124SMoriah Waterland } 244*5c51f124SMoriah Waterland zonecfg_close_scratch(fp); 245*5c51f124SMoriah Waterland free(a_zlem->_zlScratchName); 246*5c51f124SMoriah Waterland a_zlem->_zlScratchName = _z_strdup(zonename); 247*5c51f124SMoriah Waterland } 248*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_MOUNTED; 249*5c51f124SMoriah Waterland return (B_TRUE); 250*5c51f124SMoriah Waterland 251*5c51f124SMoriah Waterland case ZONE_STATE_CONFIGURED: 252*5c51f124SMoriah Waterland case ZONE_STATE_INCOMPLETE: 253*5c51f124SMoriah Waterland case ZONE_STATE_SHUTTING_DOWN: 254*5c51f124SMoriah Waterland default: 255*5c51f124SMoriah Waterland /* cannot transition (boot) these states */ 256*5c51f124SMoriah Waterland return (B_FALSE); 257*5c51f124SMoriah Waterland } 258*5c51f124SMoriah Waterland } 259*5c51f124SMoriah Waterland 260*5c51f124SMoriah Waterland /* 261*5c51f124SMoriah Waterland * Name: _z_make_zone_ready 262*5c51f124SMoriah Waterland * Description: Given a zone element entry for the non-global zone to affect, 263*5c51f124SMoriah Waterland * restore the ready state of the zone when the zone is currently 264*5c51f124SMoriah Waterland * in the running state. 265*5c51f124SMoriah Waterland * Arguments: a_zlem - [RO, *RW] - (zoneListElement_t) 266*5c51f124SMoriah Waterland * Zone list element describing the non-global zone to 267*5c51f124SMoriah Waterland * make ready 268*5c51f124SMoriah Waterland * Returns: boolean_t 269*5c51f124SMoriah Waterland * B_TRUE - non-global zone state changed successfully 270*5c51f124SMoriah Waterland * B_FALSE - failed to make the non-global zone ready 271*5c51f124SMoriah Waterland */ 272*5c51f124SMoriah Waterland 273*5c51f124SMoriah Waterland boolean_t 274*5c51f124SMoriah Waterland _z_make_zone_ready(zoneListElement_t *a_zlem) 275*5c51f124SMoriah Waterland { 276*5c51f124SMoriah Waterland argArray_t *args; 277*5c51f124SMoriah Waterland char *results = (char *)NULL; 278*5c51f124SMoriah Waterland int status = 0; 279*5c51f124SMoriah Waterland int i; 280*5c51f124SMoriah Waterland int ret; 281*5c51f124SMoriah Waterland zone_state_t st; 282*5c51f124SMoriah Waterland 283*5c51f124SMoriah Waterland /* entry assertions */ 284*5c51f124SMoriah Waterland 285*5c51f124SMoriah Waterland assert(a_zlem != (zoneListElement_t *)NULL); 286*5c51f124SMoriah Waterland 287*5c51f124SMoriah Waterland /* act based on the zone's current kernel state */ 288*5c51f124SMoriah Waterland 289*5c51f124SMoriah Waterland switch (a_zlem->_zlCurrKernelStatus) { 290*5c51f124SMoriah Waterland case ZONE_STATE_DOWN: 291*5c51f124SMoriah Waterland case ZONE_STATE_READY: 292*5c51f124SMoriah Waterland /* already down */ 293*5c51f124SMoriah Waterland return (B_TRUE); 294*5c51f124SMoriah Waterland 295*5c51f124SMoriah Waterland case ZONE_STATE_MOUNTED: 296*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONEUNMOUNT, a_zlem->_zlName); 297*5c51f124SMoriah Waterland 298*5c51f124SMoriah Waterland args = _z_new_args(10); /* generate new arg list */ 299*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 300*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 301*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", a_zlem->_zlName); 302*5c51f124SMoriah Waterland (void) _z_add_arg(args, "unmount"); 303*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, NULL, 304*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 305*5c51f124SMoriah Waterland if (ret != 0) { 306*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEUNMOUNT_EXEC, 307*5c51f124SMoriah Waterland ZONEADM_CMD, strerror(errno)); 308*5c51f124SMoriah Waterland free(results); 309*5c51f124SMoriah Waterland _z_free_args(args); 310*5c51f124SMoriah Waterland return (B_FALSE); 311*5c51f124SMoriah Waterland } 312*5c51f124SMoriah Waterland if (status != 0) { 313*5c51f124SMoriah Waterland if (status == -1) { 314*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEUNMOUNT_CMD_SIGNAL, 315*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName); 316*5c51f124SMoriah Waterland } else { 317*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEUNMOUNT_CMD_ERROR, 318*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName, status, 319*5c51f124SMoriah Waterland results == NULL ? "" : "\n", 320*5c51f124SMoriah Waterland results == NULL ? "" : results); 321*5c51f124SMoriah Waterland } 322*5c51f124SMoriah Waterland if (results != NULL) { 323*5c51f124SMoriah Waterland free(results); 324*5c51f124SMoriah Waterland } 325*5c51f124SMoriah Waterland _z_free_args(args); 326*5c51f124SMoriah Waterland return (B_FALSE); 327*5c51f124SMoriah Waterland } 328*5c51f124SMoriah Waterland if (results != NULL) { 329*5c51f124SMoriah Waterland free(results); 330*5c51f124SMoriah Waterland } 331*5c51f124SMoriah Waterland _z_free_args(args); 332*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_INSTALLED; 333*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONEREADY, a_zlem->_zlName); 334*5c51f124SMoriah Waterland 335*5c51f124SMoriah Waterland args = _z_new_args(10); /* generate new arg list */ 336*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 337*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 338*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", a_zlem->_zlName); 339*5c51f124SMoriah Waterland (void) _z_add_arg(args, "ready"); 340*5c51f124SMoriah Waterland 341*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, NULL, 342*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 343*5c51f124SMoriah Waterland if (ret != 0) { 344*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEREADY_EXEC, ZONEADM_CMD, 345*5c51f124SMoriah Waterland strerror(errno)); 346*5c51f124SMoriah Waterland free(results); 347*5c51f124SMoriah Waterland _z_free_args(args); 348*5c51f124SMoriah Waterland return (B_FALSE); 349*5c51f124SMoriah Waterland } 350*5c51f124SMoriah Waterland if (status != 0) { 351*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEREADY_CMDFAIL, ZONEADM_CMD, 352*5c51f124SMoriah Waterland a_zlem->_zlName, strerror(errno), 353*5c51f124SMoriah Waterland results == NULL ? "" : "\n", 354*5c51f124SMoriah Waterland results == NULL ? "" : results); 355*5c51f124SMoriah Waterland if (results != NULL) { 356*5c51f124SMoriah Waterland free(results); 357*5c51f124SMoriah Waterland } 358*5c51f124SMoriah Waterland _z_free_args(args); 359*5c51f124SMoriah Waterland return (B_FALSE); 360*5c51f124SMoriah Waterland } 361*5c51f124SMoriah Waterland if (results != NULL) { 362*5c51f124SMoriah Waterland free(results); 363*5c51f124SMoriah Waterland } 364*5c51f124SMoriah Waterland /* success - zone is now in the ready state */ 365*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_READY; 366*5c51f124SMoriah Waterland return (B_TRUE); 367*5c51f124SMoriah Waterland 368*5c51f124SMoriah Waterland case ZONE_STATE_RUNNING: 369*5c51f124SMoriah Waterland 370*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONEREADY, a_zlem->_zlName); 371*5c51f124SMoriah Waterland 372*5c51f124SMoriah Waterland args = _z_new_args(10); /* generate new arg list */ 373*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 374*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 375*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", a_zlem->_zlName); 376*5c51f124SMoriah Waterland (void) _z_add_arg(args, "ready"); 377*5c51f124SMoriah Waterland 378*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, (char *)NULL, 379*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 380*5c51f124SMoriah Waterland 381*5c51f124SMoriah Waterland /* free generated argument list */ 382*5c51f124SMoriah Waterland 383*5c51f124SMoriah Waterland _z_free_args(args); 384*5c51f124SMoriah Waterland 385*5c51f124SMoriah Waterland if (ret != 0) { 386*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEREADY_EXEC, ZONEADM_CMD, 387*5c51f124SMoriah Waterland strerror(errno)); 388*5c51f124SMoriah Waterland free(results); 389*5c51f124SMoriah Waterland _z_free_args(args); 390*5c51f124SMoriah Waterland return (B_FALSE); 391*5c51f124SMoriah Waterland } 392*5c51f124SMoriah Waterland if (status != 0) { 393*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEREADY_CMDFAIL, ZONEADM_CMD, 394*5c51f124SMoriah Waterland a_zlem->_zlName, strerror(errno), 395*5c51f124SMoriah Waterland results == (char *)NULL ? "" : "\n", 396*5c51f124SMoriah Waterland results == (char *)NULL ? "" : results); 397*5c51f124SMoriah Waterland if (results != (char *)NULL) { 398*5c51f124SMoriah Waterland (void) free(results); 399*5c51f124SMoriah Waterland } 400*5c51f124SMoriah Waterland return (B_FALSE); 401*5c51f124SMoriah Waterland } 402*5c51f124SMoriah Waterland 403*5c51f124SMoriah Waterland if (results != (char *)NULL) { 404*5c51f124SMoriah Waterland (void) free(results); 405*5c51f124SMoriah Waterland } 406*5c51f124SMoriah Waterland 407*5c51f124SMoriah Waterland for (i = 0; i < MAX_RETRIES; i++) { 408*5c51f124SMoriah Waterland if (zone_get_state(a_zlem->_zlName, &st) != Z_OK) { 409*5c51f124SMoriah Waterland break; 410*5c51f124SMoriah Waterland } 411*5c51f124SMoriah Waterland if ((st == ZONE_STATE_DOWN) || 412*5c51f124SMoriah Waterland (st == ZONE_STATE_INSTALLED)|| 413*5c51f124SMoriah Waterland (st == ZONE_STATE_READY)) { 414*5c51f124SMoriah Waterland break; 415*5c51f124SMoriah Waterland } 416*5c51f124SMoriah Waterland (void) sleep(RETRY_DELAY_SECS); 417*5c51f124SMoriah Waterland } 418*5c51f124SMoriah Waterland 419*5c51f124SMoriah Waterland /* failure if maximum retries reached */ 420*5c51f124SMoriah Waterland 421*5c51f124SMoriah Waterland if (i >= MAX_RETRIES) { 422*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEREADY_DIDNT_READY, 423*5c51f124SMoriah Waterland a_zlem->_zlName); 424*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = st; 425*5c51f124SMoriah Waterland return (B_FALSE); 426*5c51f124SMoriah Waterland } 427*5c51f124SMoriah Waterland 428*5c51f124SMoriah Waterland /* success - zone is now in the ready state */ 429*5c51f124SMoriah Waterland 430*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_READY; 431*5c51f124SMoriah Waterland 432*5c51f124SMoriah Waterland return (B_TRUE); 433*5c51f124SMoriah Waterland 434*5c51f124SMoriah Waterland case ZONE_STATE_INSTALLED: 435*5c51f124SMoriah Waterland case ZONE_STATE_CONFIGURED: 436*5c51f124SMoriah Waterland case ZONE_STATE_INCOMPLETE: 437*5c51f124SMoriah Waterland case ZONE_STATE_SHUTTING_DOWN: 438*5c51f124SMoriah Waterland default: 439*5c51f124SMoriah Waterland return (B_FALSE); 440*5c51f124SMoriah Waterland } 441*5c51f124SMoriah Waterland } 442*5c51f124SMoriah Waterland 443*5c51f124SMoriah Waterland /* 444*5c51f124SMoriah Waterland * Name: _z_make_zone_down 445*5c51f124SMoriah Waterland * Description: Given a zone element entry for the non-global zone to affect, 446*5c51f124SMoriah Waterland * change the state of that non-global zone to "down" 447*5c51f124SMoriah Waterland * Arguments: a_zlem - [RO, *RW] - (zoneListElement_t) 448*5c51f124SMoriah Waterland * Zone list element describing the non-global zone to 449*5c51f124SMoriah Waterland * make down 450*5c51f124SMoriah Waterland * Returns: boolean_t 451*5c51f124SMoriah Waterland * B_TRUE - non-global zone state changed successfully 452*5c51f124SMoriah Waterland * B_FALSE - failed to make the non-global zone down 453*5c51f124SMoriah Waterland */ 454*5c51f124SMoriah Waterland 455*5c51f124SMoriah Waterland boolean_t 456*5c51f124SMoriah Waterland _z_make_zone_down(zoneListElement_t *a_zlem) 457*5c51f124SMoriah Waterland { 458*5c51f124SMoriah Waterland argArray_t *args; 459*5c51f124SMoriah Waterland char *results = (char *)NULL; 460*5c51f124SMoriah Waterland int status = 0; 461*5c51f124SMoriah Waterland int ret; 462*5c51f124SMoriah Waterland 463*5c51f124SMoriah Waterland /* entry assertions */ 464*5c51f124SMoriah Waterland 465*5c51f124SMoriah Waterland assert(a_zlem != NULL); 466*5c51f124SMoriah Waterland 467*5c51f124SMoriah Waterland /* act based on the zone's current kernel state */ 468*5c51f124SMoriah Waterland 469*5c51f124SMoriah Waterland switch (a_zlem->_zlCurrKernelStatus) { 470*5c51f124SMoriah Waterland case ZONE_STATE_DOWN: 471*5c51f124SMoriah Waterland case ZONE_STATE_READY: 472*5c51f124SMoriah Waterland case ZONE_STATE_RUNNING: 473*5c51f124SMoriah Waterland /* shouldn't be touched */ 474*5c51f124SMoriah Waterland return (B_TRUE); 475*5c51f124SMoriah Waterland 476*5c51f124SMoriah Waterland case ZONE_STATE_MOUNTED: 477*5c51f124SMoriah Waterland 478*5c51f124SMoriah Waterland _z_echoDebug(DBG_TO_ZONEHALT, a_zlem->_zlName); 479*5c51f124SMoriah Waterland 480*5c51f124SMoriah Waterland /* these states can be halted - do so */ 481*5c51f124SMoriah Waterland 482*5c51f124SMoriah Waterland args = _z_new_args(10); /* generate new arg list */ 483*5c51f124SMoriah Waterland (void) _z_add_arg(args, ZONEADM_CMD); 484*5c51f124SMoriah Waterland 485*5c51f124SMoriah Waterland if (zonecfg_in_alt_root()) { 486*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-R"); 487*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", 488*5c51f124SMoriah Waterland (char *)zonecfg_get_root()); 489*5c51f124SMoriah Waterland } 490*5c51f124SMoriah Waterland 491*5c51f124SMoriah Waterland (void) _z_add_arg(args, "-z"); 492*5c51f124SMoriah Waterland (void) _z_add_arg(args, "%s", a_zlem->_zlName); 493*5c51f124SMoriah Waterland (void) _z_add_arg(args, "unmount"); 494*5c51f124SMoriah Waterland 495*5c51f124SMoriah Waterland ret = z_ExecCmdArray(&status, &results, (char *)NULL, 496*5c51f124SMoriah Waterland ZONEADM_CMD, _z_get_argv(args)); 497*5c51f124SMoriah Waterland 498*5c51f124SMoriah Waterland /* free generated argument list */ 499*5c51f124SMoriah Waterland 500*5c51f124SMoriah Waterland _z_free_args(args); 501*5c51f124SMoriah Waterland 502*5c51f124SMoriah Waterland if (ret != 0) { 503*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEHALT_EXEC, ZONEADM_CMD, 504*5c51f124SMoriah Waterland strerror(errno)); 505*5c51f124SMoriah Waterland free(results); 506*5c51f124SMoriah Waterland return (B_FALSE); 507*5c51f124SMoriah Waterland } 508*5c51f124SMoriah Waterland if (status != 0) { 509*5c51f124SMoriah Waterland if (status == -1) { 510*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_SIGNAL, 511*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName); 512*5c51f124SMoriah Waterland } else { 513*5c51f124SMoriah Waterland _z_program_error(ERR_ZONEBOOT_CMD_ERROR, 514*5c51f124SMoriah Waterland ZONEADM_CMD, a_zlem->_zlName, status, 515*5c51f124SMoriah Waterland results == NULL ? "" : "\n", 516*5c51f124SMoriah Waterland results == NULL ? "" : results); 517*5c51f124SMoriah Waterland } 518*5c51f124SMoriah Waterland free(results); 519*5c51f124SMoriah Waterland return (B_FALSE); 520*5c51f124SMoriah Waterland } 521*5c51f124SMoriah Waterland 522*5c51f124SMoriah Waterland free(results); 523*5c51f124SMoriah Waterland 524*5c51f124SMoriah Waterland a_zlem->_zlCurrKernelStatus = ZONE_STATE_INSTALLED; 525*5c51f124SMoriah Waterland /* 526*5c51f124SMoriah Waterland * Leave the scratch name in place because the upper level 527*5c51f124SMoriah Waterland * software may have used it to construct file names and the 528*5c51f124SMoriah Waterland * like. 529*5c51f124SMoriah Waterland */ 530*5c51f124SMoriah Waterland return (B_TRUE); 531*5c51f124SMoriah Waterland 532*5c51f124SMoriah Waterland case ZONE_STATE_INSTALLED: 533*5c51f124SMoriah Waterland case ZONE_STATE_CONFIGURED: 534*5c51f124SMoriah Waterland case ZONE_STATE_INCOMPLETE: 535*5c51f124SMoriah Waterland case ZONE_STATE_SHUTTING_DOWN: 536*5c51f124SMoriah Waterland default: 537*5c51f124SMoriah Waterland return (B_FALSE); 538*5c51f124SMoriah Waterland } 539*5c51f124SMoriah Waterland } 540*5c51f124SMoriah Waterland 541*5c51f124SMoriah Waterland /* 542*5c51f124SMoriah Waterland * Function: UmountAllZones 543*5c51f124SMoriah Waterland * Description: Unmount all mounted zones under a specified directory. 544*5c51f124SMoriah Waterland * 545*5c51f124SMoriah Waterland * Scope: public 546*5c51f124SMoriah Waterland * Parameters: mntpnt [RO, *RO] 547*5c51f124SMoriah Waterland * Non-NULL pointer to name of directory to be unmounted. 548*5c51f124SMoriah Waterland * Return: 0 - successfull 549*5c51f124SMoriah Waterland * -1 - unmount failed; see errno for reason 550*5c51f124SMoriah Waterland */ 551*5c51f124SMoriah Waterland int 552*5c51f124SMoriah Waterland UmountAllZones(char *mntpnt) { 553*5c51f124SMoriah Waterland 554*5c51f124SMoriah Waterland zoneList_t zlst; 555*5c51f124SMoriah Waterland int k; 556*5c51f124SMoriah Waterland int ret = 0; 557*5c51f124SMoriah Waterland 558*5c51f124SMoriah Waterland if (z_zones_are_implemented()) { 559*5c51f124SMoriah Waterland 560*5c51f124SMoriah Waterland z_set_zone_root(mntpnt); 561*5c51f124SMoriah Waterland 562*5c51f124SMoriah Waterland zlst = z_get_nonglobal_zone_list(); 563*5c51f124SMoriah Waterland if (zlst == (zoneList_t)NULL) { 564*5c51f124SMoriah Waterland return (0); 565*5c51f124SMoriah Waterland } 566*5c51f124SMoriah Waterland 567*5c51f124SMoriah Waterland for (k = 0; z_zlist_get_zonename(zlst, k) != (char *)NULL; 568*5c51f124SMoriah Waterland k++) { 569*5c51f124SMoriah Waterland if (z_zlist_get_current_state(zlst, k) > 570*5c51f124SMoriah Waterland ZONE_STATE_INSTALLED) { 571*5c51f124SMoriah Waterland if (!z_zlist_change_zone_state(zlst, k, 572*5c51f124SMoriah Waterland ZONE_STATE_INSTALLED)) { 573*5c51f124SMoriah Waterland ret = -1; 574*5c51f124SMoriah Waterland break; 575*5c51f124SMoriah Waterland } 576*5c51f124SMoriah Waterland } 577*5c51f124SMoriah Waterland } 578*5c51f124SMoriah Waterland 579*5c51f124SMoriah Waterland /* Free zlst */ 580*5c51f124SMoriah Waterland z_free_zone_list(zlst); 581*5c51f124SMoriah Waterland } 582*5c51f124SMoriah Waterland 583*5c51f124SMoriah Waterland return (ret); 584*5c51f124SMoriah Waterland 585*5c51f124SMoriah Waterland } 586