blobmsg: add blobmsg_check_array, which returns the size of the array
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
parent
fd5b522ce6
commit
7ba1f8acd8
2 changed files with 23 additions and 6 deletions
20
blobmsg.c
20
blobmsg.c
|
@ -62,11 +62,12 @@ bool blobmsg_check_attr(const struct blob_attr *attr, bool name)
|
||||||
return blob_check_type(data, len, blob_type[id]);
|
return blob_check_type(data, len, blob_type[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
|
int blobmsg_check_array(const struct blob_attr *attr, int type)
|
||||||
{
|
{
|
||||||
struct blob_attr *cur;
|
struct blob_attr *cur;
|
||||||
bool name;
|
bool name;
|
||||||
int rem;
|
int rem;
|
||||||
|
int size = 0;
|
||||||
|
|
||||||
switch (blobmsg_type(attr)) {
|
switch (blobmsg_type(attr)) {
|
||||||
case BLOBMSG_TYPE_TABLE:
|
case BLOBMSG_TYPE_TABLE:
|
||||||
|
@ -76,18 +77,25 @@ bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
|
||||||
name = false;
|
name = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
blobmsg_for_each_attr(cur, attr, rem) {
|
blobmsg_for_each_attr(cur, attr, rem) {
|
||||||
if (blobmsg_type(cur) != type)
|
if (type != BLOBMSG_TYPE_UNSPEC && blobmsg_type(cur) != type)
|
||||||
return false;
|
return -1;
|
||||||
|
|
||||||
if (!blobmsg_check_attr(cur, name))
|
if (!blobmsg_check_attr(cur, name))
|
||||||
return false;
|
return -1;
|
||||||
|
|
||||||
|
size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool blobmsg_check_attr_list(const struct blob_attr *attr, int type)
|
||||||
|
{
|
||||||
|
return blobmsg_check_array(attr, type) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
|
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
|
||||||
|
|
|
@ -90,6 +90,15 @@ static inline int blobmsg_len(const struct blob_attr *attr)
|
||||||
|
|
||||||
bool blobmsg_check_attr(const struct blob_attr *attr, bool name);
|
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);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* blobmsg_check_array: validate array/table and return size
|
||||||
|
*
|
||||||
|
* Checks if all elements of an array or table are valid and have
|
||||||
|
* the specified type. Returns the number of elements in the array
|
||||||
|
*/
|
||||||
|
int blobmsg_check_array(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, unsigned int len);
|
struct blob_attr **tb, void *data, unsigned int len);
|
||||||
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
|
int blobmsg_parse_array(const struct blobmsg_policy *policy, int policy_len,
|
||||||
|
|
Loading…
Reference in a new issue