summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2015-04-17 14:11:00 +0200
committerTom Gundersen <teg@jklm.no>2015-04-17 14:16:16 +0200
commitdee5e0b6c29ca22cbf67d28fbee195d70b0dde72 (patch)
tree9b168fad51bc28c0e12efcc4847eb5293eddad2e
parent19c9df44921bd4788bba608e9d0756f4fb1d5f89 (diff)
sd-device: enumerator - match only on initialized devices by default
It is still possible to include uninitialized ones, but now that is opt-in. In most cases people only want initialized devices. Exception is if you want to work without udev running. Suggested by David Herrmann.
-rw-r--r--src/libsystemd/sd-device/device-enumerator-private.h1
-rw-r--r--src/libsystemd/sd-device/device-enumerator.c18
-rw-r--r--src/libudev/libudev-enumerate.c17
-rw-r--r--src/systemd/sd-device.h2
4 files changed, 29 insertions, 9 deletions
diff --git a/src/libsystemd/sd-device/device-enumerator-private.h b/src/libsystemd/sd-device/device-enumerator-private.h
index 4d0a2d3c79..8d04640dc7 100644
--- a/src/libsystemd/sd-device/device-enumerator-private.h
+++ b/src/libsystemd/sd-device/device-enumerator-private.h
@@ -26,6 +26,7 @@
int device_enumerator_scan_devices(sd_device_enumerator *enumeartor);
int device_enumerator_scan_subsystems(sd_device_enumerator *enumeartor);
int device_enumerator_add_device(sd_device_enumerator *enumerator, sd_device *device);
+int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator);
sd_device *device_enumerator_get_first(sd_device_enumerator *enumerator);
sd_device *device_enumerator_get_next(sd_device_enumerator *enumerator);
diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c
index eb637f5a57..49c44bc47b 100644
--- a/src/libsystemd/sd-device/device-enumerator.c
+++ b/src/libsystemd/sd-device/device-enumerator.c
@@ -52,7 +52,7 @@ struct sd_device_enumerator {
Set *match_sysname;
Set *match_tag;
sd_device *match_parent;
- bool match_is_initialized;
+ bool match_allow_uninitialized;
};
_public_ int sd_device_enumerator_new(sd_device_enumerator **ret) {
@@ -250,10 +250,20 @@ _public_ int sd_device_enumerator_add_match_parent(sd_device_enumerator *enumera
return 0;
}
-_public_ int sd_device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator) {
+_public_ int sd_device_enumerator_allow_uninitialized(sd_device_enumerator *enumerator) {
assert_return(enumerator, -EINVAL);
- enumerator->match_is_initialized = true;
+ enumerator->match_allow_uninitialized = true;
+
+ enumerator->scan_uptodate = false;
+
+ return 0;
+}
+
+int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator) {
+ assert_return(enumerator, -EINVAL);
+
+ enumerator->match_allow_uninitialized = false;
enumerator->scan_uptodate = false;
@@ -527,7 +537,7 @@ static int enumerator_scan_dir_and_add_devices(sd_device_enumerator *enumerator,
* might not store a database, and have no way to find out
* for all other types of devices.
*/
- if (enumerator->match_is_initialized &&
+ if (!enumerator->match_allow_uninitialized &&
!initialized &&
(major(devnum) > 0 || ifindex > 0))
continue;
diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
index 1498697d7b..255fbe808d 100644
--- a/src/libudev/libudev-enumerate.c
+++ b/src/libudev/libudev-enumerate.c
@@ -66,7 +66,8 @@ struct udev_enumerate {
* Returns: an enumeration context.
**/
_public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev) {
- struct udev_enumerate *udev_enumerate;
+ _cleanup_free_ struct udev_enumerate *udev_enumerate = NULL;
+ struct udev_enumerate *ret;
int r;
assert_return_errno(udev, NULL, EINVAL);
@@ -79,7 +80,12 @@ _public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev) {
r = sd_device_enumerator_new(&udev_enumerate->enumerator);
if (r < 0) {
- free(udev_enumerate);
+ errno = -r;
+ return NULL;
+ }
+
+ r = sd_device_enumerator_allow_uninitialized(udev_enumerate->enumerator);
+ if (r < 0) {
errno = -r;
return NULL;
}
@@ -89,7 +95,10 @@ _public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev) {
udev_list_init(udev, &udev_enumerate->devices_list, false);
- return udev_enumerate;
+ ret = udev_enumerate;
+ udev_enumerate = NULL;
+
+ return ret;
}
/**
@@ -311,7 +320,7 @@ _public_ int udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumera
_public_ int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate) {
assert_return(udev_enumerate, -EINVAL);
- return sd_device_enumerator_add_match_is_initialized(udev_enumerate->enumerator);
+ return device_enumerator_add_match_is_initialized(udev_enumerate->enumerator);
}
/**
diff --git a/src/systemd/sd-device.h b/src/systemd/sd-device.h
index 86f767054c..38cb2a1102 100644
--- a/src/systemd/sd-device.h
+++ b/src/systemd/sd-device.h
@@ -92,7 +92,7 @@ int sd_device_enumerator_add_match_property(sd_device_enumerator *enumerator, co
int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname);
int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator, const char *tag);
int sd_device_enumerator_add_match_parent(sd_device_enumerator *enumerator, sd_device *parent);
-int sd_device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator);
+int sd_device_enumerator_allow_uninitialized(sd_device_enumerator *enumerator);
_SD_END_DECLARATIONS;