Example #1
0
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;
}
Example #2
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;
}
Example #3
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;
}
Example #4
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);
}