X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=libubus.h;h=99cbbb44701f96621489ce906cfe42b38a58bc61;hp=cead47648cebabf6804a22e28877267257eec98a;hb=c382792d9893ed1b0c1e1b0db2ad9a7eaa7a78e1;hpb=e49b34f91267449e89d3f482b7c16bbf84bf90fd diff --git a/libubus.h b/libubus.h index cead476..99cbbb4 100644 --- a/libubus.h +++ b/libubus.h @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2011 Felix Fietkau + * + * 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. + */ + +#ifndef __LIBUBUS_H +#define __LIBUBUS_H + #include #include #include @@ -13,6 +29,7 @@ struct ubus_request; struct ubus_request_data; struct ubus_object_data; struct ubus_event_handler; +struct ubus_watch_object; typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx, struct ubus_object_data *obj, @@ -22,6 +39,8 @@ typedef int (*ubus_handler_t)(struct ubus_context *ctx, struct ubus_object *obj, const char *method, struct blob_attr *msg); typedef void (*ubus_event_handler_t)(struct ubus_context *ctx, struct ubus_event_handler *ev, const char *type, struct blob_attr *msg); +typedef void (*ubus_watch_handler_t)(struct ubus_context *ctx, struct ubus_watch_object *w, + uint32_t id); typedef void (*ubus_data_handler_t)(struct ubus_request *req, int type, struct blob_attr *msg); typedef void (*ubus_complete_handler_t)(struct ubus_request *req, int ret); @@ -71,6 +90,12 @@ struct ubus_object { int n_methods; }; +struct ubus_watch_object { + struct ubus_object obj; + + ubus_watch_handler_t cb; +}; + struct ubus_event_handler { struct ubus_object obj; @@ -80,11 +105,13 @@ struct ubus_event_handler { 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); @@ -129,13 +156,14 @@ struct ubus_request { struct ubus_context *ubus_connect(const char *path); +int ubus_reconnect(struct ubus_context *ctx, const char *path); void ubus_free(struct ubus_context *ctx); const char *ubus_strerror(int error); static inline void ubus_add_uloop(struct ubus_context *ctx) { - uloop_fd_add(&ctx->sock, ULOOP_EDGE_TRIGGER | ULOOP_BLOCKING | ULOOP_READ); + uloop_fd_add(&ctx->sock, ULOOP_BLOCKING | ULOOP_READ); } /* call this for read events on ctx->sock.fd when not using uloop */ @@ -170,6 +198,13 @@ 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); +/* add an object for watching other object state changes */ +int ubus_register_watch_object(struct ubus_context *ctx, struct ubus_watch_object *obj); + +int ubus_watch_object_add(struct ubus_context *ctx, struct ubus_watch_object *obj, uint32_t id); + +int ubus_watch_object_remove(struct ubus_context *ctx, struct ubus_watch_object *obj, uint32_t id); + /* ----------- rpc ----------- */ /* invoke a method on a specific object */ @@ -199,3 +234,5 @@ static inline int ubus_unregister_event_handler(struct ubus_context *ctx, { return ubus_remove_object(ctx, &ev->obj); } + +#endif