1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 26 27#ifndef _INSTZONES_LIB_H 28#define _INSTZONES_LIB_H 29 30 31/* 32 * Module: instzones_lib.h 33 * Group: libinstzones 34 * Description: This module contains the libinstzones internal data structures, 35 * constants, and function prototypes. This include should not be 36 * needed by any external code (consumers of this library). 37 */ 38 39/* 40 * required includes 41 */ 42 43/* System includes */ 44 45#include <zone.h> 46#include <libzonecfg.h> 47#include <libcontract.h> 48#include <instzones_api.h> 49 50 51 52/* 53 * C++ prefix 54 */ 55 56#ifdef __cplusplus 57extern "C" { 58#endif 59 60/* constants */ 61 62 63/* macros */ 64 65/* 66 * argument array processing type 67 */ 68 69/* 70 * This is the "argument array" definition that is returned by _z_new_args 71 * and is used by _z_add_args, _z_free_args, etc. 72 */ 73 74struct _argArray_t { 75 long _aaNumArgs; /* number of arguments set */ 76 long _aaMaxArgs; /* number of arguments allocated */ 77 char **_aaArgs; /* actual arguments */ 78}; 79 80typedef struct _argArray_t argArray_t; 81 82/* 83 * lock objects 84 */ 85 86/* 87 * this allows a root path to be prepended to a lock object; e.g. 88 * rootpath.%s/zone.%s/... 89 */ 90#define LOBJ_ROOTPATH "rootpath.%s" 91 92/* this locks a single zone (zone.name) */ 93#define LOBJ_ONE_ZONE "zone.%s" 94 95/* this locks all zones */ 96#define LOBJ_ZONEADMIN "zone.*" 97 98/* this locks all packages, in all zones */ 99#define LOBJ_PKGADMIN "zone.*/package.*" 100 101/* this locks all patches, in all zones */ 102#define LOBJ_PATCHADMIN "zone.*/patch.*" 103 104#define LOCK_OBJECT_MAXLEN 512 105#define LOCK_KEY_MAXLEN 37 106 107/* paths to commands executed by this module */ 108 109#define PKGADM_CMD "/usr/bin/pkgadm" 110#define ZONEADM_CMD "/usr/sbin/zoneadm" 111 112/* max message size for program output functions (echo, echo debug, progerr) */ 113 114#define MAX_MESSAGE_SIZE 4096 115 116/* maximum number of retries when waiting for lock */ 117 118#define MAX_RETRIES 300 119 120/* delay (in seconds) between retries when waiting for lock */ 121 122#define RETRY_DELAY_SECS 1 123 124/* Size of buffer increments when reading from pipe */ 125 126#define PIPE_BUFFER_INCREMENT 256 127 128/* Maximum number of arguments to pkg_ExecCmdList */ 129 130#define MAX_EXEC_CMD_ARGS 100 131 132/* 133 * These dynamic libraries are required in order to use the zones 134 * functionality - if these libraries are not available at runtime, 135 * then zones are assumed to NOT be available, and it is assumed that 136 * the program is running in the global zone with no non-global zones. 137 */ 138 139#if defined(LIBZONECFG_PATH) 140#define ZONECFG1_LIBRARY LIBZONECFG_PATH 141#else /* defined(LIBZONECFG_PATH) */ 142#define ZONECFG1_LIBRARY "libzonecfg.so.1" 143#endif /* defined(LIBZONECFG_PATH) */ 144 145#define ZONECFG_LIBRARY "libzonecfg.so" 146 147#define CONTRACT1_LIBRARY "libcontract.so.1" 148#define CONTRACT_LIBRARY "libcontract.so" 149 150/* 151 * Environment values used when running commands within a non-global zone 152 */ 153 154/* SHELL= */ 155 156#define ZONE_FAILSAFESHELL "/sbin/sh" 157 158/* PATH= */ 159 160#define ZONE_DEF_PATH "/usr/sbin:/usr/bin" 161 162/* error codes */ 163#define ERR_MALLOC_FAIL -50 164 165/* 166 * zone brand list structure 167 */ 168 169struct _zoneBrandList { 170 char *string_ptr; 171 struct _zoneBrandList *next; 172}; 173 174/* 175 * zone status structure - used to retrieve and hold status of zones 176 */ 177 178typedef unsigned long _zone_status_t; 179 180struct _zoneListElement_t { 181 char *_zlName; 182 char *_zlPath; 183 char *_zlScratchName; 184 char *_zlLockObjects; 185 /* 186 * the install "state" refers to the zone states listed in 187 * /usr/include/libzonecfg.h that is stored in the zone_state_t 188 * structure and returned from getzoneent_private() - such as: 189 * ZONE_STATE_CONFIGURED, ZONE_STATE_INCOMPLETE, 190 * ZONE_STATE_INSTALLED, ZONE_STATE_READY, ZONE_STATE_MOUNTED, 191 * ZONE_STATE_SHUTTING_DOWN, ZONE_STATE_DOWN. 192 */ 193 zone_state_t _zlOrigInstallState; 194 zone_state_t _zlCurrInstallState; 195 /* 196 * the kernel "status" refers to the zone status listed in 197 * /usr/include/sys/zone.h, returned by zone_get_state(), 198 * and defined in the zone_status_t enum - such as: 199 * ZONE_IS_UNINITIALIZED, ZONE_IS_READY, ZONE_IS_BOOTING, 200 * ZONE_IS_RUNNING, ZONE_IS_SHUTTING_DOWN, ZONE_IS_EMPTY, 201 * ZONE_IS_DOWN, ZONE_IS_DYING, ZONE_IS_DEAD. 202 */ 203 zone_status_t _zlOrigKernelStatus; 204 zone_status_t _zlCurrKernelStatus; 205 /* 206 * this is an internal state recorded about the zone (ZSF_xxx). 207 */ 208 _zone_status_t _zlStatus; 209}; 210 211typedef struct _zoneListElement_t zoneListElement_t; 212 213/* bits used in the _zoneListElement _zlStatus variable */ 214 215#define ZST_NOT_BOOTABLE ((_zone_status_t)0x00000001) 216#define ZST_LOCKED ((_zone_status_t)0x00000002) 217 218/* 219 * User-specified list of zones. 220 */ 221 222typedef struct zone_spec_s { 223 struct zone_spec_s *zl_next; 224 boolean_t zl_used; 225 char zl_name[ZONENAME_MAX]; 226} zone_spec_t; 227 228/* 229 * The global data structure used to hold all of the global (extern) data 230 * used by this library. 231 * 232 * --> THESE DEFINITIONS ARE ORDER DEPENDENT BASED <-- 233 * --> ON THE ORDER OF THE STRUCTURE INITIALIZERS! <-- 234 */ 235 236struct _z_global_data_t { 237 char *_z_ObjectLocks; /* object locks held */ 238 char *_z_root_dir; /* root for zone lib fctns */ 239 int _z_SigReceived; /* received signal count */ 240 pid_t _z_ChildProcessId; /* child to propagate sigs to */ 241 zone_spec_t *_zone_spec; /* zones to operate on */ 242 _z_printf_fcn_t _z_echo; /* operational message fcn */ 243 _z_printf_fcn_t _z_echo_debug; /* debug message fcn */ 244 _z_printf_fcn_t _z_progerr; /* program error fcn */ 245}; 246 247typedef struct _z_global_data_t z_global_data_t; 248 249/* 250 * When _INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA is defined, 251 * instzones_lib.h will define the z_global_data structure. 252 * Otherwise an extern to the structure is inserted. 253 * 254 * --> THESE DEFINITIONS ARE ORDER DEPENDENT BASED ON <-- 255 * --> THE ORDER OF THE _z_global_data_t STRUCTURE!!! <-- 256 */ 257 258#if defined(_INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA) 259 260/* define and initialize structure */ 261 262z_global_data_t _z_global_data = { 263 NULL, /* *_z_ObjectLocks */ 264 "", /* *_z_root_dir */ 265 0, /* _z_SigReceived */ 266 -1, /* _z_ChildProcessId */ 267 NULL, /* *_zone_spec */ 268 NULL, /* _z_echo */ 269 NULL, /* _z_echo_debug */ 270 NULL /* _z_progerr */ 271}; 272 273#else /* !defined(_INSTZONES_LIB__Z_DEFINE_GLOBAL_DATA) */ 274 275/* define structure extern */ 276 277extern z_global_data_t _z_global_data; 278 279#endif /* defined(_INSTZONES_LIB_Z_DEFINE_GLOBAL_DATA) */ 280 281/* function prototypes */ 282 283/* 284 * The following functions can be used by other libs, but not 285 * by applications. 286 */ 287 288/* ---> zones_states.c */ 289 290boolean_t _z_make_zone_ready(zoneListElement_t *a_zlem); 291boolean_t _z_make_zone_down(zoneListElement_t *a_zlem); 292boolean_t _z_make_zone_running(zoneListElement_t *a_zlem); 293int UmountAllZones(char *mntpnt); 294void *_z_calloc(size_t size); 295void *_z_malloc(size_t size); 296void *_z_realloc(void *ptr, size_t size); 297void *_z_strdup(char *str); 298 299/* ---> zones_utils.c */ 300 301/*PRINTFLIKE1*/ 302void _z_program_error(char *fmt, ...); 303/*PRINTFLIKE1*/ 304void _z_echo(char *fmt, ...); 305/*PRINTFLIKE1*/ 306void _z_echoDebug(char *a_fmt, ...); 307int _z_is_directory(char *path); 308boolean_t _z_running_in_global_zone(void); 309boolean_t _z_zones_are_implemented(void); 310void _z_sig_trap(int a_signo); 311int _z_close_file_descriptors(void *a_fds, int a_fd); 312boolean_t _z_brands_are_implemented(void); 313 314 315/* ---> zones_locks.c */ 316 317boolean_t _z_adjust_lock_object_for_rootpath(char **r_result, 318 char *a_lockObject); 319boolean_t _z_acquire_lock(char **r_lockKey, char *a_zoneName, 320 char *a_lock, pid_t a_pid, boolean_t a_wait); 321boolean_t _z_lock_zone(zoneListElement_t *a_zlst, 322 ZLOCKS_T a_lflags); 323boolean_t _z_lock_zone_object(char **r_objectLocks, 324 char *a_zoneName, char *a_lockObject, 325 pid_t a_pid, char *a_waitingMsg, 326 char *a_busyMsg); 327boolean_t _z_release_lock(char *a_zoneName, char *a_lock, 328 char *a_key, boolean_t a_wait); 329boolean_t _z_unlock_zone(zoneListElement_t *a_zlst, 330 ZLOCKS_T a_lflags); 331boolean_t _z_unlock_zone_object(char **r_objectLocks, 332 char *a_zoneName, char *a_lockObject, 333 char *a_errMsg); 334 335/* ---> zones_args.c */ 336 337void _z_free_args(argArray_t *a_args); 338argArray_t *_z_new_args(int initialCount); 339/*PRINTFLIKE2*/ 340boolean_t _z_add_arg(argArray_t *a_args, char *a_format, ...); 341int _z_get_argc(argArray_t *a_args); 342char **_z_get_argv(argArray_t *a_args); 343 344/* ---> zones_str.c */ 345 346boolean_t _z_strContainsToken(char *a_string, char *a_token, 347 char *a_separators); 348char *_z_strGetToken(char *r_sep, char *a_string, 349 int a_index, char *a_separators); 350void _z_strRemoveLeadingWhitespace(char **a_str); 351void _z_strGetToken_r(char *r_sep, char *a_string, 352 int a_index, char *a_separators, char *a_buf, 353 int a_bufLen); 354void _z_strAddToken(char **a_old, char *a_new, 355 char a_separator); 356void _z_strRemoveToken(char **r_string, char *a_token, 357 char *a_separators, int a_index); 358/*PRINTFLIKE3*/ 359void _z_strPrintf_r(char *a_buf, int a_bufLen, 360 char *a_format, ...); 361/*PRINTFLIKE1*/ 362char *_z_strPrintf(char *a_format, ...); 363 364/* ---> zones_exec.c */ 365 366int _z_zone_exec(int *r_status, char **r_results, char *a_inputFile, 367 char *a_path, char *a_argv[], const char *a_zoneName, 368 int *a_fds); 369int _zexec(const char *a_zoneName, 370 const char *path, char *argv[]); 371char *_zexec_add_env(char *name, char *value); 372int _zexec_init_template(void); 373char **_zexec_prep_env(); 374 375/* 376 * C++ postfix 377 */ 378 379#ifdef __cplusplus 380} 381#endif 382 383#endif /* _INSTZONES_LIB_H */ 384