Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blob.c5
-rw-r--r--blob.h9
-rw-r--r--blobmsg.c1
-rw-r--r--blobmsg.h7
4 files changed, 17 insertions, 5 deletions
diff --git a/blob.c b/blob.c
index faa3bb8..2da7cac 100644
--- a/blob.c
+++ b/blob.c
@@ -115,10 +115,9 @@ blob_fill_pad(struct blob_attr *attr)
void
blob_set_raw_len(struct blob_attr *attr, unsigned int len)
{
- int id = blob_id(attr);
len &= BLOB_ATTR_LEN_MASK;
- len |= (id << BLOB_ATTR_ID_SHIFT) & BLOB_ATTR_ID_MASK;
- attr->id_len = cpu_to_be32(len);
+ attr->id_len &= ~cpu_to_be32(BLOB_ATTR_LEN_MASK);
+ attr->id_len |= cpu_to_be32(len);
}
struct blob_attr *
diff --git a/blob.h b/blob.h
index fa430a8..37a572b 100644
--- a/blob.h
+++ b/blob.h
@@ -42,10 +42,11 @@ enum {
BLOB_ATTR_LAST
};
-#define BLOB_ATTR_ID_MASK 0xff000000
+#define BLOB_ATTR_ID_MASK 0x7f000000
#define BLOB_ATTR_ID_SHIFT 24
#define BLOB_ATTR_LEN_MASK 0x00ffffff
#define BLOB_ATTR_ALIGN 4
+#define BLOB_ATTR_EXTENDED 0x80000000
struct blob_attr {
uint32_t id_len;
@@ -85,6 +86,12 @@ blob_id(const struct blob_attr *attr)
return id;
}
+static inline bool
+blob_is_extended(const struct blob_attr *attr)
+{
+ return !!(attr->id_len & cpu_to_be32(BLOB_ATTR_EXTENDED));
+}
+
/*
* blob_len: returns the length of the attribute's payload
*/
diff --git a/blobmsg.c b/blobmsg.c
index 3076620..47ee9e7 100644
--- a/blobmsg.c
+++ b/blobmsg.c
@@ -181,6 +181,7 @@ blobmsg_new(struct blob_buf *buf, int type, const char *name, int payload_len, v
if (!attr)
return NULL;
+ attr->id_len |= be32_to_cpu(BLOB_ATTR_EXTENDED);
hdr = blob_data(attr);
hdr->namelen = cpu_to_be16(namelen);
strcpy((char *) hdr->name, (const char *)name);
diff --git a/blobmsg.h b/blobmsg.h
index 4619643..e9e0e6e 100644
--- a/blobmsg.h
+++ b/blobmsg.h
@@ -65,7 +65,12 @@ static inline int blobmsg_type(const struct blob_attr *attr)
static inline void *blobmsg_data(const struct blob_attr *attr)
{
struct blobmsg_hdr *hdr = (struct blobmsg_hdr *) blob_data(attr);
- return (char *) hdr + blobmsg_hdrlen(be16_to_cpu(hdr->namelen));
+ char *data = blob_data(attr);
+
+ if (blob_is_extended(attr))
+ data += blobmsg_hdrlen(be16_to_cpu(hdr->namelen));
+
+ return data;
}
static inline int blobmsg_data_len(const struct blob_attr *attr)