Amxb_Ubus  3.3.1
Ambiorix Ubus API
amxb_ubus.c File Reference
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <amxc/amxc_string_split.h>
#include <amxb_be_ubus/amxb_be_ubus.h>
#include "amxb_ubus.h"
#include <amxb_ubus_version.h>

Go to the source code of this file.

Functions

static void amxb_ubus_remove_sub (AMXB_UNUSED const char *key, amxc_htable_it_t *it)
 
static int amxb_ubus_set_config (amxc_var_t *const configuration)
 
static void amxb_ubus_remove_connections (amxc_llist_it_t *lit)
 
static void amxb_ubus_reactivate_subscription (UNUSED amxp_timer_t *timer, void *priv)
 
static void amxb_ubus_watcher (UNUSED struct ubus_context *ctx, struct ubus_event_handler *ev, UNUSED const char *type, struct blob_attr *msg)
 
static void amxb_ubus_object_available (UNUSED amxp_timer_t *timer, UNUSED void *priv)
 
static void amxb_ubus_wait_watcher (UNUSED struct ubus_context *ctx, UNUSED struct ubus_event_handler *ev, UNUSED const char *type, struct blob_attr *msg)
 
static void amxb_ubus_config_changed (UNUSED const char *const sig_name, UNUSED const amxc_var_t *const data, void *const priv)
 
const amxc_var_t * amxb_ubus_get_config_option (const char *name)
 
void *PRIVATE amxb_ubus_connect (const char *host, const char *port, const char *path, amxp_signal_mngr_t *sigmngr)
 
int PRIVATE amxb_ubus_disconnect (void *ctx)
 
int PRIVATE amxb_ubus_get_fd (void *ctx)
 
int PRIVATE amxb_ubus_read (void *ctx)
 
void PRIVATE amxb_ubus_free (void *ctx)
 
static void amxb_ubus_wait_for_done (UNUSED const char *const sig_name, UNUSED const amxc_var_t *const d, void *const priv)
 
static int amxb_ubus_wait_for (void *const ctx, UNUSED const char *object)
 
static uint32_t amxb_ubus_capabilities (UNUSED void *ctx)
 
static bool amxb_ubus_has (void *ctx, const char *object)
 
amxb_be_info_t * amxb_be_info (void)
 
int amxb_be_ubus_init (void)
 
int amxb_be_ubus_clean (void)
 

Variables

static const amxc_var_t * config_opts = NULL
 
static amxp_timer_t * wait_timer = NULL
 
static amxc_llist_t avaiable_paths
 
static amxb_be_funcs_t amxb_ubus_impl
 
static amxb_version_t sup_min_lib_version
 
static amxb_version_t sup_max_lib_version
 
static amxb_version_t ubus_be_version
 
amxb_be_info_t amxb_ubus_be_info
 

Function Documentation

◆ amxb_be_info()

amxb_be_info_t* amxb_be_info ( void  )

Definition at line 442 of file amxb_ubus.c.

442  {
443  return &amxb_ubus_be_info;
444 }
amxb_be_info_t amxb_ubus_be_info
Definition: amxb_ubus.c:433
Here is the caller graph for this function:

◆ amxb_be_ubus_clean()

int amxb_be_ubus_clean ( void  )

Definition at line 450 of file amxb_ubus.c.

450  {
451  amxc_llist_clean(&amxb_ubus_impl.connections, amxb_ubus_remove_connections);
452 
453  return amxb_be_unregister(&amxb_ubus_impl);
454 }
static void amxb_ubus_remove_connections(amxc_llist_it_t *lit)
Definition: amxb_ubus.c:98
static amxb_be_funcs_t amxb_ubus_impl
Definition: amxb_ubus.c:377
Here is the call graph for this function:

◆ amxb_be_ubus_init()

int amxb_be_ubus_init ( void  )

Definition at line 446 of file amxb_ubus.c.

446  {
447  return amxb_be_register(&amxb_ubus_impl);
448 }

◆ amxb_ubus_capabilities()

