if (!iov_len)
return len;
}
+ iov->iov_base += cur_len;
iov->iov_len -= cur_len;
+ msghdr.msg_iov = iov;
+ msghdr.msg_iovlen = iov_len;
} while (1);
/* Should never reach here */
return false;
len = blob_raw_len(&hdrbuf.data);
- if (len > ctx->msgbuf_data_len) {
+ if (len > ctx->msgbuf_data_len)
ctx->msgbuf_reduction_counter = UBUS_MSGBUF_REDUCTION_INTERVAL;
- } else if (ctx->msgbuf_data_len > UBUS_MSG_CHUNK_SIZE) {
- if (ctx->msgbuf_reduction_counter > 0) {
- len = -1;
- --ctx->msgbuf_reduction_counter;
- } else
- len = UBUS_MSG_CHUNK_SIZE;
- } else
+ else if (ctx->msgbuf_reduction_counter > 0 && len < UBUS_MSG_CHUNK_SIZE)
+ len = !--ctx->msgbuf_reduction_counter ? UBUS_MSG_CHUNK_SIZE : -1;
+ else
len = -1;
if (len > -1) {
goto out_free;
ret = UBUS_STATUS_OK;
- fcntl(ctx->sock.fd, F_SETFL, fcntl(ctx->sock.fd, F_GETFL) | O_NONBLOCK);
+ fcntl(ctx->sock.fd, F_SETFL, fcntl(ctx->sock.fd, F_GETFL) | O_NONBLOCK | O_CLOEXEC);
ubus_refresh_state(ctx);