]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/rfkill/rfkill.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / rfkill / rfkill.c
index 1cc887df122370cbe733a7e8fdda6737da605978..8a92a4de6ec5908e6fe5f2685d3e48b5505a2148 100644 (file)
@@ -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;
 
@@ -229,8 +147,8 @@ static int load_state(Context *c, const struct rfkill_event *event) {
                 return r;
 
         r = read_one_line_file(state_file, &value);
-        if (r == -ENOENT) {
-                /* No state file? Then save the current state */
+        if (IN_SET(r, -ENOENT, 0)) {
+                /* No state file or it's truncated? Then save the current state */
 
                 r = write_string_file(state_file, one_zero(event->soft), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC);
                 if (r < 0)