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