diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-01-08 05:05:00 +0400 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-01-08 05:05:03 +0400 |
commit | 2f74dbad14b42c3a6687b093210b8604d0b235cd (patch) | |
tree | d2478279e17ed6b0d064a7e602de7aa115c325a1 /blobmsg.c | |
parent | dde64e47cadbd245a99f145869eb400b68cc82e9 (diff) |
blobmsg: add blobmsg_parse_array()
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Diffstat (limited to 'blobmsg.c')
-rw-r--r-- | blobmsg.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -89,6 +89,33 @@ bool blobmsg_check_attr_list(const struct blob_attr *attr, int type) 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, struct blob_attr **tb, void *data, int len) { |