chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libudev: enumerate - scan /sys/module
[elogind.git]
/
libudev
/
libudev-enumerate.c
diff --git
a/libudev/libudev-enumerate.c
b/libudev/libudev-enumerate.c
index d3dd5c963f89a5d76813d419e81c7356e3b4e708..0b028bab8477614c2ffb5b2531a5613bf7ff69fa 100644
(file)
--- a/
libudev/libudev-enumerate.c
+++ b/
libudev/libudev-enumerate.c
@@
-66,7
+66,7
@@
struct udev_enumerate {
*
* Returns: an enumeration context
**/
*
* Returns: an enumeration context
**/
-struct udev_enumerate *udev_enumerate_new(struct udev *udev)
+
UDEV_EXPORT
struct udev_enumerate *udev_enumerate_new(struct udev *udev)
{
struct udev_enumerate *udev_enumerate;
{
struct udev_enumerate *udev_enumerate;
@@
-94,7
+94,7
@@
struct udev_enumerate *udev_enumerate_new(struct udev *udev)
*
* Returns: the passed enumeration context
**/
*
* Returns: the passed enumeration context
**/
-struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate)
{
if (udev_enumerate == NULL)
return NULL;
{
if (udev_enumerate == NULL)
return NULL;
@@
-109,7
+109,7
@@
struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate)
* Drop a reference of an enumeration context. If the refcount reaches zero,
* all resources of the enumeration context will be released.
**/
* Drop a reference of an enumeration context. If the refcount reaches zero,
* all resources of the enumeration context will be released.
**/
-void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
{
unsigned int i;
{
unsigned int i;
@@
-138,7
+138,7
@@
void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
*
* Returns: the udev library context.
*/
*
* Returns: the udev library context.
*/
-struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate)
{
if (udev_enumerate == NULL)
return NULL;
{
if (udev_enumerate == NULL)
return NULL;
@@
-247,7
+247,7
@@
static size_t devices_delay_later(struct udev *udev, const char *syspath)
*
* Returns: the first entry of the sorted list of device paths.
*/
*
* Returns: the first entry of the sorted list of device paths.
*/
-struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate)
{
if (udev_enumerate == NULL)
return NULL;
{
if (udev_enumerate == NULL)
return NULL;
@@
-295,24
+295,24
@@
struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *ude
strncmp(entry->syspath, move_later->syspath, move_later_prefix) != 0) {
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
strncmp(entry->syspath, move_later->syspath, move_later_prefix) != 0) {
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
- move_later->syspath, NULL, 0
, 0
);
+ move_later->syspath, NULL, 0);
move_later = NULL;
}
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
move_later = NULL;
}
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
- entry->syspath, NULL, 0
, 0
);
+ entry->syspath, NULL, 0);
}
if (move_later)
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
}
if (move_later)
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
- move_later->syspath, NULL, 0
, 0
);
+ move_later->syspath, NULL, 0);
/* add and cleanup delayed devices from end of list */
for (i = max; i < udev_enumerate->devices_cur; i++) {
struct syspath *entry = &udev_enumerate->devices[i];
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
/* add and cleanup delayed devices from end of list */
for (i = max; i < udev_enumerate->devices_cur; i++) {
struct syspath *entry = &udev_enumerate->devices[i];
udev_list_entry_add(udev_enumerate->udev, &udev_enumerate->devices_list,
- entry->syspath, NULL, 0
, 0
);
+ entry->syspath, NULL, 0);
free(entry->syspath);
}
udev_enumerate->devices_cur = max;
free(entry->syspath);
}
udev_enumerate->devices_cur = max;
@@
-329,14
+329,14
@@
struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *ude
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
+
UDEV_EXPORT
int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (subsystem == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (subsystem == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->subsystem_match_list, subsystem, NULL,
1, 0
) == NULL)
+ &udev_enumerate->subsystem_match_list, subsystem, NULL,
UDEV_LIST_UNIQUE
) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-348,14
+348,14
@@
int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, co
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
+
UDEV_EXPORT
int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (subsystem == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (subsystem == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->subsystem_nomatch_list, subsystem, NULL,
1, 0
) == NULL)
+ &udev_enumerate->subsystem_nomatch_list, subsystem, NULL,
UDEV_LIST_UNIQUE
) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-368,14
+368,14
@@
int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate,
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
+
UDEV_EXPORT
int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysattr == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysattr == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
-
&udev_enumerate->sysattr_match_list, sysattr, value, 0
, 0) == NULL)
+
&udev_enumerate->sysattr_match_list, sysattr, value
, 0) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-388,14
+388,14
@@
int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, cons
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
+
UDEV_EXPORT
int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysattr == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysattr == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->sysattr_nomatch_list, sysattr, value, 0
, 0
) == NULL)
+ &udev_enumerate->sysattr_nomatch_list, sysattr, value, 0) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-428,14
+428,14
@@
exit:
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value)
+
UDEV_EXPORT
int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (property == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (property == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->properties_match_list, property, value, 0
, 0
) == NULL)
+ &udev_enumerate->properties_match_list, property, value, 0) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-447,14
+447,14
@@
int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, con
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag)
+
UDEV_EXPORT
int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (tag == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (tag == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->tags_match_list, tag, NULL,
1, 0
) == NULL)
+ &udev_enumerate->tags_match_list, tag, NULL,
UDEV_LIST_UNIQUE
) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-477,7
+477,7
@@
int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const ch
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate)
{
if (udev_enumerate == NULL)
return -EINVAL;
{
if (udev_enumerate == NULL)
return -EINVAL;
@@
-492,14
+492,14
@@
int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerat
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
+
UDEV_EXPORT
int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysname == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
{
if (udev_enumerate == NULL)
return -EINVAL;
if (sysname == NULL)
return 0;
if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
- &udev_enumerate->sysname_match_list, sysname, NULL,
1, 0
) == NULL)
+ &udev_enumerate->sysname_match_list, sysname, NULL,
UDEV_LIST_UNIQUE
) == NULL)
return -ENOMEM;
return 0;
}
return -ENOMEM;
return 0;
}
@@
-710,7
+710,7
@@
static int scan_dir(struct udev_enumerate *udev_enumerate, const char *basedir,
*
* Returns: 0 on success, otherwise a negative error value.
*/
*
* Returns: 0 on success, otherwise a negative error value.
*/
-int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath)
+
UDEV_EXPORT
int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath)
{
struct udev_device *udev_device;
{
struct udev_device *udev_device;
@@
-733,7
+733,7
@@
int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char
*
* Returns: 0 on success, otherwise a negative error value.
**/
*
* Returns: 0 on success, otherwise a negative error value.
**/
-int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
{
struct udev *udev = udev_enumerate_get_udev(udev_enumerate);
char base[UTIL_PATH_SIZE];
{
struct udev *udev = udev_enumerate_get_udev(udev_enumerate);
char base[UTIL_PATH_SIZE];
@@
-751,7
+751,7
@@
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
struct dirent *dent;
char path[UTIL_PATH_SIZE];
struct dirent *dent;
char path[UTIL_PATH_SIZE];
- util_strscpyl(path, sizeof(path), udev_get_
dev_path(udev), "/.run/udev
/tags/",
+ util_strscpyl(path, sizeof(path), udev_get_
run_path(udev), "
/tags/",
udev_list_entry_get_name(list_entry), NULL);
dir = opendir(path);
if (dir == NULL)
udev_list_entry_get_name(list_entry), NULL);
dir = opendir(path);
if (dir == NULL)
@@
-765,7
+765,18
@@
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
dev = udev_device_new_from_id_filename(udev_enumerate->udev, dent->d_name);
if (dev == NULL)
continue;
dev = udev_device_new_from_id_filename(udev_enumerate->udev, dent->d_name);
if (dev == NULL)
continue;
+
+ if (!match_subsystem(udev_enumerate, udev_device_get_subsystem(dev)))
+ goto nomatch;
+ if (!match_sysname(udev_enumerate, udev_device_get_sysname(dev)))
+ goto nomatch;
+ if (!match_property(udev_enumerate, dev))
+ goto nomatch;
+ if (!match_sysattr(udev_enumerate, dev))
+ goto nomatch;
+
syspath_add(udev_enumerate, udev_device_get_syspath(dev));
syspath_add(udev_enumerate, udev_device_get_syspath(dev));
+nomatch:
udev_device_unref(dev);
}
closedir(dir);
udev_device_unref(dev);
}
closedir(dir);
@@
-793,7
+804,7
@@
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
*
* Returns: 0 on success, otherwise a negative error value.
**/
*
* Returns: 0 on success, otherwise a negative error value.
**/
-int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate)
+
UDEV_EXPORT
int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate)
{
struct udev *udev = udev_enumerate_get_udev(udev_enumerate);
char base[UTIL_PATH_SIZE];
{
struct udev *udev = udev_enumerate_get_udev(udev_enumerate);
char base[UTIL_PATH_SIZE];
@@
-803,15
+814,25
@@
int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate)
if (udev_enumerate == NULL)
return -EINVAL;
if (udev_enumerate == NULL)
return -EINVAL;
+ /* all kernel modules */
+ if (match_subsystem(udev_enumerate, "module")) {
+ dbg(udev, "searching '%s/modules/*' dir\n", subsysdir);
+ scan_dir_and_add_devices(udev_enumerate, "module", NULL, NULL);
+ }
+
util_strscpyl(base, sizeof(base), udev_get_sys_path(udev), "/subsystem", NULL);
if (stat(base, &statbuf) == 0)
subsysdir = "subsystem";
else
subsysdir = "bus";
util_strscpyl(base, sizeof(base), udev_get_sys_path(udev), "/subsystem", NULL);
if (stat(base, &statbuf) == 0)
subsysdir = "subsystem";
else
subsysdir = "bus";
+
+ /* all subsystems (only buses support coldplug) */
if (match_subsystem(udev_enumerate, "subsystem")) {
dbg(udev, "searching '%s/*' dir\n", subsysdir);
scan_dir_and_add_devices(udev_enumerate, subsysdir, NULL, NULL);
}
if (match_subsystem(udev_enumerate, "subsystem")) {
dbg(udev, "searching '%s/*' dir\n", subsysdir);
scan_dir_and_add_devices(udev_enumerate, subsysdir, NULL, NULL);
}
+
+ /* all subsystem drivers */
if (match_subsystem(udev_enumerate, "drivers")) {
dbg(udev, "searching '%s/*/drivers/*' dir\n", subsysdir);
scan_dir(udev_enumerate, subsysdir, "drivers", "drivers");
if (match_subsystem(udev_enumerate, "drivers")) {
dbg(udev, "searching '%s/*/drivers/*' dir\n", subsysdir);
scan_dir(udev_enumerate, subsysdir, "drivers", "drivers");