static uint32_t amxb_ubus_capabilities ( UNUSED void *  ctx)
static

Definition at line 356 of file amxb_ubus.c.

356  {
357  return AMXB_BE_DISCOVER | AMXB_BE_DISCOVER_RESOLVE;
358 }

◆ amxb_ubus_config_changed()

static void amxb_ubus_config_changed ( UNUSED const char *const  sig_name,
UNUSED const amxc_var_t *const  data,
void *const  priv 
)
static

Definition at line 200 of file amxb_ubus.c.

202  {
203  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) priv;
204  if(GET_BOOL(config_opts, "watch-ubus-events")) {
205  if(amxb_ubus_ctx->watcher.cb == NULL) {
206  amxb_ubus_ctx->watcher.cb = amxb_ubus_watcher;
207  ubus_register_event_handler(amxb_ubus_ctx->ubus_ctx,
208  &amxb_ubus_ctx->watcher, "ubus.object.add");
209  }
210  } else {
211  if(amxb_ubus_ctx->watcher.cb != NULL) {
212  ubus_unregister_event_handler(amxb_ubus_ctx->ubus_ctx, &amxb_ubus_ctx->watcher);
213  amxb_ubus_ctx->watcher.cb = NULL;
214  }
215  }
216 }
static const amxc_var_t * config_opts
Definition: amxb_ubus.c:67
static void amxb_ubus_watcher(UNUSED struct ubus_context *ctx, struct ubus_event_handler *ev, UNUSED const char *type, struct blob_attr *msg)
Definition: amxb_ubus.c:125
struct ubus_event_handler watcher
Definition: amxb_ubus.h:92
struct ubus_context * ubus_ctx
Definition: amxb_ubus.h:87
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_connect()

void* PRIVATE amxb_ubus_connect ( const char *  host,
const char *  port,
const char *  path,
amxp_signal_mngr_t *  sigmngr 
)

Definition at line 222 of file amxb_ubus.c.

225  {
226  amxb_ubus_t* amxb_ubus_ctx = NULL;
227 
228  when_not_null(host, exit);
229  when_not_null(port, exit);
230 
231  amxb_ubus_ctx = (amxb_ubus_t*) calloc(1, sizeof(amxb_ubus_t));
232  when_null(amxb_ubus_ctx, exit);
233 
234  amxb_ubus_ctx->ubus_ctx = ubus_connect(path);
235  if(amxb_ubus_ctx->ubus_ctx == NULL) {
236  free(amxb_ubus_ctx);
237  amxb_ubus_ctx = NULL;
238  goto exit;
239  }
240 
241  amxc_htable_init(&amxb_ubus_ctx->subscribers, 5);
242  blob_buf_init(&amxb_ubus_ctx->b, 0);
243  amxb_ubus_ctx->sigmngr = sigmngr;
244  amxc_llist_init(&amxb_ubus_ctx->registered_objs);
245  amxc_llist_init(&amxb_ubus_ctx->pending_reqs);
246 
247  if(GET_BOOL(config_opts, "watch-ubus-events")) {
248  amxb_ubus_ctx->watcher.cb = amxb_ubus_watcher;
249  ubus_register_event_handler(amxb_ubus_ctx->ubus_ctx,
250  &amxb_ubus_ctx->watcher, "ubus.object.add");
251  }
252  amxp_slot_connect(NULL,
253  "config:changed",
254  NULL,
256  amxb_ubus_ctx);
257 
258 exit:
259  return amxb_ubus_ctx;
260 }
static void amxb_ubus_config_changed(UNUSED const char *const sig_name, UNUSED const amxc_var_t *const data, void *const priv)
Definition: amxb_ubus.c:200
amxc_htable_t subscribers
Definition: amxb_ubus.h:88
amxc_llist_t pending_reqs
Definition: amxb_ubus.h:94
amxc_llist_t registered_objs
Definition: amxb_ubus.h:91
struct blob_buf b
Definition: amxb_ubus.h:89
amxp_signal_mngr_t * sigmngr
Definition: amxb_ubus.h:90
static amxp_signal_mngr_t * sigmngr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_disconnect()

