diff --git a/apps/backend/backend_main.c b/apps/backend/backend_main.c index badf84f2..a8d54d97 100644 --- a/apps/backend/backend_main.c +++ b/apps/backend/backend_main.c @@ -77,7 +77,7 @@ /*! Terminate. Cannot use h after this */ static int -config_terminate(clicon_handle h) +backend_terminate(clicon_handle h) { yang_spec *yspec; char *pidfile = clicon_backend_pidfile(h); @@ -91,6 +91,7 @@ config_terminate(clicon_handle h) unlink(pidfile); if (sockpath) unlink(sockpath); + xmldb_plugin_unload(h); /* unload storage plugin */ backend_handle_exit(h); /* Cannot use h after this */ event_exit(); clicon_log_register_callback(NULL, NULL); @@ -101,7 +102,7 @@ config_terminate(clicon_handle h) /*! Unlink pidfile and quit */ static void -config_sig_term(int arg) +backend_sig_term(int arg) { static int i=0; @@ -238,11 +239,11 @@ server_socket(clicon_handle h) int ss; /* Open control socket */ - if ((ss = config_socket_init(h)) < 0) + if ((ss = backend_socket_init(h)) < 0) return -1; /* ss is a server socket that the clients connect to. The callback therefore accepts clients on ss */ - if (event_reg_fd(ss, config_accept_client, h, "server socket") < 0) { + if (event_reg_fd(ss, backend_accept_client, h, "server socket") < 0) { close(ss); return -1; } @@ -254,9 +255,9 @@ server_socket(clicon_handle h) * log event. */ static int -config_log_cb(int level, - char *msg, - void *arg) +backend_log_cb(int level, + char *msg, + void *arg) { int retval = -1; size_t n; @@ -320,7 +321,7 @@ main(int argc, char **argv) /* Initiate CLICON handle */ if ((h = backend_handle_init()) == NULL) return -1; - if (config_plugin_init(h) != 0) + if (backend_plugin_init(h) != 0) return -1; foreground = 0; once = 0; @@ -623,14 +624,14 @@ main(int argc, char **argv) goto done; /* Register log notifications */ - if (clicon_log_register_callback(config_log_cb, h) < 0) + if (clicon_log_register_callback(backend_log_cb, h) < 0) goto done; clicon_log(LOG_NOTICE, "%s: %u Started", __PROGRAM__, getpid()); - if (set_signal(SIGTERM, config_sig_term, NULL) < 0){ + if (set_signal(SIGTERM, backend_sig_term, NULL) < 0){ clicon_err(OE_DEMON, errno, "Setting signal"); goto done; } - if (set_signal(SIGINT, config_sig_term, NULL) < 0){ + if (set_signal(SIGINT, backend_sig_term, NULL) < 0){ clicon_err(OE_DEMON, errno, "Setting signal"); goto done; } @@ -646,7 +647,7 @@ main(int argc, char **argv) goto done; done: clicon_log(LOG_NOTICE, "%s: %u Terminated", __PROGRAM__, getpid()); - config_terminate(h); /* Cannot use h after this */ + backend_terminate(h); /* Cannot use h after this */ return 0; } diff --git a/apps/backend/backend_plugin.c b/apps/backend/backend_plugin.c index 7f0551b6..f336701c 100644 --- a/apps/backend/backend_plugin.c +++ b/apps/backend/backend_plugin.c @@ -132,7 +132,7 @@ config_find_plugin(clicon_handle h, * @retval -1 Error */ int -config_plugin_init(clicon_handle h) +backend_plugin_init(clicon_handle h) { find_plugin_t *fp = config_find_plugin; clicon_hash_t *data = clicon_data(h); diff --git a/apps/backend/backend_plugin.h b/apps/backend/backend_plugin.h index ca6e474e..459ff93b 100644 --- a/apps/backend/backend_plugin.h +++ b/apps/backend/backend_plugin.h @@ -62,7 +62,7 @@ typedef struct { /* * Prototypes */ -int config_plugin_init(clicon_handle h); +int backend_plugin_init(clicon_handle h); int plugin_initiate(clicon_handle h); int plugin_finish(clicon_handle h); diff --git a/apps/backend/backend_socket.c b/apps/backend/backend_socket.c index b83f7ce3..2324de82 100644 --- a/apps/backend/backend_socket.c +++ b/apps/backend/backend_socket.c @@ -174,7 +174,7 @@ config_socket_init_unix(clicon_handle h, char *sock) } int -config_socket_init(clicon_handle h) +backend_socket_init(clicon_handle h) { char *sock; @@ -197,7 +197,7 @@ config_socket_init(clicon_handle h) * XXX: credentials not properly implemented */ int -config_accept_client(int fd, +backend_accept_client(int fd, void *arg) { int retval = -1; diff --git a/apps/backend/backend_socket.h b/apps/backend/backend_socket.h index 735816b9..b88efb89 100644 --- a/apps/backend/backend_socket.h +++ b/apps/backend/backend_socket.h @@ -40,7 +40,7 @@ /* * Prototypes */ -int config_socket_init(clicon_handle h); -int config_accept_client(int fd, void *arg); +int backend_socket_init(clicon_handle h); +int backend_accept_client(int fd, void *arg); #endif /* _BACKEND_SOCKET_H_ */ diff --git a/apps/backend/clixon_backend_handle.c b/apps/backend/clixon_backend_handle.c index 85610654..be2cb07c 100644 --- a/apps/backend/clixon_backend_handle.c +++ b/apps/backend/clixon_backend_handle.c @@ -85,7 +85,6 @@ struct backend_handle { int bh_magic; /* magic (HDR)*/ clicon_hash_t *bh_copt; /* clicon option list (HDR) */ clicon_hash_t *bh_data; /* internal clicon data (HDR) */ - void *bh_xmldb; /* XMLDB storage handle, uie xmldb_handle */ /* ------ end of common handle ------ */ struct client_entry *bh_ce_list; /* The client list */ int bh_ce_nr; /* Number of clients, just increment */ diff --git a/apps/cli/cli_handle.c b/apps/cli/cli_handle.c index bc63a179..7d2e422e 100644 --- a/apps/cli/cli_handle.c +++ b/apps/cli/cli_handle.c @@ -79,7 +79,6 @@ struct cli_handle { int cl_magic; /* magic (HDR)*/ clicon_hash_t *cl_copt; /* clicon option list (HDR) */ clicon_hash_t *cl_data; /* internal clicon data (HDR) */ - void *cl_xmldb; /* XMLDB storage handle, uie xmldb_handle */ /* ------ end of common handle ------ */ cligen_handle cl_cligen; /* cligen handle */ diff --git a/datastore/datastore_client.c b/datastore/datastore_client.c index c43303f7..7445efc0 100644 --- a/datastore/datastore_client.c +++ b/datastore/datastore_client.c @@ -31,6 +31,14 @@ ***** END LICENSE BLOCK ***** + * Examples: + +./datastore_client -d candidate -b /usr/local/var/routing -p /home/olof/src/clixon/datastore/keyvalue/keyvalue.so -y /usr/local/share/routing/yang -m ietf-ip get / + +sudo ./datastore_client -d candidate -b /usr/local/var/routing -p /home/olof/src/clixon/datastore/keyvalue/keyvalue.so -y /usr/local/share/routing/yang -m ietf-ip put merge /interfaces/interface=eth0 +eth66 + + * */ #ifdef HAVE_CONFIG_H @@ -221,8 +229,8 @@ main(int argc, char **argv) goto done; if (xmldb_put(h, db, op, argv[2], xn) < 0) goto done; - if (xt) - xml_free(xt); + if (xn) + xml_free(xn); } else if (strcmp(cmd, "copy")==0){ if (argc < 3) diff --git a/datastore/keyvalue/clixon_qdb.c b/datastore/keyvalue/clixon_qdb.c index 1af75ab0..5bfa19a5 100644 --- a/datastore/keyvalue/clixon_qdb.c +++ b/datastore/keyvalue/clixon_qdb.c @@ -424,7 +424,7 @@ db_regexp(char *file, /* Retrieve value if required */ if ( ! noval) { if((val = dpget(iterdp, key, -1, 0, -1, &vlen)) == NULL) { - clicon_log(OE_DB, "%s: dpget: %s", __FUNCTION__, dperrmsg(dpecode)); + clicon_log(LOG_WARNING, "%s: dpget: %s", __FUNCTION__, dperrmsg(dpecode)); goto quit; } } diff --git a/lib/clixon/clixon.h.in b/lib/clixon/clixon.h.in index d9f00a80..26220770 100644 --- a/lib/clixon/clixon.h.in +++ b/lib/clixon/clixon.h.in @@ -76,13 +76,12 @@ #include #include #include +#include #include #include #include #include #include -#include -#include /* * Global variables generated by Makefile diff --git a/lib/clixon/clixon_handle.h b/lib/clixon/clixon_handle.h index c4f601b6..207d076f 100644 --- a/lib/clixon/clixon_handle.h +++ b/lib/clixon/clixon_handle.h @@ -71,10 +71,4 @@ clicon_hash_t *clicon_options(clicon_handle h); /* Return internal clicon data (hash-array) given a handle.*/ clicon_hash_t *clicon_data(clicon_handle h); -/* Set or reset XMLDB storage handle */ -int clicon_handle_xmldb_set(clicon_handle h, void *xh); /* ie xmldb_handle */ - -/* Get XMLDB storage handle */ -void *clicon_handle_xmldb_get(clicon_handle h); - #endif /* _CLIXON_HANDLE_H_ */ diff --git a/lib/clixon/clixon_options.h b/lib/clixon/clixon_options.h index 7c776c13..7f3bfbc4 100644 --- a/lib/clixon/clixon_options.h +++ b/lib/clixon/clixon_options.h @@ -120,4 +120,16 @@ int clicon_dbspec_yang_set(clicon_handle h, struct yang_spec *ys); char *clicon_dbspec_name(clicon_handle h); int clicon_dbspec_name_set(clicon_handle h, char *name); +int clicon_xmldb_plugin_set(clicon_handle h, plghndl_t handle); + +plghndl_t clicon_xmldb_plugin_get(clicon_handle h); + +int clicon_xmldb_api_set(clicon_handle h, void *xa_api); + +void *clicon_xmldb_api_get(clicon_handle h); + +int clicon_xmldb_handle_set(clicon_handle h, void *xh); + +void *clicon_xmldb_handle_get(clicon_handle h); + #endif /* _CLIXON_OPTIONS_H_ */ diff --git a/lib/src/clixon_handle.c b/lib/src/clixon_handle.c index 47accd83..f5debeff 100644 --- a/lib/src/clixon_handle.c +++ b/lib/src/clixon_handle.c @@ -52,6 +52,7 @@ #include "clixon_handle.h" #include "clixon_err.h" #include "clixon_yang.h" +#include "clixon_plugin.h" #include "clixon_options.h" #define CLICON_MAGIC 0x99aafabe @@ -66,7 +67,6 @@ struct clicon_handle { int ch_magic; /* magic (HDR) */ clicon_hash_t *ch_copt; /* clicon option list (HDR) */ clicon_hash_t *ch_data; /* internal clicon data (HDR) */ - void *ch_xmldb; /* XMLDB storage handle, uie xmldb_handle */ }; /*! Internal call to allocate a CLICON handle. @@ -166,30 +166,3 @@ clicon_data(clicon_handle h) return ch->ch_data; } -/*! Set or reset XMLDB storage handle - * @param[in] h Clicon handle - * @param[in] xh XMLDB storage handle. If NULL reset it - * @note Just keep note of it, dont allocate it or so. - */ -int -clicon_handle_xmldb_set(clicon_handle h, - void *xh) -{ - struct clicon_handle *ch = handle(h); - - ch->ch_xmldb = xh; - return 0; -} - -/*! Get XMLDB storage handle - * @param[in] h Clicon handle - * @retval xh XMLDB storage handle. If not connected return NULL - */ -void * -clicon_handle_xmldb_get(clicon_handle h) - -{ - struct clicon_handle *ch = handle(h); - - return ch->ch_xmldb; -} diff --git a/lib/src/clixon_hash.c b/lib/src/clixon_hash.c index c3f6d71d..fc914b60 100644 --- a/lib/src/clixon_hash.c +++ b/lib/src/clixon_hash.c @@ -200,8 +200,8 @@ hash_value(clicon_hash_t *hash, /*! Copy value and add hash entry. * * @param[in] hash Hash table - * @param[in] key New variable name - * @param[in] val New variable value + * @param[in] key Variable name + * @param[in] val Variable value * @param[in] vlen Length of variable value * @retval variable New hash structure on success * @retval NULL Failure @@ -212,8 +212,9 @@ hash_add(clicon_hash_t *hash, void *val, size_t vlen) { - void *newval; - clicon_hash_t h, new = NULL; + void *newval; + clicon_hash_t h; + clicon_hash_t new = NULL; /* If variable exist, don't allocate a new. just replace value */ h = hash_lookup (hash, key); diff --git a/lib/src/clixon_options.c b/lib/src/clixon_options.c index 1414977a..ecd6863a 100644 --- a/lib/src/clixon_options.c +++ b/lib/src/clixon_options.c @@ -63,6 +63,7 @@ #include "clixon_handle.h" #include "clixon_log.h" #include "clixon_yang.h" +#include "clixon_plugin.h" #include "clixon_options.h" /* @@ -625,12 +626,12 @@ clicon_dbspec_yang(clicon_handle h) return NULL; } -/* - * Set dbspec (YANG variant) +/*! Set yang database specification * ys must be a malloced pointer */ int -clicon_dbspec_yang_set(clicon_handle h, struct yang_spec *ys) +clicon_dbspec_yang_set(clicon_handle h, + struct yang_spec *ys) { clicon_hash_t *cdat = clicon_data(h); @@ -642,8 +643,7 @@ clicon_dbspec_yang_set(clicon_handle h, struct yang_spec *ys) return 0; } -/* - * Get dbspec name as read from spec. Can be used in CLI '@' syntax. +/*! Get dbspec name as read from spec. Can be used in CLI '@' syntax. * XXX: this we muśt change,... */ char * @@ -654,11 +654,103 @@ clicon_dbspec_name(clicon_handle h) return clicon_option_str(h, "dbspec_name"); } -/* - * Set dbspec name as read from spec. Can be used in CLI '@' syntax. +/*! Set dbspec name as read from spec. Can be used in CLI '@' syntax. */ int clicon_dbspec_name_set(clicon_handle h, char *name) { return clicon_option_str_set(h, "dbspec_name", name); } + +/*! Set xmldb datastore plugin handle, as used by dlopen/dlsym/dlclose */ +int +clicon_xmldb_plugin_set(clicon_handle h, + plghndl_t handle) +{ + clicon_hash_t *cdat = clicon_data(h); + + if (hash_add(cdat, "xmldb_plugin", &handle, sizeof(void*)) == NULL) + return -1; + return 0; +} + +/*! Get xmldb datastore plugin handle, as used by dlopen/dlsym/dlclose */ +plghndl_t +clicon_xmldb_plugin_get(clicon_handle h) +{ + clicon_hash_t *cdat = clicon_data(h); + size_t len; + void *p; + + if ((p = hash_value(cdat, "xmldb_plugin", &len)) != NULL) + return *(plghndl_t*)p; + return NULL; +} + +/*! Set or reset XMLDB API struct pointer + * @param[in] h Clicon handle + * @param[in] xa XMLDB API struct + * @note xa is really of type struct xmldb_api* + */ +int +clicon_xmldb_api_set(clicon_handle h, + void *xa) +{ + clicon_hash_t *cdat = clicon_data(h); + + /* It is the pointer to xa_api that should be copied by hash, + so we send a ptr to the ptr to indicate what to copy. + */ + if (hash_add(cdat, "xmldb_api", &xa, sizeof(void*)) == NULL) + return -1; + return 0; +} + +/*! Get XMLDB API struct pointer + * @param[in] h Clicon handle + * @retval xa XMLDB API struct + * @note xa is really of type struct xmldb_api* + */ +void * +clicon_xmldb_api_get(clicon_handle h) +{ + clicon_hash_t *cdat = clicon_data(h); + size_t len; + void *xa; + + if ((xa = hash_value(cdat, "xmldb_api", &len)) != NULL) + return *(void**)xa; + return NULL; +} + +/*! Set or reset XMLDB storage handle + * @param[in] h Clicon handle + * @param[in] xh XMLDB storage handle. If NULL reset it + * @note Just keep note of it, dont allocate it or so. + */ +int +clicon_xmldb_handle_set(clicon_handle h, + void *xh) +{ + clicon_hash_t *cdat = clicon_data(h); + + if (hash_add(cdat, "xmldb_handle", &xh, sizeof(void*)) == NULL) + return -1; + return 0; +} + +/*! Get XMLDB storage handle + * @param[in] h Clicon handle + * @retval xh XMLDB storage handle. If not connected return NULL + */ +void * +clicon_xmldb_handle_get(clicon_handle h) +{ + clicon_hash_t *cdat = clicon_data(h); + size_t len; + void *xh; + + if ((xh = hash_value(cdat, "xmldb_handle", &len)) != NULL) + return *(void**)xh; + return NULL; +} diff --git a/lib/src/clixon_plugin.c b/lib/src/clixon_plugin.c index c127a948..729ada7d 100644 --- a/lib/src/clixon_plugin.c +++ b/lib/src/clixon_plugin.c @@ -93,9 +93,9 @@ clicon_find_func(clicon_handle h, char *plugin, char *func) * @param[in] dlflags See man(3) dlopen */ plghndl_t -plugin_load (clicon_handle h, - char *file, - int dlflags) +plugin_load(clicon_handle h, + char *file, + int dlflags) { char *error; void *handle = NULL; diff --git a/lib/src/clixon_proto_client.c b/lib/src/clixon_proto_client.c index d5a7e977..03558c57 100644 --- a/lib/src/clixon_proto_client.c +++ b/lib/src/clixon_proto_client.c @@ -60,6 +60,7 @@ #include "clixon_hash.h" #include "clixon_handle.h" #include "clixon_yang.h" +#include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_xml.h" #include "clixon_xsl.h" diff --git a/lib/src/clixon_xml_db.c b/lib/src/clixon_xml_db.c index 97ef6dd3..8abfd12b 100644 --- a/lib/src/clixon_xml_db.c +++ b/lib/src/clixon_xml_db.c @@ -59,17 +59,15 @@ #include "clixon_handle.h" #include "clixon_xml.h" #include "clixon_yang.h" +#include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_xml_db.h" -static struct xmldb_api *_xa_api = NULL; - -/*! Load a specific plugin, call its init function and add it to plugins list +/*! Load an xmldb storage plugin according to filename * If init function fails (not found, wrong version, etc) print a log and dont * add it. - * @param[in] name Filename (complete path) of plugin + * @param[in] h CLicon handle * @param[in] filename Actual filename with path - * @param[out] plugin Plugin data structure for invoking. Dealloc with free */ int xmldb_plugin_load(clicon_handle h, @@ -78,8 +76,9 @@ xmldb_plugin_load(clicon_handle h, int retval = -1; char *dlerrcode; plugin_init_t *initfun; - void *handle = NULL; + plghndl_t handle = NULL; char *error; + struct xmldb_api *xa = NULL; dlerror(); /* Clear any existing error */ if ((handle = dlopen(filename, RTLD_NOW|RTLD_GLOBAL)) == NULL) { @@ -94,21 +93,27 @@ xmldb_plugin_load(clicon_handle h, XMLDB_PLUGIN_INIT_FN, dlerrcode); goto fail; } - if ((_xa_api = initfun(XMLDB_API_VERSION)) == NULL) { + if ((xa = initfun(XMLDB_API_VERSION)) == NULL) { clicon_log(LOG_WARNING, "%s: failed when running init function %s: %s", filename, XMLDB_PLUGIN_INIT_FN, errno?strerror(errno):""); goto fail; } - if (_xa_api->xa_version != XMLDB_API_VERSION){ + if (xa->xa_version != XMLDB_API_VERSION){ clicon_log(LOG_WARNING, "%s: Unexpected plugin version number: %d", - filename, _xa_api->xa_version); + filename, xa->xa_version); goto fail; } - if (_xa_api->xa_magic != XMLDB_API_MAGIC){ + if (xa->xa_magic != XMLDB_API_MAGIC){ clicon_log(LOG_WARNING, "%s: Wrong plugin magic number: %x", - filename, _xa_api->xa_magic); + filename, xa->xa_magic); goto fail; } + /* Add plugin */ + if (clicon_xmldb_plugin_set(h, handle) < 0) + goto done; + /* Add API */ + if (clicon_xmldb_api_set(h, xa) < 0) + goto done; clicon_log(LOG_WARNING, "xmldb plugin %s loaded", filename); retval = 0; done: @@ -120,11 +125,41 @@ xmldb_plugin_load(clicon_handle h, goto done; } -/*! XXX: fixme */ +/*! Unload the xmldb storage plugin */ int xmldb_plugin_unload(clicon_handle h) { - return 0; + int retval = -1; + plghndl_t handle; + struct xmldb_api *xa; + xmldb_handle xh; + char *error; + + if ((handle = clicon_xmldb_plugin_get(h)) == NULL){ + clicon_err(OE_PLUGIN, errno, "No plugin handle"); + goto done; + } + /* If connected storage handle then disconnect */ + if ((xh = clicon_xmldb_handle_get(h)) != NULL) + xmldb_disconnect(h); /* sets xmldb handle to NULL */ + /* Deregister api */ + if ((xa = clicon_xmldb_api_get(h)) != NULL){ + /* Call plugin_exit */ + if (xa->xa_plugin_exit_fn != NULL) + xa->xa_plugin_exit_fn(); + /* Deregister API (it is allocated in plugin) */ + clicon_xmldb_api_set(h, NULL); + } + /* Unload plugin */ + dlerror(); /* Clear any existing error */ + if (dlclose(handle) != 0) { + error = (char*)dlerror(); + clicon_err(OE_PLUGIN, errno, "dlclose: %s\n", error ? error : "Unknown error"); + /* Just report no -1 return*/ + } + retval = 0; + done: + return retval; } /*! Connect to a datastore plugin @@ -139,21 +174,21 @@ xmldb_plugin_unload(clicon_handle h) int xmldb_connect(clicon_handle h) { - int retval = -1; - xmldb_handle xh; + int retval = -1; + xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_connect_fn == NULL){ + if (xa->xa_connect_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = _xa_api->xa_connect_fn()) == NULL) + if ((xh = xa->xa_connect_fn()) == NULL) goto done; - clicon_handle_xmldb_set(h, xh); - + clicon_xmldb_handle_set(h, xh); retval = 0; done: return retval; @@ -168,22 +203,23 @@ xmldb_disconnect(clicon_handle h) { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_disconnect_fn == NULL){ + if (xa->xa_disconnect_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Already disconnected from datastore plugin"); goto done; } - if (_xa_api->xa_disconnect_fn(xh) < 0) + if (xa->xa_disconnect_fn(xh) < 0) goto done; - clicon_handle_xmldb_set(h, NULL); + clicon_xmldb_handle_set(h, NULL); retval = 0; done: return retval; @@ -203,20 +239,21 @@ xmldb_getopt(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_getopt_fn == NULL){ + if (xa->xa_getopt_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_getopt_fn(xh, optname, value); + retval = xa->xa_getopt_fn(xh, optname, value); done: return retval; } @@ -235,20 +272,21 @@ xmldb_setopt(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_setopt_fn == NULL){ + if (xa->xa_setopt_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_setopt_fn(xh, optname, value); + retval = xa->xa_setopt_fn(xh, optname, value); done: return retval; } @@ -293,20 +331,22 @@ xmldb_get(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_get_fn == NULL){ + if (xa->xa_get_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_get_fn(xh, db, xpath, xtop, xvec, xlen); + clicon_log(LOG_WARNING, "%s: db:%s xpath:%s", __FUNCTION__, db, xpath); + retval = xa->xa_get_fn(xh, db, xpath, xtop, xvec, xlen); done: return retval; } @@ -341,20 +381,30 @@ xmldb_put(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_put_fn == NULL){ + if (xa->xa_put_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_put_fn(xh, db, op, api_path, xt); + { + cbuf *cb = cbuf_new(); + if (clicon_xml2cbuf(cb, xt, 0, 0) < 0) + goto done; + + clicon_log(LOG_WARNING, "%s: db:%s op:%d api_path:%s xml:%s", __FUNCTION__, + db, op, api_path, cbuf_get(cb)); + cbuf_free(cb); + } + retval = xa->xa_put_fn(xh, db, op, api_path, xt); done: return retval; } @@ -373,20 +423,21 @@ xmldb_copy(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_copy_fn == NULL){ + if (xa->xa_copy_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_copy_fn(xh, from, to); + retval = xa->xa_copy_fn(xh, from, to); done: return retval; } @@ -405,20 +456,21 @@ xmldb_lock(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_lock_fn == NULL){ + if (xa->xa_lock_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_lock_fn(xh, db, pid); + retval = xa->xa_lock_fn(xh, db, pid); done: return retval; } @@ -438,20 +490,21 @@ xmldb_unlock(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_unlock_fn == NULL){ + if (xa->xa_unlock_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_unlock_fn(xh, db, pid); + retval = xa->xa_unlock_fn(xh, db, pid); done: return retval; } @@ -468,20 +521,21 @@ xmldb_unlock_all(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_unlock_all_fn == NULL){ + if (xa->xa_unlock_all_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval =_xa_api->xa_unlock_all_fn(xh, pid); + retval =xa->xa_unlock_all_fn(xh, pid); done: return retval; } @@ -499,20 +553,21 @@ xmldb_islocked(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_islocked_fn == NULL){ + if (xa->xa_islocked_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval =_xa_api->xa_islocked_fn(xh, db); + retval =xa->xa_islocked_fn(xh, db); done: return retval; } @@ -530,20 +585,21 @@ xmldb_exists(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_exists_fn == NULL){ + if (xa->xa_exists_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_exists_fn(xh, db); + retval = xa->xa_exists_fn(xh, db); done: return retval; } @@ -560,20 +616,21 @@ xmldb_delete(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_delete_fn == NULL){ + if (xa->xa_delete_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_delete_fn(xh, db); + retval = xa->xa_delete_fn(xh, db); done: return retval; } @@ -590,20 +647,21 @@ xmldb_init(clicon_handle h, { int retval = -1; xmldb_handle xh; + struct xmldb_api *xa; - if (_xa_api == NULL){ + if ((xa = clicon_xmldb_api_get(h)) == NULL){ clicon_err(OE_DB, 0, "No xmldb plugin"); goto done; } - if (_xa_api->xa_init_fn == NULL){ + if (xa->xa_init_fn == NULL){ clicon_err(OE_DB, 0, "No xmldb function"); goto done; } - if ((xh = clicon_handle_xmldb_get(h)) == NULL){ + if ((xh = clicon_xmldb_handle_get(h)) == NULL){ clicon_err(OE_DB, 0, "Not connected to datastore plugin"); goto done; } - retval = _xa_api->xa_init_fn(xh, db); + retval = xa->xa_init_fn(xh, db); done: return retval; } diff --git a/lib/src/clixon_xml_map.c b/lib/src/clixon_xml_map.c index f0609294..9ac928a6 100644 --- a/lib/src/clixon_xml_map.c +++ b/lib/src/clixon_xml_map.c @@ -79,6 +79,7 @@ #include "clixon_string.h" #include "clixon_yang.h" #include "clixon_yang_type.h" +#include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_xml.h" #include "clixon_xsl.h" diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index b8e421e0..14a03e84 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -66,6 +66,7 @@ #include "clixon_file.h" #include "clixon_yang.h" #include "clixon_hash.h" +#include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_yang_type.h" #include "clixon_yang_parse.h" diff --git a/lib/src/clixon_yang_type.c b/lib/src/clixon_yang_type.c index dbb5ac65..6533ff7d 100644 --- a/lib/src/clixon_yang_type.c +++ b/lib/src/clixon_yang_type.c @@ -63,6 +63,7 @@ #include "clixon_handle.h" #include "clixon_yang.h" #include "clixon_hash.h" +#include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_yang.h" #include "clixon_yang_type.h"