hdr.version = 0;
hdr.type = cmd;
- hdr.seq = seq;
- hdr.peer = peer;
+ hdr.seq = cpu_to_be16(seq);
+ hdr.peer = cpu_to_be32(peer);
if (!msg) {
blob_buf_init(&b, 0);
return ret;
}
-static int recv_retry(int fd, struct iovec *iov, bool wait, int *recv_fd)
+static int recv_retry(struct ubus_context *ctx, struct iovec *iov, bool wait, int *recv_fd)
{
int bytes, total = 0;
+ int fd = ctx->sock.fd;
static struct {
struct cmsghdr h;
int fd;
if (bytes < 0) {
bytes = 0;
- if (uloop_cancelled)
+ if (uloop_cancelling() || ctx->cancel_poll)
return 0;
if (errno == EINTR)
continue;
return false;
ctx->msgbuf.data = ptr;
+ ctx->msgbuf_data_len = len;
return true;
}
int r;
/* receive header + start attribute */
- r = recv_retry(ctx->sock.fd, &iov, false, recv_fd);
+ r = recv_retry(ctx, &iov, false, recv_fd);
if (r <= 0) {
if (r < 0)
ctx->sock.eof = true;
return false;
}
+ hdrbuf.hdr.seq = be16_to_cpu(hdrbuf.hdr.seq);
+ hdrbuf.hdr.peer = be32_to_cpu(hdrbuf.hdr.peer);
+
if (!ubus_validate_hdr(&hdrbuf.hdr))
return false;
iov.iov_base = (char *)ctx->msgbuf.data + sizeof(hdrbuf.data);
iov.iov_len = blob_len(ctx->msgbuf.data);
- if (iov.iov_len > 0 && !recv_retry(ctx->sock.fd, &iov, true, NULL))
+ if (iov.iov_len > 0 &&
+ recv_retry(ctx, &iov, true, NULL) <= 0)
return false;
return true;
while (get_next_msg(ctx, &recv_fd)) {
ubus_process_msg(ctx, &ctx->msgbuf, recv_fd);
- if (uloop_cancelled)
+ if (uloop_cancelling() || ctx->cancel_poll)
break;
}
.events = POLLIN | POLLERR,
};
+ ctx->cancel_poll = false;
poll(&pfd, 1, timeout ? timeout : -1);
ubus_handle_data(&ctx->sock, ULOOP_READ);
}
close(ctx->sock.fd);
}
+ ctx->sock.eof = false;
+ ctx->sock.error = false;
ctx->sock.fd = usock(USOCK_UNIX, path, NULL);
if (ctx->sock.fd < 0)
return UBUS_STATUS_CONNECTION_FAILED;