+/*
+ * 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 {
struct ubus_msghdr hdr;
- char data[UBUS_MAX_MSGLEN - sizeof(struct ubus_msghdr)];
+ char data[UBUS_MAX_MSGLEN];
} msgbuf;
};
uloop_fd_add(&ctx->sock, ULOOP_EDGE_TRIGGER | ULOOP_BLOCKING | ULOOP_READ);
}
+/* call this for read events on ctx->sock.fd when not using uloop */
+static inline void ubus_handle_event(struct ubus_context *ctx)
+{
+ ctx->sock.cb(&ctx->sock, ULOOP_READ);
+}
+
/* ----------- raw request handling ----------- */
/* wait for a request to complete and return its status */
-int ubus_complete_request(struct ubus_context *ctx, struct ubus_request *req);
+int ubus_complete_request(struct ubus_context *ctx, struct ubus_request *req,
+ int timeout);
/* complete a request asynchronously */
void ubus_complete_request_async(struct ubus_context *ctx,
int ubus_lookup_id(struct ubus_context *ctx, const char *path, uint32_t *id);
+/* make an object visible to remote connections */
+int ubus_add_object(struct ubus_context *ctx, struct ubus_object *obj);
+
+/* remove the object from the ubus connection */
+int ubus_remove_object(struct ubus_context *ctx, struct ubus_object *obj);
+
/* ----------- rpc ----------- */
/* invoke a method on a specific object */
int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method,
- struct blob_attr *msg, ubus_data_handler_t cb, void *priv);
+ struct blob_attr *msg, ubus_data_handler_t cb, void *priv,
+ int timeout);
/* asynchronous version of ubus_invoke() */
-void ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method,
- struct blob_attr *msg, struct ubus_request *req);
-
-/* make an object visible to remote connections */
-int ubus_add_object(struct ubus_context *ctx, struct ubus_object *obj);
-
-/* remove the object from the ubus connection */
-int ubus_remove_object(struct ubus_context *ctx, struct ubus_object *obj);
+int ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method,
+ struct blob_attr *msg, struct ubus_request *req);
/* send a reply to an incoming object method call */
int ubus_send_reply(struct ubus_context *ctx, struct ubus_request_data *req,
struct blob_attr *msg);
/* ----------- events ----------- */
+
int ubus_send_event(struct ubus_context *ctx, const char *id,
struct blob_attr *data);