blobmsg: add blobmsg_parse_array()
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
parent
dde64e47ca
commit
2f74dbad14
2 changed files with 29 additions and 0 deletions
27
blobmsg.c
27
blobmsg.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue