From: Felix Fietkau Date: Tue, 8 Jan 2013 01:05:00 +0000 (+0100) Subject: blobmsg: add blobmsg_parse_array() X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2f74dbad14b42c3a6687b093210b8604d0b235cd;p=oweals%2Flibubox.git blobmsg: add blobmsg_parse_array() Signed-off-by: Felix Fietkau --- diff --git a/blobmsg.c b/blobmsg.c index 2d584a1..e04fa53 100644 --- a/blobmsg.c +++ b/blobmsg.c @@ -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) { diff --git a/blobmsg.h b/blobmsg.h index 94b145c..056f79a 100644 --- a/blobmsg.h +++ b/blobmsg.h @@ -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); int blobmsg_parse(const struct blobmsg_policy *policy, int policy_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, const void *data, int len);