summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdlpi/common/libdlpi.c
diff options
context:
space:
mode:
authorAnurag S. Maskey <Anurag.Maskey@Sun.COM>2008-12-24 11:14:39 -0500
committerAnurag S. Maskey <Anurag.Maskey@Sun.COM>2008-12-24 11:14:39 -0500
commit4ac67f0276a8313b5cefec38af347b94b7bfb526 (patch)
treef028fa345594682efbc023412e2255af29a6484a /usr/src/lib/libdlpi/common/libdlpi.c
parentbf85a12b7c81d0745d5a8aff65baeff50006cde9 (diff)
downloadillumos-joyent-4ac67f0276a8313b5cefec38af347b94b7bfb526.tar.gz
6745288 libdladm is executing open() of dld control device everywhere
Diffstat (limited to 'usr/src/lib/libdlpi/common/libdlpi.c')
-rw-r--r--usr/src/lib/libdlpi/common/libdlpi.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/usr/src/lib/libdlpi/common/libdlpi.c b/usr/src/lib/libdlpi/common/libdlpi.c
index f53abef44e..14c4451081 100644
--- a/usr/src/lib/libdlpi/common/libdlpi.c
+++ b/usr/src/lib/libdlpi/common/libdlpi.c
@@ -96,6 +96,7 @@ dlpi_walk(dlpi_walkfunc_t *fn, void *arg, uint_t flags)
struct i_dlpi_walklink_arg warg;
struct dirent *d;
DIR *dp;
+ dladm_handle_t handle;
warg.fn = fn;
warg.arg = arg;
@@ -114,8 +115,18 @@ dlpi_walk(dlpi_walkfunc_t *fn, void *arg, uint_t flags)
(void) closedir(dp);
} else {
- (void) dladm_walk(i_dlpi_walk_link, &warg, DATALINK_CLASS_ALL,
- DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
+ /*
+ * Rather than have libdlpi take the libdladm handle,
+ * open the handle here.
+ */
+ if (dladm_open(&handle) != DLADM_STATUS_OK)
+ return;
+
+ (void) dladm_walk(i_dlpi_walk_link, handle, &warg,
+ DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE,
+ DLADM_OPT_ACTIVE);
+
+ dladm_close(handle);
}
}
@@ -1062,6 +1073,7 @@ i_dlpi_open(const char *provider, int *fd, uint_t flags, boolean_t style1)
char device[DLPI_LINKNAME_MAX];
datalink_id_t linkid;
uint_t ppa;
+ dladm_handle_t handle;
/*
* This is not a valid style-1 name. It could be "ip" module
@@ -1095,14 +1107,22 @@ i_dlpi_open(const char *provider, int *fd, uint_t flags, boolean_t style1)
(void) snprintf(device, DLPI_LINKNAME_MAX, "%s%d", driver,
ppa >= 1000 ? ppa % 1000 : ppa);
- if (dladm_dev2linkid(device, &linkid) == DLADM_STATUS_OK) {
+ /* open libdladm handle rather than taking it as input */
+ if (dladm_open(&handle) != DLADM_STATUS_OK)
+ return (DLPI_FAILURE);
+
+ if (dladm_dev2linkid(handle, device, &linkid) ==
+ DLADM_STATUS_OK) {
dladm_phys_attr_t dpa;
- if ((dladm_phys_info(linkid, &dpa, DLADM_OPT_ACTIVE)) ==
- DLADM_STATUS_OK && !dpa.dp_novanity) {
+ if ((dladm_phys_info(handle, linkid, &dpa,
+ DLADM_OPT_ACTIVE)) == DLADM_STATUS_OK &&
+ !dpa.dp_novanity) {
+ dladm_close(handle);
return (DLPI_ENOTSTYLE2);
}
}
+ dladm_close(handle);
}
fallback: