Ubus
OpenWrt system message/RPC bus.
ubusd_obj.h File Reference
#include "ubusd_id.h"

Go to the source code of this file.

Data Structures

struct  ubus_object_type
 
struct  ubus_method
 
struct  ubus_subscription
 
struct  ubus_object
 

Functions

struct ubus_objectubusd_create_object (struct ubus_client *cl, struct blob_attr **attr)
 
struct ubus_objectubusd_create_object_internal (struct ubus_object_type *type, uint32_t id)
 
void ubusd_free_object (struct ubus_object *obj)
 
static struct ubus_objectubusd_find_object (uint32_t objid)
 
void ubus_subscribe (struct ubus_object *obj, struct ubus_object *target)
 
void ubus_unsubscribe (struct ubus_subscription *s)
 
void ubus_notify_unsubscribe (struct ubus_subscription *s)
 
void ubus_notify_subscription (struct ubus_object *obj)
 

Variables

struct avl_tree obj_types
 
struct avl_tree objects
 
struct avl_tree path
 

Function Documentation

◆ ubus_notify_subscription()

void ubus_notify_subscription ( struct ubus_object obj)

Definition at line 615 of file ubusd_proto.c.

616 {
617  bool active = !list_empty(&obj->subscribers);
618  struct ubus_msg_buf *ub;
619 
620  blob_buf_init(&b, 0);
621  blob_put_int32(&b, UBUS_ATTR_OBJID, obj->id.id);
622  blob_put_int8(&b, UBUS_ATTR_ACTIVE, active);
623 
624  ub = ubus_msg_from_blob(false);
625  if (!ub)
626  return;
627 
628  ubus_msg_init(ub, UBUS_MSG_NOTIFY, ++obj->invoke_seq, 0);
629  ubus_msg_send(obj->client, ub);
630  ubus_msg_free(ub);
631 }
uint32_t id
Definition: libubus.h:130
struct ubus_client * client
Definition: ubusd_obj.h:54
unsigned int invoke_seq
Definition: ubusd_obj.h:59
void ubus_msg_free(struct ubus_msg_buf *ub)
Definition: ubusd.c:67
void ubus_msg_send(struct ubus_client *cl, struct ubus_msg_buf *ub)
Definition: ubusd.c:162
static struct ubus_msg_buf * ubus_msg_from_blob(bool shared)
Definition: ubusd_proto.c:60
struct blob_buf b
Definition: ubusd_proto.c:19
static void ubus_msg_init(struct ubus_msg_buf *ub, uint8_t type, uint16_t seq, uint32_t peer)
Definition: ubusd_proto.c:52
@ UBUS_MSG_NOTIFY
Definition: ubusmsg.h:71
@ UBUS_ATTR_ACTIVE
Definition: ubusmsg.h:94
@ UBUS_ATTR_OBJID
Definition: ubusmsg.h:85
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubus_notify_unsubscribe()

void ubus_notify_unsubscribe ( struct ubus_subscription s)

Definition at line 633 of file ubusd_proto.c.

634 {
635  struct ubus_msg_buf *ub;
636 
637  blob_buf_init(&b, 0);
638  blob_put_int32(&b, UBUS_ATTR_OBJID, s->subscriber->id.id);
639  blob_put_int32(&b, UBUS_ATTR_TARGET, s->target->id.id);
640 
641  ub = ubus_msg_from_blob(false);
642  if (ub != NULL) {
645  ubus_msg_free(ub);
646  }
647 
648  ubus_unsubscribe(s);
649 }
int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id)
Definition: libubus-sub.c:123
struct ubus_object * target
Definition: ubusd_obj.h:40
struct ubus_object * subscriber
Definition: ubusd_obj.h:40
@ UBUS_MSG_UNSUBSCRIBE
Definition: ubusmsg.h:64
@ UBUS_ATTR_TARGET
Definition: ubusmsg.h:92
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubus_subscribe()

void ubus_subscribe ( struct ubus_object obj,
struct ubus_object target 
)

Definition at line 172 of file ubusd_obj.c.

173 {
174  struct ubus_subscription *s;
175  bool first = list_empty(&target->subscribers);
176 
177  s = calloc(1, sizeof(*s));
178  if (!s)
179  return;
180 
181  s->subscriber = obj;
182  s->target = target;
183  list_add(&s->list, &target->subscribers);
184  list_add(&s->target_list, &obj->target_list);
185 
186  if (first)
188 }
struct list_head subscribers target_list
Definition: ubusd_obj.h:49
struct list_head list target_list
Definition: ubusd_obj.h:39
void ubus_notify_subscription(struct ubus_object *obj)
Definition: ubusd_proto.c:615
Here is the call graph for this function:

◆ ubus_unsubscribe()

void ubus_unsubscribe ( struct ubus_subscription s)

Definition at line 190 of file ubusd_obj.c.

