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.
This commit is contained in:
parent
8c7e28a191
commit
9a73bd7cab
|
@ -221,6 +221,12 @@ static void worker_attach_event(struct worker *worker, struct event *event) {
|
||||||
event->worker = worker;
|
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) {
|
static void worker_spawn(Manager *manager, struct event *event) {
|
||||||
struct udev *udev = event->udev;
|
struct udev *udev = event->udev;
|
||||||
_cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
|
_cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
|
||||||
|
@ -292,7 +298,6 @@ static void worker_spawn(Manager *manager, struct event *event) {
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct udev_event *udev_event;
|
struct udev_event *udev_event;
|
||||||
struct worker_message msg;
|
|
||||||
int fd_lock = -1;
|
int fd_lock = -1;
|
||||||
|
|
||||||
log_debug("seq %llu running", udev_device_get_seqnum(dev));
|
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));
|
log_debug("seq %llu processed", udev_device_get_seqnum(dev));
|
||||||
|
|
||||||
/* send udevd the result of the event execution */
|
/* send udevd the result of the event execution */
|
||||||
memzero(&msg, sizeof(struct worker_message));
|
r = worker_send_message(worker_watch[WRITE_END]);
|
||||||
r = send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);
|
|
||||||
if (r < 0)
|
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_get_seqnum(dev));
|
||||||
|
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
|
|
Loading…
Reference in a new issue