Print this page
OS-5073 lx-branded zones should request options when using DHCP
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
        
*** 29,38 ****
--- 29,39 ----
  #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,87 ****
          { "VERBOSE",             "0",    0,   0   },
          { "VERIFIED_LEASE_ONLY", "0",    0,   0   },
          { "PARAM_IGNORE_LIST",   NULL,   0,   0   }
  };
  
  /*
   * 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)
  {
          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)
                  return (NULL);
  
          if (nvlist_alloc(&nvlist, NV_UNIQUE_NAME, 0) != 0) {
                  dhcpmsg(MSG_WARNING, "cannot build default value cache; "
                      "using built-in defaults");
--- 61,115 ----
          { "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(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,166 ****
--- 185,195 ----
   */
  
  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,181 ****
          static nvlist_t         *df_nvlist = NULL;
  
          if (param >= (sizeof (defaults) / sizeof (*defaults)))
                  return (NULL);
  
!         if (stat(DHCP_AGENT_DEFAULTS, &statbuf) != 0) {
                  if (!df_unavail_msg) {
                          dhcpmsg(MSG_WARNING, "cannot access %s; using "
!                             "built-in defaults", DHCP_AGENT_DEFAULTS);
                          df_unavail_msg = B_TRUE;
                  }
                  return (defaults[param].df_default);
          }
  
--- 197,211 ----
          static nvlist_t         *df_nvlist = NULL;
  
          if (param >= (sizeof (defaults) / sizeof (*defaults)))
                  return (NULL);
  
! 
!         if (stat(agent_defaults_path, &statbuf) != 0) {
                  if (!df_unavail_msg) {
                          dhcpmsg(MSG_WARNING, "cannot access %s; using "
!                             "built-in defaults", agent_defaults_path);
                          df_unavail_msg = B_TRUE;
                  }
                  return (defaults[param].df_default);
          }