diff --git a/lib/Makefile.am b/lib/Makefile.am index 38070d9..457cf4c 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -14,7 +14,7 @@ lib_LTLIBRARIES = libsntllv2.la libsntllv2_la_SOURCES = \ - connex.c sntllv2.c + connex.c sntllv2.c chansx.c libsntllv2_la_LDFLAGS = -Wl,--export-dynamic diff --git a/lib/chansx.c b/lib/chansx.c index 6d469dc..1b4ced3 100644 --- a/lib/chansx.c +++ b/lib/chansx.c @@ -43,8 +43,60 @@ /* 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; } diff --git a/lib/internal.h b/lib/internal.h new file mode 100644 index 0000000..4ce1281 --- /dev/null +++ b/lib/internal.h @@ -0,0 +1,8 @@ +#ifndef __SNTLL_INTERNAL_H__ +#define __SNTLL_INTERNAL_H__ + +/* channel operations */ +uint8_t _channel_open(conn_t *co, uint16_t *chid); +uint8_t _channel_close(conn_t *co, uint16_t chid); + +#endif /* __SNTLL_INTERNAL_H__ */ diff --git a/lib/sntllv2.c b/lib/sntllv2.c index a5f0654..4868bbb 100644 --- a/lib/sntllv2.c +++ b/lib/sntllv2.c @@ -42,6 +42,8 @@ #include +#include "internal.h" + typedef struct __sntll_bundle_type { void *buf; conn_t *conn;