summaryrefslogtreecommitdiff
path: root/src/rfkill
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-12-14 12:32:33 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-12-17 13:50:51 +0100
commited435031a599335a003f17eac45af5696ffc3a86 (patch)
treee1ffaa4d494d8902b4f3895d309c50fb1f8b3bc0 /src/rfkill
parent11c49e6df563e264e6094c4d521c3a2dc8e089b3 (diff)
downloadsystemd-ed435031a599335a003f17eac45af5696ffc3a86.tar.gz
rfkill: move wait_for_initialized() to shared/
The function interface is the same, except that the output pointer may be NULL. The implementation is slightly simplified by taking advantage of changes in ancestor commit 'sd-device: attempt to read db again if it wasn't found', by not creating a new sd_device object before re-checking the is_initialized status. v2: - In v1, the old object was always used and the device received back from the sd_device_monitor_start callback was ignored. I *think* the result will be equivalent in both cases, because by the time we the callback gets called, the db entry in the filesystem will also exist, and any subsequent access to properties of the object would trigger a read of the database from disk. But I'm not certain, and anyway, using the device object received in the callback seems cleaner.
Diffstat (limited to 'src/rfkill')
-rw-r--r--src/rfkill/rfkill.c86
1 files changed, 2 insertions, 84 deletions
diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c
index 1cc887df12..ac21dc064c 100644
--- a/src/rfkill/rfkill.c
+++ b/src/rfkill/rfkill.c
@@ -18,6 +18,7 @@
#include "proc-cmdline.h"
#include "string-table.h"
#include "string-util.h"
+#include "udev-util.h"
#include "util.h"
#include "list.h"
@@ -88,89 +89,6 @@ static int find_device(
return 0;
}
-struct DeviceMonitorData {
- const char *sysname;
- sd_device *device;
-};
-
-static int device_monitor_handler(sd_device_monitor *monitor, sd_device *device, void *userdata) {
- struct DeviceMonitorData *data = userdata;
- const char *sysname;
-
- assert(device);
- assert(data);
- assert(data->sysname);
-
- if (sd_device_get_sysname(device, &sysname) >= 0 && streq(sysname, data->sysname)) {
- data->device = sd_device_ref(device);
- return sd_event_exit(sd_device_monitor_get_event(monitor), 0);
- }
-
- return 0;
-}
-
-static int wait_for_initialized(
- sd_device *device,
- sd_device **ret) {
-
- _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor = NULL;
- _cleanup_(sd_event_unrefp) sd_event *event = NULL;
- _cleanup_(sd_device_unrefp) sd_device *d = NULL;
- struct DeviceMonitorData data = {};
- int r;
-
- assert(device);
- assert(ret);
-
- if (sd_device_get_is_initialized(device) > 0) {
- *ret = sd_device_ref(device);
- return 0;
- }
-
- assert_se(sd_device_get_sysname(device, &data.sysname) >= 0);
-
- /* Wait until the device is initialized, so that we can get
- * access to the ID_PATH property */
-
- r = sd_event_default(&event);
- if (r < 0)
- return log_error_errno(r, "Failed to get default event: %m");
-
- r = sd_device_monitor_new(&monitor);
- if (r < 0)
- return log_error_errno(r, "Failed to acquire monitor: %m");
-
- r = sd_device_monitor_filter_add_match_subsystem_devtype(monitor, "rfkill", NULL);
- if (r < 0)
- return log_error_errno(r, "Failed to add rfkill device match to monitor: %m");
-
- r = sd_device_monitor_attach_event(monitor, event);
- if (r < 0)
- return log_error_errno(r, "Failed to attach event to device monitor: %m");
-
- r = sd_device_monitor_start(monitor, device_monitor_handler, &data);
- if (r < 0)
- return log_error_errno(r, "Failed to start device monitor: %m");
-
- /* Check again, maybe things changed */
- r = sd_device_new_from_subsystem_sysname(&d, "rfkill", data.sysname);
- if (r < 0)
- return log_full_errno(IN_SET(r, -ENOENT, -ENXIO, -ENODEV) ? LOG_DEBUG : LOG_ERR, r,
- "Failed to open device '%s': %m", data.sysname);
-
- if (sd_device_get_is_initialized(d) > 0) {
- *ret = TAKE_PTR(d);
- return 0;
- }
-
- r = sd_event_loop(event);
- if (r < 0)
- return log_error_errno(r, "Event loop failed: %m");
-
- *ret = TAKE_PTR(data.device);
- return 0;
-}
-
static int determine_state_file(
const struct rfkill_event *event,
char **ret) {
@@ -187,7 +105,7 @@ static int determine_state_file(
if (r < 0)
return r;
- r = wait_for_initialized(d, &device);
+ r = device_wait_for_initialization(d, "rfkill", &device);
if (r < 0)
return r;