You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dr...@locus.apache.org on 2000/06/14 16:01:52 UTC
cvs commit: apache-2.0/src/lib/apr/network_io/beos sockopt.c
dreid 00/06/14 07:01:46
Modified: src/lib/apr/network_io/beos sockopt.c
Log:
Fix saferead on beos. The server now works as expected again :)
Revision Changes Path
1.20 +25 -2 apache-2.0/src/lib/apr/network_io/beos/sockopt.c
Index: sockopt.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/beos/sockopt.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- sockopt.c 2000/06/13 16:44:30 1.19
+++ sockopt.c 2000/06/14 14:01:40 1.20
@@ -58,9 +58,16 @@
#else
#include "networkio.h"
+int setnonblocking(int on, int sock)
+{
+ return setsockopt(sock, SOL_SOCKET, SO_NONBLOCK,
+ &on, sizeof(on));
+}
+
ap_status_t ap_setsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t on)
{
int one;
+ int rv;
if (on){
one = 1;
}else {
@@ -80,9 +87,25 @@
}
}
if (opt & APR_SO_NONBLOCK) {
- if (setsockopt(sock->socketdes, SOL_SOCKET, SO_NONBLOCK, &one, sizeof(one)) == -1){
- return errno;
+ if ((rv = setnonblocking (one, sock->socketdes)) < 0) {
+ return errno;
}
+ }
+ if (opt & APR_SO_TIMEOUT) {
+ if (on > 0 && sock->timeout < 0)
+ /* we should be in non-blocking mode right now... */
+ one = 1;
+ else if (on < 0 && sock->timeout >= 0)
+ /* they've set a timeout so we should be blocking... */
+ one = 0;
+ else if (on == 0)
+ /* we need to be in nonblocking or this will hang the server */
+ one = 1;
+
+ if ((rv = setnonblocking (one, sock->socketdes)) < 0)
+ return rv;
+
+ sock->timeout = on;
}
return APR_SUCCESS;
}