src/sock_tcp.c
changeset 29 3f0f2898fea3
parent 28 9c1050bc8709
child 30 7f8dd120933f
--- a/src/sock_tcp.c	Tue Mar 10 02:34:11 2009 +0200
+++ b/src/sock_tcp.c	Tue Mar 10 02:51:44 2009 +0200
@@ -149,7 +149,7 @@
 
 err_t sock_tcp_init_fd (struct sock_tcp *sock, int fd)
 {
-    // valid fd -XXX: err instead?
+    // valid fd
     assert(fd >= 0);
 
     // initialize
@@ -194,8 +194,11 @@
 err_t sock_tcp_init_connect (struct sock_tcp *sock, const char *hostname, const char *service)
 {
     struct addrinfo hints, *res, *r;
-    int err;
-    RESET_ERROR(SOCK_TCP_ERR(sock));
+    int ret;
+    struct error_info *err = SOCK_TCP_ERR(sock);
+    
+    // zero error code
+    RESET_ERROR(err);
     
     // hints
     memset(&hints, 0, sizeof(hints));
@@ -203,15 +206,15 @@
     hints.ai_socktype = SOCK_STREAM;
 
     // resolve
-    if ((err = getaddrinfo(hostname, service, &hints, &res)))
-        RETURN_SET_ERROR_EXTRA(SOCK_TCP_ERR(sock), ERR_GETADDRINFO, err);
+    if ((ret = getaddrinfo(hostname, service, &hints, &res)))
+        RETURN_SET_ERROR_EXTRA(err, ERR_GETADDRINFO, ret);
 
     // try each result in turn
     for (r = res; r; r = r->ai_next) {
         // create the socket
         if ((sock->fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) < 0) {
             // remember error
-            SET_ERROR_ERRNO(SOCK_TCP_ERR(sock), ERR_SOCKET);
+            SET_ERROR_ERRNO(err, ERR_SOCKET);
 
             // skip to next one
             continue;
@@ -220,7 +223,7 @@
         // connect to remote address
         if (connect(sock->fd, r->ai_addr, r->ai_addrlen)) {
             // remember error
-            SET_ERROR_ERRNO(SOCK_TCP_ERR(sock), ERR_CONNECT);
+            SET_ERROR_ERRNO(err, ERR_CONNECT);
             
             // close/invalidate socket
             close(sock->fd);
@@ -237,13 +240,13 @@
     // ensure we got some valid socket, else return last error code
     if (sock->fd < 0) {
         // did we hit some error?
-        if (IS_ERROR(SOCK_TCP_ERR(sock)))
+        if (IS_ERROR(err))
             // return last error
-            return ERROR_CODE(SOCK_TCP_ERR(sock));
+            return ERROR_CODE(err);
         
         else
             // no results
-            return SET_ERROR(SOCK_TCP_ERR(sock), ERR_GETADDRINFO_EMPTY);
+            return SET_ERROR(err, ERR_GETADDRINFO_EMPTY);
     }
     
     // ok, done
@@ -261,8 +264,13 @@
     return SUCCESS;
 }
 
-void sock_tcp_close (struct sock_tcp *sock)
+err_t sock_tcp_close (struct sock_tcp *sock)
 {
+    struct error_info *err = SOCK_TCP_ERR(sock);
+    
+    // no errors yet
+    RESET_ERROR(err);
+
     // must be connected
     assert(sock->fd >= 0);
 
@@ -274,11 +282,13 @@
         event_del(sock->ev_write);
 
     // close the socket itself
-    // XXX: errors?
-    close(sock->fd);
+    if (close(sock->fd))
+        SET_ERROR_ERRNO(err, ERR_CLOSE);
 
     // invalidate
     sock->fd = -1;
+
+    return ERROR_CODE(err);
 }
 
 void sock_tcp_free (struct sock_tcp *sock)