Print this page
patch zone-auto-create-be

@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2015 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  */
 
 
 /*
  * Module:      zones.c

@@ -35,10 +36,12 @@
  *      administration file that can be used to perform "non-interactive"
  *      operations in a non-global zone.
  *  z_free_zone_list - free contents of zoneList_t object
  *  z_get_nonglobal_zone_list - return zoneList_t object describing all
  *      non-global native zones
+ *  z_get_nonglobal_branded_zone_list - return zoneList_t object describing
+ *      all branded non-global zones
  *  z_get_nonglobal_zone_list_by_brand - return zoneList_t object describing
  *      all non-global zones matching the list of zone brands passed in.
  *  z_free_brand_list - free contents of a zoneBrandList_t object
  *  z_make_brand_list - return a zoneBrandList_t object describing the list
  *      of all zone brands passed in.

@@ -428,24 +431,13 @@
 
         free(blist);
         return (head);
 }
 
-/*
- * Name:        z_get_nonglobal_zone_list_by_brand
- * Description: return zoneList_t object describing all non-global
- *              zones matching the list of brands passed in.
- * Arguments:   brands - The list of zone brands to look for.
- * Returns:     zoneList_t
- *                      == NULL - error, list could not be generated
- *                      != NULL - success, list returned
- * NOTE:        Any zoneList_t returned is placed in new storage for the
- *              calling function. The caller must use 'z_free_zone_list' to
- *              dispose of the storage once the list is no longer needed.
- */
-zoneList_t
-z_get_nonglobal_zone_list_by_brand(zoneBrandList_t *brands)
+static zoneList_t
+i_get_nonglobal_branded_zone_list(boolean_t (*include)(struct zoneent *,
+    void *), void *arg)
 {
         FILE            *zoneIndexFP;
         int             numzones = 0;
         struct zoneent  *ze;
         zoneList_t      zlst = NULL;

@@ -478,13 +470,13 @@
                         free(ze);
                         continue;
                 }
 
                 /*
-                 * skip any zones with brands not on the brand list
+                 * skip any zones the filter function doesn't like
                  */
-                if (!z_is_zone_brand_in_list(ze->zone_name, brands)) {
+                if (include != NULL && !include(ze, arg)) {
                         free(ze);
                         continue;
                 }
 
                 /*

@@ -564,10 +556,52 @@
 
         return (zlst);
 }
 
 /*
+ * Name:        z_get_nonglobal_branded_zone_list
+ * Description: return zoneList_t object describing all non-global
+ * Returns:     zoneList_t
+ *                      == NULL - error, list could not be generated
+ *                      != NULL - success, list returned
+ * NOTE:        Any zoneList_t returned is placed in new storage for the
+ *              calling function. The caller must use 'z_free_zone_list' to
+ *              dispose of the storage once the list is no longer needed.
+ */
+zoneList_t
+z_get_nonglobal_branded_zone_list(void)
+{
+        return (i_get_nonglobal_branded_zone_list(NULL, NULL));
+}
+
+static boolean_t
+X(struct zoneent *ze, void *arg)
+{
+        zoneBrandList_t *brands = arg;
+
+        return (z_is_zone_brand_in_list(ze->zone_name, brands));
+}
+
+/*
+ * Name:        z_get_nonglobal_zone_list_by_brand
+ * Description: return zoneList_t object describing all non-global
+ *              zones matching the list of brands passed in.
+ * Arguments:   brands - The list of zone brands to look for.
+ * Returns:     zoneList_t
+ *                      == NULL - error, list could not be generated
+ *                      != NULL - success, list returned
+ * NOTE:        Any zoneList_t returned is placed in new storage for the
+ *              calling function. The caller must use 'z_free_zone_list' to
+ *              dispose of the storage once the list is no longer needed.
+ */
+zoneList_t
+z_get_nonglobal_zone_list_by_brand(zoneBrandList_t *brands)
+{
+        return (i_get_nonglobal_branded_zone_list(X, brands));
+}
+
+/*
  * Name:        z_get_zonename
  * Description: return the name of the current zone
  * Arguments:   void
  * Returns:     char *
  *                      - pointer to string representing the name of the current

@@ -1892,10 +1926,31 @@
         /* return selected zone's zonepath */
 
         return (a_zlst[i]._zlPath);
 }
 
+int
+z_zlist_is_zone_auto_create_be(zoneList_t zlst, int idx, boolean_t *ret)
+{
+        char brandname[MAXNAMELEN];
+        brand_handle_t bh;
+
+        if (zone_get_brand(z_zlist_get_zonename(zlst, idx), brandname,
+            sizeof (brandname)) != Z_OK)
+                return (-1);
+
+        bh = brand_open(brandname);
+        if (bh == NULL)
+                return (-1);
+
+        *ret = brand_auto_create_be(bh);
+
+        brand_close(bh);
+
+        return (0);
+}
+
 boolean_t
 z_zlist_is_zone_runnable(zoneList_t a_zlst, int a_zoneIndex)
 {
         int     i;