devinfo, devinfo_init, devinfo_free, devinfo_handle_to_device, devinfo_handle_to_resource, devinfo_handle_to_rman, devinfo_foreach_device_child, devinfo_foreach_device_resource, devinfo_foreach_rman_resource, devinfo_foreach_rman - библиотека для обработки информации об устройствах и ресурсах
Библиотека для обработки информации об устройствах и ресурсах (libdevinfo, -ldevinfo)
Библиотека devinfo предоставляет доступ к внутренней иерархии устройств ядра и менеджера ресурсов ввода-вывода. Библиотека использует интерфейс sysctl(3) для получения снимка состояния ядра, который затем может быть доступен приложениям.
Фактически эта информация может быть логически сгруппирована различными способами, библиотека не пытается навязывать какую-либо структуру данных.
Информация об устройствах, ресурсах и менеджере ресурсов возвращается в структурах данных определённых в <devinfo.h>:
struct devinfo_dev { devinfo_handle_t dd_handle; /* дескриптор устройства */ devinfo_handle_t dd_parent; /* родительское устройство */ char *dd_name; /* имя устройства */ char *dd_desc; /* описание устройства */ char *dd_drivername; /* имя присоединённого драйвера */ char *dd_pnpinfo; /* информация pnp от родительской шины */ char *dd_location; /* где устройство по мнению шины */ uint32_t dd_devflags; /* API-флаги */ uint16_t dd_flags; /* внутренние флаги устройства */ device_state_t dd_state; /* состояние присоединения устройства */ }; struct devinfo_rman { devinfo_handle_t dm_handle; /* дескриптор менеджера ресурсов */ u_long dm_start; /* начало ресурса */ u_long dm_size; /* размер ресурса */ char *dm_desc; /* описание ресурса */ }; struct devinfo_res { devinfo_handle_t dr_handle; /* дескриптор ресурса */ devinfo_handle_t dr_rman; /* дескриптор менеджера ресурсов */ devinfo_handle_t dr_device; /* принадлежность устройства */ u_long dr_start; /* начало области */ u_long dr_size; /* размер области */ };
Значения devinfo_handle_t могут использоваться для поиска структур по соответствующим ссылкам.
devinfo_init() создаёт снимок состояния устройств и ресурсов внутри ядра . Она возвращает ненулевой результат если после нескольких последовательных попыток снимок не может быть получен. devinfo_init() должна вызываться перед использованием любых других функций.
devinfo_free() возвращает память, связанную со снимком. Любые указатели возвращённые другими функциями после этого становятся неправильными, и перед использованием других функций снова должна быть вызвана devinfo_init().
devinfo_handle_to_device(), devinfo_handle_to_resource() и devinfo_handle_to_rman() возвращают указатели на структуры соответственно devinfo_dev, devinfo_res и devinfo_rman, основываясь на переданном им devinfo_handle_t. Эти функции могут использоваться для обхода дерева с любого узла до любого другого. Если devinfo_handle_to_device() передать константу DEVINFO_ROOT_DEVICE, функция вернёт дескриптор корня дерева устройств.
devinfo_foreach_device_child() вызывает callback-функцию указанную аргументом fn для каждого устройства являющегося непосредственным потомком. Функции fn также передаётся аргумент, позволяющий обработать состояние в callback-функции. Если fn возвращает ненулевое значение ошибки, обход останавливается и devinfo_foreach_device_child() возвращает значение ошибки той функции, которая её вызвала.
devinfo_foreach_device_resource() вызывает callback-функцию указанную аргументом fn для каждого ресурса, которым владеет устройство. Функции fn также передаётся устройство и аргумент, позволяющий обработать состояние в callback-функции. Если fn возвращает ненулевое значение ошибки, обход останавливается и devinfo_foreach_device_resource() возвращает значение ошибки той функции, которая её вызвала.
devinfo_foreach_rman_resource() вызывает callback-функцию указанную аргументом fn для каждого ресурса в пределах менеджера ресурсов rman. Функции fn также передаётся аргумент, позволяющий обработать состояние в callback-функции. Если fn возвращает ненулевое значение ошибки, обход останавливается и devinfo_foreach_rman_resource() возвращает значение ошибки той функции, которая её вызвала.
devinfo_foreach_rman() вызывает callback-функцию указанную аргументом fn для каждого менеджера ресурсов. Функции fn также передаётся аргумент, позволяющий обработать состояние в callback-функции. Если fn возвращает ненулевое значение ошибки, обход останавливается и devinfo_foreach_rman() возвращает значение ошибки той функции, которая её вызвала.
Библиотека devinfo появилась в FreeBSD 5.0 и была импортирована в DragonFly 1.11.
Перевод на русский язык выполнил Владимир Ступин
Это первая реализация библиотеки, и интерфейс всё ещё нуждается в переработке.
Интерфейс не сообщает классы устройства или драйвера, делая тяжелой сортировку по классу или драйверу.