int PRIVATE amxb_ubus_disconnect ( void *  ctx)

Definition at line 262 of file amxb_ubus.c.

262  {
263  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
264 
265  when_null(amxb_ubus_ctx, exit);
266  when_null(amxb_ubus_ctx->ubus_ctx, exit);
267 
268  amxp_slot_disconnect_with_priv(NULL,
270  amxb_ubus_ctx);
271 
272  amxc_htable_clean(&amxb_ubus_ctx->subscribers, amxb_ubus_remove_sub);
273  amxb_ubus_cancel_requests(amxb_ubus_ctx);
274  ubus_free(amxb_ubus_ctx->ubus_ctx);
275  blob_buf_free(&amxb_ubus_ctx->b);
276  amxb_ubus_ctx->ubus_ctx = NULL;
277 
278 exit:
279  return 0;
280 }
static void amxb_ubus_remove_sub(AMXB_UNUSED const char *key, amxc_htable_it_t *it)
Definition: amxb_ubus.c:71
void PRIVATE amxb_ubus_cancel_requests(amxb_ubus_t *amxb_ubus_ctx)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_free()

void PRIVATE amxb_ubus_free ( void *  ctx)

Definition at line 316 of file amxb_ubus.c.

316  {
317  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
318 
319  when_null(amxb_ubus_ctx, exit);
320  amxc_llist_clean(&amxb_ubus_ctx->registered_objs, amxb_ubus_obj_it_free);
321  free(amxb_ubus_ctx);
322 
323 exit:
324  return;
325 }
void PRIVATE amxb_ubus_obj_it_free(amxc_llist_it_t *it)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_get_config_option()

const amxc_var_t* amxb_ubus_get_config_option ( const char *  name)

Definition at line 218 of file amxb_ubus.c.

218  {
219  return GET_ARG(config_opts, name);
220 }

◆ amxb_ubus_get_fd()

int PRIVATE amxb_ubus_get_fd ( void *  ctx)

Definition at line 282 of file amxb_ubus.c.

282  {
283  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
284  int fd = -1;
285 
286  when_null(amxb_ubus_ctx, exit);
287  when_null(amxb_ubus_ctx->ubus_ctx, exit);
288 
289  fd = amxb_ubus_ctx->ubus_ctx->sock.fd;
290 
291 exit:
292  return fd;
293 }
Here is the caller graph for this function:

◆ amxb_ubus_has()

static bool amxb_ubus_has ( void *  ctx,
const char *  object 
)
static

Definition at line 360 of file amxb_ubus.c.

360  {
361  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
362  int retval = -1;
363  bool has_object = false;
364  uint32_t id = 0;
365  when_null(object, exit);
366 
367  retval = ubus_lookup_id(amxb_ubus_ctx->ubus_ctx, object, &id);
368 
369  when_failed(retval, exit);
370 
371  has_object = (id != 0);
372 
373 exit:
374  return has_object;
375 }

◆ amxb_ubus_object_available()

static void amxb_ubus_object_available ( UNUSED amxp_timer_t *  timer,
UNUSED void *  priv 
)
static

Definition at line 163 of file amxb_ubus.c.

163  {
164  amxc_llist_for_each(it, &avaiable_paths) {
165  amxc_string_t* path = amxc_string_from_llist_it(it);
166  amxp_sigmngr_emit_signal(NULL, amxc_string_get(path, 0), NULL);
167  amxc_string_delete(&path);
168  }
169 
170  amxp_timer_delete(&wait_timer);
171 }
static amxp_timer_t * wait_timer
Definition: amxb_ubus.c:68
static amxc_llist_t avaiable_paths
Definition: amxb_ubus.c:69
Here is the caller graph for this function:

◆ amxb_ubus_reactivate_subscription()

static void amxb_ubus_reactivate_subscription ( UNUSED amxp_timer_t *  timer,
void *  priv 
)
static

