+/*
+ * Copyright (C) 2011 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#include <libubox/avl.h>
#include <libubox/list.h>
#include <libubox/blobmsg.h>
int type, struct blob_attr *msg);
typedef void (*ubus_complete_handler_t)(struct ubus_request *req, int ret);
-
-#define UBUS_SIGNATURE(_type, _name) { .type = _type, .name = _name }
-
-#define UBUS_METHOD_START(_name) UBUS_SIGNATURE(UBUS_SIGNATURE_METHOD, _name)
-#define UBUS_METHOD_END() UBUS_SIGNATURE(UBUS_SIGNATURE_END, NULL)
-
-#define UBUS_FIELD(_type, _name) UBUS_SIGNATURE(BLOBMSG_TYPE_ ## _type, _name)
-
-#define UBUS_ARRAY(_name) UBUS_FIELD(ARRAY, _name)
-#define UBUS_ARRAY_END() UBUS_SIGNATURE(UBUS_SIGNATURE_END, NULL)
-
-#define UBUS_TABLE_START(_name) UBUS_FIELD(TABLE, _name)
-#define UBUS_TABLE_END() UBUS_SIGNATURE(UBUS_SIGNATURE_END, NULL)
-
-#define UBUS_OBJECT_TYPE(_name, _signature) \
+#define UBUS_OBJECT_TYPE(_name, _methods) \
{ \
.name = _name, \
.id = 0, \
- .n_signature = ARRAY_SIZE(_signature), \
- .signature = _signature \
+ .n_methods = ARRAY_SIZE(_methods), \
+ .methods = _methods \
+ }
+
+#define UBUS_METHOD(_name, _handler, _policy) \
+ { \
+ .name = _name, \
+ .handler = _handler, \
+ .policy = _policy, \
+ .n_policy = ARRAY_SIZE(_policy) \
}
-struct ubus_signature {
- enum blobmsg_type type;
+struct ubus_method {
const char *name;
+ ubus_handler_t handler;
+
+ const struct blobmsg_policy *policy;
+ int n_policy;
};
struct ubus_object_type {
const char *name;
uint32_t id;
- int n_signature;
- const struct ubus_signature *signature;
-};
-struct ubus_method {
- const char *name;
- ubus_handler_t handler;
+ const struct ubus_method *methods;
+ int n_methods;
};
struct ubus_object {
struct ubus_context {
struct list_head requests;
struct avl_tree objects;
+ struct list_head pending;
struct uloop_fd sock;
uint32_t local_id;
uint32_t request_seq;
+ int stack_depth;
void (*connection_lost)(struct ubus_context *ctx);