Print this page
*** 118,132 ****
boolean_t zone_isnative;
boolean_t zone_iscluster;
boolean_t zone_islabeled;
boolean_t shutdown_in_progress;
static zoneid_t zone_id;
- static zoneid_t zone_did = 0;
dladm_handle_t dld_handle = NULL;
! char pre_statechg_hook[2 * MAXPATHLEN];
! char post_statechg_hook[2 * MAXPATHLEN];
char query_hook[2 * MAXPATHLEN];
zlog_t logsys;
mutex_t lock = DEFAULTMUTEX; /* to serialize stuff */
--- 118,131 ----
boolean_t zone_isnative;
boolean_t zone_iscluster;
boolean_t zone_islabeled;
boolean_t shutdown_in_progress;
static zoneid_t zone_id;
dladm_handle_t dld_handle = NULL;
! static char pre_statechg_hook[2 * MAXPATHLEN];
! static char post_statechg_hook[2 * MAXPATHLEN];
char query_hook[2 * MAXPATHLEN];
zlog_t logsys;
mutex_t lock = DEFAULTMUTEX; /* to serialize stuff */
*** 292,302 ****
filter_bootargs(zlog_t *zlogp, const char *inargs, char *outargs,
char *init_file)
{
int argc = 0, argc_save;
int i;
! int err = Z_OK;
char *arg, *lasts, **argv = NULL, **argv_save;
char zonecfg_args[BOOTARGS_MAX];
char scratchargs[BOOTARGS_MAX], *sargs;
char scratchopt[3];
char c;
--- 291,301 ----
filter_bootargs(zlog_t *zlogp, const char *inargs, char *outargs,
char *init_file)
{
int argc = 0, argc_save;
int i;
! int err;
char *arg, *lasts, **argv = NULL, **argv_save;
char zonecfg_args[BOOTARGS_MAX];
char scratchargs[BOOTARGS_MAX], *sargs;
char scratchopt[3];
char c;
*** 307,320 ****
* If the user didn't specify transient boot arguments, check
* to see if there were any specified in the zone configuration,
* and use them if applicable.
*/
if (inargs == NULL || inargs[0] == '\0') {
bzero(zonecfg_args, sizeof (zonecfg_args));
! (void) zonecfg_get_bootargs(snap_hndl, zonecfg_args,
sizeof (zonecfg_args));
inargs = zonecfg_args;
}
if (strlen(inargs) >= BOOTARGS_MAX) {
zerror(zlogp, B_FALSE, "boot argument string too long");
return (Z_INVAL);
--- 306,334 ----
* If the user didn't specify transient boot arguments, check
* to see if there were any specified in the zone configuration,
* and use them if applicable.
*/
if (inargs == NULL || inargs[0] == '\0') {
+ zone_dochandle_t handle;
+ if ((handle = zonecfg_init_handle()) == NULL) {
+ zerror(zlogp, B_TRUE,
+ "getting zone configuration handle");
+ return (Z_BAD_HANDLE);
+ }
+ err = zonecfg_get_snapshot_handle(zone_name, handle);
+ if (err != Z_OK) {
+ zerror(zlogp, B_FALSE,
+ "invalid configuration snapshot");
+ zonecfg_fini_handle(handle);
+ return (Z_BAD_HANDLE);
+ }
+
bzero(zonecfg_args, sizeof (zonecfg_args));
! (void) zonecfg_get_bootargs(handle, zonecfg_args,
sizeof (zonecfg_args));
inargs = zonecfg_args;
+ zonecfg_fini_handle(handle);
}
if (strlen(inargs) >= BOOTARGS_MAX) {
zerror(zlogp, B_FALSE, "boot argument string too long");
return (Z_INVAL);
*** 460,470 ****
/*
* Run the brand's pre-state change callback, if it exists.
*/
static int
! brand_prestatechg(zlog_t *zlogp, int state, int cmd, boolean_t debug)
{
char cmdbuf[2 * MAXPATHLEN];
const char *altroot;
if (pre_statechg_hook[0] == '\0')
--- 474,484 ----
/*
* Run the brand's pre-state change callback, if it exists.
*/
static int
! brand_prestatechg(zlog_t *zlogp, int state, int cmd)
{
char cmdbuf[2 * MAXPATHLEN];
const char *altroot;
if (pre_statechg_hook[0] == '\0')
*** 473,493 ****
altroot = zonecfg_get_root();
if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", pre_statechg_hook,
state, cmd, altroot) > sizeof (cmdbuf))
return (-1);
! if (do_subproc(zlogp, cmdbuf, NULL, debug) != 0)
return (-1);
return (0);
}
/*
* Run the brand's post-state change callback, if it exists.
*/
static int
! brand_poststatechg(zlog_t *zlogp, int state, int cmd, boolean_t debug)
{
char cmdbuf[2 * MAXPATHLEN];
const char *altroot;
if (post_statechg_hook[0] == '\0')
--- 487,507 ----
altroot = zonecfg_get_root();
if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", pre_statechg_hook,
state, cmd, altroot) > sizeof (cmdbuf))
return (-1);
! if (do_subproc(zlogp, cmdbuf, NULL) != 0)
return (-1);
return (0);
}
/*
* Run the brand's post-state change callback, if it exists.
*/
static int
! brand_poststatechg(zlog_t *zlogp, int state, int cmd)
{
char cmdbuf[2 * MAXPATHLEN];
const char *altroot;
if (post_statechg_hook[0] == '\0')
*** 496,506 ****
altroot = zonecfg_get_root();
if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", post_statechg_hook,
state, cmd, altroot) > sizeof (cmdbuf))
return (-1);
! if (do_subproc(zlogp, cmdbuf, NULL, debug) != 0)
return (-1);
return (0);
}
--- 510,520 ----
altroot = zonecfg_get_root();
if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", post_statechg_hook,
state, cmd, altroot) > sizeof (cmdbuf))
return (-1);
! if (do_subproc(zlogp, cmdbuf, NULL) != 0)
return (-1);
return (0);
}
*** 533,587 ****
/*
* Bring a zone up to the pre-boot "ready" stage. The mount_cmd argument is
* 'true' if this is being invoked as part of the processing for the "mount"
* subcommand.
- *
- * If a scratch zone mount (ALT_MOUNT) is being performed then do not
- * call the state change hooks.
*/
static int
! zone_ready(zlog_t *zlogp, zone_mnt_t mount_cmd, int zstate, boolean_t debug)
{
int err;
- boolean_t snapped = B_FALSE;
! if ((snap_hndl = zonecfg_init_handle()) == NULL) {
! zerror(zlogp, B_TRUE, "getting zone configuration handle");
! goto bad;
! }
if ((err = zonecfg_create_snapshot(zone_name)) != Z_OK) {
zerror(zlogp, B_FALSE, "unable to create snapshot: %s",
zonecfg_strerror(err));
goto bad;
}
- snapped = B_TRUE;
! if (zonecfg_get_snapshot_handle(zone_name, snap_hndl) != Z_OK) {
! zerror(zlogp, B_FALSE, "invalid configuration snapshot");
goto bad;
}
-
- if (zone_did == 0)
- zone_did = zone_get_did(zone_name);
-
- if (!ALT_MOUNT(mount_cmd) &&
- brand_prestatechg(zlogp, zstate, Z_READY, debug) != 0)
- goto bad;
-
- if ((zone_id = vplat_create(zlogp, mount_cmd, zone_did)) == -1)
- goto bad;
-
if (vplat_bringup(zlogp, mount_cmd, zone_id) != 0) {
bringup_failure_recovery = B_TRUE;
! (void) vplat_teardown(NULL, (mount_cmd != Z_MNT_BOOT), B_FALSE,
! debug);
goto bad;
}
if (!ALT_MOUNT(mount_cmd) &&
! brand_poststatechg(zlogp, zstate, Z_READY, debug) != 0)
goto bad;
return (0);
bad:
--- 547,589 ----
/*
* Bring a zone up to the pre-boot "ready" stage. The mount_cmd argument is
* 'true' if this is being invoked as part of the processing for the "mount"
* subcommand.
*/
static int
! zone_ready(zlog_t *zlogp, zone_mnt_t mount_cmd, int zstate)
{
int err;
! if (!ALT_MOUNT(mount_cmd) &&
! brand_prestatechg(zlogp, zstate, Z_READY) != 0)
! return (-1);
!
if ((err = zonecfg_create_snapshot(zone_name)) != Z_OK) {
zerror(zlogp, B_FALSE, "unable to create snapshot: %s",
zonecfg_strerror(err));
goto bad;
}
! if ((zone_id = vplat_create(zlogp, mount_cmd)) == -1) {
! if ((err = zonecfg_destroy_snapshot(zone_name)) != Z_OK)
! zerror(zlogp, B_FALSE, "destroying snapshot: %s",
! zonecfg_strerror(err));
goto bad;
}
if (vplat_bringup(zlogp, mount_cmd, zone_id) != 0) {
bringup_failure_recovery = B_TRUE;
! (void) vplat_teardown(NULL, (mount_cmd != Z_MNT_BOOT), B_FALSE);
! if ((err = zonecfg_destroy_snapshot(zone_name)) != Z_OK)
! zerror(zlogp, B_FALSE, "destroying snapshot: %s",
! zonecfg_strerror(err));
goto bad;
}
if (!ALT_MOUNT(mount_cmd) &&
! brand_poststatechg(zlogp, zstate, Z_READY) != 0)
goto bad;
return (0);
bad:
*** 588,606 ****
/*
* If something goes wrong, we up the zones's state to the target
* state, READY, and then invoke the hook as if we're halting.
*/
if (!ALT_MOUNT(mount_cmd))
! (void) brand_poststatechg(zlogp, ZONE_STATE_READY, Z_HALT,
! debug);
!
! if (snapped)
! if ((err = zonecfg_destroy_snapshot(zone_name)) != Z_OK)
! zerror(zlogp, B_FALSE, "destroying snapshot: %s",
! zonecfg_strerror(err));
! zonecfg_fini_handle(snap_hndl);
! snap_hndl = NULL;
return (-1);
}
int
init_template(void)
--- 590,600 ----
/*
* If something goes wrong, we up the zones's state to the target
* state, READY, and then invoke the hook as if we're halting.
*/
if (!ALT_MOUNT(mount_cmd))
! (void) brand_poststatechg(zlogp, ZONE_STATE_READY, Z_HALT);
return (-1);
}
int
init_template(void)
*** 777,788 ****
return (0);
}
/*
* env variable name format
! * _ZONECFG_{resource name}_{identifying attr. name}_{property name}
! * Any dashes (-) in the property names are replaced with underscore (_).
*/
static void
set_zonecfg_env(char *rsrc, char *attr, char *name, char *val)
{
char *p;
--- 771,781 ----
return (0);
}
/*
* env variable name format
! * _ZONECFG;{resource name};{identifying attr. name};{property name}
*/
static void
set_zonecfg_env(char *rsrc, char *attr, char *name, char *val)
{
char *p;
*** 809,836 ****
* If debug is true, export the brand hook debug env. variable as well.
*
* We could export more of the config in the future, as necessary.
*/
static int
! setup_subproc_env(boolean_t debug)
{
int res;
struct zone_nwiftab ntab;
struct zone_devtab dtab;
- struct zone_attrtab atab;
char net_resources[MAXNAMELEN * 2];
char dev_resources[MAXNAMELEN * 2];
! /* snap_hndl is null when called through the set_brand_env code path */
! if (snap_hndl == NULL)
! return (Z_OK);
! net_resources[0] = '\0';
! if ((res = zonecfg_setnwifent(snap_hndl)) != Z_OK)
goto done;
! while (zonecfg_getnwifent(snap_hndl, &ntab) == Z_OK) {
struct zone_res_attrtab *rap;
char *phys;
phys = ntab.zone_nwif_physical;
--- 802,830 ----
* If debug is true, export the brand hook debug env. variable as well.
*
* We could export more of the config in the future, as necessary.
*/
static int
! setup_subproc_env()
{
int res;
+ zone_dochandle_t handle;
struct zone_nwiftab ntab;
struct zone_devtab dtab;
char net_resources[MAXNAMELEN * 2];
char dev_resources[MAXNAMELEN * 2];
! if ((handle = zonecfg_init_handle()) == NULL)
! exit(Z_NOMEM);
! if ((res = zonecfg_get_handle(zone_name, handle)) != Z_OK)
goto done;
! if ((res = zonecfg_setnwifent(handle)) != Z_OK)
! goto done;
!
! while (zonecfg_getnwifent(handle, &ntab) == Z_OK) {
struct zone_res_attrtab *rap;
char *phys;
phys = ntab.zone_nwif_physical;
*** 853,873 ****
for (rap = ntab.zone_nwif_attrp; rap != NULL;
rap = rap->zone_res_attr_next)
set_zonecfg_env(RSRC_NET, phys, rap->zone_res_attr_name,
rap->zone_res_attr_value);
- nwifent_free_attrs(&ntab);
}
! (void) setenv("_ZONECFG_net_resources", net_resources, 1);
! (void) zonecfg_endnwifent(snap_hndl);
!
! if ((res = zonecfg_setdevent(snap_hndl)) != Z_OK)
goto done;
! while (zonecfg_getdevent(snap_hndl, &dtab) == Z_OK) {
struct zone_res_attrtab *rap;
char *match;
match = dtab.zone_dev_match;
--- 847,864 ----
for (rap = ntab.zone_nwif_attrp; rap != NULL;
rap = rap->zone_res_attr_next)
set_zonecfg_env(RSRC_NET, phys, rap->zone_res_attr_name,
rap->zone_res_attr_value);
}
! (void) zonecfg_endnwifent(handle);
! if ((res = zonecfg_setdevent(handle)) != Z_OK)
goto done;
! while (zonecfg_getdevent(handle, &dtab) == Z_OK) {
struct zone_res_attrtab *rap;
char *match;
match = dtab.zone_dev_match;
*** 878,930 ****
rap = rap->zone_res_attr_next)
set_zonecfg_env(RSRC_DEV, match,
rap->zone_res_attr_name, rap->zone_res_attr_value);
}
! (void) zonecfg_enddevent(snap_hndl);
- if ((res = zonecfg_setattrent(snap_hndl)) != Z_OK)
- goto done;
-
- while (zonecfg_getattrent(snap_hndl, &atab) == Z_OK) {
- set_zonecfg_env("attr", NULL, atab.zone_attr_name,
- atab.zone_attr_value);
- }
-
- (void) zonecfg_endattrent(snap_hndl);
-
- if (debug)
- (void) setenv("_ZONEADMD_brand_debug", "1", 1);
- else
- (void) setenv("_ZONEADMD_brand_debug", "", 1);
-
res = Z_OK;
done:
return (res);
}
- void
- nwifent_free_attrs(struct zone_nwiftab *np)
- {
- struct zone_res_attrtab *rap;
-
- for (rap = np->zone_nwif_attrp; rap != NULL; ) {
- struct zone_res_attrtab *tp = rap;
-
- rap = rap->zone_res_attr_next;
- free(tp);
- }
- }
-
/*
* If retstr is not NULL, the output of the subproc is returned in the str,
* otherwise it is output using zerror(). Any memory allocated for retstr
* should be freed by the caller.
*/
int
! do_subproc(zlog_t *zlogp, char *cmdbuf, char **retstr, boolean_t debug)
{
char buf[1024]; /* arbitrary large amount */
char *inbuf;
FILE *file;
int status;
--- 869,894 ----
rap = rap->zone_res_attr_next)
set_zonecfg_env(RSRC_DEV, match,
rap->zone_res_attr_name, rap->zone_res_attr_value);
}
! (void) zonecfg_enddevent(handle);
res = Z_OK;
done:
+ zonecfg_fini_handle(handle);
return (res);
}
/*
* If retstr is not NULL, the output of the subproc is returned in the str,
* otherwise it is output using zerror(). Any memory allocated for retstr
* should be freed by the caller.
*/
int
! do_subproc(zlog_t *zlogp, char *cmdbuf, char **retstr)
{
char buf[1024]; /* arbitrary large amount */
char *inbuf;
FILE *file;
int status;
*** 939,949 ****
rd_cnt = 0;
} else {
inbuf = buf;
}
! if (setup_subproc_env(debug) != Z_OK) {
zerror(zlogp, B_FALSE, "failed to setup environment");
return (-1);
}
file = popen(cmdbuf, "r");
--- 903,913 ----
rd_cnt = 0;
} else {
inbuf = buf;
}
! if (setup_subproc_env() != Z_OK) {
zerror(zlogp, B_FALSE, "failed to setup environment");
return (-1);
}
file = popen(cmdbuf, "r");
*** 952,968 ****
return (-1);
}
while (fgets(inbuf, 1024, file) != NULL) {
if (retstr == NULL) {
! if (zlogp != &logsys) {
! int last = strlen(inbuf) - 1;
!
! if (inbuf[last] == '\n')
! inbuf[last] = '\0';
zerror(zlogp, B_FALSE, "%s", inbuf);
- }
} else {
char *p;
rd_cnt += 1024 - 1;
if ((p = realloc(*retstr, rd_cnt + 1024)) == NULL) {
--- 916,927 ----
return (-1);
}
while (fgets(inbuf, 1024, file) != NULL) {
if (retstr == NULL) {
! if (zlogp != &logsys)
zerror(zlogp, B_FALSE, "%s", inbuf);
} else {
char *p;
rd_cnt += 1024 - 1;
if ((p = realloc(*retstr, rd_cnt + 1024)) == NULL) {
*** 989,1049 ****
}
return (WEXITSTATUS(status));
}
/*
- * Get the path for this zone's init(1M) (or equivalent) process. First look
- * for a zone-specific init-name attr, then get it from the brand.
- */
- static int
- get_initname(brand_handle_t bh, char *initname, int len)
- {
- struct zone_attrtab a;
-
- bzero(&a, sizeof (a));
- (void) strlcpy(a.zone_attr_name, "init-name",
- sizeof (a.zone_attr_name));
-
- if (zonecfg_lookup_attr(snap_hndl, &a) == Z_OK) {
- (void) strlcpy(initname, a.zone_attr_value, len);
- return (0);
- }
-
- return (brand_get_initname(bh, initname, len));
- }
-
- /*
- * Get the restart-init flag for this zone's init(1M) (or equivalent) process.
- * First look for a zone-specific restart-init attr, then get it from the brand.
- */
- static boolean_t
- restartinit(brand_handle_t bh)
- {
- struct zone_attrtab a;
-
- bzero(&a, sizeof (a));
- (void) strlcpy(a.zone_attr_name, "restart-init",
- sizeof (a.zone_attr_name));
-
- if (zonecfg_lookup_attr(snap_hndl, &a) == Z_OK) {
- if (strcmp(a.zone_attr_value, "false") == 0)
- return (B_FALSE);
- return (B_TRUE);
- }
-
- return (brand_restartinit(bh));
- }
-
- /*
* Get the app-svc-dependent flag for this zone's init process. This is a
* zone-specific attr which controls the type of contract we create for the
* zone's init. When true, the contract will include CT_PR_EV_EXIT in the fatal
* set, so that when any service which is in the same contract exits, the init
* application will be terminated.
*/
static boolean_t
! is_app_svc_dep(brand_handle_t bh)
{
struct zone_attrtab a;
bzero(&a, sizeof (a));
(void) strlcpy(a.zone_attr_name, "app-svc-dependent",
--- 948,967 ----
}
return (WEXITSTATUS(status));
}
/*
* Get the app-svc-dependent flag for this zone's init process. This is a
* zone-specific attr which controls the type of contract we create for the
* zone's init. When true, the contract will include CT_PR_EV_EXIT in the fatal
* set, so that when any service which is in the same contract exits, the init
* application will be terminated.
+ *
+ * We use the global "snap_hndl", so no parameters get passed here.
*/
static boolean_t
! is_app_svc_dep(void)
{
struct zone_attrtab a;
bzero(&a, sizeof (a));
(void) strlcpy(a.zone_attr_name, "app-svc-dependent",
*** 1056,1066 ****
return (B_FALSE);
}
static int
! zone_bootup(zlog_t *zlogp, const char *bootargs, int zstate, boolean_t debug)
{
zoneid_t zoneid;
struct stat st;
char rpath[MAXPATHLEN], initpath[MAXPATHLEN], init_file[MAXPATHLEN];
char nbootargs[BOOTARGS_MAX];
--- 974,984 ----
return (B_FALSE);
}
static int
! zone_bootup(zlog_t *zlogp, const char *bootargs, int zstate)
{
zoneid_t zoneid;
struct stat st;
char rpath[MAXPATHLEN], initpath[MAXPATHLEN], init_file[MAXPATHLEN];
char nbootargs[BOOTARGS_MAX];
*** 1072,1082 ****
char errmsg[DLADM_STRSIZE];
int err;
boolean_t restart_init;
boolean_t app_svc_dep;
! if (brand_prestatechg(zlogp, zstate, Z_BOOT, debug) != 0)
return (-1);
if ((zoneid = getzoneidbyname(zone_name)) == -1) {
zerror(zlogp, B_TRUE, "unable to get zoneid");
goto bad;
--- 990,1000 ----
char errmsg[DLADM_STRSIZE];
int err;
boolean_t restart_init;
boolean_t app_svc_dep;
! if (brand_prestatechg(zlogp, zstate, Z_BOOT) != 0)
return (-1);
if ((zoneid = getzoneidbyname(zone_name)) == -1) {
zerror(zlogp, B_TRUE, "unable to get zoneid");
goto bad;
*** 1115,1139 ****
brand_close(bh);
goto bad;
}
/* Get the path for this zone's init(1M) (or equivalent) process. */
! if (get_initname(bh, init_file, MAXPATHLEN) != 0) {
zerror(zlogp, B_FALSE,
"unable to determine zone's init(1M) location");
brand_close(bh);
goto bad;
}
! /* See if we should restart init if it dies. */
! restart_init = restartinit(bh);
/*
* See if we need to setup contract dependencies between the zone's
* primary application and any of its services.
*/
! app_svc_dep = is_app_svc_dep(bh);
brand_close(bh);
err = filter_bootargs(zlogp, bootargs, nbootargs, init_file);
if (err != Z_OK)
--- 1033,1057 ----
brand_close(bh);
goto bad;
}
/* Get the path for this zone's init(1M) (or equivalent) process. */
! if (brand_get_initname(bh, init_file, MAXPATHLEN) != 0) {
zerror(zlogp, B_FALSE,
"unable to determine zone's init(1M) location");
brand_close(bh);
goto bad;
}
! /* See if this zone's brand should restart init if it dies. */
! restart_init = brand_restartinit(bh);
/*
* See if we need to setup contract dependencies between the zone's
* primary application and any of its services.
*/
! app_svc_dep = is_app_svc_dep();
brand_close(bh);
err = filter_bootargs(zlogp, bootargs, nbootargs, init_file);
if (err != Z_OK)
*** 1155,1167 ****
if (lstat(initpath, &st) == -1) {
zerror(zlogp, B_TRUE, "could not stat %s", initpath);
goto bad;
}
! if ((st.st_mode & S_IFMT) == S_IFLNK) {
! /* symlink, we'll have to wait and resolve when we boot */
! } else if ((st.st_mode & S_IXUSR) == 0) {
zerror(zlogp, B_FALSE, "%s is not executable", initpath);
goto bad;
}
/*
--- 1073,1087 ----
if (lstat(initpath, &st) == -1) {
zerror(zlogp, B_TRUE, "could not stat %s", initpath);
goto bad;
}
! /*
! * If a symlink, we'll have to wait and resolve when we boot,
! * otherwise check the executable bits now.
! */
! if ((st.st_mode & S_IFMT) != S_IFLNK && (st.st_mode & S_IXUSR) == 0) {
zerror(zlogp, B_FALSE, "%s is not executable", initpath);
goto bad;
}
/*
*** 1183,1193 ****
* If there is a brand 'boot' callback, execute it now to give the
* brand one last chance to do any additional setup before the zone
* is booted.
*/
if ((strlen(cmdbuf) > EXEC_LEN) &&
! (do_subproc(zlogp, cmdbuf, NULL, debug) != Z_OK)) {
zerror(zlogp, B_FALSE, "%s failed", cmdbuf);
goto bad;
}
if (zone_setattr(zoneid, ZONE_ATTR_INITNAME, init_file, 0) == -1) {
--- 1103,1113 ----
* If there is a brand 'boot' callback, execute it now to give the
* brand one last chance to do any additional setup before the zone
* is booted.
*/
if ((strlen(cmdbuf) > EXEC_LEN) &&
! (do_subproc(zlogp, cmdbuf, NULL) != Z_OK)) {
zerror(zlogp, B_FALSE, "%s failed", cmdbuf);
goto bad;
}
if (zone_setattr(zoneid, ZONE_ATTR_INITNAME, init_file, 0) == -1) {
*** 1221,1231 ****
if (zone_boot(zoneid) == -1) {
zerror(zlogp, B_TRUE, "unable to boot zone");
goto bad;
}
! if (brand_poststatechg(zlogp, zstate, Z_BOOT, debug) != 0)
goto bad;
/* Startup a thread to perform zfd logging/tty svc for the zone. */
create_log_thread(zlogp, zone_id);
--- 1141,1151 ----
if (zone_boot(zoneid) == -1) {
zerror(zlogp, B_TRUE, "unable to boot zone");
goto bad;
}
! if (brand_poststatechg(zlogp, zstate, Z_BOOT) != 0)
goto bad;
/* Startup a thread to perform zfd logging/tty svc for the zone. */
create_log_thread(zlogp, zone_id);
*** 1237,1269 ****
bad:
/*
* If something goes wrong, we up the zones's state to the target
* state, RUNNING, and then invoke the hook as if we're halting.
*/
! (void) brand_poststatechg(zlogp, ZONE_STATE_RUNNING, Z_HALT, debug);
return (-1);
}
static int
! zone_halt(zlog_t *zlogp, boolean_t unmount_cmd, boolean_t rebooting, int zstate,
! boolean_t debug)
{
int err;
- /*
- * If performing a scratch zone unmount then do not call the
- * state change hooks.
- */
if (unmount_cmd == B_FALSE &&
! brand_prestatechg(zlogp, zstate, Z_HALT, debug) != 0)
return (-1);
/* Shutting down, stop the memcap thread */
destroy_mcap_thread();
! if (vplat_teardown(zlogp, unmount_cmd, rebooting, debug) != 0) {
if (!bringup_failure_recovery)
zerror(zlogp, B_FALSE, "unable to destroy zone");
destroy_log_thread();
return (-1);
}
--- 1157,1184 ----
bad:
/*
* If something goes wrong, we up the zones's state to the target
* state, RUNNING, and then invoke the hook as if we're halting.
*/
! (void) brand_poststatechg(zlogp, ZONE_STATE_RUNNING, Z_HALT);
return (-1);
}
static int
! zone_halt(zlog_t *zlogp, boolean_t unmount_cmd, boolean_t rebooting, int zstate)
{
int err;
if (unmount_cmd == B_FALSE &&
! brand_prestatechg(zlogp, zstate, Z_HALT) != 0)
return (-1);
/* Shutting down, stop the memcap thread */
destroy_mcap_thread();
! if (vplat_teardown(zlogp, unmount_cmd, rebooting) != 0) {
if (!bringup_failure_recovery)
zerror(zlogp, B_FALSE, "unable to destroy zone");
destroy_log_thread();
return (-1);
}
*** 1270,1289 ****
/* Shut down is done, stop the log thread */
destroy_log_thread();
if (unmount_cmd == B_FALSE &&
! brand_poststatechg(zlogp, zstate, Z_HALT, debug) != 0)
return (-1);
if ((err = zonecfg_destroy_snapshot(zone_name)) != Z_OK)
zerror(zlogp, B_FALSE, "destroying snapshot: %s",
zonecfg_strerror(err));
- zonecfg_fini_handle(snap_hndl);
- snap_hndl = NULL;
-
return (0);
}
static int
zone_graceful_shutdown(zlog_t *zlogp)
--- 1185,1201 ----
/* Shut down is done, stop the log thread */
destroy_log_thread();
if (unmount_cmd == B_FALSE &&
! brand_poststatechg(zlogp, zstate, Z_HALT) != 0)
return (-1);
if ((err = zonecfg_destroy_snapshot(zone_name)) != Z_OK)
zerror(zlogp, B_FALSE, "destroying snapshot: %s",
zonecfg_strerror(err));
return (0);
}
static int
zone_graceful_shutdown(zlog_t *zlogp)
*** 1495,1509 ****
ucred_t *uc = NULL;
const priv_set_t *eset;
zone_state_t zstate;
zone_cmd_t cmd;
- boolean_t debug;
int init_status;
zone_cmd_arg_t *zargp;
! boolean_t kernelcall = B_TRUE;
int rval = -1;
uint64_t uniqid;
zoneid_t zoneid = -1;
zlog_t zlog;
--- 1407,1420 ----
ucred_t *uc = NULL;
const priv_set_t *eset;
zone_state_t zstate;
zone_cmd_t cmd;
int init_status;
zone_cmd_arg_t *zargp;
! boolean_t kernelcall;
int rval = -1;
uint64_t uniqid;
zoneid_t zoneid = -1;
zlog_t zlog;
*** 1549,1559 ****
"unexpected (expected %d bytes)", alen,
sizeof (zone_cmd_arg_t));
goto out;
}
cmd = zargp->cmd;
- debug = zargp->debug;
init_status = zargp->status;
if (door_ucred(&uc) != 0) {
zerror(&logsys, B_TRUE, "door_ucred");
goto out;
--- 1460,1469 ----
*** 1657,1685 ****
break;
case ZONE_STATE_INSTALLED:
switch (cmd) {
case Z_READY:
! rval = zone_ready(zlogp, Z_MNT_BOOT, zstate, debug);
if (rval == 0)
eventstream_write(Z_EVT_ZONE_READIED);
zcons_statechanged();
break;
case Z_BOOT:
case Z_FORCEBOOT:
eventstream_write(Z_EVT_ZONE_BOOTING);
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate,
! debug)) == 0) {
rval = zone_bootup(zlogp, zargp->bootbuf,
! zstate, debug);
}
audit_put_record(zlogp, uc, rval, "boot");
zcons_statechanged();
if (rval != 0) {
bringup_failure_recovery = B_TRUE;
(void) zone_halt(zlogp, B_FALSE, B_FALSE,
! zstate, debug);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
break;
case Z_SHUTDOWN:
case Z_HALT:
--- 1567,1595 ----
break;
case ZONE_STATE_INSTALLED:
switch (cmd) {
case Z_READY:
! rval = zone_ready(zlogp, Z_MNT_BOOT, zstate);
if (rval == 0)
eventstream_write(Z_EVT_ZONE_READIED);
zcons_statechanged();
break;
case Z_BOOT:
case Z_FORCEBOOT:
eventstream_write(Z_EVT_ZONE_BOOTING);
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate))
! == 0) {
rval = zone_bootup(zlogp, zargp->bootbuf,
! zstate);
}
audit_put_record(zlogp, uc, rval, "boot");
zcons_statechanged();
if (rval != 0) {
bringup_failure_recovery = B_TRUE;
(void) zone_halt(zlogp, B_FALSE, B_FALSE,
! zstate);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
break;
case Z_SHUTDOWN:
case Z_HALT:
*** 1727,1737 ****
BOOTARGS_MAX);
}
rval = zone_ready(zlogp,
strcmp(zargp->bootbuf, "-U") == 0 ?
! Z_MNT_UPDATE : Z_MNT_SCRATCH, zstate, debug);
if (rval != 0)
break;
eventstream_write(Z_EVT_ZONE_READIED);
--- 1637,1647 ----
BOOTARGS_MAX);
}
rval = zone_ready(zlogp,
strcmp(zargp->bootbuf, "-U") == 0 ?
! Z_MNT_UPDATE : Z_MNT_SCRATCH, zstate);
if (rval != 0)
break;
eventstream_write(Z_EVT_ZONE_READIED);
*** 1789,1828 ****
*/
zerror(zlogp, B_FALSE, "zone is already ready");
rval = 0;
break;
case Z_BOOT:
- case Z_FORCEBOOT:
(void) strlcpy(boot_args, zargp->bootbuf,
sizeof (boot_args));
eventstream_write(Z_EVT_ZONE_BOOTING);
! rval = zone_bootup(zlogp, zargp->bootbuf, zstate,
! debug);
audit_put_record(zlogp, uc, rval, "boot");
zcons_statechanged();
if (rval != 0) {
bringup_failure_recovery = B_TRUE;
(void) zone_halt(zlogp, B_FALSE, B_TRUE,
! zstate, debug);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
boot_args[0] = '\0';
break;
case Z_HALT:
if (kernelcall) /* Invalid; can't happen */
abort();
! if ((rval = zone_halt(zlogp, B_FALSE, B_FALSE, zstate,
! debug)) != 0)
break;
zcons_statechanged();
eventstream_write(Z_EVT_ZONE_HALTED);
break;
case Z_SHUTDOWN:
case Z_REBOOT:
case Z_NOTE_UNINSTALLING:
case Z_MOUNT:
- case Z_FORCEMOUNT:
case Z_UNMOUNT:
if (kernelcall) /* Invalid; can't happen */
abort();
zerror(zlogp, B_FALSE, "%s operation is invalid "
"for zones in state '%s'", z_cmd_name(cmd),
--- 1699,1735 ----
*/
zerror(zlogp, B_FALSE, "zone is already ready");
rval = 0;
break;
case Z_BOOT:
(void) strlcpy(boot_args, zargp->bootbuf,
sizeof (boot_args));
eventstream_write(Z_EVT_ZONE_BOOTING);
! rval = zone_bootup(zlogp, zargp->bootbuf, zstate);
audit_put_record(zlogp, uc, rval, "boot");
zcons_statechanged();
if (rval != 0) {
bringup_failure_recovery = B_TRUE;
(void) zone_halt(zlogp, B_FALSE, B_TRUE,
! zstate);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
boot_args[0] = '\0';
break;
case Z_HALT:
if (kernelcall) /* Invalid; can't happen */
abort();
! if ((rval = zone_halt(zlogp, B_FALSE, B_FALSE, zstate))
! != 0)
break;
zcons_statechanged();
eventstream_write(Z_EVT_ZONE_HALTED);
break;
case Z_SHUTDOWN:
case Z_REBOOT:
case Z_NOTE_UNINSTALLING:
case Z_MOUNT:
case Z_UNMOUNT:
if (kernelcall) /* Invalid; can't happen */
abort();
zerror(zlogp, B_FALSE, "%s operation is invalid "
"for zones in state '%s'", z_cmd_name(cmd),
*** 1835,1845 ****
case ZONE_STATE_MOUNTED:
switch (cmd) {
case Z_UNMOUNT:
if (kernelcall) /* Invalid; can't happen */
abort();
! rval = zone_halt(zlogp, B_TRUE, B_FALSE, zstate, debug);
if (rval == 0) {
eventstream_write(Z_EVT_ZONE_HALTED);
(void) sema_post(&scratch_sem);
}
break;
--- 1742,1752 ----
case ZONE_STATE_MOUNTED:
switch (cmd) {
case Z_UNMOUNT:
if (kernelcall) /* Invalid; can't happen */
abort();
! rval = zone_halt(zlogp, B_TRUE, B_FALSE, zstate);
if (rval == 0) {
eventstream_write(Z_EVT_ZONE_HALTED);
(void) sema_post(&scratch_sem);
}
break;
*** 1857,1878 ****
case ZONE_STATE_RUNNING:
case ZONE_STATE_SHUTTING_DOWN:
case ZONE_STATE_DOWN:
switch (cmd) {
case Z_READY:
! if ((rval = zone_halt(zlogp, B_FALSE, B_TRUE, zstate,
! debug)) != 0)
break;
zcons_statechanged();
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate,
! debug)) == 0)
eventstream_write(Z_EVT_ZONE_READIED);
else
eventstream_write(Z_EVT_ZONE_HALTED);
break;
case Z_BOOT:
- case Z_FORCEBOOT:
/*
* We could have two clients racing to boot this
* zone; the second client loses, but his request
* doesn't fail, since the zone is now in the desired
* state.
--- 1764,1783 ----
case ZONE_STATE_RUNNING:
case ZONE_STATE_SHUTTING_DOWN:
case ZONE_STATE_DOWN:
switch (cmd) {
case Z_READY:
! if ((rval = zone_halt(zlogp, B_FALSE, B_TRUE, zstate))
! != 0)
break;
zcons_statechanged();
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate)) == 0)
eventstream_write(Z_EVT_ZONE_READIED);
else
eventstream_write(Z_EVT_ZONE_HALTED);
break;
case Z_BOOT:
/*
* We could have two clients racing to boot this
* zone; the second client loses, but his request
* doesn't fail, since the zone is now in the desired
* state.
*** 1884,1922 ****
if (kernelcall) {
log_init_exit(init_status);
} else {
log_init_exit(-1);
}
! if ((rval = zone_halt(zlogp, B_FALSE, B_FALSE, zstate,
! debug)) != 0)
break;
eventstream_write(Z_EVT_ZONE_HALTED);
zcons_statechanged();
break;
case Z_REBOOT:
(void) strlcpy(boot_args, zargp->bootbuf,
sizeof (boot_args));
eventstream_write(Z_EVT_ZONE_REBOOTING);
! if ((rval = zone_halt(zlogp, B_FALSE, B_TRUE, zstate,
! debug)) != 0) {
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
boot_args[0] = '\0';
break;
}
zcons_statechanged();
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate,
! debug)) != 0) {
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
boot_args[0] = '\0';
break;
}
! rval = zone_bootup(zlogp, zargp->bootbuf, zstate,
! debug);
audit_put_record(zlogp, uc, rval, "reboot");
if (rval != 0) {
(void) zone_halt(zlogp, B_FALSE, B_TRUE,
! zstate, debug);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
boot_args[0] = '\0';
break;
case Z_SHUTDOWN:
--- 1789,1826 ----
if (kernelcall) {
log_init_exit(init_status);
} else {
log_init_exit(-1);
}
! if ((rval = zone_halt(zlogp, B_FALSE, B_FALSE, zstate))
! != 0)
break;
eventstream_write(Z_EVT_ZONE_HALTED);
zcons_statechanged();
break;
case Z_REBOOT:
(void) strlcpy(boot_args, zargp->bootbuf,
sizeof (boot_args));
eventstream_write(Z_EVT_ZONE_REBOOTING);
! if ((rval = zone_halt(zlogp, B_FALSE, B_TRUE, zstate))
! != 0) {
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
boot_args[0] = '\0';
break;
}
zcons_statechanged();
! if ((rval = zone_ready(zlogp, Z_MNT_BOOT, zstate)) !=
! 0) {
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
boot_args[0] = '\0';
break;
}
! rval = zone_bootup(zlogp, zargp->bootbuf, zstate);
audit_put_record(zlogp, uc, rval, "reboot");
if (rval != 0) {
(void) zone_halt(zlogp, B_FALSE, B_TRUE,
! zstate);
eventstream_write(Z_EVT_ZONE_BOOTFAILED);
}
boot_args[0] = '\0';
break;
case Z_SHUTDOWN:
*** 1924,1934 ****
wait_shut = B_TRUE;
}
break;
case Z_NOTE_UNINSTALLING:
case Z_MOUNT:
- case Z_FORCEMOUNT:
case Z_UNMOUNT:
zerror(zlogp, B_FALSE, "%s operation is invalid "
"for zones in state '%s'", z_cmd_name(cmd),
zone_state_str(zstate));
rval = -1;
--- 1828,1837 ----
*** 2133,2188 ****
(void) close(doorfd);
return (ret);
}
/*
- * Run the query hook with the 'env' parameter. It should return a
- * string of tab-delimited key-value pairs, each of which should be set
- * in the environment.
- *
- * Because the env_vars string values become part of the environment, the
- * string is static and we don't free it.
- *
- * This function is always called before zoneadmd forks and makes itself
- * exclusive, so it is possible there could more than one instance of zoneadmd
- * running in parallel at this point. Thus, we have no zonecfg snapshot and
- * shouldn't take one yet (i.e. snap_hndl is NULL). Thats ok, since we don't
- * need any zonecfg info to query for a brand-specific env value.
- */
- static int
- set_brand_env(zlog_t *zlogp)
- {
- int ret = 0;
- static char *env_vars = NULL;
- char buf[2 * MAXPATHLEN];
-
- if (query_hook[0] == '\0' || env_vars != NULL)
- return (0);
-
- if (snprintf(buf, sizeof (buf), "%s env", query_hook) > sizeof (buf))
- return (-1);
-
- if (do_subproc(zlogp, buf, &env_vars, B_FALSE) != 0)
- return (-1);
-
- if (env_vars != NULL) {
- char *sp;
-
- sp = strtok(env_vars, "\t");
- while (sp != NULL) {
- if (putenv(sp) != 0) {
- ret = -1;
- break;
- }
- sp = strtok(NULL, "\t");
- }
- }
-
- return (ret);
- }
-
- /*
* Setup the brand's pre and post state change callbacks, as well as the
* query callback, if any of these exist.
*/
static int
brand_callback_init(brand_handle_t bh, char *zone_name)
--- 2036,2045 ----
*** 2414,2428 ****
priv_freeset(privset);
return (1);
}
priv_freeset(privset);
- if (set_brand_env(zlogp) != 0) {
- zerror(zlogp, B_FALSE, "Unable to setup brand's environment");
- return (1);
- }
-
if (mkzonedir(zlogp) != 0)
return (1);
/*
* Pre-fork: setup shared state
--- 2271,2280 ----