Print this page
libdladm needs to be a bit more LX-aware
        
@@ -1494,16 +1494,21 @@
 
         return (DLADM_STATUS_OK);
 }
 
 typedef int (*zone_get_devroot_t)(char *, char *, size_t);
+typedef int (*zone_get_brand_t)(char *, char *, size_t);
 
 static int
 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen)
 {
         char                    root[MAXPATHLEN];
+        char                    brand[MAXPATHLEN]; /* Overkill, for sure. */
+        static char             *full_native_path = "/native/dev";
+        char                    *native_dev_path = full_native_path;
         zone_get_devroot_t      real_zone_get_devroot;
+        zone_get_brand_t        real_zone_get_brand;
         void                    *dlhandle;
         void                    *sym;
         int                     ret;
 
         if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL)
@@ -1511,15 +1516,32 @@
 
         if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) {
                 (void) dlclose(dlhandle);
                 return (-1);
         }
-
         real_zone_get_devroot = (zone_get_devroot_t)sym;
 
+        if ((sym = dlsym(dlhandle, "zone_get_brand")) == NULL) {
+                (void) dlclose(dlhandle);
+                return (-1);
+        }
+        real_zone_get_brand = (zone_get_devroot_t)sym;
+
+        /* Have "/dev" be LX-agile for possibility of "/native/dev". */
+        ret = real_zone_get_brand(zone_name, brand, sizeof (brand));
+        if (ret != 0) {
+                (void) dlclose(dlhandle);
+                return (ret);
+        }
+        /* Can use strcmp with constant string... */
+        if (strcmp(brand, "lx") != 0) {
+                /* Non-LX zone, don't use "/native/dev" */
+                native_dev_path += 7;   /* strlen("/native") */
+        }
+
         if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0)
-                (void) snprintf(dev, devlen, "%s%s", root, "/dev");
+                (void) snprintf(dev, devlen, "%s%s", root, native_dev_path);
         (void) dlclose(dlhandle);
         return (ret);
 }
 
 static dladm_status_t