--- a/usr/src/cmd/zlogin/zlogin.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zlogin/zlogin.c Tue Nov 03 19:20:02 2009 -0800
@@ -1679,6 +1679,7 @@
priv_set_t *privset;
int tmpl_fd;
char zonebrand[MAXNAMELEN];
+ char default_brand[MAXNAMELEN];
struct stat sb;
char kernzone[ZONENAME_MAX];
brand_handle_t bh;
@@ -1908,11 +1909,16 @@
* brand may not exist in the miniroot (such as in net install
* upgrade).
*/
+ if (zonecfg_default_brand(default_brand,
+ sizeof (default_brand)) != Z_OK) {
+ zerror(gettext("unable to determine default brand"));
+ return (1);
+ }
if (zonecfg_in_alt_root() &&
strcmp(zonebrand, CLUSTER_BRAND_NAME) == 0) {
- (void) strlcpy(zonebrand, NATIVE_BRAND_NAME,
- sizeof (zonebrand));
+ (void) strlcpy(zonebrand, default_brand, sizeof (zonebrand));
}
+
if ((bh = brand_open(zonebrand)) == NULL) {
zerror(gettext("could not open brand for zone %s"), zonename);
return (1);
--- a/usr/src/cmd/zoneadm/zoneadm.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadm/zoneadm.c Tue Nov 03 19:20:02 2009 -0800
@@ -198,6 +198,7 @@
/* set early in main(), never modified thereafter, used all over the place */
static char *execname;
static char target_brand[MAXNAMELEN];
+static char default_brand[MAXPATHLEN];
static char *locale;
char *target_zone;
static char *target_uuid;
@@ -525,7 +526,7 @@
*/
if (getzoneid() != GLOBAL_ZONEID) {
assert(is_system_labeled() != 0);
- (void) strlcpy(zent->zbrand, NATIVE_BRAND_NAME,
+ (void) strlcpy(zent->zbrand, default_brand,
sizeof (zent->zbrand));
} else if (zone_get_brand(zent->zname, zent->zbrand,
sizeof (zent->zbrand)) != Z_OK) {
@@ -5651,6 +5652,13 @@
*/
zonecfg_init_lock_file(target_zone, &zone_lock_env);
+ /* Figure out what the system's default brand is */
+ if (zonecfg_default_brand(default_brand,
+ sizeof (default_brand)) != Z_OK) {
+ zerror(gettext("unable to determine default brand"));
+ return (Z_ERR);
+ }
+
/*
* If we are going to be operating on a single zone, retrieve its
* brand type and determine whether it is native or not.
@@ -5672,7 +5680,7 @@
*/
if (strcmp(target_brand, CLUSTER_BRAND_NAME) == 0) {
if (zonecfg_in_alt_root()) {
- (void) strlcpy(target_brand, NATIVE_BRAND_NAME,
+ (void) strlcpy(target_brand, default_brand,
sizeof (target_brand));
}
}
--- a/usr/src/cmd/zoneadmd/vplat.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/vplat.c Tue Nov 03 19:20:02 2009 -0800
@@ -1085,11 +1085,11 @@
/*
* Get a handle to the brand info for this zone.
- * If we are mounting the zone, then we must always use the native
+ * If we are mounting the zone, then we must always use the default
* brand device mounts.
*/
if (ALT_MOUNT(mount_cmd)) {
- (void) strlcpy(brand, NATIVE_BRAND_NAME, sizeof (brand));
+ (void) strlcpy(brand, default_brand, sizeof (brand));
} else {
(void) strlcpy(brand, brand_name, sizeof (brand));
}
@@ -1759,11 +1759,11 @@
}
/*
- * If we are mounting the zone, then we must always use the native
+ * If we are mounting the zone, then we must always use the default
* brand global mounts.
*/
if (ALT_MOUNT(mount_cmd)) {
- (void) strlcpy(brand, NATIVE_BRAND_NAME, sizeof (brand));
+ (void) strlcpy(brand, default_brand, sizeof (brand));
} else {
(void) strlcpy(brand, brand_name, sizeof (brand));
}
--- a/usr/src/cmd/zoneadmd/zoneadmd.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/zoneadmd.c Tue Nov 03 19:20:02 2009 -0800
@@ -106,6 +106,7 @@
static char *progname;
char *zone_name; /* zone which we are managing */
+char default_brand[MAXNAMELEN];
char brand_name[MAXNAMELEN];
boolean_t zone_isnative;
boolean_t zone_iscluster;
@@ -1239,11 +1240,11 @@
eventstream_write(Z_EVT_ZONE_READIED);
/*
- * Get a handle to the native brand info.
- * We must always use the native brand file system
+ * Get a handle to the default brand info.
+ * We must always use the default brand file system
* list when mounting the zone.
*/
- if ((bh = brand_open(NATIVE_BRAND_NAME)) == NULL) {
+ if ((bh = brand_open(default_brand)) == NULL) {
rval = -1;
break;
}
@@ -1747,6 +1748,12 @@
return (1);
}
+ if (zonecfg_default_brand(default_brand,
+ sizeof (default_brand)) != Z_OK) {
+ zerror(zlogp, B_FALSE, "unable to determine default brand");
+ return (1);
+ }
+
/* Get a handle to the brand info for this zone */
if (zone_get_brand(zone_name, brand_name, sizeof (brand_name))
!= Z_OK) {
@@ -1767,7 +1774,7 @@
if (strcmp(brand_name, CLUSTER_BRAND_NAME) == 0) {
zone_iscluster = B_TRUE;
if (zonecfg_in_alt_root()) {
- (void) strlcpy(brand_name, NATIVE_BRAND_NAME,
+ (void) strlcpy(brand_name, default_brand,
sizeof (brand_name));
}
} else {
--- a/usr/src/cmd/zoneadmd/zoneadmd.h Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/zoneadmd.h Tue Nov 03 19:20:02 2009 -0800
@@ -87,6 +87,7 @@
extern boolean_t bringup_failure_recovery;
extern char *zone_name;
extern char brand_name[MAXNAMELEN];
+extern char default_brand[MAXNAMELEN];
extern char boot_args[BOOTARGS_MAX];
extern char bad_boot_arg[BOOTARGS_MAX];
extern boolean_t zone_isnative;
--- a/usr/src/head/libzonecfg.h Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/head/libzonecfg.h Tue Nov 03 19:20:02 2009 -0800
@@ -504,6 +504,7 @@
extern char *zone_state_str(zone_state_t);
extern int zonecfg_get_name_by_uuid(const uuid_t, char *, size_t);
extern int zonecfg_get_uuid(const char *, uuid_t);
+extern int zonecfg_default_brand(char *, size_t);
/*
* Iterator for configured zones.
--- a/usr/src/lib/libbrand/common/libbrand.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/libbrand.c Tue Nov 03 19:20:02 2009 -0800
@@ -688,13 +688,6 @@
buf, len, DTD_ELEM_SYSBOOT, B_TRUE, B_TRUE));
}
-int
-brand_is_native(brand_handle_t bh)
-{
- struct brand_handle *bhp = (struct brand_handle *)bh;
- return ((strcmp(bhp->bh_name, NATIVE_BRAND_NAME) == 0) ? 1 : 0);
-}
-
boolean_t
brand_allow_exclusive_ip(brand_handle_t bh)
{
--- a/usr/src/lib/libbrand/common/libbrand.h Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/libbrand.h Tue Nov 03 19:20:02 2009 -0800
@@ -44,8 +44,6 @@
extern brand_handle_t brand_open(const char *);
extern void brand_close(brand_handle_t);
-extern int brand_is_native(brand_handle_t);
-
extern boolean_t brand_allow_exclusive_ip(brand_handle_t);
extern int brand_get_attach(brand_handle_t, const char *, const char *,
--- a/usr/src/lib/libbrand/common/mapfile-vers Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/mapfile-vers Tue Nov 03 19:20:02 2009 -0800
@@ -69,7 +69,6 @@
brand_get_validatesnap;
brand_get_verify_adm;
brand_get_verify_cfg;
- brand_is_native;
brand_open;
brand_platform_iter_devices;
brand_platform_iter_gmounts;
--- a/usr/src/lib/libzonecfg/common/libzonecfg.c Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libzonecfg/common/libzonecfg.c Tue Nov 03 19:20:02 2009 -0800
@@ -914,23 +914,37 @@
return (setrootattr(handle, DTD_ATTR_ZONEPATH, zonepath));
}
-int
-zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize)
+static int
+i_zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize,
+ boolean_t default_query)
{
int ret, sz;
ret = getrootattr(handle, DTD_ATTR_BRAND, brand, brandsize);
- /* If the zone has no brand, it is native. */
- if (ret == Z_OK && brand[0] == '\0') {
- sz = strlcpy(brand, NATIVE_BRAND_NAME, brandsize);
- if (sz >= brandsize)
- ret = Z_TOO_BIG;
- else
- ret = Z_OK;
- }
-
- return (ret);
+ /*
+ * If the lookup failed, or succeeded in finding a non-null brand
+ * string then return.
+ */
+ if (ret != Z_OK || brand[0] != '\0')
+ return (ret);
+
+ if (!default_query) {
+ /* If the zone has no brand, it is the default brand. */
+ return (zonecfg_default_brand(brand, sizeof (brandsize)));
+ }
+
+ /* if SUNWdefault didn't specify a brand, fallback to "native" */
+ sz = strlcpy(brand, NATIVE_BRAND_NAME, brandsize);
+ if (sz >= brandsize)
+ return (Z_TOO_BIG);
+ return (Z_OK);
+}
+
+int
+zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize)
+{
+ return (i_zonecfg_get_brand(handle, brand, brandsize, B_FALSE));
}
int
@@ -4905,18 +4919,21 @@
}
static int
-priv_lists_create(zone_dochandle_t handle, priv_lists_t **plpp,
+priv_lists_create(zone_dochandle_t handle, char *brand, priv_lists_t **plpp,
const char *curr_iptype)
{
priv_lists_t *plp;
brand_handle_t bh;
- char brand[MAXNAMELEN];
+ char brand_str[MAXNAMELEN];
+
+ /* handle or brand must be set, but never both */
+ assert((handle != NULL) || (brand != NULL));
+ assert((handle == NULL) || (brand == NULL));
if (handle != NULL) {
- if (zonecfg_get_brand(handle, brand, sizeof (brand)) != 0)
+ brand = brand_str;
+ if (zonecfg_get_brand(handle, brand, sizeof (brand_str)) != 0)
return (Z_BRAND_ERROR);
- } else {
- (void) strlcpy(brand, NATIVE_BRAND_NAME, MAXNAMELEN);
}
if ((bh = brand_open(brand)) == NULL)
@@ -4963,12 +4980,31 @@
}
int
+zonecfg_default_brand(char *brand, size_t brandsize)
+{
+ zone_dochandle_t handle;
+ int ret;
+
+ if ((handle = zonecfg_init_handle()) == NULL)
+ return (Z_NOMEM);
+ if ((ret = zonecfg_get_handle("SUNWdefault", handle)) == Z_OK) {
+ ret = i_zonecfg_get_brand(handle, brand, brandsize, B_TRUE);
+ zonecfg_fini_handle(handle);
+ return (ret);
+ }
+ return (ret);
+}
+
+int
zonecfg_default_privset(priv_set_t *privs, const char *curr_iptype)
{
priv_lists_t *plp;
+ char buf[MAXNAMELEN];
int ret;
- if ((ret = priv_lists_create(NULL, &plp, curr_iptype)) != Z_OK)
+ if ((ret = zonecfg_default_brand(buf, sizeof (buf))) != Z_OK)
+ return (ret);
+ if ((ret = priv_lists_create(NULL, buf, &plp, curr_iptype)) != Z_OK)
return (ret);
ret = get_default_privset(privs, plp);
priv_lists_destroy(plp);
@@ -5140,7 +5176,7 @@
break;
}
- if ((err = priv_lists_create(handle, &plp, curr_iptype)) != Z_OK)
+ if ((err = priv_lists_create(handle, NULL, &plp, curr_iptype)) != Z_OK)
return (err);
limitlen = strlen(limitpriv);
@@ -5278,10 +5314,9 @@
return (Z_OK);
}
- if (strcmp(zone_name, "global") == 0) {
- (void) strlcpy(brandname, NATIVE_BRAND_NAME, rp_sz);
- return (Z_OK);
- }
+ if (strcmp(zone_name, "global") == 0)
+ return (zonecfg_default_brand(brandname, rp_sz));
+
if ((handle = zonecfg_init_handle()) == NULL)
return (Z_NOMEM);
--- a/usr/src/lib/libzonecfg/common/mapfile-vers Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libzonecfg/common/mapfile-vers Tue Nov 03 19:20:02 2009 -0800
@@ -69,6 +69,7 @@
zonecfg_close_scratch;
zonecfg_construct_rctlblk;
zonecfg_create_snapshot;
+ zonecfg_default_brand;
zonecfg_default_privset;
zonecfg_delete_attr;
zonecfg_delete_dev;