Definition at line 103 of file amxb_ubus.c.

103  {
104  amxb_ubus_sub_t* amxb_ubus_sub = (amxb_ubus_sub_t*) priv;
105  amxc_htable_t* subscribers = NULL;
106  amxb_ubus_t* amxb_ubus_ctx = NULL;
107  const char* path = NULL;
108  int ret = 0;
109 
110  subscribers = container_of(amxb_ubus_sub->it.ait->array, amxc_htable_t, table);
111  amxb_ubus_ctx = container_of(subscribers, amxb_ubus_t, subscribers);
112  path = amxc_htable_it_get_key(&amxb_ubus_sub->it);
113 
114  amxc_htable_it_take(&amxb_ubus_sub->it);
115  ret = ubus_unregister_subscriber(amxb_ubus_ctx->ubus_ctx, &amxb_ubus_sub->sub);
116  when_failed(ret, exit);
117  amxb_ubus_subscribe(amxb_ubus_ctx, path);
118 
119 exit:
120  amxp_timer_delete(&amxb_ubus_sub->reactivate);
121  amxc_htable_it_clean(&amxb_ubus_sub->it, NULL);
122  free(amxb_ubus_sub);
123 }
int PRIVATE amxb_ubus_subscribe(void *const ctx, const char *object)
amxp_timer_t * reactivate
Definition: amxb_ubus.h:83
amxc_htable_it_t it
Definition: amxb_ubus.h:81
struct ubus_subscriber sub
Definition: amxb_ubus.h:82
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_read()

int PRIVATE amxb_ubus_read ( void *  ctx)

Definition at line 295 of file amxb_ubus.c.

295  {
296  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
297  struct ubus_context* ubus_ctx = NULL;
298  int retval = -1;
299 
300  when_null(amxb_ubus_ctx, exit);
301  when_null(amxb_ubus_ctx->ubus_ctx, exit);
302 
303  ubus_ctx = amxb_ubus_ctx->ubus_ctx;
304  ubus_ctx->sock.cb(&ubus_ctx->sock, ULOOP_READ);
305 
306  if(ubus_ctx->sock.eof) {
307  retval = -1;
308  } else {
309  retval = 0;
310  }
311 
312 exit:
313  return retval;
314 }

◆ amxb_ubus_remove_connections()

static void amxb_ubus_remove_connections ( amxc_llist_it_t *  lit)
static

Definition at line 98 of file amxb_ubus.c.

98  {
99  amxb_bus_ctx_t* bus_ctx = amxc_llist_it_get_data(lit, amxb_bus_ctx_t, it);
100  amxb_disconnect(bus_ctx);
101 }
static amxb_bus_ctx_t * bus_ctx
Here is the caller graph for this function:

◆ amxb_ubus_remove_sub()

static void amxb_ubus_remove_sub ( AMXB_UNUSED const char *  key,
amxc_htable_it_t *  it 
)
static

Definition at line 71 of file amxb_ubus.c.

72  {
73  amxb_ubus_sub_t* sub = amxc_htable_it_get_data(it, amxb_ubus_sub_t, it);
74  amxp_timer_delete(&sub->reactivate);
75  free(sub);
76 }
Here is the caller graph for this function:

◆ amxb_ubus_set_config()

static int amxb_ubus_set_config ( amxc_var_t *const  configuration)
static

Definition at line 78 of file amxb_ubus.c.

78  {
79  struct stat sb;
80  amxc_var_t* uris = GET_ARG(configuration, "uris");
81 
82  config_opts = configuration;
83 
84  if((configuration != NULL) && (uris == NULL)) {
85  uris = amxc_var_add_key(amxc_llist_t, configuration, "uris", NULL);
86  }
87 
88  if(stat("/var/run/ubus.sock", &sb) == 0) {
89  amxc_var_add(cstring_t, uris, "ubus:/var/run/ubus.sock");
90  }
91  if(stat("/var/run/ubus/ubus.sock", &sb) == 0) {
92  amxc_var_add(cstring_t, uris, "ubus:/var/run/ubus/ubus.sock");
93  }
94 
95  return 0;
96 }

