[omniORB] EAGAIN
Sai-Lai Lo
S.Lo@orl.co.uk
18 Jun 1998 09:55:31 +0100
There is still an error in the patch in my previous posting. The return
code from fcntl should be test for == RC_SOCKET_ERROR, not < RC_SOCKET_ERROR.
Here is the revised patch:
tcpSocketMTfactory.cc:
line 794:
#if defined(__sunos__) && defined(__sparc__) && __OSVERSION__ >= 5
// Use non-blocking connect.
int fl = O_NONBLOCK;
if (fcntl(sock,F_SETFL,fl) == RC_SOCKET_ERROR) {
CLOSESOCKET(sock);
return RC_INVALID_SOCKET;
}
if (connect(sock,(struct sockaddr *)&raddr,
sizeof(struct sockaddr_in)) == RC_SOCKET_ERROR)
{
if (errno != EINPROGRESS) {
CLOSESOCKET(sock);
return RC_INVALID_SOCKET;
}
fd_set wrfds;
FD_ZERO(&wrfds);
FD_SET(sock,&wrfds);
struct timeval t = { 30,0 };
int rc;
if ((rc = select(sock+1,0,&wrfds,0,&t)) <= 0) {
// Timeout, do not bother trying again.
CLOSESOCKET(sock);
return RC_INVALID_SOCKET;
}
}
// Set the socket back to blocking
fl = 0;
if (fcntl(sock,F_SETFL,fl) == RC_SOCKET_ERROR) {
CLOSESOCKET(sock);
return RC_INVALID_SOCKET;
}
#else
Sai-Lai