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)
|