int kn_chrdev_associate(handle_t h, engine_t e, void (*cb_ontranfnish)(handle_t,st_io*,int,int), void (*destry_stio)(st_io*)) { if(((handle_t)h)->type != KN_CHRDEV) return -1; if(((handle_t)h)->status == KN_CHRDEV_RELEASE) return -1; kn_chr_dev *r = (kn_chr_dev*)h; if(!cb_ontranfnish) return -1; if(r->e) kn_event_del(r->e,h); r->destry_stio = destry_stio; r->cb_ontranfnish = cb_ontranfnish; r->e = e; return 0; }
static int stream_socket_associate(engine_t e,handle_t h,void (*callback)(handle_t,void*,int,int)){ if(((handle_t)h)->type != KN_SOCKET) return -1; kn_socket *s = (kn_socket*)h; if(!callback) return -1; if(s->e){ kn_event_del(s->e,h); s->e = NULL; } if(h->status == SOCKET_ESTABLISH){ kn_set_noblock(h->fd,0); #ifdef _LINUX kn_event_add(e,h,EVENT_WRITE | EVENT_READ); #elif _BSD kn_event_add(e,h,EVENT_WRITE); kn_event_add(e,h,EVENT_READ); //kn_disable_read(e,h); //kn_disable_write(e,h); #else return -1; #endif }else if(h->status == SOCKET_LISTENING){ #ifdef _LINUX kn_event_add(e,h,EVENT_READ); #elif _BSD kn_event_add(e,EVENT_READ); #else return -1; #endif }else if(h->status == SOCKET_CONNECTING){ #ifdef _LINUX kn_event_add(e,h,EVENT_WRITE | EVENT_READ); #elif _BSD kn_event_add(e,h,EVENT_WRITE); kn_event_add(e,h,EVENT_READ); #else return -1; #endif } else{ return -1; } s->callback = callback; s->e = e; return 0; }
static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,void *socketp) { kn_CURL_t curl = NULL; kn_CURLM_t curlm = NULL; curl_conn_t conn = NULL; curl_easy_getinfo(easy,CURLINFO_PRIVATE,&curl); curlm = curl->c_handle; if (action == CURL_POLL_IN || action == CURL_POLL_OUT) { if (socketp) { conn = (curl_conn_t) socketp; }else { conn = create_curl_conn(s,curlm); } curl_multi_assign(curlm->c_handle, s,(void *) conn); } switch (action) { case CURL_POLL_IN: curl_conn_add_read(curlm->e,conn); break; case CURL_POLL_OUT: curl_conn_add_write(curlm->e,conn); break; case CURL_POLL_REMOVE: if (socketp) { conn = (curl_conn_t) socketp; kn_event_del(curlm->e,(handle_t)conn); free(conn); curl_multi_assign(curlm->c_handle,s,NULL); } break; default: abort(); } return 0; }
static void on_destroy(void *_){ kn_socket *s = (kn_socket*)_; st_io *io_req; if(s->clear_func){ while((io_req = (st_io*)kn_list_pop(&s->pending_send))!=NULL) s->clear_func(io_req); while((io_req = (st_io*)kn_list_pop(&s->pending_recv))!=NULL) s->clear_func(io_req); } kn_stream_socket *ss = (kn_stream_socket*)_; if(ss->ctx){ SSL_CTX_free(ss->ctx); } if(ss->ssl){ if(s->comm_head.status == SOCKET_ESTABLISH) SSL_shutdown(ss->ssl); SSL_free(ss->ssl); } if(s->e){ kn_event_del(s->e,(handle_t)s); } close(s->comm_head.fd); free(s); }