chiark / gitweb /
libudev: enumerate - scan /sys/module
[elogind.git] / libudev / libudev-enumerate.c
index d3dd5c963f89a5d76813d419e81c7356e3b4e708..0b028bab8477614c2ffb5b2531a5613bf7ff69fa 100644 (file)
@@ -66,7 +66,7 @@ struct udev_enumerate {
  *
  * 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;
 
@@ -94,7 +94,7 @@ struct udev_enumerate *udev_enumerate_new(struct udev *udev)
  *
  * 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;
@@ -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.
  **/
-void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
+UDEV_EXPORT void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
 {
        unsigned int i;
 
@@ -138,7 +138,7 @@ void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
  *
  * 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;
@@ -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.
  */
-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;
@@ -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,
-                                           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,
-                                           entry->syspath, NULL, 0, 0);
+                                           entry->syspath, NULL, 0);
                }
 
                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,
-                                           entry->syspath, NULL, 0, 0);
+                                           entry->syspath, NULL, 0);
                        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.
  */
-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),
-                               &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;
 }
@@ -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.
  */
-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),
-                               &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;
 }
@@ -368,14 +368,14 @@ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate,
  *
  * 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),
-                          &udev_enumerate->sysattr_match_list, sysattr, value, 0, 0) == NULL)
+                               &udev_enumerate->sysattr_match_list, sysattr, value, 0) == NULL)
                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.
  */
-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),
-                          &udev_enumerate->sysattr_nomatch_list, sysattr, value, 0, 0) == NULL)
+                          &udev_enumerate->sysattr_nomatch_list, sysattr, value, 0) == NULL)
                return -ENOMEM;
        return 0;
 }
@@ -428,14 +428,14 @@ exit:
  *
  * 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),
-                               &udev_enumerate->properties_match_list, property, value, 0, 0) == NULL)
+                               &udev_enumerate->properties_match_list, property, value, 0) == NULL)
                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.
  */
-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),
-                               &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;
 }
@@ -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.
  */
-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;
@@ -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.
  */
-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),
-                               &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;
 }
@@ -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.
  */
-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;
 
@@ -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.
  **/
-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];
@@ -751,7 +751,7 @@ int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
                        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)
@@ -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;
+
+                               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));
+nomatch:
                                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.
  **/
-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];
@@ -803,15 +814,25 @@ int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate)
        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";
+
+       /* 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);
        }
+
+       /* all subsystem drivers */
        if (match_subsystem(udev_enumerate, "drivers")) {
                dbg(udev, "searching '%s/*/drivers/*' dir\n", subsysdir);
                scan_dir(udev_enumerate, subsysdir, "drivers", "drivers");