tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mt...@apache.org
Subject cvs commit: jakarta-tomcat-connectors/jk/native/common jk_connect.c
Date Thu, 26 May 2005 14:39:37 GMT
mturk       2005/05/26 07:39:37

  Modified:    jk/native/common jk_connect.c
  Log:
  Add nonblocking detection for socket connections from pre 1.2.8
  for non winsock platform.
  Also check for EAGAIN while reading data.
  Thanks to Kresimir Kukulj and his intensive testing for transient errors.
  
  Revision  Changes    Path
  1.60      +34 -7     jakarta-tomcat-connectors/jk/native/common/jk_connect.c
  
  Index: jk_connect.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_connect.c,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- jk_connect.c	13 May 2005 08:23:11 -0000	1.59
  +++ jk_connect.c	26 May 2005 14:39:37 -0000	1.60
  @@ -552,7 +552,7 @@
   #else
               wr = write(sd, b + sent, len - sent);
   #endif
  -        } while (wr == -1 && errno == EINTR);
  +        } while (wr == -1 && (errno == EINTR || errno == EAGAIN));
   
           if (wr == -1)
               return (errno > 0) ? -errno : errno;
  @@ -587,7 +587,7 @@
   #else
               rd = read(sd, (char *)b + rdlen, len - rdlen);
   #endif
  -        } while (rd == -1 && errno == EINTR);
  +        } while (rd == -1 && (errno == EINTR || errno == EAGAIN));
   
           if (rd == -1)
               return (errno > 0) ? -errno : errno;
  @@ -615,6 +615,7 @@
       return buf;
   }
   
  +#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
   int jk_is_socket_connected(int sd)
   {
       fd_set fd;
  @@ -629,15 +630,41 @@
       tv.tv_usec = 1;
   
       /* If we get a timeout, then we are still connected */
  -    if ((rc = select(1, &fd, NULL, NULL, &tv)) == 0)
  +    if ((rc = select(1, &fd, NULL, NULL, &tv)) == 0) {
  +        errno = 0;
           return 1;
  +    }
       else {
  -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
           if (rc == SOCKET_ERROR)
               errno = WSAGetLastError() - WSABASEERR;
           else
  -            errno = 0;
  -#endif
  +            errno = EOF;
           return 0;
       }
   }
  +#else
  +int jk_is_socket_connected(int sd)
  +{
  +    char test_buffer[1];
  +    int  rd;
  +    int  saved_errno;
  +
  +    errno = 0;
  +    /* Set socket to nonblocking */
  +    if (sononblock(sd) != 0)
  +        return 0;
  +    do {
  +        rd = read(sd, test_buffer, 1);
  +    } while (rd == -1 && errno == EINTR);
  +    saved_errno = errno;
  +    soblock(sd);
  +    if (rd == -1 && saved_errno == EWOULDBLOCK) {
  +    errno = 0;
  +        return 1;
  +    }
  +    else {
  +        errno = saved_errno ? saved_errno : EOF;
  +        return 0;
  +    }
  +}
  +#endif
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org


Mime
View raw message