diff --git a/CHANGELOG.md b/CHANGELOG.md index e528ef5d..cbd40030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,6 @@ ### Known issues ### Major changes: * Clixon can now be compiled and run on Apple Darwin. - * Performance improvements * Added xml hash lookup instead of linear search for better performance of large lists. To disable, undefine XML_CHILD_HASH in clixon_custom.h * netconf client was limited to 8K byte messages. Now limit is 2^32 bytes @@ -26,6 +25,8 @@ clixon_cli -f /usr/local/etc/routing.conf -1x Backward compatibility is enabled by defining BACKEND_STARTUP_BACKWARD_COMPAT in include/clixon_custom.h ### Minor changes: +* When user callbacks p_statedata() or rpc callback call returns -1, clixon_backend nolonger silently exits. Instead a log is printed and an RPC error is returned. + * Disabled key-value datastore. Enable with --with-keyvalue * Removed mandatory requirements for BACKEND, NETCONF, RESTCONF and CLI dirs. * When user callbacks such as statedata() call returns -1, clixon_backend no diff --git a/apps/backend/backend_client.c b/apps/backend/backend_client.c index 0916cff4..8e89e848 100644 --- a/apps/backend/backend_client.c +++ b/apps/backend/backend_client.c @@ -275,6 +275,7 @@ from_client_get(clicon_handle h, cxobj *xfilter; char *selector = "/"; cxobj *xret = NULL; + int ret; if ((xfilter = xml_find(xe, "filter")) != NULL) if ((selector = xml_find_value(xfilter, "select"))==NULL) @@ -291,18 +292,30 @@ from_client_get(clicon_handle h, } /* Get state data from plugins as defined by plugin_statedata(), if any */ assert(xret); - if (backend_statedata_call(h, selector, xret) < 0) + clicon_err_reset(); + if ((ret = backend_statedata_call(h, selector, xret)) < 0) goto done; - cprintf(cbret, ""); - if (xret==NULL) - cprintf(cbret, ""); - else{ - if (xml_name_set(xret, "data") < 0) - goto done; - if (clicon_xml2cbuf(cbret, xret, 0, 0) < 0) - goto done; + if (ret == 0){ /* OK */ + cprintf(cbret, ""); + if (xret==NULL) + cprintf(cbret, ""); + else{ + if (xml_name_set(xret, "data") < 0) + goto done; + if (clicon_xml2cbuf(cbret, xret, 0, 0) < 0) + goto done; + } + cprintf(cbret, ""); + } + else { /* 1 Error from callback */ + cprintf(cbret, "" + "operation-failed" + "rpc" + "error" + "Internal error:%s" + "", clicon_err_reason); + clicon_log(LOG_NOTICE, "%s Error in backend_statedata_call:%s", __FUNCTION__, xml_name(xe)); } - cprintf(cbret, ""); ok: retval = 0; done: diff --git a/apps/backend/backend_plugin.c b/apps/backend/backend_plugin.c index b194931d..9c04a5b1 100644 --- a/apps/backend/backend_plugin.c +++ b/apps/backend/backend_plugin.c @@ -726,6 +726,7 @@ plugin_transaction_abort(clicon_handle h, * @param[in,out] xml XML tree. * @retval -1 Error * @retval 0 OK + * @retval 1 Statedata callback failed */ int backend_statedata_call(clicon_handle h, @@ -753,8 +754,10 @@ backend_statedata_call(clicon_handle h, if (p->p_statedata) { if ((x = xml_new("config", NULL)) == NULL) goto done; - if ((p->p_statedata)(h, xpath, x) < 0) - goto done; + if ((p->p_statedata)(h, xpath, x) < 0){ + retval = 1; + goto done; /* Dont quit here on user callbacks */ + } if (xml_merge(xtop, x, yspec) < 0) goto done; if (x){ @@ -763,27 +766,25 @@ backend_statedata_call(clicon_handle h, } } } - { - /* Code complex to filter out anything that is outside of xpath */ - if (xpath_vec(xtop, xpath?xpath:"/", &xvec, &xlen) < 0) - goto done; + /* Code complex to filter out anything that is outside of xpath */ + if (xpath_vec(xtop, xpath?xpath:"/", &xvec, &xlen) < 0) + goto done; - /* If vectors are specified then mark the nodes found and - * then filter out everything else, - * otherwise return complete tree. - */ - if (xvec != NULL){ - for (i=0; i