ubusd: retry sending messages on EINTR

Avoids unnecessary delays and/or blocking on messages

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2019-04-16 11:13:44 +02:00
parent 76ea27a627
commit 588baa3cd7

18
ubusd.c
View file

@ -109,16 +109,16 @@ static int ubus_msg_writev(int fd, struct ubus_msg_buf *ub, int offset)
.msg_control = &fd_buf, .msg_control = &fd_buf,
.msg_controllen = sizeof(fd_buf), .msg_controllen = sizeof(fd_buf),
}; };
struct ubus_msghdr hdr;
int ret;
fd_buf.fd = ub->fd; fd_buf.fd = ub->fd;
if (ub->fd < 0) { if (ub->fd < 0 || offset) {
msghdr.msg_control = NULL; msghdr.msg_control = NULL;
msghdr.msg_controllen = 0; msghdr.msg_controllen = 0;
} }
if (offset < sizeof(ub->hdr)) { if (offset < sizeof(ub->hdr)) {
struct ubus_msghdr hdr;
hdr.version = ub->hdr.version; hdr.version = ub->hdr.version;
hdr.type = ub->hdr.type; hdr.type = ub->hdr.type;
hdr.seq = cpu_to_be16(ub->hdr.seq); hdr.seq = cpu_to_be16(ub->hdr.seq);
@ -128,12 +128,18 @@ static int ubus_msg_writev(int fd, struct ubus_msg_buf *ub, int offset)
iov[0].iov_len = sizeof(hdr) - offset; iov[0].iov_len = sizeof(hdr) - offset;
iov[1].iov_base = (char *) ub->data; iov[1].iov_base = (char *) ub->data;
iov[1].iov_len = ub->len; iov[1].iov_len = ub->len;
return sendmsg(fd, &msghdr, 0);
} else { } else {
offset -= sizeof(ub->hdr); offset -= sizeof(ub->hdr);
return write(fd, ((char *) ub->data) + offset, ub->len - offset); iov[0].iov_base = ((char *) ub->data) + offset;
iov[0].iov_len = ub->len - offset;
msghdr.msg_iovlen = 1;
} }
do {
ret = sendmsg(fd, &msghdr, 0);
} while (ret < 0 && errno == EINTR);
return ret;
} }
static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub) static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)