X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=libubus-io.c;h=daa710677880c1d5933b45ab9b528116c5f320ca;hb=d57907c2b30170bdab7d59a4fad6e514f1861bbb;hp=b9b312807fa08182667f40b76e204ad8829007b7;hpb=04e644bcce3207df6992cbc36598afc4abf871b1;p=project%2Fubus.git diff --git a/libubus-io.c b/libubus-io.c index b9b3128..daa7106 100644 --- a/libubus-io.c +++ b/libubus-io.c @@ -133,8 +133,8 @@ int __hidden ubus_send_msg(struct ubus_context *ctx, uint32_t seq, 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); @@ -154,9 +154,10 @@ int __hidden ubus_send_msg(struct ubus_context *ctx, uint32_t seq, 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; @@ -191,7 +192,7 @@ static int recv_retry(int fd, struct iovec *iov, bool wait, int *recv_fd) if (bytes < 0) { bytes = 0; - if (uloop_cancelled) + if (uloop_cancelling() || ctx->cancel_poll) return 0; if (errno == EINTR) continue; @@ -259,6 +260,7 @@ static bool alloc_msg_buf(struct ubus_context *ctx, int len) return false; ctx->msgbuf.data = ptr; + ctx->msgbuf_data_len = len; return true; } @@ -273,7 +275,7 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) 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; @@ -281,6 +283,9 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) 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; @@ -294,7 +299,7 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) 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) <= 0) + recv_retry(ctx, &iov, true, NULL) <= 0) return false; return true; @@ -307,7 +312,7 @@ void __hidden ubus_handle_data(struct uloop_fd *u, unsigned int events) 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; } @@ -322,6 +327,7 @@ void __hidden ubus_poll_data(struct ubus_context *ctx, int timeout) .events = POLLIN | POLLERR, }; + ctx->cancel_poll = false; poll(&pfd, 1, timeout ? timeout : -1); ubus_handle_data(&ctx->sock, ULOOP_READ); } @@ -368,6 +374,8 @@ int ubus_reconnect(struct ubus_context *ctx, const char *path) 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;