if(!buflen) {
logger(mesh, MESHLINK_DEBUG, "Invalid data\n");
+ free(buf);
meshlink_errno = MESHLINK_EPEER;
return false;
}
if(!count) {
logger(mesh, MESHLINK_DEBUG, "Invalid data\n");
+ free(buf);
meshlink_errno = MESHLINK_EPEER;
return false;
}
if(!node_write_config(mesh, n, true)) {
free_node(n);
+ free(buf);
return false;
}
}
}
- utcp_abort_all_connections(n->utcp);
+ utcp_reset_all_connections(n->utcp);
n->mtu = 0;
n->minmtu = 0;
pthread_mutex_unlock(&mesh->mutex);
}
+void meshlink_channel_abort(meshlink_handle_t *mesh, meshlink_channel_t *channel) {
+ if(!mesh || !channel) {
+ meshlink_errno = MESHLINK_EINVAL;
+ return;
+ }
+
+ if(pthread_mutex_lock(&mesh->mutex) != 0) {
+ abort();
+ }
+
+ if(channel->c) {
+ utcp_abort(channel->c);
+ channel->c = NULL;
+
+ /* Clean up any outstanding AIO buffers. */
+ aio_abort(mesh, channel, &channel->aio_send);
+ aio_abort(mesh, channel, &channel->aio_receive);
+ }
+
+ if(!channel->in_callback) {
+ free(channel);
+ }
+
+ pthread_mutex_unlock(&mesh->mutex);
+}
+
ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
if(!mesh || !channel) {
meshlink_errno = MESHLINK_EINVAL;