struct blob_attr *data;
};
-static inline struct blob_attr *
-ubus_msghdr_data(struct ubus_msghdr *hdr)
-{
- struct ubus_msghdr_buf *hdrbuf = container_of(hdr, typeof(*hdrbuf), hdr);
- return hdrbuf->data;
-}
-
typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx,
struct ubus_object_data *obj,
void *priv);
.methods = _methods \
}
-#define __UBUS_METHOD_NOARG(_name, _handler) \
+#define __UBUS_METHOD_NOARG(_name, _handler, _tags) \
.name = _name, \
- .handler = _handler
+ .handler = _handler, \
+ .tags = _tags
-#define __UBUS_METHOD(_name, _handler, _policy) \
- __UBUS_METHOD_NOARG(_name, _handler), \
+#define __UBUS_METHOD(_name, _handler, _policy, _tags) \
+ __UBUS_METHOD_NOARG(_name, _handler, _tags), \
.policy = _policy, \
.n_policy = ARRAY_SIZE(_policy)
#define UBUS_METHOD(_name, _handler, _policy) \
- { __UBUS_METHOD(_name, _handler, _policy) }
+ { __UBUS_METHOD(_name, _handler, _policy, 0) }
+
+#define UBUS_METHOD_TAG(_name, _handler, _policy, _tags)\
+ { __UBUS_METHOD(_name, _handler, _policy, _tags) }
#define UBUS_METHOD_MASK(_name, _handler, _policy, _mask) \
{ \
- __UBUS_METHOD(_name, _handler, _policy),\
+ __UBUS_METHOD(_name, _handler, _policy, 0),\
.mask = _mask \
}
#define UBUS_METHOD_NOARG(_name, _handler) \
- { __UBUS_METHOD_NOARG(_name, _handler) }
+ { __UBUS_METHOD_NOARG(_name, _handler, 0) }
+
+#define UBUS_METHOD_TAG_NOARG(_name, _handler, _tags) \
+ { __UBUS_METHOD_NOARG(_name, _handler, _tags) }
+
+#define UBUS_TAG_STATUS BIT(0)
+#define UBUS_TAG_ADMIN BIT(1)
+#define UBUS_TAG_PRIVATE BIT(2)
struct ubus_method {
const char *name;
ubus_handler_t handler;
unsigned long mask;
+ unsigned long tags;
const struct blobmsg_policy *policy;
int n_policy;
};
void (*connection_lost)(struct ubus_context *ctx);
struct ubus_msghdr_buf msgbuf;
+ uint32_t msgbuf_data_len;
+ int msgbuf_reduction_counter;
};
struct ubus_object_data {
struct blob_attr *signature;
};
+struct ubus_acl_key {
+ const char *user;
+ const char *group;
+ const char *object;
+};
+
struct ubus_request_data {
uint32_t object;
uint32_t peer;
uint16_t seq;
+ struct ubus_acl_key acl;
+
/* internal use */
bool deferred;
int fd;
};
struct ubus_context *ubus_connect(const char *path);
+int ubus_connect_ctx(struct ubus_context *ctx, const char *path);
void ubus_auto_connect(struct ubus_auto_conn *conn);
int ubus_reconnect(struct ubus_context *ctx, const char *path);
+
+/* call this only for struct ubus_context pointers returned by ubus_connect() */
void ubus_free(struct ubus_context *ctx);
+/* call this only for struct ubus_context pointers initialised by ubus_connect_ctx() */
+void ubus_shutdown(struct ubus_context *ctx);
+
const char *ubus_strerror(int error);
static inline void ubus_add_uloop(struct ubus_context *ctx)
int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
+
+/* ----------- acl ----------- */
+
+struct acl_object {
+ struct ubus_acl_key key;
+ struct avl_node avl;
+ struct blob_attr *acl;
+};
+
+extern struct avl_tree acl_objects;
+int ubus_register_acl(struct ubus_context *ctx);
+
+#define acl_for_each(o, m) \
+ if ((m)->object && (m)->user && (m)->group) \
+ avl_for_element_range(avl_find_ge_element(&acl_objects, m, o, avl), avl_find_le_element(&acl_objects, m, o, avl), o, avl)
+
/* ----------- rpc ----------- */
/* invoke a method on a specific object */