From b03e89cfbaa1fdd0c32bbd54f2b450e17014b522 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sun, 28 Sep 2008 23:17:29 +0200 Subject: [PATCH] libudev: enumerate - scan /sys/block/ if needed --- TODO | 15 +++++++-------- udev/lib/libudev-enumerate.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index b1e6f9863..b4e0809c8 100644 --- a/TODO +++ b/TODO @@ -1,18 +1,17 @@ - o libudev enumerate - add buses and drivers - add /sys/block/ scanning crap - use enumerate for "trigger" +#129 + o use enumerate for "trigger" o libudev queue - interface for /dev/.udev/queue/ state use queue interface for "settle" - o relace test/sys/ with current sysfs layout + o relace test/sys/ with current sysfs layout and adapt test + +#130+ o use libudev device in udev_rules.c get rid of udevice, store rule matching state in rule iterator o rework rules to a match-action list, instead of a rules array o add DVB variables to kernel, and drop shell script rule o add watershed extra - o log warning if the kernel uses CONFIG_SYSFS_DEPRECATED*=y, - which means that /sys/class/block/ does not exist, but udev - will depend on it in a future release + o log warning if /sys/block/ does, but /sys/class/block/ does not exist, + udev will depend on the non-deprecated sysfs layout in a future release o DEVTYPE for disks is set by the kernel, they will be removed from the default rules o "udevadm control" commands will only accept the -- syntax diff --git a/udev/lib/libudev-enumerate.c b/udev/lib/libudev-enumerate.c index b71ded645..272b2981f 100644 --- a/udev/lib/libudev-enumerate.c +++ b/udev/lib/libudev-enumerate.c @@ -89,6 +89,7 @@ static int devices_scan_subsystem(struct udev *udev, return -1; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { char syspath[UTIL_PATH_SIZE]; + char filename[UTIL_PATH_SIZE]; struct stat statbuf; if (dent->d_name[0] == '.') @@ -96,9 +97,9 @@ static int devices_scan_subsystem(struct udev *udev, util_strlcpy(syspath, path, sizeof(syspath)); util_strlcat(syspath, "/", sizeof(syspath)); util_strlcat(syspath, dent->d_name, sizeof(syspath)); - if (stat(syspath, &statbuf) != 0) - continue; - if (!S_ISDIR(statbuf.st_mode)) + util_strlcpy(filename, syspath, sizeof(filename)); + util_strlcat(filename, "/uevent", sizeof(filename)); + if (stat(filename, &statbuf) != 0) continue; util_resolve_sys_link(udev, syspath, sizeof(syspath)); list_entry_add(udev, devices_list, syspath, NULL, 1, 1); @@ -117,8 +118,11 @@ static int devices_scan_subsystems(struct udev *udev, struct udev_list_entry *list_entry; /* if list of subsystems to scan is given, just use this list */ - udev_list_entry_foreach(list_entry, subsystem_include_list) + udev_list_entry_foreach(list_entry, subsystem_include_list) { + if (udev_list_entry_get_by_name(subsystem_exclude_list, udev_list_entry_get_name(list_entry)) != NULL) + continue; devices_scan_subsystem(udev, basedir, udev_list_entry_get_name(list_entry), subdir, devices_list); + } } else { char path[UTIL_PATH_SIZE]; DIR *dir; @@ -213,10 +217,10 @@ struct udev_enumerate *udev_enumerate_new_from_devices(struct udev *udev, const } va_end(vargs); - /* if we have /sys/subsystem/, forget all the old stuff */ util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); util_strlcat(base, "/subsystem", sizeof(base)); if (stat(base, &statbuf) == 0) { + /* we have /subsystem/, forget all the old stuff */ info(udev, "searching '/subsystem/*/devices/*' dir\n"); devices_scan_subsystems(udev, "/subsystem", "/devices", list_get_entry(&subsystem_include_list), @@ -233,6 +237,25 @@ struct udev_enumerate *udev_enumerate_new_from_devices(struct udev *udev, const list_get_entry(&subsystem_include_list), list_get_entry(&subsystem_exclude_list), &udev_enumerate->devices_list); + /* if block isn't a class, scan /block/ */ + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/class/block", sizeof(base)); + if (stat(base, &statbuf) != 0) { + struct udev_list_entry *include_list = list_get_entry(&subsystem_include_list); + struct udev_list_entry *exclude_list = list_get_entry(&subsystem_exclude_list); + int include_block = (include_list == NULL || udev_list_entry_get_by_name(include_list, "block") != NULL); + int exclude_block = (udev_list_entry_get_by_name(exclude_list, "block") != NULL); + + if (include_block && !exclude_block) { + info(udev, "searching '/block/*/*' dir\n"); + /* scan disks */ + devices_scan_subsystem(udev, "/block", NULL, NULL, &udev_enumerate->devices_list); + /* scan partitions */ + devices_scan_subsystems(udev, "/block", NULL, + NULL, NULL, + &udev_enumerate->devices_list); + } + } } list_cleanup(udev, &subsystem_include_list); -- 2.30.2