Print this page
OS-5073 lx-branded zones should request options when using DHCP
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>

@@ -29,10 +29,11 @@
 #include <ctype.h>
 #include <dhcpmsg.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <libnvpair.h>
+#include <zone.h>
 
 #include "common.h"
 #include "defaults.h"
 
 struct dhcp_default {

@@ -60,28 +61,55 @@
         { "VERBOSE",             "0",    0,   0   },
         { "VERIFIED_LEASE_ONLY", "0",    0,   0   },
         { "PARAM_IGNORE_LIST",   NULL,   0,   0   }
 };
 
+
 /*
+ * df_find_defaults(): builds the path to the default configuration file
+ *
+ *   input: void
+ *  output: void
+ */
+
+static const char *
+df_find_defaults(void)
+{
+        static char agent_defaults_path[MAXPATHLEN] = { 0 };
+        const char      *zroot = NULL;
+
+        if (agent_defaults_path[0] != '\0') {
+                return agent_defaults_path;
+        }
+
+        zroot = zone_get_nroot();
+
+        (void) snprintf(agent_defaults_path, MAXPATHLEN, "%s%s",
+            zroot != NULL ?  zroot : "", DHCP_AGENT_DEFAULTS);
+
+        return agent_defaults_path;
+}
+
+/*
  * df_build_cache(): builds the defaults nvlist cache
  *
  *   input: void
  *  output: a pointer to an nvlist of the current defaults, or NULL on failure
  */
 
 static nvlist_t *
 df_build_cache(void)
 {
+        const char      *agent_defaults_path = df_find_defaults();
         char            entry[1024];
         int             i;
         char            *param, *pastv6, *value, *end;
         FILE            *fp;
         nvlist_t        *nvlist;
         struct dhcp_default *defp;
 
-        if ((fp = fopen(DHCP_AGENT_DEFAULTS, "r")) == NULL)
+        if ((fp = fopen(agent_defaults_path, "r")) == NULL)
                 return (NULL);
 
         if (nvlist_alloc(&nvlist, NV_UNIQUE_NAME, 0) != 0) {
                 dhcpmsg(MSG_WARNING, "cannot build default value cache; "
                     "using built-in defaults");

@@ -157,10 +185,11 @@
  */
 
 const char *
 df_get_string(const char *if_name, boolean_t isv6, uint_t param)
 {
+        const char              *agent_defaults_path = df_find_defaults();
         char                    *value;
         char                    paramstr[256];
         char                    name[256];
         struct stat             statbuf;
         static struct stat      df_statbuf;

@@ -168,14 +197,15 @@
         static nvlist_t         *df_nvlist = NULL;
 
         if (param >= (sizeof (defaults) / sizeof (*defaults)))
                 return (NULL);
 
-        if (stat(DHCP_AGENT_DEFAULTS, &statbuf) != 0) {
+
+        if (stat(agent_defaults_path, &statbuf) != 0) {
                 if (!df_unavail_msg) {
                         dhcpmsg(MSG_WARNING, "cannot access %s; using "
-                            "built-in defaults", DHCP_AGENT_DEFAULTS);
+                            "built-in defaults", agent_defaults_path);
                         df_unavail_msg = B_TRUE;
                 }
                 return (defaults[param].df_default);
         }