DI_INIT(3DEVINFO) Device Information Library Functions DI_INIT(3DEVINFO)
NAME
di_init, di_fini - create and destroy a snapshot of kernel device tree
SYNOPSIS
cc [
flag... ]
file...
-ldevinfo [
library... ]
#include <libdevinfo.h>
di_node_t di_init(
const char *phys_path,
uint_t flags);
void di_fini(
di_node_t root);
PARAMETERS
flags Snapshot content specification. The possible values can be a
bitwise OR of at least one of the following:
DINFOSUBTREE Include subtree.
DINFOPROP Include properties.
DINFOMINOR Include minor node data.
DINFOCPYALL Include all of the above.
DINFOPATH Include multipath path node data.
DINFOLYR Include device layering data.
DINFOCPYONE Include only a single node without
properties, minor nodes, or path nodes.
phys_path Physical path of the
root device node of the snapshot. See
di_devfs_path(3DEVINFO).
root Handle obtained by calling
di_init().
DESCRIPTION
The
di_init() function creates a snapshot of the kernel device tree and
returns a handle of the
root device node. The caller specifies the
contents of the snapshot by providing
flag and
phys_path.
The
di_fini() function destroys the snapshot of the kernel device tree
and frees the associated memory. All handles associated with this
snapshot become invalid after the call to
di_fini().
RETURN VALUES
Upon success,
di_init() returns a handle. Otherwise,
DI_NODE_NIL is
returned and
errno is set to indicate the error.
ERRORS
The
di_init() function can set
errno to any error code that can also be
set by
open(2),
ioctl(2) or
mmap(2). The most common error codes include:
EACCES Insufficient privilege for accessing device configuration data.
ENXIO Either the device named by
phys_path is not present in the
system, or the
devinfo(4D) driver is not installed properly.
EINVAL Either
phys_path is incorrectly formed or the
flags argument is
invalid.
EXAMPLES
Example 1: Using the libdevinfo Interfaces To Print All Device Tree Node
Names
The following is an example using the
libdevinfo interfaces to print all
device tree device node names:
/*
* Code to print all device tree device node names
*/
#include <stdio.h>
#include <libdevinfo.h>
int
prt_nodename(di_node_t node, void *arg)
{
printf("%s\n", di_node_name(node));
return (DI_WALK_CONTINUE);
}
main()
{
di_node_t root_node;
if((root_node = di_init("/", DINFOSUBTREE)) == DI_NODE_NIL) {
fprintf(stderr, "di_init() failed\n");
exit(1);
}
di_walk_node(root_node, DI_WALK_CLDFIRST, NULL, prt_nodename);
di_fini(root_node);
}
Example 2: Using the libdevinfo Interfaces To Print The Physical Path Of
SCSI Disks
The following example uses the
libdevinfo interfaces to print the
physical path of SCSI disks:
/*
* Code to print physical path of scsi disks
*/
#include <stdio.h>
#include <libdevinfo.h>
#define DISK_DRIVER "sd" /* driver name */
void
prt_diskinfo(di_node_t node)
{
int instance;
char *phys_path;
/*
* If the device node exports no minor nodes,
* there is no physical disk.
*/
if (di_minor_next(node, DI_MINOR_NIL) == DI_MINOR_NIL) {
return;
}
instance = di_instance(node);
phys_path = di_devfs_path(node);
printf("%s%d: %s\n", DISK_DRIVER, instance, phys_path);
di_devfs_path_free(phys_path);
}
void
walk_disknodes(di_node_t node)
{
node = di_drv_first_node(DISK_DRIVER, node);
while (node != DI_NODE_NIL) {
prt_diskinfo(node);
node = di_drv_next_node(node);
}
}
main()
{
di_node_t root_node;
if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
fprintf(stderr, "di_init() failed\n");
exit(1);
}
walk_disknodes(root_node);
di_fini(root_node);
}
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Committed |
+--------------------+-----------------+
|MT-Level | Safe |
+--------------------+-----------------+
SEE ALSO
ioctl(2),
mmap(2),
open(2),
libdevinfo(3LIB),
attributes(7) Writing Device Drivers May 15, 2008
DI_INIT(3DEVINFO)