1479         status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
1480             perm_flags, &zid, sizeof (zid));
1481         if (status != DLADM_STATUS_OK)
1482                 return (status);
1483 
1484         *val_cnt = 1;
1485         if (zid != GLOBAL_ZONEID) {
1486                 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) {
1487                         return (dladm_errno2status(errno));
1488                 }
1489 
1490                 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX);
1491         } else {
1492                 *prop_val[0] = '\0';
1493         }
1494 
1495         return (DLADM_STATUS_OK);
1496 }
1497 
1498 typedef int (*zone_get_devroot_t)(char *, char *, size_t);
1499 
1500 static int
1501 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen)
1502 {
1503         char                    root[MAXPATHLEN];
1504         zone_get_devroot_t      real_zone_get_devroot;
1505         void                    *dlhandle;
1506         void                    *sym;
1507         int                     ret;
1508 
1509         if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL)
1510                 return (-1);
1511 
1512         if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) {
1513                 (void) dlclose(dlhandle);
1514                 return (-1);
1515         }
1516 
1517         real_zone_get_devroot = (zone_get_devroot_t)sym;
1518 
1519         if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0)
1520                 (void) snprintf(dev, devlen, "%s%s", root, "/dev");
1521         (void) dlclose(dlhandle);
1522         return (ret);
1523 }
1524 
1525 static dladm_status_t
1526 i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid,
1527     datalink_id_t linkid, boolean_t add)
1528 {
1529         char            path[MAXPATHLEN];
1530         char            name[MAXLINKNAMELEN];
1531         di_prof_t       prof = NULL;
1532         char            zone_name[ZONENAME_MAX];
1533         dladm_status_t  status;
1534         int             ret;
1535 
1536         if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0)
1537                 return (dladm_errno2status(errno));
1538         if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0)
1539                 return (dladm_errno2status(errno));
1540         if (di_prof_init(path, &prof) != 0)
 
 | 
 
 
1479         status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
1480             perm_flags, &zid, sizeof (zid));
1481         if (status != DLADM_STATUS_OK)
1482                 return (status);
1483 
1484         *val_cnt = 1;
1485         if (zid != GLOBAL_ZONEID) {
1486                 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) {
1487                         return (dladm_errno2status(errno));
1488                 }
1489 
1490                 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX);
1491         } else {
1492                 *prop_val[0] = '\0';
1493         }
1494 
1495         return (DLADM_STATUS_OK);
1496 }
1497 
1498 typedef int (*zone_get_devroot_t)(char *, char *, size_t);
1499 typedef int (*zone_get_brand_t)(char *, char *, size_t);
1500 
1501 static int
1502 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen)
1503 {
1504         char                    root[MAXPATHLEN];
1505         char                    brand[MAXPATHLEN]; /* Overkill, for sure. */
1506         static char             *full_native_path = "/native/dev";
1507         char                    *native_dev_path = full_native_path;
1508         zone_get_devroot_t      real_zone_get_devroot;
1509         zone_get_brand_t        real_zone_get_brand;
1510         void                    *dlhandle;
1511         void                    *sym;
1512         int                     ret;
1513 
1514         if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL)
1515                 return (-1);
1516 
1517         if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) {
1518                 (void) dlclose(dlhandle);
1519                 return (-1);
1520         }
1521         real_zone_get_devroot = (zone_get_devroot_t)sym;
1522 
1523         if ((sym = dlsym(dlhandle, "zone_get_brand")) == NULL) {
1524                 (void) dlclose(dlhandle);
1525                 return (-1);
1526         }
1527         real_zone_get_brand = (zone_get_devroot_t)sym;
1528 
1529         /* Have "/dev" be LX-agile for possibility of "/native/dev". */
1530         ret = real_zone_get_brand(zone_name, brand, sizeof (brand));
1531         if (ret != 0) {
1532                 (void) dlclose(dlhandle);
1533                 return (ret);
1534         }
1535         /* Can use strcmp with constant string... */
1536         if (strcmp(brand, "lx") != 0) {
1537                 /* Non-LX zone, don't use "/native/dev" */
1538                 native_dev_path += 7;   /* strlen("/native") */
1539         }
1540 
1541         if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0)
1542                 (void) snprintf(dev, devlen, "%s%s", root, native_dev_path);
1543         (void) dlclose(dlhandle);
1544         return (ret);
1545 }
1546 
1547 static dladm_status_t
1548 i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid,
1549     datalink_id_t linkid, boolean_t add)
1550 {
1551         char            path[MAXPATHLEN];
1552         char            name[MAXLINKNAMELEN];
1553         di_prof_t       prof = NULL;
1554         char            zone_name[ZONENAME_MAX];
1555         dladm_status_t  status;
1556         int             ret;
1557 
1558         if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0)
1559                 return (dladm_errno2status(errno));
1560         if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0)
1561                 return (dladm_errno2status(errno));
1562         if (di_prof_init(path, &prof) != 0)
 
 |