- struct uh_ubus_session *ses;
- struct uh_ubus_session_data *data;
- struct blob_attr *tb[__UH_UBUS_SA_MAX];
- struct blob_attr *attr;
- struct blob_buf b;
- void *c;
- int rem;
-
- blobmsg_parse(get_policy, __UH_UBUS_SG_MAX, tb, blob_data(msg), blob_len(msg));
-
- if (!tb[UH_UBUS_SG_SID])
- return UBUS_STATUS_INVALID_ARGUMENT;
-
- ses = uh_ubus_session_get(blobmsg_data(tb[UH_UBUS_SG_SID]));
- if (!ses)
- return UBUS_STATUS_NOT_FOUND;
-
- memset(&b, 0, sizeof(b));
- blob_buf_init(&b, 0);
- c = blobmsg_open_table(&b, "values");
-
- if (!tb[UH_UBUS_SG_KEYS]) {
- uh_ubus_session_dump_data(ses, &b);
- return 0;
- }
-
- blobmsg_for_each_attr(attr, tb[UH_UBUS_SG_KEYS], rem) {
- if (blob_id(attr) != BLOBMSG_TYPE_STRING)
- continue;
-
- data = avl_find_element(&ses->data, blobmsg_data(attr), data, avl);
- if (!data)
- continue;
-
- blobmsg_add_field(&b, blobmsg_type(data->attr),
- blobmsg_name(data->attr),
- blobmsg_data(data->attr),
- blobmsg_data_len(data->attr));
- }
-
- blobmsg_close_table(&b, c);
- ubus_send_reply(ctx, req, b.head);
- blob_buf_free(&b);