X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=blobmsg.h;h=f2fc0d0ad107010a982f29d991f10b1a9757b4c8;hb=c1be505732e6d254464973bdeacb955214c76c46;hp=456508221df201fe8bb6aed1abfd8a159c9bc7c0;hpb=e85cb739766d00977a08cce98f161976da5fbefc;p=project%2Flibubox.git diff --git a/blobmsg.h b/blobmsg.h index 4565082..f2fc0d0 100644 --- a/blobmsg.h +++ b/blobmsg.h @@ -31,10 +31,11 @@ enum blobmsg_type { BLOBMSG_TYPE_INT32, BLOBMSG_TYPE_INT16, BLOBMSG_TYPE_INT8, + BLOBMSG_TYPE_BOOL = BLOBMSG_TYPE_INT8, BLOBMSG_TYPE_DOUBLE, __BLOBMSG_TYPE_LAST, BLOBMSG_TYPE_LAST = __BLOBMSG_TYPE_LAST - 1, - BLOBMSG_TYPE_BOOL = BLOBMSG_TYPE_INT8, + BLOBMSG_CAST_INT64 = __BLOBMSG_TYPE_LAST, }; struct blobmsg_hdr { @@ -61,7 +62,7 @@ static inline void blobmsg_clear_name(struct blob_attr *attr) static inline const char *blobmsg_name(const struct blob_attr *attr) { struct blobmsg_hdr *hdr = (struct blobmsg_hdr *) blob_data(attr); - return (const char *) hdr->name; + return (const char *)(hdr + 1); } static inline int blobmsg_type(const struct blob_attr *attr) @@ -177,6 +178,20 @@ int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len, int blobmsg_add_field(struct blob_buf *buf, int type, const char *name, const void *data, unsigned int len); +static inline int +blobmsg_parse_attr(const struct blobmsg_policy *policy, int policy_len, + struct blob_attr **tb, struct blob_attr *data) +{ + return blobmsg_parse(policy, policy_len, tb, blobmsg_data(data), blobmsg_len(data)); +} + +static inline int +blobmsg_parse_array_attr(const struct blobmsg_policy *policy, int policy_len, + struct blob_attr **tb, struct blob_attr *data) +{ + return blobmsg_parse_array(policy, policy_len, tb, blobmsg_data(data), blobmsg_len(data)); +} + static inline int blobmsg_add_double(struct blob_buf *buf, const char *name, double val) { @@ -288,6 +303,38 @@ static inline uint64_t blobmsg_get_u64(struct blob_attr *attr) return tmp; } +static inline uint64_t blobmsg_cast_u64(struct blob_attr *attr) +{ + uint64_t tmp = 0; + + if (blobmsg_type(attr) == BLOBMSG_TYPE_INT64) + tmp = blobmsg_get_u64(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT32) + tmp = blobmsg_get_u32(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT16) + tmp = blobmsg_get_u16(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT8) + tmp = blobmsg_get_u8(attr); + + return tmp; +} + +static inline int64_t blobmsg_cast_s64(struct blob_attr *attr) +{ + int64_t tmp = 0; + + if (blobmsg_type(attr) == BLOBMSG_TYPE_INT64) + tmp = blobmsg_get_u64(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT32) + tmp = (int32_t)blobmsg_get_u32(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT16) + tmp = (int16_t)blobmsg_get_u16(attr); + else if (blobmsg_type(attr) == BLOBMSG_TYPE_INT8) + tmp = (int8_t)blobmsg_get_u8(attr); + + return tmp; +} + static inline double blobmsg_get_double(struct blob_attr *attr) { union {