◆ amxb_ubus_wait_for()

static int amxb_ubus_wait_for ( void *const  ctx,
UNUSED const char *  object 
)
static

Definition at line 338 of file amxb_ubus.c.

338  {
339  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) ctx;
340  int retval = -1;
341 
342  when_null(amxb_ubus_ctx, exit);
343  if(amxb_ubus_ctx->wait_watcher.cb == NULL) {
344  amxb_ubus_ctx->wait_watcher.cb = amxb_ubus_wait_watcher;
345  ubus_register_event_handler(amxb_ubus_ctx->ubus_ctx,
346  &amxb_ubus_ctx->wait_watcher, "ubus.object.add");
347  amxp_slot_connect(NULL, "wait:done", NULL, amxb_ubus_wait_for_done, amxb_ubus_ctx);
348  }
349 
350  retval = 0;
351 
352 exit:
353  return retval;
354 }
static void amxb_ubus_wait_watcher(UNUSED struct ubus_context *ctx, UNUSED struct ubus_event_handler *ev, UNUSED const char *type, struct blob_attr *msg)
Definition: amxb_ubus.c:173
static void amxb_ubus_wait_for_done(UNUSED const char *const sig_name, UNUSED const amxc_var_t *const d, void *const priv)
Definition: amxb_ubus.c:327
struct ubus_event_handler wait_watcher
Definition: amxb_ubus.h:93
Here is the call graph for this function:

◆ amxb_ubus_wait_for_done()

static void amxb_ubus_wait_for_done ( UNUSED const char *const  sig_name,
UNUSED const amxc_var_t *const  d,
void *const  priv 
)
static

Definition at line 327 of file amxb_ubus.c.

329  {
330  amxb_ubus_t* amxb_ubus_ctx = (amxb_ubus_t*) priv;
331  if(amxb_ubus_ctx->wait_watcher.cb != NULL) {
332  ubus_unregister_event_handler(amxb_ubus_ctx->ubus_ctx, &amxb_ubus_ctx->wait_watcher);
333  amxb_ubus_ctx->wait_watcher.cb = NULL;
334  amxp_slot_disconnect_with_priv(NULL, amxb_ubus_wait_for_done, amxb_ubus_ctx);
335  }
336 }
Here is the caller graph for this function:

◆ amxb_ubus_wait_watcher()

static void amxb_ubus_wait_watcher ( UNUSED struct ubus_context *  ctx,
UNUSED struct ubus_event_handler *  ev,
UNUSED const char *  type,
struct blob_attr *  msg 
)
static

Definition at line 173 of file amxb_ubus.c.

176  {
177  amxc_var_t watch_event;
178  amxc_string_t* sig_name = NULL;
179 
180  amxc_var_init(&watch_event);
181  amxc_var_set_type(&watch_event, AMXC_VAR_ID_HTABLE);
182  amxb_ubus_parse_blob_table(&watch_event,
183  (struct blob_attr*) blob_data(msg),
184  blob_len(msg));
185 
186  amxc_string_new(&sig_name, 0);
187  amxc_string_setf(sig_name, "wait:%s.", GET_CHAR(&watch_event, "path"));
188  if(amxp_sigmngr_find_signal(NULL, amxc_string_get(sig_name, 0)) != NULL) {
189  amxc_llist_append(&avaiable_paths, &sig_name->it);
190  if(wait_timer == NULL) {
191  amxp_timer_new(&wait_timer, amxb_ubus_object_available, NULL);
192  }
193  amxp_timer_start(wait_timer, 100);
194  } else {
195  amxc_string_delete(&sig_name);
196  }
197  amxc_var_clean(&watch_event);
198 }
static void amxb_ubus_object_available(UNUSED amxp_timer_t *timer, UNUSED void *priv)
Definition: amxb_ubus.c:163
int PRIVATE amxb_ubus_parse_blob_table(amxc_var_t *var, struct blob_attr *attr, int len)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ amxb_ubus_watcher()

