#define STATIC_IOV(_var) { .iov_base = (char *) &(_var), .iov_len = sizeof(_var) }
+#define UBUS_MSGBUF_REDUCTION_INTERVAL 16
+
static const struct blob_attr_info ubus_policy[UBUS_ATTR_MAX] = {
[UBUS_ATTR_STATUS] = { .type = BLOB_ATTR_INT32 },
[UBUS_ATTR_OBJID] = { .type = BLOB_ATTR_INT32 },
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 */
struct blob_attr data;
} hdrbuf;
struct iovec iov = STATIC_IOV(hdrbuf);
+ int len;
int r;
/* receive header + start attribute */
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)
+ return false;
+
memcpy(&ctx->msgbuf.hdr, &hdrbuf.hdr, sizeof(hdrbuf.hdr));
memcpy(ctx->msgbuf.data, &hdrbuf.data, sizeof(hdrbuf.data));