]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
util: make device_wait_for_initialization() optionally takes timeout value
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 1 Jun 2019 16:01:31 +0000 (01:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 3 Jun 2019 16:19:43 +0000 (01:19 +0900)
src/rfkill/rfkill.c
src/shared/dissect-image.c
src/shared/udev-util.c
src/shared/udev-util.h

index fe26566fa3dd8d1d8ba0b0b4952c9375f2382f2f..f9d309c909a7ecddc235948b09187dc2e2f3d2ad 100644 (file)
@@ -109,7 +109,7 @@ static int determine_state_file(
         if (r < 0)
                 return r;
 
-        r = device_wait_for_initialization(d, "rfkill", &device);
+        r = device_wait_for_initialization(d, "rfkill", USEC_INFINITY, &device);
         if (r < 0)
                 return r;
 
index 168fa9cda51978d9a756ff1ac9c6ee9ef4138664..95ee7efa92af6fa453f939d8c907b812ca8c1006 100644 (file)
@@ -181,7 +181,7 @@ static int wait_for_partitions_to_appear(
                         continue;
 
                 if (!FLAGS_SET(flags, DISSECT_IMAGE_NO_UDEV)) {
-                        r = device_wait_for_initialization(q, "block", NULL);
+                        r = device_wait_for_initialization(q, "block", USEC_INFINITY, NULL);
                         if (r < 0)
                                 return r;
                 }
@@ -251,7 +251,7 @@ static int loop_wait_for_partitions_to_appear(
         log_debug("Waiting for device (parent + %d partitions) to appear...", num_partitions);
 
         if (!FLAGS_SET(flags, DISSECT_IMAGE_NO_UDEV)) {
-                r = device_wait_for_initialization(d, "block", &device);
+                r = device_wait_for_initialization(d, "block", USEC_INFINITY, &device);
                 if (r < 0)
                         return r;
         } else
index 1ca5080d1c802ebf53a1e3fa05050f7563190a36..482d914d0785823dbcd76d986b2fe387042b2622 100644 (file)
@@ -113,8 +113,13 @@ static int device_monitor_handler(sd_device_monitor *monitor, sd_device *device,
         return 0;
 }
 
-int device_wait_for_initialization(sd_device *device, const char *subsystem, sd_device **ret) {
+static int device_timeout_handler(sd_event_source *s, uint64_t usec, void *userdata) {
+        return sd_event_exit(sd_event_source_get_event(s), -ETIMEDOUT);
+}
+
+int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t timeout, sd_device **ret) {
         _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor = NULL;
+        _cleanup_(sd_event_source_unrefp) sd_event_source *timeout_source = NULL;
         _cleanup_(sd_event_unrefp) sd_event *event = NULL;
         struct DeviceMonitorData data = {};
         int r;
@@ -159,6 +164,14 @@ int device_wait_for_initialization(sd_device *device, const char *subsystem, sd_
         if (r < 0)
                 return log_error_errno(r, "Failed to start device monitor: %m");
 
+        if (timeout != USEC_INFINITY) {
+                r = sd_event_add_time(event, &timeout_source,
+                                      CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + timeout, 0,
+                                      device_timeout_handler, NULL);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add timeout event source: %m");
+        }
+
         /* Check again, maybe things changed. Udev will re-read the db if the device wasn't initialized
          * yet. */
         if (sd_device_get_is_initialized(device) > 0) {
@@ -169,7 +182,7 @@ int device_wait_for_initialization(sd_device *device, const char *subsystem, sd_
 
         r = sd_event_loop(event);
         if (r < 0)
-                return log_error_errno(r, "Event loop failed: %m");
+                return log_error_errno(r, "Failed to wait for device to be initialized: %m");
 
         if (ret)
                 *ret = TAKE_PTR(data.device);
index 3c45447515651df15077dd53f7dcf085721a68b3..f62c4c56e394b5007db4f9c0e64a3cb514a12fc8 100644 (file)
@@ -27,6 +27,6 @@ static inline int udev_parse_config(void) {
         return udev_parse_config_full(NULL, NULL, NULL, NULL);
 }
 
-int device_wait_for_initialization(sd_device *device, const char *subsystem, sd_device **ret);
+int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t timeout, sd_device **ret);
 int device_is_renaming(sd_device *dev);
 bool device_for_action(sd_device *dev, DeviceAction action);