191 {
192  struct ubus_object *obj = s->target;
193 
194  list_del(&s->list);
195  list_del(&s->target_list);
196  free(s);
197 
198  if (list_empty(&obj->subscribers))
200 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubusd_create_object()

struct ubus_object* ubusd_create_object ( struct ubus_client cl,
struct blob_attr **  attr 
)

Definition at line 129 of file ubusd_obj.c.

130 {
131  struct ubus_object *obj;
132  struct ubus_object_type *type = NULL;
133 
134  if (attr[UBUS_ATTR_OBJTYPE])
135  type = ubus_get_obj_type(blob_get_u32(attr[UBUS_ATTR_OBJTYPE]));
136  else if (attr[UBUS_ATTR_SIGNATURE])
138 
140  if (type)
142 
143  if (!obj)
144  return NULL;
145 
146  if (attr[UBUS_ATTR_OBJPATH]) {
147  if (ubusd_acl_check(cl, blob_data(attr[UBUS_ATTR_OBJPATH]), NULL, UBUS_ACL_PUBLISH))
148  goto free;
149 
150  obj->path.key = strdup(blob_data(attr[UBUS_ATTR_OBJPATH]));
151  if (!obj->path.key)
152  goto free;
153 
154  if (avl_insert(&path, &obj->path) != 0) {
155  free((void *) obj->path.key);
156  obj->path.key = NULL;
157  goto free;
158  }
159  ubusd_send_obj_event(obj, true);
160  }
161 
162  obj->client = cl;
163  list_add(&obj->list, &cl->objects);
164 
165  return obj;
166 
167 free:
168  ubusd_free_object(obj);
169  return NULL;
170 }
struct list_head objects
Definition: ubusd.h:60
const char * path
Definition: libubus.h:132
struct list_head list
Definition: ubusd_obj.h:45
void ubusd_send_obj_event(struct ubus_object *obj, bool add)
Definition: ubusd_event.c:259
int ubusd_acl_check(struct ubus_client *cl, const char *obj, const char *method, enum ubusd_acl_type type)
Definition: ubusd_acl.c:90
@ UBUS_ACL_PUBLISH
Definition: ubusd_acl.h:18
static struct ubus_object_type * ubus_create_obj_type(struct blob_attr *sig)
Definition: ubusd_obj.c:53
static struct ubus_object_type * ubus_get_obj_type(uint32_t obj_id)
Definition: ubusd_obj.c:89
static void ubus_unref_object_type(struct ubus_object_type *type)
Definition: ubusd_obj.c:21
struct avl_tree path
Definition: ubusd_obj.c:19
struct ubus_object * ubusd_create_object_internal(struct ubus_object_type *type, uint32_t id)
Definition: ubusd_obj.c:103
void ubusd_free_object(struct ubus_object *obj)
Definition: ubusd_obj.c:202
uint8_t type
Definition: ubusmsg.h:1
@ UBUS_ATTR_OBJTYPE
Definition: ubusmsg.h:88
@ UBUS_ATTR_OBJPATH
Definition: ubusmsg.h:84
@ UBUS_ATTR_SIGNATURE
Definition: ubusmsg.h:89
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubusd_create_object_internal()

struct ubus_object* ubusd_create_object_internal ( struct ubus_object_type type,
uint32_t  id 
)

Definition at line 103 of file ubusd_obj.c.

104 {
105  struct ubus_object *obj;
106 
107  obj = calloc(1, sizeof(*obj));
108  if (!obj)
109  return NULL;
110 
111  if (!ubus_alloc_id(&objects, &obj->id, id))
112  goto error_free;
113 
114  obj->type = type;
115  INIT_LIST_HEAD(&obj->list);
116  INIT_LIST_HEAD(&obj->events);
117  INIT_LIST_HEAD(&obj->subscribers);
118  INIT_LIST_HEAD(&obj->target_list);
119  if (type)
120  type->refcount++;
121 
122  return obj;
123 
124 error_free:
125  free(obj);
126  return NULL;
127 }
struct ubus_object_type * type
Definition: libubus.h:133
struct list_head events
Definition: ubusd_obj.h:47
bool ubus_alloc_id(struct avl_tree *tree, struct ubus_id *id, uint32_t val)
Definition: ubusd_id.c:53
struct avl_tree objects
Definition: ubusd_obj.c:18
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubusd_find_object()

static struct ubus_object* ubusd_find_object ( uint32_t  objid)
inlinestatic

Definition at line 66 of file ubusd_obj.h.

67 {
68  struct ubus_object *obj;
69  struct ubus_id *id;
70 
71  id = ubus_find_id(&objects, objid);
72  if (!id)
73  return NULL;
74 
75  obj = container_of(id, struct ubus_object, id);
76  return obj;
77 }
uint32_t id
Definition: ubusd_id.h:22
static struct ubus_id * ubus_find_id(struct avl_tree *tree, uint32_t id)
Definition: ubusd_id.h:34
struct avl_tree objects
Definition: ubusd_obj.c:18
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ubusd_free_object()

void ubusd_free_object ( struct ubus_object obj)

Definition at line 202 of file ubusd_obj.c.

203 {
204  struct ubus_subscription *s, *tmp;
205 
206  list_for_each_entry_safe(s, tmp, &obj->target_list, target_list) {
207  ubus_unsubscribe(s);
208  }
209  list_for_each_entry_safe(s, tmp, &obj->subscribers, list) {
211  }
212 
214  if (obj->path.key) {
215  ubusd_send_obj_event(obj, false);
216  avl_delete(&path, &obj->path);
217  free((void *) obj->path.key);
218  }
219  if (!list_empty(&obj->list))
220  list_del(&obj->list);
221  ubus_free_id(&objects, &obj->id);
222  if (obj->type)
224  free(obj);
225 }
void ubusd_event_cleanup_object(struct ubus_object *obj)
Definition: ubusd_event.c:36
static void ubus_free_id(struct avl_tree *tree, struct ubus_id *id)
Definition: ubusd_id.h:29
void ubus_unsubscribe(struct ubus_subscription *s)
Definition: ubusd_obj.c:190
void ubus_notify_unsubscribe(struct ubus_subscription *s)
Definition: ubusd_proto.c:633
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ obj_types

struct avl_tree obj_types
extern

Definition at line 1 of file ubusd_obj.c.

◆ objects

struct avl_tree objects
extern

Definition at line 1 of file ubusd_obj.c.

◆ path

struct avl_tree path
extern

Definition at line 1 of file ubusd_obj.c.