summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdevinfo
diff options
context:
space:
mode:
authorVikram Hegde <Vikram.Hegde@Sun.COM>2010-04-09 13:39:36 -0700
committerVikram Hegde <Vikram.Hegde@Sun.COM>2010-04-09 13:39:36 -0700
commit94c894bb831b66894f8e0b0bdcf8a9a450530820 (patch)
tree302352d6535f12a1d5fb5173a0a7a472aec377e2 /usr/src/lib/libdevinfo
parent5afc78aa05e746cd98000659cff9f89d9995b3fe (diff)
downloadillumos-gate-94c894bb831b66894f8e0b0bdcf8a9a450530820.tar.gz
6874797 Solaris needs to support I/O subtree reparenting
Diffstat (limited to 'usr/src/lib/libdevinfo')
-rw-r--r--usr/src/lib/libdevinfo/devinfo.c92
-rw-r--r--usr/src/lib/libdevinfo/libdevinfo.h7
-rw-r--r--usr/src/lib/libdevinfo/mapfile-vers4
3 files changed, 95 insertions, 8 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo.c b/usr/src/lib/libdevinfo/devinfo.c
index e9c3e18375..1222707c36 100644
--- a/usr/src/lib/libdevinfo/devinfo.c
+++ b/usr/src/lib/libdevinfo/devinfo.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -3696,8 +3695,53 @@ di_walk_lnode(di_node_t root, uint_t flag, void *arg,
return (0);
}
-di_node_t
-di_lookup_node(di_node_t root, char *devfspath)
+static char *
+alias_to_curr(di_node_t anynode, char *devfspath, di_node_t *nodep)
+{
+ caddr_t pa;
+ struct di_all *all;
+ struct di_alias *di_alias;
+ di_node_t node;
+ char *curr;
+ char *cp;
+ char *alias;
+ di_off_t off;
+ char buf[MAXPATHLEN];
+
+ *nodep = NULL;
+
+ assert(anynode != DI_NODE_NIL);
+
+ pa = (caddr_t)anynode - DI_NODE(anynode)->self;
+ all = DI_ALL(pa);
+
+ di_alias = NULL;
+ for (off = all->aliases; off > 0; off = di_alias->next) {
+ di_alias = DI_ALIAS(pa + off);
+ alias = di_alias->alias;
+ if (strncmp(devfspath, alias, strlen(alias)) == 0) {
+ cp = devfspath + strlen(alias);
+ node = DI_NODE(pa + di_alias->curroff);
+ assert(node != DI_NODE_NIL);
+ if (*cp == '\0') {
+ *nodep = node;
+ return (NULL);
+ } else if (*cp == '/') {
+ curr = di_devfs_path(node);
+ (void) snprintf(buf, sizeof (buf), "%s%s",
+ curr, cp);
+ di_devfs_path_free(curr);
+ curr = strdup(buf);
+ return (curr);
+ }
+ }
+ }
+
+ return (NULL);
+}
+
+static di_node_t
+di_lookup_node_impl(di_node_t root, char *devfspath)
{
struct di_all *dap;
di_node_t node;
@@ -3785,6 +3829,46 @@ di_lookup_node(di_node_t root, char *devfspath)
return (node);
}
+di_node_t
+di_lookup_node(di_node_t root, char *devfspath)
+{
+ di_node_t node;
+ char *curr;
+
+ node = di_lookup_node_impl(root, devfspath);
+ if (node != DI_NODE_NIL) {
+ return (node);
+ }
+
+ /* node is already set to DI_NODE_NIL */
+ curr = alias_to_curr(root, devfspath, &node);
+ if (curr == NULL) {
+ /* node may or may node be DI_NODE_NIL */
+ return (node);
+ }
+
+ node = di_lookup_node_impl(root, curr);
+
+ free(curr);
+
+ return (node);
+}
+
+char *
+di_alias2curr(di_node_t anynode, char *alias)
+{
+ di_node_t currnode = DI_NODE_NIL;
+ char *curr = alias_to_curr(anynode, alias, &currnode);
+
+ if (curr == NULL && currnode != DI_NODE_NIL) {
+ return (di_devfs_path(currnode));
+ } else if (curr == NULL) {
+ return (strdup(alias));
+ }
+
+ return (curr);
+}
+
di_path_t
di_lookup_path(di_node_t root, char *devfspath)
{
diff --git a/usr/src/lib/libdevinfo/libdevinfo.h b/usr/src/lib/libdevinfo/libdevinfo.h
index 7789edd60a..8f685a1524 100644
--- a/usr/src/lib/libdevinfo/libdevinfo.h
+++ b/usr/src/lib/libdevinfo/libdevinfo.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _LIBDEVINFO_H
@@ -559,6 +558,10 @@ extern char *di_dim_path_devices(di_dim_t,
extern char *di_dim_path_dev(di_dim_t,
char *drv_name, int instance, char *minor_name);
+/*
+ * Alias related exported interfaces
+ */
+char *di_alias2curr(di_node_t anynode, char *alias);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/libdevinfo/mapfile-vers b/usr/src/lib/libdevinfo/mapfile-vers
index bfad2642f2..368feea35d 100644
--- a/usr/src/lib/libdevinfo/mapfile-vers
+++ b/usr/src/lib/libdevinfo/mapfile-vers
@@ -19,8 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
#
#
@@ -39,6 +38,7 @@
SUNW_1.4 {
global:
+ di_alias2curr;
di_path_bus_addr;
di_path_client_devfs_path;
di_path_client_next_path;