From 9ae43b449b383c1ddcb67273c37c6c76d76634cf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1?= Date: Wed, 19 Aug 2020 16:43:31 +0200 Subject: [PATCH] sysrepo: common module to create/destroy context --- modules/sysrepo/common/sysrepo_ctx.c | 91 ++++++++++++++++++++++++++++ modules/sysrepo/common/sysrepo_ctx.h | 36 +++++++++++ 2 files changed, 127 insertions(+) create mode 100644 modules/sysrepo/common/sysrepo_ctx.c create mode 100644 modules/sysrepo/common/sysrepo_ctx.h diff --git a/modules/sysrepo/common/sysrepo_ctx.c b/modules/sysrepo/common/sysrepo_ctx.c new file mode 100644 index 000000000..5bcc6e69c --- /dev/null +++ b/modules/sysrepo/common/sysrepo_ctx.c @@ -0,0 +1,91 @@ +#include +#include + +#include "lib/utils.h" +#include "sysrepo_ctx.h" + + +static void sysrepo_subscr_finish_closing(uv_handle_t *handle) +{ + sysrepo_ctx_t *sysrepo = handle->data; + assert(sysrepo); + free(sysrepo); +} + +/** Free a event loop subscription. */ +static void sysrepo_subscription_free(sysrepo_ctx_t *sysrepo) +{ + sr_disconnect(sysrepo->connection); + uv_close((uv_handle_t *)&sysrepo->uv_handle, sysrepo_subscr_finish_closing); +} + +static void sysrepo_subscr_cb_tramp(uv_poll_t *handle, int status, int events) +{ + sysrepo_ctx_t *sysrepo = handle->data; + sysrepo->callback(sysrepo, status); +} + +static void sysrepo_subscr_cb(sysrepo_ctx_t *sysrepo, int status) +{ + if (status) { + /* some error */ + return; + } + /* normal state */ + sr_process_events(sysrepo->subscription, sysrepo->session,NULL); +} + +sysrepo_ctx_t *sysrepo_ctx_init() +{ + sr_conn_ctx_t *sr_connection = NULL; + sr_session_ctx_t *sr_session = NULL; + sr_subscription_ctx_t *sr_subscription = NULL; + + int ret = sr_connect(0, &sr_connection); + if (!ret) ret = sr_session_start(sr_connection, SR_DS_RUNNING, &sr_session); + if (ret){ + kr_log_error( + "[sysrepo] failed to start sysrepo session: %s\n", + sr_strerror(ret)); + return NULL; + } + + sysrepo_ctx_t *sysrepo = malloc(sizeof(sysrepo_ctx_t)); + sysrepo->connection = sr_connection; + sysrepo->session = sr_session; + sysrepo->callback = sysrepo_subscr_cb; + sysrepo->subscription = sr_subscription; + + return sysrepo; +} + +int sysrepo_ctx_start(uv_loop_t *loop, sysrepo_ctx_t *sysrepo) +{ + int pipe; + int ret = sr_get_event_pipe(sysrepo->subscription, &pipe); + if (ret != SR_ERR_OK) { + kr_log_error("[sysrepo] failed to get sysrepo event pipe: %s\n", sr_strerror(ret)); + free(sysrepo); + return ret; + } + ret = uv_poll_init(loop, &sysrepo->uv_handle, pipe); + if (ret) { + kr_log_error("[libuv] failed to initialize uv_poll: %s\n", uv_strerror(ret)); + free(sysrepo); + return ret; + } + sysrepo->uv_handle.data = sysrepo; + ret = uv_poll_start(&sysrepo->uv_handle, UV_READABLE, sysrepo_subscr_cb_tramp); + if (ret) { + kr_log_error("[libuv] failed to start uv_poll: %s\n", uv_strerror(ret)); + sysrepo_subscription_free(sysrepo); + } + return ret; +} + +int sysrepo_ctx_deinit(sysrepo_ctx_t *sysrepo) +{ + sysrepo_subscription_free(sysrepo); + + return 0; +} \ No newline at end of file diff --git a/modules/sysrepo/common/sysrepo_ctx.h b/modules/sysrepo/common/sysrepo_ctx.h new file mode 100644 index 000000000..ec01dcc6c --- /dev/null +++ b/modules/sysrepo/common/sysrepo_ctx.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#define YM_COMMON "cznic-resolver-common" +#define YM_KRES "cznic-resolver-knot" +#define XPATH_BASE "/" YM_COMMON ":dns-resolver" +#define XPATH_RPC_BASE "/"YM_COMMON +#define XPATH_GC XPATH_BASE "/cache/" YM_KRES ":garbage-collector" + + +typedef struct sysrepo_ctx sysrepo_ctx_t; +/** Callback for sysrepo subscriptions */ +typedef void (*sysrepo_cb)(sysrepo_ctx_t *sysrepo, int status); + +/** Context for sysrepo subscriptions. + * might add some other fields in future */ +struct sysrepo_ctx { + sr_conn_ctx_t *connection; + sr_session_ctx_t *session; + sr_subscription_ctx_t *subscription; + sysrepo_cb callback; + uv_poll_t uv_handle; +}; + +/** Init sysrepo context */ +sysrepo_ctx_t *sysrepo_ctx_init(); + +/** Start subscribtion with sysrepo context */ +int sysrepo_ctx_start(uv_loop_t *loop, sysrepo_ctx_t *sysrepo); + +/** Destroy sysrepo context */ +int sysrepo_ctx_deinit(sysrepo_ctx_t *sysrepo); + + -- 2.47.2