summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/native/jni/java-nio/javanio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/native/jni/java-nio/javanio.c')
-rw-r--r--libjava/classpath/native/jni/java-nio/javanio.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/libjava/classpath/native/jni/java-nio/javanio.c b/libjava/classpath/native/jni/java-nio/javanio.c
index d9e4d4f1d95..09806f8bad4 100644
--- a/libjava/classpath/native/jni/java-nio/javanio.c
+++ b/libjava/classpath/native/jni/java-nio/javanio.c
@@ -41,11 +41,12 @@ exception statement from your version. */
* we include this file in the header, and do not compile it.
*/
+#include <fcntl.h>
+#include <unistd.h>
#include <sys/types.h>
-#include <sys/fcntl.h>
#include <sys/socket.h>
+#include <sys/select.h>
#include <sys/uio.h>
-#include <unistd.h>
CPNIO_EXPORT ssize_t
cpnio_read (int fd, void *buf, size_t nbytes)
@@ -86,6 +87,25 @@ cpnio_connect (int fd, const struct sockaddr *addr, socklen_t addrlen)
CPNIO_EXPORT int
cpnio_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
{
+ fd_set rset;
+ struct timeval tv;
+ socklen_t tvlen = sizeof(tv);
+ int ret;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ getsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, &tv, &tvlen);
+ if (tv.tv_sec > 0 || tv.tv_usec > 0)
+ {
+ FD_ZERO(&rset);
+ FD_SET(fd,&rset);
+ ret = select (fd+1,&rset,NULL,NULL,&tv);
+ if (ret == 0)
+ {
+ errno = EAGAIN;
+ return -1;
+ }
+ }
return accept (fd, addr, addrlen);
}
OpenPOWER on IntegriCloud