X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=blobdiff_plain;f=src%2Fudev%2Fudev-ctrl.c;h=dafe3da2511b39ac55f701160277a3614f3adba6;hp=59ce5c1f80098c42c21022cdaac802cb175bc53c;hb=39cf0351c529584aa8f270e3b418d7ab9461b622;hpb=83159fa039b82fce4fc0d4133c3bb3bd63b57d1a diff --git a/src/udev/udev-ctrl.c b/src/udev/udev-ctrl.c index 59ce5c1f800..dafe3da2511 100644 --- a/src/udev/udev-ctrl.c +++ b/src/udev/udev-ctrl.c @@ -13,13 +13,13 @@ #include #include #include -#include #include #include #include "sd-event.h" #include "alloc-util.h" +#include "errno-util.h" #include "fd-util.h" #include "format-util.h" #include "io-util.h" @@ -75,6 +75,7 @@ int udev_ctrl_new_from_fd(struct udev_ctrl **ret, int fd) { *uctrl = (struct udev_ctrl) { .n_ref = 1, .sock = fd >= 0 ? fd : TAKE_FD(sock), + .sock_connect = -1, .bound = fd >= 0, }; @@ -188,12 +189,12 @@ static int udev_ctrl_connection_event_handler(sd_event_source *s, int fd, uint32 _cleanup_(udev_ctrl_disconnect_and_listen_againp) struct udev_ctrl *uctrl = NULL; struct udev_ctrl_msg_wire msg_wire; struct iovec iov = IOVEC_MAKE(&msg_wire, sizeof(struct udev_ctrl_msg_wire)); - char cred_msg[CMSG_SPACE(sizeof(struct ucred))]; + CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(struct ucred))) control; struct msghdr smsg = { .msg_iov = &iov, .msg_iovlen = 1, - .msg_control = cred_msg, - .msg_controllen = sizeof(cred_msg), + .msg_control = &control, + .msg_controllen = sizeof(control), }; struct cmsghdr *cmsg; struct ucred *cred; @@ -211,13 +212,11 @@ static int udev_ctrl_connection_event_handler(sd_event_source *s, int fd, uint32 if (size == 0) return 0; /* Client disconnects? */ - size = recvmsg(fd, &smsg, 0); - if (size < 0) { - if (errno != EINTR) - return log_error_errno(errno, "Failed to receive ctrl message: %m"); - + size = recvmsg_safe(fd, &smsg, 0); + if (size == -EINTR) return 0; - } + if (size < 0) + return log_error_errno(size, "Failed to receive ctrl message: %m"); cmsg_close_all(&smsg); @@ -261,9 +260,10 @@ static int udev_ctrl_event_handler(sd_event_source *s, int fd, uint32_t revents, sock = accept4(fd, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK); if (sock < 0) { - if (errno != EINTR) - log_error_errno(errno, "Failed to accept ctrl connection: %m"); - return 0; + if (ERRNO_IS_ACCEPT_AGAIN(errno)) + return 0; + + return log_error_errno(errno, "Failed to accept ctrl connection: %m"); } /* check peer credential of connection */ @@ -389,17 +389,17 @@ int udev_ctrl_wait(struct udev_ctrl *uctrl, usec_t timeout) { if (r < 0) return r; - (void) sd_event_source_set_description(uctrl->event_source, "udev-ctrl-wait-io"); + (void) sd_event_source_set_description(source_io, "udev-ctrl-wait-io"); if (timeout != USEC_INFINITY) { - usec_t usec; - - usec = now(clock_boottime_or_monotonic()) + timeout; - r = sd_event_add_time(uctrl->event, &source_timeout, clock_boottime_or_monotonic(), usec, 0, NULL, INT_TO_PTR(-ETIMEDOUT)); + r = sd_event_add_time_relative( + uctrl->event, &source_timeout, clock_boottime_or_monotonic(), + timeout, + 0, NULL, INT_TO_PTR(-ETIMEDOUT)); if (r < 0) return r; - (void) sd_event_source_set_description(source_timeout, "udev-ctrl-wait-io"); + (void) sd_event_source_set_description(source_timeout, "udev-ctrl-wait-timeout"); } return sd_event_loop(uctrl->event);