diff --git a/lib/clixon/clixon_netconf_lib.h b/lib/clixon/clixon_netconf_lib.h
index fdcceb50..3f2ba051 100644
--- a/lib/clixon/clixon_netconf_lib.h
+++ b/lib/clixon/clixon_netconf_lib.h
@@ -161,6 +161,11 @@ int netconf_missing_attribute_xml(cxobj **xret, char *type, char *info, char *me
int netconf_bad_attribute(cbuf *cb, char *type, char *info, char *message);
int netconf_bad_attribute_xml(cxobj **xret, char *type, char *info, char *message);
int netconf_unknown_attribute(cbuf *cb, char *type, char *info, char *message);
+int netconf_common_rpc_err(cbuf *cb, char *ns, char *type, char *tag, char *info,
+ char *severity, char *message);
+int netconf_common_rpc_err_xml(cxobj **xret, char *ns, char *type, char *tag,
+ char *severity, char *infotag, char *info,
+ char *message);
int netconf_missing_element(cbuf *cb, char *type, char *element, char *message);
int netconf_missing_yang_xml(cxobj **xret, char *path, char *app_tag, char *info, char *message);
int netconf_missing_element_xml(cxobj **xret, char *type, char *element, char *message);
diff --git a/lib/src/clixon_netconf_lib.c b/lib/src/clixon_netconf_lib.c
index 5e37013f..71f44a68 100644
--- a/lib/src/clixon_netconf_lib.c
+++ b/lib/src/clixon_netconf_lib.c
@@ -487,23 +487,85 @@ netconf_unknown_attribute(cbuf *cb,
goto done;
}
-/*! Common Netconf element XML tree according to RFC 6241 App A
+/*! Create Netconf rpc-error XML tree with all parameters available.
+ *
+ * An unexpected attribute is present.
+ * @param[out] cb CLIgen buf. Error XML is written in this buffer
+ * @param[in] ns Namespace. If NULL the netconf base ns will be used
+ * @param[in] type Error type: "rpc", "application" or "protocol"
+ * @param[in] severity Severity: "error" or "warning"
+ * @param[in] tag Error tag, like "invalid-value" or "unknown-attribute"
+ * @param[in] info bad-attribute or bad-element xml. If NULL not included.
+ * @param[in] message Error message. May be NULL.
+ * @retval 0 OK
+ * @retval -1 Error
+ */
+int
+netconf_common_rpc_err(cbuf *cb,
+ char *ns,
+ char *type,
+ char *tag,
+ char *severity,
+ char *info,
+ char *message)
+{
+ int retval = -1;
+ char *encstr = NULL;
+
+ if (!ns)
+ ns = NETCONF_BASE_NAMESPACE;
+
+ if (cprintf(cb, ""
+ "%s"
+ "%s"
+ "%s",
+ ns, type, tag, severity) < 0)
+ goto err;
+ if (info){
+ if (cprintf(cb, "%s", info) < 0)
+ goto err;
+ }
+ if (message){
+ if (xml_chardata_encode(&encstr, 0, "%s", message) < 0)
+ goto done;
+ if (cprintf(cb, "%s", encstr) < 0)
+ goto err;
+ }
+ if (cprintf(cb, "") < 0)
+ goto err;
+ retval = 0;
+ done:
+ if (encstr)
+ free(encstr);
+ return retval;
+ err:
+ clixon_err(OE_XML, errno, "cprintf");
+ goto done;
+}
+
+/*! Common Netconf element XML tree according to RFC 6241 App A, allow a
+ * passed in namespace.
*
* @param[out] xret Error XML tree. Free with xml_free after use
+ * @param[in] ns Namespace to use, if NULL it will use the default
* @param[in] type Error type: "application" or "protocol"
* @param[in] tag Error tag
- * @param[in] element bad-element xml
- * @param[in] message Error message (will be XML encoded)
+ * @param[in] severity Message severity
+ * @param[in] infotag Tag for the info, may be NULL if not tag required
+ * @param[in] info info, may be NULL if no info
+ * @param[in] message Error message (will be XML encoded), may be NULL
* @retval 0 OK
* @retval -1 Error
*/
-static int
-netconf_common_xml(cxobj **xret,
- char *type,
- char *tag,
- char *infotag,
- char *element,
- char *message)
+int
+netconf_common_rpc_err_xml(cxobj **xret,
+ char *ns,
+ char *type,
+ char *tag,
+ char *severity,
+ char *infotag,
+ char *info,
+ char *message)
{
int retval =-1;
cxobj *xerr;
@@ -513,22 +575,45 @@ netconf_common_xml(cxobj **xret,
clixon_err(OE_NETCONF, EINVAL, "xret is NULL");
goto done;
}
+
+ if (!ns)
+ ns = NETCONF_BASE_NAMESPACE;
+
if (*xret == NULL){
if ((*xret = xml_new("rpc-reply", NULL, CX_ELMNT)) == NULL)
goto done;
- if (xml_add_attr(*xret, "xmlns", NETCONF_BASE_NAMESPACE, NULL, NULL) == NULL)
+ if (xml_add_attr(*xret, "xmlns", ns, NULL, NULL) == NULL)
goto done;
}
else if (xml_name_set(*xret, "rpc-reply") < 0)
goto done;
if ((xerr = xml_new("rpc-error", *xret, CX_ELMNT)) == NULL)
goto done;
- if (clixon_xml_parse_va(YB_NONE, NULL, &xerr, NULL, "%s"
- "%s"
- "<%s>%s%s>"
- "error",
- type, tag, infotag, element, infotag) < 0)
- goto done;
+ if (infotag) {
+ if (clixon_xml_parse_va(YB_NONE, NULL, &xerr, NULL,
+ "%s"
+ "%s"
+ "<%s>%s%s>"
+ "%s",
+ type, tag, infotag, info, infotag,
+ severity) < 0)
+ goto done;
+ } else if (info) {
+ if (clixon_xml_parse_va(YB_NONE, NULL, &xerr, NULL,
+ "%s"
+ "%s"
+ "%s"
+ "%s",
+ type, tag, info, severity) < 0)
+ goto done;
+ } else {
+ if (clixon_xml_parse_va(YB_NONE, NULL, &xerr, NULL,
+ "%s"
+ "%s"
+ "%s",
+ type, tag, severity) < 0)
+ goto done;
+ }
if (message){
if (xml_chardata_encode(&encstr, 0, "%s", message) < 0)
goto done;
@@ -541,7 +626,7 @@ netconf_common_xml(cxobj **xret,
if (encstr)
free(encstr);
return retval;
-}
+}
/*! Create Netconf missing-element error XML tree according to RFC 6241 App A
*
@@ -562,8 +647,9 @@ netconf_missing_element(cbuf *cb,
int retval = -1;
cxobj *xret = NULL;
- if (netconf_common_xml(&xret, type, "missing-element",
- "bad-element", element, message) < 0)
+ if (netconf_common_rpc_err_xml(&xret, NETCONF_BASE_NAMESPACE, type,
+ "missing-element", "error",
+ "bad-element", element, message) < 0)
goto done;
if (clixon_xml2cbuf(cb, xret, 0, 0, NULL, -1, 0) < 0)
goto done;
@@ -588,8 +674,9 @@ netconf_missing_element_xml(cxobj **xret,
char *element,
char *message)
{
- return netconf_common_xml(xret, type, "missing-element",
- "bad-element", element, message);
+ return netconf_common_rpc_err_xml(xret, NETCONF_BASE_NAMESPACE, type,
+ "missing-element", "error",
+ "bad-element", element, message);
}
/*! Create Netconf bad-element error XML tree according to RFC 6241 App A
@@ -612,8 +699,9 @@ netconf_bad_element(cbuf *cb,
int retval = -1;
cxobj *xret = NULL;
- if (netconf_common_xml(&xret, type, "bad-element",
- "bad-element",element, message) < 0)
+ if (netconf_common_rpc_err_xml(&xret, NETCONF_BASE_NAMESPACE, type,
+ "bad-element", "error",
+ "bad-element",element, message) < 0)
goto done;
if (clixon_xml2cbuf(cb, xret, 0, 0, NULL, -1, 0) < 0)
goto done;
@@ -630,7 +718,9 @@ netconf_bad_element_xml(cxobj **xret,
char *element,
char *message)
{
- return netconf_common_xml(xret, type, "bad-element", "bad-element", element, message);
+ return netconf_common_rpc_err_xml(xret, NETCONF_BASE_NAMESPACE, type,
+ "bad-element", "error",
+ "bad-element", element, message);
}
/*! Create Netconf unknown-element error XML tree according to RFC 6241 App A
@@ -652,8 +742,9 @@ netconf_unknown_element(cbuf *cb,
int retval = -1;
cxobj *xret = NULL;
- if (netconf_common_xml(&xret, type, "unknown-element",
- "bad-element", element, message) < 0)
+ if (netconf_common_rpc_err_xml(&xret, NETCONF_BASE_NAMESPACE, type,
+ "unknown-element", "error",
+ "bad-element", element, message) < 0)
goto done;
if (clixon_xml2cbuf(cb, xret, 0, 0, NULL, -1, 0) < 0)
goto done;
@@ -680,8 +771,9 @@ netconf_unknown_element_xml(cxobj **xret,
char *element,
char *message)
{
- return netconf_common_xml(xret, type, "unknown-element",
- "bad-element", element, message);
+ return netconf_common_rpc_err_xml(xret, NETCONF_BASE_NAMESPACE, type,
+ "unknown-element", "error",
+ "bad-element", element, message);
}
/*! Create Netconf unknown-namespace error XML tree according to RFC 6241 App A
@@ -703,8 +795,9 @@ netconf_unknown_namespace(cbuf *cb,
int retval = -1;
cxobj *xret = NULL;
- if (netconf_common_xml(&xret, type, "unknown-namespace",
- "bad-namespace", ns, message) < 0)
+ if (netconf_common_rpc_err_xml(&xret, NETCONF_BASE_NAMESPACE, type,
+ "unknown-namespace", "error",
+ "bad-namespace", ns, message) < 0)
goto done;
if (clixon_xml2cbuf(cb, xret, 0, 0, NULL, -1, 0) < 0)
goto done;
@@ -721,8 +814,9 @@ netconf_unknown_namespace_xml(cxobj **xret,
char *ns,
char *message)
{
- return netconf_common_xml(xret, type, "unknown-namespace",
- "bad-namespace", ns, message);
+ return netconf_common_rpc_err_xml(xret, NETCONF_BASE_NAMESPACE, type,
+ "unknown-namespace", "error",
+ "bad-namespace", ns, message);
}
/*! Create Netconf access-denied error cbuf according to RFC 6241 App A