commit 0b7cfa35242ff40409c53735c21447a88f20a202
Author: Oswald Buddenhagen <o...@kde.org>
Date:   Fri Mar 29 18:22:40 2013 +0100

    improve socket error reporting
    
    always use getsockopt() to query the meaning of POLLERR, rather than
    reporting "Unidentified socket error".
    this is unlikely to have any effect when using select(), as that one
    pretty much never signals exceptional conditions.

 src/socket.c |   45 ++++++++++++++++++---------------------------
 1 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/src/socket.c b/src/socket.c
index 99982f9..f497449 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -297,7 +297,7 @@ static void start_tls_p3( conn_t *conn, int ok )
 static void socket_fd_cb( int, void * );
 
 static void socket_connect_failed( conn_t * );
-static void socket_connected2( conn_t * );
+static void socket_connected( conn_t * );
 static void socket_connect_bail( conn_t * );
 
 static void
@@ -388,7 +388,7 @@ socket_connect( conn_t *sock, void (*cb)( int ok, void *aux 
) )
 
        }
        info( "\vok\n" );
-       socket_connected2( sock );
+       socket_connected( sock );
        return;
 }
 
@@ -403,24 +403,6 @@ socket_connect_failed( conn_t *conn )
 static void
 socket_connected( conn_t *conn )
 {
-       int soerr;
-       socklen_t selen = sizeof(soerr);
-
-       if (getsockopt( conn->fd, SOL_SOCKET, SO_ERROR, &soerr, &selen )) {
-               perror( "getsockopt" );
-               exit( 1 );
-       }
-       if (soerr) {
-               errno = soerr;
-               socket_connect_failed( conn );
-               return;
-       }
-       socket_connected2( conn );
-}
-
-static void
-socket_connected2( conn_t *conn )
-{
        conf_fd( conn->fd, 0, POLLIN );
        conn->state = SCK_READY;
        conn->callbacks.connect( 1, conn->callback_aux );
@@ -637,13 +619,22 @@ socket_fd_cb( int events, void *aux )
 {
        conn_t *conn = (conn_t *)aux;
 
-       if (conn->state == SCK_CONNECTING) {
-               socket_connected( conn );
-               return;
-       }
-
-       if (events & POLLERR) {
-               error( "Unidentified socket error from %s.\n", conn->name );
+       if ((events & POLLERR) || conn->state == SCK_CONNECTING) {
+               int soerr;
+               socklen_t selen = sizeof(soerr);
+               if (getsockopt( conn->fd, SOL_SOCKET, SO_ERROR, &soerr, &selen 
)) {
+                       perror( "getsockopt" );
+                       exit( 1 );
+               }
+               errno = soerr;
+               if (conn->state == SCK_CONNECTING) {
+                       if (errno)
+                               socket_connect_failed( conn );
+                       else
+                               socket_connected( conn );
+                       return;
+               }
+               sys_error( "Socket error from %s", conn->name );
                socket_fail( conn );
                return;
        }

------------------------------------------------------------------------------
Own the Future-Intel(R) Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest. Compete 
for recognition, cash, and the chance to get your game on Steam. 
$5K grand prize plus 10 genre and skill prizes. Submit your demo 
by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to