projects
/
project
/
ubus.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix invalid close() call
[project/ubus.git]
/
libubus-io.c
diff --git
a/libubus-io.c
b/libubus-io.c
index
b9b3128
..
daa7106
100644
(file)
--- 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.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);
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;
}
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 bytes, total = 0;
+ int fd = ctx->sock.fd;
static struct {
struct cmsghdr h;
int 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 (bytes < 0) {
bytes = 0;
- if (uloop_cancell
ed
)
+ if (uloop_cancell
ing() || ctx->cancel_poll
)
return 0;
if (errno == EINTR)
continue;
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;
return false;
ctx->msgbuf.data = ptr;
+ ctx->msgbuf_data_len = len;
return true;
}
return true;
}
@@
-273,7
+275,7
@@
static bool get_next_msg(struct ubus_context *ctx, int *recv_fd)
int r;
/* receive header + start attribute */
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;
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;
}
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;
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 &&
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;
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);
while (get_next_msg(ctx, &recv_fd)) {
ubus_process_msg(ctx, &ctx->msgbuf, recv_fd);
- if (uloop_cancell
ed
)
+ if (uloop_cancell
ing() || ctx->cancel_poll
)
break;
}
break;
}
@@
-322,6
+327,7
@@
void __hidden ubus_poll_data(struct ubus_context *ctx, int timeout)
.events = POLLIN | POLLERR,
};
.events = POLLIN | POLLERR,
};
+ ctx->cancel_poll = false;
poll(&pfd, 1, timeout ? timeout : -1);
ubus_handle_data(&ctx->sock, ULOOP_READ);
}
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);
}
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;
ctx->sock.fd = usock(USOCK_UNIX, path, NULL);
if (ctx->sock.fd < 0)
return UBUS_STATUS_CONNECTION_FAILED;