- return ubus_complete_request(ctx, &req);
-}
-
-static void ubus_add_object_cb(struct ubus_request *req, int type, struct blob_attr *msg)
-{
- struct ubus_object *obj = req->priv;
-
- ubus_parse_msg(msg);
-
- if (!attrbuf[UBUS_ATTR_OBJID])
- return;
-
- obj->id = blob_get_u32(attrbuf[UBUS_ATTR_OBJID]);
-
- if (attrbuf[UBUS_ATTR_OBJTYPE])
- obj->type->id = blob_get_u32(attrbuf[UBUS_ATTR_OBJTYPE]);
-
- obj->avl.key = &obj->id;
- avl_insert(&req->ctx->objects, &obj->avl);
-}
-
-static bool ubus_push_table_data(const struct ubus_signature **sig, int *rem, bool array)
-{
- const struct ubus_signature *cur;
- bool nest_type;
- void *nest;
-
- while (rem) {
- cur = (*sig)++;
- (*rem)--;
- switch(cur->type) {
- case UBUS_SIGNATURE_END:
- return !array;
- case BLOBMSG_TYPE_INT32:
- case BLOBMSG_TYPE_STRING:
- blobmsg_add_u32(&b, cur->name, cur->type);
- break;
- case BLOBMSG_TYPE_TABLE:
- case BLOBMSG_TYPE_ARRAY:
- nest_type = cur->type == BLOBMSG_TYPE_ARRAY;
- nest = blobmsg_open_nested(&b, cur->name, nest_type);
- if (!ubus_push_table_data(sig, rem, nest_type))
- return false;
- blobmsg_close_table(&b, nest);
- break;
- default:
- return false;
- }
- if (array)
- return true;
- }
- return false;
-}
-
-static bool ubus_push_object_type(struct ubus_object_type *type)
-{
- void *s, *m;
- int rem = type->n_signature;
- const struct ubus_signature *sig = type->signature;
-
- s = blob_nest_start(&b, UBUS_ATTR_SIGNATURE);
- while (rem) {
- if (sig->type != UBUS_SIGNATURE_METHOD)
- return false;
-
- m = blobmsg_open_table(&b, sig->name);
-
- sig++;
- rem--;
- if (!ubus_push_table_data(&sig, &rem, false))
- return false;
-
- blobmsg_close_table(&b, m);
- }
- blob_nest_end(&b, s);
-
- return true;
-}
-
-static int __ubus_add_object(struct ubus_context *ctx, struct ubus_object *obj)
-{
- struct ubus_request req;
- int ret;
-
- blob_buf_init(&b, 0);
-
- if (obj->name && obj->type) {
- blob_put_string(&b, UBUS_ATTR_OBJPATH, obj->name);
-
- if (obj->type->id)
- blob_put_int32(&b, UBUS_ATTR_OBJTYPE, obj->type->id);
- else if (!ubus_push_object_type(obj->type))
- return UBUS_STATUS_INVALID_ARGUMENT;
- }
-
- ubus_start_request(ctx, &req, b.head, UBUS_MSG_ADD_OBJECT, 0);
- req.raw_data_cb = ubus_add_object_cb;
- req.priv = obj;
- ret = ubus_complete_request(ctx, &req);
- if (ret)
- return ret;
-
- if (!obj->id)
- return UBUS_STATUS_NO_DATA;
-
- return 0;