static void amxb_ubus_watcher ( UNUSED struct ubus_context *  ctx,
struct ubus_event_handler *  ev,
UNUSED const char *  type,
struct blob_attr *  msg 
)
static

Definition at line 125 of file amxb_ubus.c.

128  {
129  amxb_ubus_t* amxb_ubus_ctx = container_of(ev, amxb_ubus_t, watcher);
130  amxc_var_t watch_event;
131  amxc_htable_it_t* it = NULL;
132  const char* p = NULL;
133  amxb_ubus_sub_t* amxb_ubus_sub = NULL;
134  amxc_string_t signal_name;
135 
136  amxc_string_init(&signal_name, 0);
137  amxc_var_init(&watch_event);
138  amxc_var_set_type(&watch_event, AMXC_VAR_ID_HTABLE);
139  amxb_ubus_parse_blob_table(&watch_event,
140  (struct blob_attr*) blob_data(msg),
141  blob_len(msg));
142 
143  p = GET_CHAR(&watch_event, "path");
144  amxc_string_setf(&signal_name, "wait:%s.", p);
145  amxp_sigmngr_trigger_signal(NULL, amxc_string_get(&signal_name, 0), NULL);
146 
147  it = amxc_htable_get(&amxb_ubus_ctx->subscribers, p);
148  when_null(it, exit);
149  amxb_ubus_sub = amxc_container_of(it, amxb_ubus_sub_t, it);
150 
151  if(amxb_ubus_sub->reactivate == NULL) {
152  amxp_timer_new(&amxb_ubus_sub->reactivate,
154  amxb_ubus_sub);
155  }
156  amxp_timer_start(amxb_ubus_sub->reactivate, 100);
157 
158 exit:
159  amxc_string_clean(&signal_name);
160  amxc_var_clean(&watch_event);
161 }
static void amxb_ubus_reactivate_subscription(UNUSED amxp_timer_t *timer, void *priv)
Definition: amxb_ubus.c:103
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ amxb_ubus_be_info

amxb_be_info_t amxb_ubus_be_info
Initial value:
= {
.min_supported = &sup_min_lib_version,
.max_supported = &sup_max_lib_version,
.be_version = &ubus_be_version,
.name = "ubus",
.description = "AMXB Backend for UBUS (Openwrt/Prplwrt)",
.funcs = &amxb_ubus_impl,
}
static amxb_version_t ubus_be_version
Definition: amxb_ubus.c:427
static amxb_version_t sup_max_lib_version
Definition: amxb_ubus.c:421
static amxb_version_t sup_min_lib_version
Definition: amxb_ubus.c:415

Definition at line 433 of file amxb_ubus.c.

◆ amxb_ubus_impl

amxb_be_funcs_t amxb_ubus_impl
static

Definition at line 377 of file amxb_ubus.c.

◆ avaiable_paths

amxc_llist_t avaiable_paths
static

Definition at line 69 of file amxb_ubus.c.

◆ config_opts

const amxc_var_t* config_opts = NULL
static

Definition at line 67 of file amxb_ubus.c.

◆ sup_max_lib_version

amxb_version_t sup_max_lib_version
static
Initial value:
= {
.major = 4,
.minor = -1,
.build = -1
}

Definition at line 421 of file amxb_ubus.c.

◆ sup_min_lib_version

amxb_version_t sup_min_lib_version
static
Initial value:
= {
.major = 4,
.minor = 8,
.build = 0
}

Definition at line 415 of file amxb_ubus.c.

◆ ubus_be_version

amxb_version_t ubus_be_version
static
Initial value:
= {
.major = AMXB_UBUS_VERSION_MAJOR,
.minor = AMXB_UBUS_VERSION_MINOR,
.build = AMXB_UBUS_VERSION_BUILD,
}

Definition at line 427 of file amxb_ubus.c.

◆ wait_timer

amxp_timer_t* wait_timer = NULL
static

Definition at line 68 of file amxb_ubus.c.