+__attribute__((format(printf, 3, 0)))
+int blobmsg_vprintf(struct blob_buf *buf, const char *name, const char *format, va_list arg)
+{
+ va_list arg2;
+ char cbuf;
+ char *sbuf;
+ int len, ret;
+
+ va_copy(arg2, arg);
+ len = vsnprintf(&cbuf, sizeof(cbuf), format, arg2);
+ va_end(arg2);
+
+ if (len < 0)
+ return -1;
+
+ sbuf = blobmsg_alloc_string_buffer(buf, name, len);
+ if (!sbuf)
+ return -1;
+
+ ret = vsnprintf(sbuf, len + 1, format, arg);
+ if (ret < 0)
+ return -1;
+
+ blobmsg_add_string_buffer(buf);
+
+ return ret;
+}
+
+__attribute__((format(printf, 3, 4)))
+int blobmsg_printf(struct blob_buf *buf, const char *name, const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, format);
+ ret = blobmsg_vprintf(buf, name, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+