From 5678b294c5bbb61b983a7a269bc85fd6ea6590ff Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 28 Oct 2019 21:12:14 +0100 Subject: [PATCH] Set meshlink_errno when trying to create a channel to a blacklisted node. Create a new errno value MESHLINK_EBLACKLISTED, which is used when trying to send something or create a channel to a blacklisted node. Also improve some log messages. --- src/meshlink.c | 13 ++++++++++++- src/meshlink.h | 25 +++++++++++++------------ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/meshlink.c b/src/meshlink.c index 0318a497..98e02f7d 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -796,6 +796,7 @@ static const char *errstr[] = { [MESHLINK_EPEER] = "Error communicating with peer", [MESHLINK_ENOTSUP] = "Operation not supported", [MESHLINK_EBUSY] = "MeshLink instance already in use", + [MESHLINK_EBLACKLISTED] = "Node is blacklisted", }; const char *meshlink_strerror(meshlink_errno_t err) { @@ -1757,6 +1758,7 @@ bool meshlink_send(meshlink_handle_t *mesh, meshlink_node_t *destination, const if(n->status.blacklisted) { logger(mesh, MESHLINK_ERROR, "Node %s blacklisted, dropping packet\n", n->name); + meshlink_errno = MESHLINK_EBLACKLISTED; return false; } @@ -2861,9 +2863,15 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) { node_t *n = (node_t *)node; + if(n == mesh->self) { + logger(mesh, MESHLINK_ERROR, "%s whitelisting itself?\n", node->name); + meshlink_errno = MESHLINK_EINVAL; + pthread_mutex_unlock(&mesh->mutex); + return; + } + if(!n->status.blacklisted) { logger(mesh, MESHLINK_DEBUG, "Node %s was already whitelisted\n", node->name); - meshlink_errno = MESHLINK_EINVAL; pthread_mutex_unlock(&mesh->mutex); return; } @@ -2876,6 +2884,8 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) { update_node_status(mesh, n); } + logger(mesh, MESHLINK_DEBUG, "Whitelisted %s.\n", node->name); + pthread_mutex_unlock(&mesh->mutex); return; } @@ -3183,6 +3193,7 @@ meshlink_channel_t *meshlink_channel_open_ex(meshlink_handle_t *mesh, meshlink_n if(n->status.blacklisted) { logger(mesh, MESHLINK_ERROR, "Cannot open a channel with blacklisted node\n"); + meshlink_errno = MESHLINK_EBLACKLISTED; pthread_mutex_unlock(&mesh->mutex); return NULL; } diff --git a/src/meshlink.h b/src/meshlink.h index e043d8d2..3d12af6b 100644 --- a/src/meshlink.h +++ b/src/meshlink.h @@ -59,18 +59,19 @@ typedef struct meshlink_submesh meshlink_submesh_t; /// Code of most recent error encountered. typedef enum { - MESHLINK_OK, ///< Everything is fine - MESHLINK_EINVAL, ///< Invalid parameter(s) to function call - MESHLINK_ENOMEM, ///< Out of memory - MESHLINK_ENOENT, ///< Node is not known - MESHLINK_EEXIST, ///< Node already exists - MESHLINK_EINTERNAL, ///< MeshLink internal error - MESHLINK_ERESOLV, ///< MeshLink could not resolve a hostname - MESHLINK_ESTORAGE, ///< MeshLink could not load or write data from/to disk - MESHLINK_ENETWORK, ///< MeshLink encountered a network error - MESHLINK_EPEER, ///< A peer caused an error - MESHLINK_ENOTSUP, ///< The operation is not supported in the current configuration of MeshLink - MESHLINK_EBUSY ///< The MeshLink instance is already in use by another process + MESHLINK_OK, ///< Everything is fine + MESHLINK_EINVAL, ///< Invalid parameter(s) to function call + MESHLINK_ENOMEM, ///< Out of memory + MESHLINK_ENOENT, ///< Node is not known + MESHLINK_EEXIST, ///< Node already exists + MESHLINK_EINTERNAL, ///< MeshLink internal error + MESHLINK_ERESOLV, ///< MeshLink could not resolve a hostname + MESHLINK_ESTORAGE, ///< MeshLink could not load or write data from/to disk + MESHLINK_ENETWORK, ///< MeshLink encountered a network error + MESHLINK_EPEER, ///< A peer caused an error + MESHLINK_ENOTSUP, ///< The operation is not supported in the current configuration of MeshLink + MESHLINK_EBUSY, ///< The MeshLink instance is already in use by another process + MESHLINK_EBLACKLISTED, ///< The operation is not allowed because the node is blacklisted } meshlink_errno_t; /// Device class -- 2.39.2