]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
sysrepo: common module to create/destroy context sysrepo
authorAleš <ales.mrazek@nic.cz>
Wed, 19 Aug 2020 14:43:31 +0000 (16:43 +0200)
committerAleš <ales.mrazek@nic.cz>
Wed, 19 Aug 2020 14:43:31 +0000 (16:43 +0200)
modules/sysrepo/common/sysrepo_ctx.c [new file with mode: 0644]
modules/sysrepo/common/sysrepo_ctx.h [new file with mode: 0644]

diff --git a/modules/sysrepo/common/sysrepo_ctx.c b/modules/sysrepo/common/sysrepo_ctx.c
new file mode 100644 (file)
index 0000000..5bcc6e6
--- /dev/null
@@ -0,0 +1,91 @@
+#include <uv.h>
+#include <sysrepo.h>
+
+#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 (file)
index 0000000..ec01dcc
--- /dev/null
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <uv.h>
+#include <sysrepo.h>
+
+#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);
+
+