/* * 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 * */ #include #include #include #include #include #include #include #include #include #ifdef WIN32 #include #define EBADE 1 #define NETDB_SUCCESS 0 #else #include #include #include #include #endif #include #include #include #include #include /* 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; }