return (char *)attr - (char *) buf->buf;
}
+void
+blob_buf_grow(struct blob_buf *buf, int required)
+{
+ int offset_head = attr_to_offset(buf, buf->head);
+
+ if (!buf->grow || !buf->grow(buf, required))
+ return;
+
+ buf->head = offset_to_attr(buf, offset_head);
+}
+
static struct blob_attr *
blob_add(struct blob_buf *buf, struct blob_attr *pos, int id, int payload)
{
struct blob_attr *attr;
if (required > 0) {
- int offset_head = attr_to_offset(buf, buf->head);
-
- if (!buf->grow || !buf->grow(buf, required))
- return NULL;
-
- buf->head = offset_to_attr(buf, offset_head);
+ blob_buf_grow(buf, required);
attr = offset_to_attr(buf, offset);
} else {
attr = pos;
return attr;
}
+struct blob_attr *
+blob_put_raw(struct blob_buf *buf, const void *ptr, int len)
+{
+ struct blob_attr *attr;
+
+ if (len < sizeof(struct blob_attr) || !ptr)
+ return NULL;
+
+ attr = blob_add(buf, blob_next(buf->head), 0, len - sizeof(struct blob_attr));
+ blob_set_raw_len(buf->head, blob_pad_len(buf->head) + len);
+ memcpy(attr, ptr, len);
+ return attr;
+}
+
struct blob_attr *
blob_put(struct blob_buf *buf, int id, const void *ptr, int len)
{