You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libsxmp/lib/chansx.c

103 lines
2.1 KiB
C

/*
* Secure Network Transport Layer Library v2 implementation.
* (sntllv2) it superseed all versions before due to the:
* - memory consumption
* - new features such as pulse emitting
* - performance optimization
*
* This is a proprietary software. See COPYING for further details.
*
* (c) Askele Group 2013-2015 <http://askele.com>
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#ifdef WIN32
#include <Winsock2.h>
#define EBADE 1
#define NETDB_SUCCESS 0
#else
#include <sys/select.h>
#include <netdb.h>
#include <unistd.h>
#include <uuid/uuid.h>
#endif
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <tdata/usrtc.h>
#include <sexpr/sexp.h>
#include <sntl/sntllv2.h>
/* locally used functions */
uint8_t _channel_open(conn_t *co, uint16_t *chid)
{
chnl_t *chan;
uint16_t typeid = *chid; /* our type */
uint16_t chidx;
usrtc_t *rpc_list = co->rpc_list;
usrtc_node_t *node;
rpc_typed_list_t *rlist;
cx_rpc_list_t *rpclist;
node = usrtc_lookup(rpc_list, (void *)&typeid);
if(!node) return SNE_EPERM;
else rlist = (rpc_typed_list_t *)usrtc_node_getdata(node);
if(rlist) rpclist = rlist->rpc_list;
else return SNE_FAILED;
chan = malloc(sizeof(chnl_t));
if(!chan) return SNE_ENOMEM;
/* init channel */
chan->connection = co;
chan->rpc_list = rpclist;
chan->flags = 0;
pthread_mutex_lock(&co->idx_ch_lock);
chidx = idx_allocate(&co->idx_ch);
pthread_mutex_unlock(&co->idx_ch_lock);
if(chidx == IDX_INVAL) {
free(chan);
return SNE_MCHANNELS;
}
chan->cid = chidx;
co->channels[chidx] = chan;
*chid = chidx;
return SNE_SUCCESS;
}
uint8_t _channel_close(conn_t *co, uint16_t chid)
{
chnl_t *chan;
if(chid > 512) return SNE_INVALINDEX;
else chan = co->channels[chid];
if(!chan) return SNE_NOSUCHCHAN;
pthread_mutex_lock(&co->idx_ch_lock);
idx_free(&co->idx_ch, chid);
co->channels[chid] = NULL;
pthread_mutex_unlock(&co->idx_ch_lock);
free(chan);
return SNE_SUCCESS;
}