Print this page
*** 20,31 ****
*/
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
- * Copyright 2015, Joyent Inc. All rights reserved.
* Copyright (c) 2015 by Delphix. All rights reserved.
*/
/*
* zoneadm is a command interpreter for zone administration. It is all in
* C (i.e., no lex/yacc), and all the argument passing is argc/argv based.
--- 20,31 ----
*/
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2015 by Delphix. All rights reserved.
+ * Copyright 2015, Joyent Inc. All rights reserved.
*/
/*
* zoneadm is a command interpreter for zone administration. It is all in
* C (i.e., no lex/yacc), and all the argument passing is argc/argv based.
*** 105,114 ****
--- 105,117 ----
zoneid_t zdid;
} zone_entry_t;
#define CLUSTER_BRAND_NAME "cluster"
+ static zone_entry_t *zents;
+ static size_t nzents;
+
#define LOOPBACK_IF "lo0"
#define SOCKET_AF(af) (((af) == AF_UNSPEC) ? AF_INET : (af))
struct net_if {
char *name;
*** 403,412 ****
--- 406,428 ----
(void) vfprintf(stderr, fmt, alist);
(void) fprintf(stderr, "\n");
va_end(alist);
}
+ static void *
+ safe_calloc(size_t nelem, size_t elsize)
+ {
+ void *r = calloc(nelem, elsize);
+
+ if (r == NULL) {
+ zerror(gettext("failed to allocate %lu bytes: %s"),
+ (ulong_t)nelem * elsize, strerror(errno));
+ exit(Z_ERR);
+ }
+ return (r);
+ }
+
static void
zone_print(zone_entry_t *zent, boolean_t verbose, boolean_t parsable)
{
static boolean_t firsttime = B_TRUE;
char *ip_type_str;
*** 474,486 ****
(void) strlcpy(zent->zname, zone_name, sizeof (zent->zname));
(void) strlcpy(zent->zroot, "???", sizeof (zent->zroot));
(void) strlcpy(zent->zbrand, "???", sizeof (zent->zbrand));
zent->zstate_str = "???";
- if (strcmp(zone_name, GLOBAL_ZONENAME) == 0)
- zid = zent->zdid = GLOBAL_ZONEID;
-
zent->zid = zid;
if (zonecfg_get_uuid(zone_name, uuid) == Z_OK &&
!uuid_is_null(uuid))
uuid_unparse(uuid, zent->zuuid);
--- 490,499 ----
*** 521,532 ****
return (Z_ERR);
}
zent->zstate_str = zone_state_str(zent->zstate_num);
/*
! * A zone's brand might only be available in the .xml file describing
! * it, which is only visible to the global zone. This causes
* zone_get_brand() to fail when called from within a non-global
* zone. Fortunately we only do this on labeled systems, where we
* know all zones are native.
*/
if (getzoneid() != GLOBAL_ZONEID) {
--- 534,545 ----
return (Z_ERR);
}
zent->zstate_str = zone_state_str(zent->zstate_num);
/*
! * A zone's brand is only available in the .xml file describing it,
! * which is only visible to the global zone. This causes
* zone_get_brand() to fail when called from within a non-global
* zone. Fortunately we only do this on labeled systems, where we
* know all zones are native.
*/
if (getzoneid() != GLOBAL_ZONEID) {
*** 592,658 ****
zonecfg_fini_handle(handle);
return (Z_OK);
}
static int
! zone_print_list(zone_state_t min_state, boolean_t verbose, boolean_t parsable)
{
! zone_entry_t zent;
! FILE *cookie;
! struct zoneent *ze;
! /*
! * Get the full list of zones from the configuration.
! */
! cookie = setzoneent();
! while ((ze = getzoneent_private(cookie)) != NULL) {
! char *name = ze->zone_name;
! zoneid_t zid;
! zid = getzoneidbyname(name);
! if (ze->zone_brand[0] == '\0') {
! /* old, incomplete index entry */
! if (lookup_zone_info(name, zid, &zent) != Z_OK) {
! free(ze);
! continue;
}
! } else {
! /* new, full index entry */
! (void) strlcpy(zent.zname, name, sizeof (zent.zname));
! (void) strlcpy(zent.zroot, ze->zone_path,
! sizeof (zent.zroot));
! uuid_unparse(ze->zone_uuid, zent.zuuid);
! (void) strlcpy(zent.zbrand, ze->zone_brand,
! sizeof (zent.zbrand));
! zent.ziptype = ze->zone_iptype;
! zent.zdid = ze->zone_did;
! zent.zid = zid;
! if (zid != -1) {
! int err;
! err = zone_get_state(name,
! (zone_state_t *)&ze->zone_state);
! if (err != Z_OK) {
! errno = err;
! zperror2(name, gettext("could not get "
! "state"));
! free(ze);
continue;
}
}
!
! zent.zstate_num = ze->zone_state;
! zent.zstate_str = zone_state_str(zent.zstate_num);
}
if (zent.zstate_num >= min_state)
zone_print(&zent, verbose, parsable);
-
- free(ze);
}
endzoneent(cookie);
return (Z_OK);
}
--- 605,773 ----
zonecfg_fini_handle(handle);
return (Z_OK);
}
+ /*
+ * fetch_zents() calls zone_list(2) to find out how many zones are running
+ * (which is stored in the global nzents), then calls zone_list(2) again
+ * to fetch the list of running zones (stored in the global zents). This
+ * function may be called multiple times, so if zents is already set, we
+ * return immediately to save work.
+ *
+ * Note that the data about running zones can change while this function
+ * is running, so its possible that the list of zones will have empty slots
+ * at the end.
+ */
+
static int
! fetch_zents(void)
{
! zoneid_t *zids = NULL;
! uint_t nzents_saved;
! int i, retv;
! FILE *fp;
! boolean_t inaltroot;
! zone_entry_t *zentp;
! const char *altroot;
! if (nzents > 0)
! return (Z_OK);
! if (zone_list(NULL, &nzents) != 0) {
! zperror(gettext("failed to get zoneid list"), B_FALSE);
! return (Z_ERR);
! }
! again:
! if (nzents == 0)
! return (Z_OK);
!
! zids = safe_calloc(nzents, sizeof (zoneid_t));
! nzents_saved = nzents;
!
! if (zone_list(zids, &nzents) != 0) {
! zperror(gettext("failed to get zone list"), B_FALSE);
! free(zids);
! return (Z_ERR);
}
! if (nzents != nzents_saved) {
! /* list changed, try again */
! free(zids);
! goto again;
! }
! zents = safe_calloc(nzents, sizeof (zone_entry_t));
! inaltroot = zonecfg_in_alt_root();
! if (inaltroot) {
! fp = zonecfg_open_scratch("", B_FALSE);
! altroot = zonecfg_get_root();
! } else {
! fp = NULL;
! }
! zentp = zents;
! retv = Z_OK;
! for (i = 0; i < nzents; i++) {
! char name[ZONENAME_MAX];
! char altname[ZONENAME_MAX];
! char rev_altroot[MAXPATHLEN];
!
! if (getzonenamebyid(zids[i], name, sizeof (name)) < 0) {
! /*
! * There is a race condition where the zone may have
! * shutdown since we retrieved the number of running
! * zones above. This is not an error, there will be
! * an empty slot at the end of the list.
! */
continue;
}
+ if (zonecfg_is_scratch(name)) {
+ /* Ignore scratch zones by default */
+ if (!inaltroot)
+ continue;
+ if (fp == NULL ||
+ zonecfg_reverse_scratch(fp, name, altname,
+ sizeof (altname), rev_altroot,
+ sizeof (rev_altroot)) == -1) {
+ zerror(gettext("could not resolve scratch "
+ "zone %s"), name);
+ retv = Z_ERR;
+ continue;
}
! /* Ignore zones in other alternate roots */
! if (strcmp(rev_altroot, altroot) != 0)
! continue;
! (void) strcpy(name, altname);
! } else {
! /* Ignore non-scratch when in an alternate root */
! if (inaltroot && strcmp(name, GLOBAL_ZONENAME) != 0)
! continue;
}
+ if (lookup_zone_info(name, zids[i], zentp) != Z_OK) {
+ /*
+ * There is a race condition where the zone may have
+ * shutdown since we retrieved the number of running
+ * zones above. This is not an error, there will be
+ * an empty slot at the end of the list.
+ */
+ continue;
+ }
+ zentp++;
+ }
+ nzents = zentp - zents;
+ if (fp != NULL)
+ zonecfg_close_scratch(fp);
+ free(zids);
+ return (retv);
+ }
+
+ static int
+ zone_print_list(zone_state_t min_state, boolean_t verbose, boolean_t parsable)
+ {
+ int i;
+ zone_entry_t zent;
+ FILE *cookie;
+ char *name;
+
+ /*
+ * First get the list of running zones from the kernel and print them.
+ * If that is all we need, then return.
+ */
+ if ((i = fetch_zents()) != Z_OK) {
+ /*
+ * No need for error messages; fetch_zents() has already taken
+ * care of this.
+ */
+ return (i);
+ }
+ for (i = 0; i < nzents; i++)
+ zone_print(&zents[i], verbose, parsable);
+ if (min_state >= ZONE_STATE_RUNNING)
+ return (Z_OK);
+ /*
+ * Next, get the full list of zones from the configuration, skipping
+ * any we have already printed.
+ */
+ cookie = setzoneent();
+ while ((name = getzoneent(cookie)) != NULL) {
+ for (i = 0; i < nzents; i++) {
+ if (strcmp(zents[i].zname, name) == 0)
+ break;
+ }
+ if (i < nzents) {
+ free(name);
+ continue;
+ }
+ if (lookup_zone_info(name, ZONE_ID_UNDEFINED, &zent) != Z_OK) {
+ free(name);
+ continue;
+ }
+ free(name);
if (zent.zstate_num >= min_state)
zone_print(&zent, verbose, parsable);
}
endzoneent(cookie);
return (Z_OK);
}
*** 909,924 ****
}
if (strcmp(stbuf.st_fstype, MNTTYPE_TMPFS) == 0) {
(void) printf(gettext("WARNING: %s is on a temporary "
"file system.\n"), rpath);
}
- if (cmd_num != CMD_BOOT && cmd_num != CMD_REBOOT &&
- cmd_num != CMD_READY) {
- /* we checked when we installed, no need to check each boot */
if (crosscheck_zonepaths(rpath) != Z_OK)
return (Z_ERR);
- }
/*
* Try to collect and report as many minor errors as possible
* before returning, so the user can learn everything that needs
* to be fixed up front.
*/
--- 1024,1035 ----
*** 1101,1127 ****
static int
ready_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
- boolean_t debug = B_FALSE;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot ready zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?X")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_READY, CMD_READY);
return (optopt == '?' ? Z_OK : Z_USAGE);
- case 'X':
- debug = B_TRUE;
- break;
default:
sub_usage(SHELP_READY, CMD_READY);
return (Z_USAGE);
}
}
--- 1212,1234 ----
static int
ready_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot ready zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_READY, CMD_READY);
return (optopt == '?' ? Z_OK : Z_USAGE);
default:
sub_usage(SHELP_READY, CMD_READY);
return (Z_USAGE);
}
}
*** 1134,1144 ****
return (Z_ERR);
if (verify_details(CMD_READY, argv) != Z_OK)
return (Z_ERR);
zarg.cmd = Z_READY;
- zarg.debug = debug;
if (zonecfg_call_zoneadmd(target_zone, &zarg, locale, B_TRUE) != 0) {
zerror(gettext("call to %s failed"), "zoneadmd");
return (Z_ERR);
}
return (Z_OK);
--- 1241,1250 ----
*** 1147,1157 ****
static int
boot_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
boolean_t force = B_FALSE;
- boolean_t debug = B_FALSE;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot boot zone in alternate root"));
return (Z_ERR);
--- 1253,1262 ----
*** 1174,1184 ****
* is:
*
* zoneadm -z myzone boot -- -s -v -m verbose.
*/
optind = 0;
! while ((arg = getopt(argc, argv, "?fsX")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_BOOT, CMD_BOOT);
return (optopt == '?' ? Z_OK : Z_USAGE);
case 's':
--- 1279,1289 ----
* is:
*
* zoneadm -z myzone boot -- -s -v -m verbose.
*/
optind = 0;
! while ((arg = getopt(argc, argv, "?fs")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_BOOT, CMD_BOOT);
return (optopt == '?' ? Z_OK : Z_USAGE);
case 's':
*** 1186,1198 ****
sizeof (zarg.bootbuf));
break;
case 'f':
force = B_TRUE;
break;
- case 'X':
- debug = B_TRUE;
- break;
default:
sub_usage(SHELP_BOOT, CMD_BOOT);
return (Z_USAGE);
}
}
--- 1291,1300 ----
*** 1214,1224 ****
!= Z_OK)
return (Z_ERR);
if (verify_details(CMD_BOOT, argv) != Z_OK)
return (Z_ERR);
zarg.cmd = force ? Z_FORCEBOOT : Z_BOOT;
- zarg.debug = debug;
if (zonecfg_call_zoneadmd(target_zone, &zarg, locale, B_TRUE) != 0) {
zerror(gettext("call to %s failed"), "zoneadmd");
return (Z_ERR);
}
--- 1316,1325 ----
*** 1524,1537 ****
* zone, the name service knows about it.
* 4b. For some operations which expect a zone not to be running, that it is
* not already running (or ready).
*/
static int
! sanity_check(char *zone, int cmd_num, boolean_t need_running,
boolean_t unsafe_when_running, boolean_t force)
{
! boolean_t is_running = B_FALSE;
priv_set_t *privset;
zone_state_t state, min_state;
char kernzone[ZONENAME_MAX];
FILE *fp;
--- 1625,1638 ----
* zone, the name service knows about it.
* 4b. For some operations which expect a zone not to be running, that it is
* not already running (or ready).
*/
static int
! sanity_check(char *zone, int cmd_num, boolean_t running,
boolean_t unsafe_when_running, boolean_t force)
{
! zone_entry_t *zent;
priv_set_t *privset;
zone_state_t state, min_state;
char kernzone[ZONENAME_MAX];
FILE *fp;
*** 1598,1655 ****
"with SUNW."), cmd_to_str(cmd_num));
return (Z_ERR);
}
if (!zonecfg_in_alt_root()) {
! /* Avoid the xml read overhead of lookup_running_zone */
! if (getzoneidbyname(zone) != -1)
! is_running = B_TRUE;
!
! } else if ((fp = zonecfg_open_scratch("", B_FALSE)) != NULL) {
! if (zonecfg_find_scratch(fp, zone, zonecfg_get_root(), kernzone,
! sizeof (kernzone)) == 0 && getzoneidbyname(kernzone) != -1)
! is_running = B_TRUE;
!
zonecfg_close_scratch(fp);
}
/*
* Look up from the kernel for 'running' zones.
*/
! if (need_running && !force) {
! if (!is_running) {
zerror(gettext("not running"));
return (Z_ERR);
}
} else {
int err;
! err = zone_get_state(zone, &state);
!
! if (unsafe_when_running && is_running) {
/* check whether the zone is ready or running */
! char *zstate_str;
!
! if (err != Z_OK) {
errno = err;
! zperror2(zone, gettext("could not get state"));
/* can't tell, so hedge */
! zstate_str = "ready/running";
} else {
! zstate_str = zone_state_str(state);
}
zerror(gettext("%s operation is invalid for %s zones."),
! cmd_to_str(cmd_num), zstate_str);
return (Z_ERR);
}
!
! if (err != Z_OK) {
errno = err;
zperror2(zone, gettext("could not get state"));
return (Z_ERR);
}
-
switch (cmd_num) {
case CMD_UNINSTALL:
if (state == ZONE_STATE_CONFIGURED) {
zerror(gettext("is already in state '%s'."),
zone_state_str(ZONE_STATE_CONFIGURED));
--- 1699,1753 ----
"with SUNW."), cmd_to_str(cmd_num));
return (Z_ERR);
}
if (!zonecfg_in_alt_root()) {
! zent = lookup_running_zone(zone);
! } else if ((fp = zonecfg_open_scratch("", B_FALSE)) == NULL) {
! zent = NULL;
! } else {
! if (zonecfg_find_scratch(fp, zone, zonecfg_get_root(),
! kernzone, sizeof (kernzone)) == 0)
! zent = lookup_running_zone(kernzone);
! else
! zent = NULL;
zonecfg_close_scratch(fp);
}
/*
* Look up from the kernel for 'running' zones.
*/
! if (running && !force) {
! if (zent == NULL) {
zerror(gettext("not running"));
return (Z_ERR);
}
} else {
int err;
! if (unsafe_when_running && zent != NULL) {
/* check whether the zone is ready or running */
! if ((err = zone_get_state(zent->zname,
! &zent->zstate_num)) != Z_OK) {
errno = err;
! zperror2(zent->zname,
! gettext("could not get state"));
/* can't tell, so hedge */
! zent->zstate_str = "ready/running";
} else {
! zent->zstate_str =
! zone_state_str(zent->zstate_num);
}
zerror(gettext("%s operation is invalid for %s zones."),
! cmd_to_str(cmd_num), zent->zstate_str);
return (Z_ERR);
}
! if ((err = zone_get_state(zone, &state)) != Z_OK) {
errno = err;
zperror2(zone, gettext("could not get state"));
return (Z_ERR);
}
switch (cmd_num) {
case CMD_UNINSTALL:
if (state == ZONE_STATE_CONFIGURED) {
zerror(gettext("is already in state '%s'."),
zone_state_str(ZONE_STATE_CONFIGURED));
*** 1733,1759 ****
static int
halt_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
- boolean_t debug = B_FALSE;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot halt zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?X")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_HALT, CMD_HALT);
return (optopt == '?' ? Z_OK : Z_USAGE);
- case 'X':
- debug = B_TRUE;
- break;
default:
sub_usage(SHELP_HALT, CMD_HALT);
return (Z_USAGE);
}
}
--- 1831,1853 ----
static int
halt_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot halt zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_HALT, CMD_HALT);
return (optopt == '?' ? Z_OK : Z_USAGE);
default:
sub_usage(SHELP_HALT, CMD_HALT);
return (Z_USAGE);
}
}
*** 1775,1785 ****
*/
if (invoke_brand_handler(CMD_HALT, argv) != Z_OK)
return (Z_ERR);
zarg.cmd = Z_HALT;
- zarg.debug = debug;
return ((zonecfg_call_zoneadmd(target_zone, &zarg, locale,
B_TRUE) == 0) ? Z_OK : Z_ERR);
}
static int
--- 1869,1878 ----
*** 1853,1879 ****
static int
reboot_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
- boolean_t debug = B_FALSE;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot reboot zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?X")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_REBOOT, CMD_REBOOT);
return (optopt == '?' ? Z_OK : Z_USAGE);
- case 'X':
- debug = B_TRUE;
- break;
default:
sub_usage(SHELP_REBOOT, CMD_REBOOT);
return (Z_USAGE);
}
}
--- 1946,1968 ----
static int
reboot_func(int argc, char *argv[])
{
zone_cmd_arg_t zarg;
int arg;
if (zonecfg_in_alt_root()) {
zerror(gettext("cannot reboot zone in alternate root"));
return (Z_ERR);
}
optind = 0;
! if ((arg = getopt(argc, argv, "?")) != EOF) {
switch (arg) {
case '?':
sub_usage(SHELP_REBOOT, CMD_REBOOT);
return (optopt == '?' ? Z_OK : Z_USAGE);
default:
sub_usage(SHELP_REBOOT, CMD_REBOOT);
return (Z_USAGE);
}
}
*** 1904,1914 ****
return (Z_ERR);
if (verify_details(CMD_REBOOT, argv) != Z_OK)
return (Z_ERR);
zarg.cmd = Z_REBOOT;
- zarg.debug = debug;
return ((zonecfg_call_zoneadmd(target_zone, &zarg, locale, B_TRUE) == 0)
? Z_OK : Z_ERR);
}
static int
--- 1993,2002 ----
*** 2132,2145 ****
return (Z_OK);
if (strcmp(fstab->zone_fs_type, MNTTYPE_ZFS) == 0)
return (verify_fs_zfs(fstab));
- if (strcmp(fstab->zone_fs_type, MNTTYPE_HYPRLOFS) == 0 &&
- strcmp(fstab->zone_fs_special, "swap") == 0)
- return (Z_OK);
-
if (stat64(fstab->zone_fs_special, &st) != 0) {
(void) fprintf(stderr, gettext("could not verify fs "
"%s: could not access %s: %s\n"), fstab->zone_fs_dir,
fstab->zone_fs_special, strerror(errno));
return (Z_ERR);
--- 2220,2229 ----
*** 2539,2548 ****
--- 2623,2633 ----
boolean_t in_alt_root;
zone_iptype_t iptype;
dladm_handle_t dh;
dladm_status_t status;
datalink_id_t linkid;
+ char errmsg[DLADM_STRSIZE];
in_alt_root = zonecfg_in_alt_root();
if (in_alt_root)
goto no_net;
*** 2621,2630 ****
--- 2706,2720 ----
nwiftab.zone_nwif_physical, &linkid, NULL,
NULL, NULL);
dladm_close(dh);
}
if (status != DLADM_STATUS_OK) {
+ (void) fprintf(stderr,
+ gettext("WARNING: skipping network "
+ "interface '%s': %s\n"),
+ nwiftab.zone_nwif_physical,
+ dladm_status2str(status, errmsg));
break;
}
dl_owner_zid = ALL_ZONES;
if (zone_check_datalink(&dl_owner_zid, linkid) != 0)
break;
*** 2718,2729 ****
*/
static boolean_t
verify_fix_did(zone_dochandle_t handle)
{
zoneid_t mydid;
! struct zoneent *ze;
FILE *cookie;
boolean_t fix = B_FALSE;
mydid = zonecfg_get_did(handle);
if (mydid == -1) {
zonecfg_set_did(handle);
--- 2808,2820 ----
*/
static boolean_t
verify_fix_did(zone_dochandle_t handle)
{
zoneid_t mydid;
! zone_entry_t zent;
FILE *cookie;
+ char *name;
boolean_t fix = B_FALSE;
mydid = zonecfg_get_did(handle);
if (mydid == -1) {
zonecfg_set_did(handle);
*** 2730,2767 ****
return (B_TRUE);
}
/* Get the full list of zones from the configuration. */
cookie = setzoneent();
! while ((ze = getzoneent_private(cookie)) != NULL) {
! char *name;
! zoneid_t did;
!
! name = ze->zone_name;
! if (strcmp(name, GLOBAL_ZONENAME) == 0 ||
! strcmp(name, target_zone) == 0) {
! free(ze);
! continue;
}
! if (ze->zone_brand[0] == '\0') {
! /* old, incomplete index entry */
! zone_entry_t zent;
!
! if (lookup_zone_info(name, ZONE_ID_UNDEFINED,
! &zent) != Z_OK) {
! free(ze);
continue;
}
- did = zent.zdid;
- } else {
- /* new, full index entry */
- did = ze->zone_did;
- }
- free(ze);
! if (did == mydid) {
fix = B_TRUE;
break;
}
}
endzoneent(cookie);
--- 2821,2844 ----
return (B_TRUE);
}
/* Get the full list of zones from the configuration. */
cookie = setzoneent();
! while ((name = getzoneent(cookie)) != NULL) {
! if (strcmp(target_zone, name) == 0) {
! free(name);
! break; /* Once we find our entry, stop. */
}
! if (strcmp(name, "global") == 0 ||
! lookup_zone_info(name, ZONE_ID_UNDEFINED, &zent) != Z_OK) {
! free(name);
continue;
}
! free(name);
! if (zent.zdid == mydid) {
fix = B_TRUE;
break;
}
}
endzoneent(cookie);
*** 2928,2938 ****
char zonepath[MAXPATHLEN];
brand_handle_t bh = NULL;
int status;
boolean_t do_postinstall = B_FALSE;
boolean_t brand_help = B_FALSE;
- boolean_t do_dataset = B_TRUE;
char opts[128];
if (target_zone == NULL) {
sub_usage(SHELP_INSTALL, CMD_INSTALL);
return (Z_USAGE);
--- 3005,3014 ----
*** 3004,3019 ****
sub_usage(SHELP_INSTALL, CMD_INSTALL);
brand_help = B_TRUE;
}
/* Ignore unknown options - may be brand specific. */
break;
- case 'x':
- if (strcmp(optarg, "nodataset") == 0) {
- do_dataset = B_FALSE;
- continue; /* internal arg, don't pass thru */
- }
- break;
default:
/* Ignore unknown options - may be brand specific. */
break;
}
--- 3080,3089 ----
*** 3062,3072 ****
errno = err;
zperror2(target_zone, gettext("could not set state"));
goto done;
}
- if (do_dataset)
create_zfs_zonepath(zonepath);
}
status = do_subproc(cmdbuf);
if ((subproc_err =
--- 3132,3141 ----
*** 5027,5037 ****
* well it will then shut itself down.
*/
if (zonecfg_ping_zoneadmd(target_zone) == Z_OK) {
zone_cmd_arg_t zarg;
zarg.cmd = Z_NOTE_UNINSTALLING;
- zarg.debug = B_FALSE;
/* we don't care too much if this fails, just plow on */
(void) zonecfg_call_zoneadmd(target_zone, &zarg, locale,
B_TRUE);
}
--- 5096,5105 ----
*** 5143,5153 ****
return (Z_ERR);
if (verify_details(CMD_MOUNT, argv) != Z_OK)
return (Z_ERR);
zarg.cmd = force ? Z_FORCEMOUNT : Z_MOUNT;
- zarg.debug = B_FALSE;
zarg.bootbuf[0] = '\0';
if (zonecfg_call_zoneadmd(target_zone, &zarg, locale, B_TRUE) != 0) {
zerror(gettext("call to %s failed"), "zoneadmd");
return (Z_ERR);
}
--- 5211,5220 ----
*** 5165,5175 ****
if (sanity_check(target_zone, CMD_UNMOUNT, B_FALSE, B_FALSE, B_FALSE)
!= Z_OK)
return (Z_ERR);
zarg.cmd = Z_UNMOUNT;
- zarg.debug = B_FALSE;
if (zonecfg_call_zoneadmd(target_zone, &zarg, locale, B_TRUE) != 0) {
zerror(gettext("call to %s failed"), "zoneadmd");
return (Z_ERR);
}
return (Z_OK);
--- 5232,5241 ----