blobmsg: add blobmsg_parse_array()

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
Felix Fietkau 2013-01-08 02:05:00 +01:00
parent dde64e47ca
commit 2f74dbad14
2 changed files with 29 additions and 0 deletions

View file

@ -89,6 +89,33 @@ bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
return true; return true;
} }
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
struct blob_attr **tb, void *data, int len)
{
struct blob_attr *attr;
int i = 0;
memset(tb, 0, policy_len * sizeof(*tb));
__blob_for_each_attr(attr, data, len) {
if (policy[i].type != BLOBMSG_TYPE_UNSPEC &&
blob_id(attr) != policy[i].type)
continue;
if (!blobmsg_check_attr(attr, true))
return -1;
if (tb[i])
continue;
tb[i++] = attr;
if (i == policy_len)
break;
}
return 0;
}
int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len, int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len,
struct blob_attr **tb, void *data, int len) struct blob_attr **tb, void *data, int len)
{ {

View file

@ -81,6 +81,8 @@ bool blobmsg_check_attr(const struct blob_attr *attr, bool name);
bool blobmsg_check_attr_list(const struct blob_attr *attr, int type); bool blobmsg_check_attr_list(const struct blob_attr *attr, int type);
int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len, int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len,
struct blob_attr **tb, void *data, int len); struct blob_attr **tb, void *data, int len);
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
struct blob_attr **tb, void *data, int len);
int blobmsg_add_field(struct blob_buf *buf, int type, const char *name, int blobmsg_add_field(struct blob_buf *buf, int type, const char *name,
const void *data, int len); const void *data, int len);