static int writev_retry(int fd, struct iovec *iov, int iov_len, int sock_fd)
{
static struct {
- struct cmsghdr h;
int fd;
+ struct cmsghdr h;
} fd_buf = {
.h = {
.cmsg_len = sizeof(fd_buf),
int len = 0;
do {
- int cur_len;
+ ssize_t cur_len;
if (sock_fd < 0) {
msghdr.msg_control = NULL;
sock_fd = -1;
len += cur_len;
- while (cur_len >= iov->iov_len) {
+ while (cur_len >= (ssize_t) iov->iov_len) {
cur_len -= iov->iov_len;
iov_len--;
iov++;
int bytes, total = 0;
int fd = ctx->sock.fd;
static struct {
- struct cmsghdr h;
int fd;
+ struct cmsghdr h;
} fd_buf = {
.h = {
.cmsg_type = SCM_RIGHTS,
};
while (iov->iov_len > 0) {
- if (wait)
- wait_data(fd, false);
-
if (recv_fd) {
msghdr.msg_control = &fd_buf;
msghdr.msg_controllen = sizeof(fd_buf);
if (bytes < 0) {
bytes = 0;
- if (uloop_cancelling() || ctx->cancel_poll)
- return 0;
if (errno == EINTR)
continue;
iov->iov_len -= bytes;
iov->iov_base += bytes;
total += bytes;
+
+ if (iov->iov_len > 0)
+ wait_data(fd, false);
}
return total;
}
-static bool ubus_validate_hdr(struct ubus_msghdr *hdr)
+bool ubus_validate_hdr(struct ubus_msghdr *hdr)
{
struct blob_attr *data = (struct blob_attr *) (hdr + 1);
goto out_close;
memcpy(buf, &hdr.data, sizeof(hdr.data));
- if (read(ctx->sock.fd, blob_data(buf), blob_len(buf)) != blob_len(buf))
+ if (read(ctx->sock.fd, blob_data(buf), blob_len(buf)) != (ssize_t) blob_len(buf))
goto out_free;
ctx->local_id = hdr.hdr.peer;