+ 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_reduction_counter > 0 && len < UBUS_MSG_CHUNK_SIZE)
+ len = !--ctx->msgbuf_reduction_counter ? UBUS_MSG_CHUNK_SIZE : -1;
+ 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)
+ return false;
+
+ memcpy(&ctx->msgbuf.hdr, &hdrbuf.hdr, sizeof(hdrbuf.hdr));
+ memcpy(ctx->msgbuf.data, &hdrbuf.data, sizeof(hdrbuf.data));
+
+ iov.iov_base = (char *)ctx->msgbuf.data + sizeof(hdrbuf.data);
+ iov.iov_len = blob_len(ctx->msgbuf.data);