- iov.iov_len += sizeof(struct blob_attr);
- if (!recv_retry(ctx->sock.fd, &iov, false))
+ r = recv_retry(ctx->sock.fd, &iov, false, recv_fd);
+ if (r <= 0) {
+ if (r < 0)
+ ctx->sock.eof = true;
+
+ return false;
+ }
+
+ if (!ubus_validate_hdr(&hdrbuf.hdr))
+ return false;
+
+ len = blob_raw_len(&hdrbuf.data);
+ 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
+ len = -1;
+
+ if (len > -1) {
+ ctx->msgbuf.data = realloc(ctx->msgbuf.data, len * sizeof(char));
+ if (ctx->msgbuf.data)
+ ctx->msgbuf_data_len = len;
+ }
+ if (!ctx->msgbuf.data)