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 data.
DINFOCPYALL Include all of the above.
DINFOLYR Include device layering data.
DINFOCPYONE Include only a single node without proper‐
ties or minor nodes.
phys_path Physical path of the root 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 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(7D) 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 node names:
/*
* Code to print all device tree 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 phys‐
ical 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(5) for descriptions of the following attributes:
┌─────────────────────────────┬─────────────────────────────┐
│ ATTRIBUTE TYPE │ ATTRIBUTE VALUE │
├─────────────────────────────┼─────────────────────────────┤
│Interface Stability │Committed │
├─────────────────────────────┼─────────────────────────────┤
│MT-Level │Safe │
└─────────────────────────────┴─────────────────────────────┘
SEE ALSOopen(2), ioctl(2), mmap(2), libdevinfo(3LIB), attributes(5)SunOS 5.10 16 Aug 2007 di_init(3DEVINFO)