]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: worker - use loop_write() rather than send()
authorTom Gundersen <teg@jklm.no>
Fri, 15 May 2015 09:41:36 +0000 (11:41 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 15 May 2015 23:14:48 +0000 (01:14 +0200)
When notifying the main daemon about event completion, make sure the message is sent
successfully, and not interrupted.

src/udev/udevd.c

index 318d769114814ce6d21f90236752993fdc56574b..8142ec605dc9b4e774cbe8cace7e9a1e67364e8a 100644 (file)
@@ -221,6 +221,12 @@ static void worker_attach_event(struct worker *worker, struct event *event) {
         event->worker = worker;
 }
 
+static int worker_send_message(int fd) {
+        struct worker_message message = {};
+
+        return loop_write(fd, &message, sizeof(message), false);
+}
+
 static void worker_spawn(Manager *manager, struct event *event) {
         struct udev *udev = event->udev;
         _cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
@@ -292,7 +298,6 @@ static void worker_spawn(Manager *manager, struct event *event) {
 
                 for (;;) {
                         struct udev_event *udev_event;
-                        struct worker_message msg;
                         int fd_lock = -1;
 
                         log_debug("seq %llu running", udev_device_get_seqnum(dev));
@@ -369,10 +374,9 @@ skip:
                         log_debug("seq %llu processed", udev_device_get_seqnum(dev));
 
                         /* send udevd the result of the event execution */
-                        memzero(&msg, sizeof(struct worker_message));
-                        r = send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);
+                        r = worker_send_message(worker_watch[WRITE_END]);
                         if (r < 0)
-                                log_error_errno(errno, "failed to send result of seq %llu to main daemon: %m",
+                                log_error_errno(r, "failed to send result of seq %llu to main daemon: %m",
                                                 udev_device_get_seqnum(dev));
 
                         udev_device_unref(dev);