#include "proc-cmdline.h"
#include "string-table.h"
#include "string-util.h"
+#include "udev-util.h"
#include "util.h"
#include "list.h"
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) {
if (r < 0)
return r;
- r = wait_for_initialized(d, &device);
+ r = device_wait_for_initialization(d, "rfkill", &device);
if (r < 0)
return r;
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)