Commit ecebe3d0 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

basic poll(2) implementation for connect(2) (needs work)

Need to deal with selectinfo...
parent 529e1d61
......@@ -42,6 +42,9 @@
#define SASL_MIN_BUFF_SIZE 4096
#endif
#undef TV2MILLISEC
#define TV2MILLISEC(tv) (((tv)->sec * 1000) + ((tv)->tv_usec/1000))
/*
* Support needed if the library is running in the kernel
*/
......
......@@ -210,12 +210,6 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
{
int rc;
struct timeval tv, *opt_tv=NULL;
#ifndef HAVE_POLL
fd_set wfds, *z=NULL;
#ifdef HAVE_WINSOCK
fd_set efds;
#endif
#endif
#ifdef LDAP_CONNECTIONLESS
/* We could do a connect() but that would interfere with
......@@ -259,60 +253,86 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
#endif
#ifdef HAVE_POLL
assert(0);
{
struct pollfd fd;
int timeout = INFTIM;
if( opt_tv != NULL ) timeout = TV2MILLISEC( &tv );
fd.fd = s;
fd.events = POLLOUT;
do {
fd.revents = 0;
rc = poll( &fd, 1, timeout );
} while( rc == AC_SOCKET_ERROR && errno == EINTR &&
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
if( rc == AC_SOCKET_ERROR ) return rc;
if( fd.revents & POLLOUT ) {
if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1;
if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1;
return ( 0 );
}
}
#else
FD_ZERO(&wfds);
FD_SET(s, &wfds );
{
fd_set wfds, *z=NULL;
#ifdef HAVE_WINSOCK
fd_set efds;
#endif
FD_ZERO(&wfds);
FD_SET(s, &wfds );
#ifdef HAVE_WINSOCK
FD_ZERO(&efds);
FD_SET(s, &efds );
FD_ZERO(&efds);
FD_SET(s, &efds );
#endif
do {
rc = select(ldap_int_tblsize, z, &wfds,
do {
rc = select(ldap_int_tblsize, z, &wfds,
#ifdef HAVE_WINSOCK
&efds,
&efds,
#else
z,
z,
#endif
opt_tv ? &tv : NULL);
} while( rc == AC_SOCKET_ERROR && errno == EINTR &&
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
opt_tv ? &tv : NULL);
} while( rc == AC_SOCKET_ERROR && errno == EINTR &&
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
if( rc == AC_SOCKET_ERROR ) return rc;
if( rc == AC_SOCKET_ERROR ) return rc;
#ifdef HAVE_WINSOCK
/* This means the connection failed */
if ( FD_ISSET(s, &efds) ) {
int so_errno;
int dummy = sizeof(so_errno);
if ( getsockopt( s, SOL_SOCKET, SO_ERROR,
(char *) &so_errno, &dummy ) == AC_SOCKET_ERROR || !so_errno )
{
/* impossible */
so_errno = WSAGetLastError();
}
ldap_pvt_set_errno(so_errno);
osip_debug(ld, "ldap_pvt_connect: error on socket %d: "
"errno: %d (%s)\n", s, errno, sock_errstr(errno));
return -1;
}
/* This means the connection failed */
if ( FD_ISSET(s, &efds) ) {
int so_errno;
int dummy = sizeof(so_errno);
if ( getsockopt( s, SOL_SOCKET, SO_ERROR,
(char *) &so_errno, &dummy ) == AC_SOCKET_ERROR || !so_errno )
{
/* impossible */
so_errno = WSAGetLastError();
}
ldap_pvt_set_errno(so_errno);
osip_debug(ld, "ldap_pvt_connect: error on socket %d: "
"errno: %d (%s)\n", s, errno, sock_errstr(errno));
return -1;
}
#endif
if ( FD_ISSET(s, &wfds) ) {
if ( FD_ISSET(s, &wfds) ) {
#ifndef HAVE_WINSOCK
if ( ldap_pvt_is_socket_ready(ld, s) == -1 )
return ( -1 );
if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1;
#endif
if ( ldap_pvt_ndelay_off(ld, s) == -1 )
return ( -1 );
return ( 0 );
if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1;
return 0;
}
}
#endif
osip_debug(ld, "ldap_connect_timeout: timed out\n",0,0,0);
ldap_pvt_set_errno( ETIMEDOUT );
return ( -1 );
return -1;
}
#ifndef HAVE_INET_ATON
......
......@@ -216,14 +216,40 @@ sendcred:
#endif
#ifdef HAVE_POLL
assert(0);
{
struct pollfd fd;
int timeout = INFTIM;
if( opt_tv != NULL ) timeout = TV2MILLISEC( &tv );
fd.fd = s;
fd.events = POLLOUT;
do {
fd.revents = 0;
rc = poll( &fd, 1, timeout );
} while( rc == AC_SOCKET_ERROR && errno == EINTR &&
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
if( rc == AC_SOCKET_ERROR ) return rc;
if( fd.revents & POLLOUT ) {
if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1;
if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1;
#ifdef DO_SENDMSG
goto sendcred;
#else
return ( 0 );
#endif
}
}
#else
{
fd_set wfds, *z=NULL;
FD_ZERO(&wfds);
FD_SET(s, &wfds );
fd_set wfds, *z=NULL;
do {
FD_ZERO(&wfds);
FD_SET(s, &wfds );
rc = select( ldap_int_tblsize, z, &wfds, z, opt_tv ? &tv : NULL );
} while( rc == AC_SOCKET_ERROR && errno == EINTR &&
LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment