httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From b..@hyperreal.org
Subject cvs commit: apachen/src/main buff.c
Date Thu, 13 Nov 1997 20:22:35 GMT
ben         97/11/13 12:22:35

  Modified:    src      CHANGES
               src/main buff.c
  Log:
  Fix Win32 16k bug.
  
  Revision  Changes    Path
  1.510     +4 -0      apachen/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/CHANGES,v
  retrieving revision 1.509
  retrieving revision 1.510
  diff -u -r1.509 -r1.510
  --- CHANGES	1997/11/13 15:00:08	1.509
  +++ CHANGES	1997/11/13 20:22:32	1.510
  @@ -1,5 +1,9 @@
   Changes with Apache 1.3b3
   
  +  *) Some Win32 systems terminated all responses after 16 kB. This turns
  +     out to be a bug in Winsock - select() doesn't always return the
  +	 correct status.  [Ben Laurie]
  +
     *) Directives owned by http_core can now use the new check_cmd_context()
        routine to ensure that they're not being used within a container
        (e.g., <Directory>) where they're invalid.  [Martin Kraemer]
  
  
  
  1.50      +34 -17    apachen/src/main/buff.c
  
  Index: buff.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/buff.c,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- buff.c	1997/11/02 14:04:36	1.49
  +++ buff.c	1997/11/13 20:22:34	1.50
  @@ -53,6 +53,7 @@
   
   #include "httpd.h"
   #include "http_main.h"
  +#include "http_log.h"
   
   #include <errno.h>
   #include <stdio.h>
  @@ -98,6 +99,10 @@
   
   #ifdef WIN32
   
  +/*
  +  select() sometimes returns 0 even though the timeout has _not_ expired. We must work
around this.
  +*/
  +
   int sendwithtimeout(int sock, const char *buf, int len, int flags)
   {
       int iostate = 1;
  @@ -105,6 +110,7 @@
       struct timeval tv;
       int err = WSAEWOULDBLOCK;
       int rv;
  +    int retry;
   
       if (!(tv.tv_sec = check_alarm()))
   	return (send(sock, buf, len, flags));
  @@ -118,25 +124,36 @@
       rv = send(sock, buf, len, flags);
       if (rv == SOCKET_ERROR) {
   	err = WSAGetLastError();
  -	if (err == WSAEWOULDBLOCK) {
  -	    FD_ZERO(&fdset);
  -	    FD_SET(sock, &fdset);
  -	    tv.tv_usec = 0;
  -	    rv = select(FD_SETSIZE, NULL, &fdset, NULL, &tv);
  -	    if (rv == SOCKET_ERROR)
  -		err = WSAGetLastError();
  -	    else if (rv == 0) {
  -		ioctlsocket(sock, FIONBIO, &iostate);
  -		check_alarm();
  -		WSASetLastError(WSAEWOULDBLOCK);
  -		return (SOCKET_ERROR);
  -	    }
  -	    else {
  -		rv = send(sock, buf, len, flags);
  +	if (err == WSAEWOULDBLOCK)
  +	    do {
  +		retry=0;
  +
  +		FD_ZERO(&fdset);
  +		FD_SET(sock, &fdset);
  +		tv.tv_usec = 0;
  +		rv = select(FD_SETSIZE, NULL, &fdset, NULL, &tv);
   		if (rv == SOCKET_ERROR)
   		    err = WSAGetLastError();
  -	    }
  -	}
  +		else if (rv == 0) {
  + 		    ioctlsocket(sock, FIONBIO, &iostate);
  +		    if(check_alarm() < 0) {
  +			WSASetLastError(EINTR);	/* Simulate an alarm() */
  +			return (SOCKET_ERROR);
  +		    }
  +		}
  +		else {
  +		    rv = send(sock, buf, len, flags);
  +		    if (rv == SOCKET_ERROR) {
  +		        err = WSAGetLastError();
  +			if(err == WSAEWOULDBLOCK) {
  +			    aplog_error(APLOG_MARK,APLOG_WARNING,NULL,
  +				"select claimed we could write, but in fact we couldn't. This is a bug in Windows.");
  +			    retry=1;
  +			    Sleep(100);
  +			}
  +		    }
  +		}
  +	    } while(retry);
       }
       ioctlsocket(sock, FIONBIO, &iostate);
       if (rv == SOCKET_ERROR)
  
  
  

Mime
View raw message