summaryrefslogtreecommitdiff
path: root/src/udev
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2015-05-27 07:46:12 -0400
committerAnthony G. Basile <blueness@gentoo.org>2015-05-27 07:46:12 -0400
commit233b58f3ac6d9ee34f0e428968c36b2e72ddb20c (patch)
tree3f6cb9281660fb239ec40d28c7c901f69b421ba5 /src/udev
parentb27de334488b0a7f9c6840b09d57fa2873034f39 (diff)
udevd: worker - use loop_write() rather than send()
When notifying the main daemon about event completion, make sure the message is sent successfully, and not interrupted. Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
Diffstat (limited to 'src/udev')
-rw-r--r--src/udev/udevd.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 7c919dc1b7..f9fa3f6e66 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -215,6 +215,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(struct event *event) {
struct udev *udev = event->udev;
_cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
@@ -285,7 +291,6 @@ static void worker_spawn(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));
@@ -355,10 +360,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);