src/sock_gnutls.c
changeset 10 9fe218576d13
parent 9 4c4c906cc649
child 12 4147fae232d9
--- a/src/sock_gnutls.c	Sun Feb 22 08:48:21 2009 +0200
+++ b/src/sock_gnutls.c	Sun Feb 22 10:16:28 2009 +0200
@@ -4,28 +4,59 @@
 #include <stdlib.h>
 #include <err.h>
 
-static err_t sock_gnutls_read (struct sock_stream *base_sock, void *buf, size_t len)
+// XXX: errors
+static err_t sock_gnutls_read (struct sock_stream *base_sock, void *buf, size_t *len)
+{
+    struct sock_gnutls *sock = SOCK_FROM_BASE(base_sock, struct sock_gnutls);
+    int ret;
+    
+    // just map to gnutls_record_recv
+    if ((ret = gnutls_record_recv(sock->session, buf, *len)) < 0)
+        RETURN_SET_ERROR_ERRNO(SOCK_GNUTLS_ERR(sock), ERR_GNUTLS_RECORD_RECV);
+    
+    // updated length
+    *len = ret;
+
+    return SUCCESS;
+}
+
+static err_t sock_gnutls_write (struct sock_stream *base_sock, const void *buf, size_t *len)
+{
+    struct sock_gnutls *sock = SOCK_FROM_BASE(base_sock, struct sock_gnutls);
+    int ret;
+    
+    // just map to gnutls_record_send
+    if ((ret = gnutls_record_send(sock->session, buf, *len)) < 0)
+        RETURN_SET_ERROR_ERRNO(SOCK_GNUTLS_ERR(sock), ERR_GNUTLS_RECORD_SEND);
+    
+    // updated length
+    *len = ret;
+
+    return SUCCESS;
+}
+
+static err_t sock_gnutls_event_init (struct sock_stream *base_sock)
 {
     struct sock_gnutls *sock = SOCK_FROM_BASE(base_sock, struct sock_gnutls);
     
-    // just map to gnutls_record_recv
-    return gnutls_record_recv(sock->session, buf, len);
+    return SUCCESS;
 }
 
-static err_t sock_gnutls_write (struct sock_stream *base_sock, const void *buf, size_t len)
+static err_t sock_gnutls_event_enable (struct sock_stream *base_sock, short mask)
 {
     struct sock_gnutls *sock = SOCK_FROM_BASE(base_sock, struct sock_gnutls);
     
-    // just map to gnutls_record_send
-    return gnutls_record_send(sock->session, buf, len);
+    return SUCCESS;
 }
 
 /*
  * Our sock_stream_Type
  */
 struct sock_stream_type sock_gnutls_type = {
-    .methods.read   = &sock_gnutls_read,
-    .methods.write  = &sock_gnutls_write,
+    .methods.read           = &sock_gnutls_read,
+    .methods.write          = &sock_gnutls_write,
+    .methods.event_init     = &sock_gnutls_event_init,
+    .methods.event_enable   = &sock_gnutls_event_enable,
 };
 
 /*