diff -r e6639132bead -r 9c1050bc8709 src/sock_tcp.c --- a/src/sock_tcp.c Tue Mar 10 01:46:09 2009 +0200 +++ b/src/sock_tcp.c Tue Mar 10 02:34:11 2009 +0200 @@ -109,6 +109,15 @@ return sock_tcp_add_event(sock, mask); } +static void sock_tcp_release (struct sock_stream *base_sock) +{ + struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); + + // close and free + sock_tcp_close(sock); + sock_tcp_free(sock); +} + /* * Our sock_stream_type */ @@ -118,6 +127,7 @@ .write = &sock_tcp_write, .event_init = &sock_tcp_event_init, .event_enable = &sock_tcp_event_enable, + .release = &sock_tcp_release, }, }; @@ -251,7 +261,27 @@ return SUCCESS; } -void sock_tcp_release (struct sock_tcp *sock) +void sock_tcp_close (struct sock_tcp *sock) +{ + // must be connected + assert(sock->fd >= 0); + + // kill any events + if (sock->ev_read) + event_del(sock->ev_read); + + if (sock->ev_write) + event_del(sock->ev_write); + + // close the socket itself + // XXX: errors? + close(sock->fd); + + // invalidate + sock->fd = -1; +} + +void sock_tcp_free (struct sock_tcp *sock) { // must not be connected assert(sock->fd < 0); @@ -275,7 +305,7 @@ SET_ERROR_INFO(err_info, sock_stream_error(SOCK_TCP_BASE(sock))); // cleanup - sock_tcp_release(sock); + sock_tcp_free(sock); // return error code return err;