src/sock_tcp.c
changeset 28 9c1050bc8709
parent 27 e6639132bead
child 29 3f0f2898fea3
equal deleted inserted replaced
27:e6639132bead 28:9c1050bc8709
   105 {
   105 {
   106     struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp);
   106     struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp);
   107     
   107     
   108     // implemented in sock_tcp_add_event
   108     // implemented in sock_tcp_add_event
   109     return sock_tcp_add_event(sock, mask);
   109     return sock_tcp_add_event(sock, mask);
       
   110 }
       
   111 
       
   112 static void sock_tcp_release (struct sock_stream *base_sock)
       
   113 {
       
   114     struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp);
       
   115     
       
   116     // close and free
       
   117     sock_tcp_close(sock);
       
   118     sock_tcp_free(sock);
   110 }
   119 }
   111 
   120 
   112 /*
   121 /*
   113  * Our sock_stream_type
   122  * Our sock_stream_type
   114  */
   123  */
   116     .methods                = {
   125     .methods                = {
   117         .read               = &sock_tcp_read,
   126         .read               = &sock_tcp_read,
   118         .write              = &sock_tcp_write,
   127         .write              = &sock_tcp_write,
   119         .event_init         = &sock_tcp_event_init,
   128         .event_init         = &sock_tcp_event_init,
   120         .event_enable       = &sock_tcp_event_enable,
   129         .event_enable       = &sock_tcp_event_enable,
       
   130         .release            = &sock_tcp_release,
   121     },
   131     },
   122 };
   132 };
   123 
   133 
   124 err_t sock_tcp_alloc (struct sock_tcp **sock_ptr)
   134 err_t sock_tcp_alloc (struct sock_tcp **sock_ptr)
   125 {
   135 {
   249 
   259 
   250     // ok
   260     // ok
   251     return SUCCESS;
   261     return SUCCESS;
   252 }
   262 }
   253 
   263 
   254 void sock_tcp_release (struct sock_tcp *sock)
   264 void sock_tcp_close (struct sock_tcp *sock)
       
   265 {
       
   266     // must be connected
       
   267     assert(sock->fd >= 0);
       
   268 
       
   269     // kill any events
       
   270     if (sock->ev_read)
       
   271         event_del(sock->ev_read);
       
   272 
       
   273     if (sock->ev_write)
       
   274         event_del(sock->ev_write);
       
   275 
       
   276     // close the socket itself
       
   277     // XXX: errors?
       
   278     close(sock->fd);
       
   279 
       
   280     // invalidate
       
   281     sock->fd = -1;
       
   282 }
       
   283 
       
   284 void sock_tcp_free (struct sock_tcp *sock)
   255 {
   285 {
   256     // must not be connected
   286     // must not be connected
   257     assert(sock->fd < 0);
   287     assert(sock->fd < 0);
   258 
   288 
   259     // free
   289     // free
   273     if ((err = sock_tcp_init_connect(sock, host, service))) {
   303     if ((err = sock_tcp_init_connect(sock, host, service))) {
   274         // copy error_info
   304         // copy error_info
   275         SET_ERROR_INFO(err_info, sock_stream_error(SOCK_TCP_BASE(sock)));
   305         SET_ERROR_INFO(err_info, sock_stream_error(SOCK_TCP_BASE(sock)));
   276 
   306 
   277         // cleanup
   307         // cleanup
   278         sock_tcp_release(sock);
   308         sock_tcp_free(sock);
   279         
   309         
   280         // return error code
   310         // return error code
   281         return err;
   311         return err;
   282     }
   312     }
   283 
   313