src/sock_tcp.c
changeset 28 9c1050bc8709
parent 27 e6639132bead
child 29 3f0f2898fea3
--- 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;