--- 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;