X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=blobmsg.c;h=307662051d9ae66b84f6f2304feb38e2465c3e9a;hp=8e2d73a0b8157872d0876050852d7d6b3564217c;hb=a34c8f6918c291275ded2b6fd9b94ac91722ded2;hpb=4b5f278195c4bda222759682a2f9167646d05c77 diff --git a/blobmsg.c b/blobmsg.c index 8e2d73a..3076620 100644 --- a/blobmsg.c +++ b/blobmsg.c @@ -102,7 +102,7 @@ int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len, blob_id(attr) != policy[i].type) continue; - if (!blobmsg_check_attr(attr, true)) + if (!blobmsg_check_attr(attr, false)) return -1; if (tb[i]) @@ -195,7 +195,7 @@ blobmsg_new(struct blob_buf *buf, int type, const char *name, int payload_len, v static inline int attr_to_offset(struct blob_buf *buf, struct blob_attr *attr) { - return (char *)attr - (char *) buf->buf; + return (char *)attr - (char *) buf->buf + BLOB_COOKIE; } @@ -216,6 +216,31 @@ blobmsg_open_nested(struct blob_buf *buf, const char *name, bool array) return (void *)offset; } +void +blobmsg_vprintf(struct blob_buf *buf, const char *name, const char *format, va_list arg) +{ + va_list arg2; + char cbuf; + int len; + + va_copy(arg2, arg); + len = vsnprintf(&cbuf, sizeof(cbuf), format, arg2); + va_end(arg2); + + vsprintf(blobmsg_alloc_string_buffer(buf, name, len + 1), format, arg); + blobmsg_add_string_buffer(buf); +} + +void +blobmsg_printf(struct blob_buf *buf, const char *name, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + blobmsg_vprintf(buf, name, format, ap); + va_end(ap); +} + void * blobmsg_alloc_string_buffer(struct blob_buf *buf, const char *name, int maxlen) { @@ -233,6 +258,23 @@ blobmsg_alloc_string_buffer(struct blob_buf *buf, const char *name, int maxlen) return data_dest; } +void * +blobmsg_realloc_string_buffer(struct blob_buf *buf, int maxlen) +{ + struct blob_attr *attr = blob_next(buf->head); + int offset = attr_to_offset(buf, blob_next(buf->head)) + blob_pad_len(attr) - BLOB_COOKIE; + int required = maxlen - (buf->buflen - offset); + + if (required <= 0) + goto out; + + blob_buf_grow(buf, required); + attr = blob_next(buf->head); + +out: + return blobmsg_data(attr); +} + void blobmsg_add_string_buffer(struct blob_buf *buf) {