lib: mgmtd: cleanup error value for native messaging

- Now if positive it's libyang LY_ERR, otherwise it's `-errno` value.

Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
Christian Hopps 2024-09-17 02:27:03 -04:00
parent d57a6f761e
commit 96db155acd
5 changed files with 41 additions and 8 deletions

View file

@ -908,7 +908,7 @@ static int nb_candidate_edit_tree_add(struct nb_config *candidate,
if (operation == NB_OP_CREATE_EXCL) { if (operation == NB_OP_CREATE_EXCL) {
snprintf(errmsg, errmsg_len, snprintf(errmsg, errmsg_len,
"Data already exists"); "Data already exists");
ret = NB_ERR; ret = NB_ERR_EXISTS;
goto done; goto done;
} }
@ -995,7 +995,7 @@ static int nb_candidate_edit_tree_del(struct nb_config *candidate,
if (!dnode || (dnode->flags & LYD_DEFAULT)) { if (!dnode || (dnode->flags & LYD_DEFAULT)) {
if (operation == NB_OP_DELETE) { if (operation == NB_OP_DELETE) {
snprintf(errmsg, errmsg_len, "Data missing"); snprintf(errmsg, errmsg_len, "Data missing");
return NB_ERR; return NB_ERR_NOT_FOUND;
} else } else
return NB_OK; return NB_OK;
} }
@ -2605,6 +2605,8 @@ const char *nb_err_name(enum nb_error error)
return "no changes"; return "no changes";
case NB_ERR_NOT_FOUND: case NB_ERR_NOT_FOUND:
return "element not found"; return "element not found";
case NB_ERR_EXISTS:
return "element already exists";
case NB_ERR_LOCKED: case NB_ERR_LOCKED:
return "resource is locked"; return "resource is locked";
case NB_ERR_VALIDATION: case NB_ERR_VALIDATION:

View file

@ -678,6 +678,7 @@ enum nb_error {
NB_ERR, NB_ERR,
NB_ERR_NO_CHANGES, NB_ERR_NO_CHANGES,
NB_ERR_NOT_FOUND, NB_ERR_NOT_FOUND,
NB_ERR_EXISTS,
NB_ERR_LOCKED, NB_ERR_LOCKED,
NB_ERR_VALIDATION, NB_ERR_VALIDATION,
NB_ERR_RESOURCE, NB_ERR_RESOURCE,

View file

@ -194,7 +194,7 @@ extern int mgmt_fe_adapter_send_rpc_reply(uint64_t session_id, uint64_t txn_id,
* unlock: implicit-lock flag was set in the request * unlock: implicit-lock flag was set in the request
* commit: implicit-commit flag was set in the request * commit: implicit-commit flag was set in the request
* xpath: the xpath of the data node that was created * xpath: the xpath of the data node that was created
* error: the error code, zero for successful request * error: >0 LY_ERR, < 0 -errno
* errstr: the error string, if error is non-zero * errstr: the error string, if error is non-zero
*/ */
extern int mgmt_fe_adapter_send_edit_reply(uint64_t session_id, uint64_t txn_id, extern int mgmt_fe_adapter_send_edit_reply(uint64_t session_id, uint64_t txn_id,
@ -210,7 +210,7 @@ extern int mgmt_fe_adapter_send_edit_reply(uint64_t session_id, uint64_t txn_id,
* Args: * Args:
* txn_id: the txn_id this error pertains to. * txn_id: the txn_id this error pertains to.
* short_circuit_ok: True if OK to short-circuit the call. * short_circuit_ok: True if OK to short-circuit the call.
* error: An integer error value. * error: >0 LY_ERR, < 0 -errno
* errfmt: An error format string (i.e., printfrr) * errfmt: An error format string (i.e., printfrr)
* ...: args for use by the `errfmt` format string. * ...: args for use by the `errfmt` format string.
* *

View file

@ -1335,7 +1335,8 @@ static int txn_get_tree_data_done(struct mgmt_txn_ctx *txn,
" req_id %" PRIu64 " to requested type %u", " req_id %" PRIu64 " to requested type %u",
txn->txn_id, req_id, get_tree->result_type); txn->txn_id, req_id, get_tree->result_type);
(void)mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false, ret, (void)mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false,
errno_from_nb_error(ret),
"Error converting results of GETTREE"); "Error converting results of GETTREE");
} }
@ -1351,7 +1352,7 @@ static int txn_rpc_done(struct mgmt_txn_ctx *txn, struct mgmt_txn_req *txn_req)
EVENT_OFF(txn->rpc_timeout); EVENT_OFF(txn->rpc_timeout);
if (rpc->errstr) if (rpc->errstr)
mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false, -1, mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false, -EINVAL,
rpc->errstr); rpc->errstr);
else if (mgmt_fe_adapter_send_rpc_reply(txn->session_id, txn->txn_id, else if (mgmt_fe_adapter_send_rpc_reply(txn->session_id, txn->txn_id,
req_id, rpc->result_type, req_id, rpc->result_type,
@ -1360,7 +1361,8 @@ static int txn_rpc_done(struct mgmt_txn_ctx *txn, struct mgmt_txn_req *txn_req)
" req_id %" PRIu64 " to requested type %u", " req_id %" PRIu64 " to requested type %u",
txn->txn_id, req_id, rpc->result_type); txn->txn_id, req_id, rpc->result_type);
(void)mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false, -1, (void)mgmt_fe_adapter_txn_error(txn->txn_id, req_id, false,
-EINVAL,
"Error converting results of RPC"); "Error converting results of RPC");
} }
@ -2580,7 +2582,7 @@ int mgmt_txn_send_edit(uint64_t txn_id, uint64_t req_id,
reply: reply:
mgmt_fe_adapter_send_edit_reply(txn->session_id, txn->txn_id, req_id, mgmt_fe_adapter_send_edit_reply(txn->session_id, txn->txn_id, req_id,
unlock, commit, edit->xpath_created, unlock, commit, edit->xpath_created,
ret ? -1 : 0, errstr); errno_from_nb_error(ret), errstr);
XFREE(MTYPE_MGMTD_TXN_REQ, edit); XFREE(MTYPE_MGMTD_TXN_REQ, edit);

View file

@ -69,6 +69,34 @@ static inline const char *mgmt_txn_type2str(enum mgmt_txn_type type)
return "Unknown"; return "Unknown";
} }
static inline int16_t errno_from_nb_error(enum nb_error ret)
{
switch (ret) {
case NB_OK:
return 0;
case NB_ERR_NO_CHANGES:
return -EALREADY;
case NB_ERR_NOT_FOUND:
return -ENOENT;
case NB_ERR_EXISTS:
return -EEXIST;
case NB_ERR_LOCKED:
return -EWOULDBLOCK;
case NB_ERR_VALIDATION:
return -EINVAL;
case NB_ERR_RESOURCE:
return -ENOMEM;
case NB_ERR:
case NB_ERR_INCONSISTENCY:
return -EINVAL;
case NB_YIELD:
default:
return -EINVAL;
}
}
/* Initialise transaction module. */ /* Initialise transaction module. */
extern int mgmt_txn_init(struct mgmt_master *cm, struct event_loop *tm); extern int mgmt_txn_init(struct mgmt_master *cm, struct event_loop *tm);