- 论坛徽章:
- 0
|
/*
* Code to get the name of the parent nexus of the specified driver
*/
#include
#include
int walk_nodes(char *driver_name, int instance, di_node_t node)
{
node = di_drv_first_node(driver_name, node);
while (node != DI_NODE_NIL) {
if (di_minor_next(node, DI_MINOR_NIL) == DI_MINOR_NIL) {
node = di_drv_next_node(node);
continue;
}
if (instance == di_instance(node)) {
printf("%s\n", di_driver_name(di_parent_node(node)));
return 0;
}
node = di_drv_next_node(node);
}
return 1;
}
int main(int argc, char *argv[])
{
extern char *optarg;
char *Progname;
char c, *str;
char driver_name[MAXPATHLEN];
int ret, instance = 0;
di_node_t root_node;
while ((c = getopt(argc, argv, "d:i:")) != EOF) {
switch (c) {
case 'd':
strncpy(driver_name, optarg, MAXPATHLEN);
break;
case 'i':
instance = atoi(optarg);
break;
default:
break;
}
}
if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
fprintf(stderr, "di_init() failed\n");
exit(1);
}
ret = walk_nodes(driver_name, instance, root_node);
di_fini(root_node);
exit(ret);
}
Makefile:
CC = gcc
EXEC = nexus
OBJS = nexus.o
LDLIBS = -ldevinfo
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
clean:
rm -f $(EXEC) *.elf *.gdb *.o
run:
./nexus -d e1000g -i 0
验证:
bash-3.2# uname -i
SUNW,Sun-Fire-T1000
bash-3.2# ./nexus -d bge -i 0
pxb_bcm
bash-3.2# ./nexus -d bge -i 1
pxb_bcm
bash-3.2# ./nexus -d bge -i 2
pci_pci
bash-3.2# ./nexus -d bge -i 3
pci_pci
# prtconf -D
...
pci, instance #1 (driver name: px)
pci, instance #0 (driver name: pxb_bcm)
network, instance #0 (driver name: bge)
network, instance #1 (driver name: bge)
pci, instance #0 (driver name: pci_pci)
ethernet, instance #2 (driver name: bge)
ethernet, instance #3 (driver name: bge)
...
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23177/showart_705511.html |
|