X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=libudev%2Flibudev-enumerate.c;h=0b028bab8477614c2ffb5b2531a5613bf7ff69fa;hp=d3dd5c963f89a5d76813d419e81c7356e3b4e708;hb=325293609392d0feba7a31ca9ed0940c8509c2ea;hpb=5f59fa0900a5c127ce1a25d8ba3176f166662f96 diff --git a/libudev/libudev-enumerate.c b/libudev/libudev-enumerate.c index d3dd5c963..0b028bab8 100644 --- a/libudev/libudev-enumerate.c +++ b/libudev/libudev-enumerate.c @@ -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");