Catch POLLERR and POLLHUP.

This commit is contained in:
Kurt Zeilenga 2004-10-18 21:56:07 +00:00
parent 8715d97409
commit 1adf003977

View File

@ -260,7 +260,7 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
if( opt_tv != NULL ) timeout = TV2MILLISEC( &tv ); if( opt_tv != NULL ) timeout = TV2MILLISEC( &tv );
fd.fd = s; fd.fd = s;
fd.events = POLLOUT; fd.events = POLLWRITE;
do { do {
fd.revents = 0; fd.revents = 0;
@ -270,7 +270,7 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
if( rc == AC_SOCKET_ERROR ) return rc; if( rc == AC_SOCKET_ERROR ) return rc;
if( fd.revents & POLLOUT ) { if( fd.revents & POLLWRITE ) {
if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1; if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1;
if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1; if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1;
return ( 0 ); return ( 0 );
@ -638,6 +638,12 @@ struct selectinfo {
/* for UNIX poll(2) */ /* for UNIX poll(2) */
int si_maxfd; int si_maxfd;
struct pollfd si_fds[FD_SETSIZE]; struct pollfd si_fds[FD_SETSIZE];
#undef POLLOTHER
#define POLLOTHER (POLLERR|POLLHUP)
#undef POLLREAD
#define POLLREAD (POLLIN|POLLPRI|POLLOTHER)
#undef POLLWRITE
#define POLLWRITE (POLLOUT|POLLOTHER)
#else #else
/* for UNIX select(2) */ /* for UNIX select(2) */
fd_set si_readfds; fd_set si_readfds;
@ -664,7 +670,7 @@ ldap_mark_select_write( LDAP *ld, Sockbuf *sb )
int i; int i;
for(i=0; i < sip->si_maxfd; i++) { for(i=0; i < sip->si_maxfd; i++) {
if( sip->si_fds[i].fd == sd ) { if( sip->si_fds[i].fd == sd ) {
sip->si_fds[i].events |= POLLIN; sip->si_fds[i].events |= POLLWRITE;
return; return;
} }
if( empty==-1 && sip->si_fds[i].fd == -1 ) { if( empty==-1 && sip->si_fds[i].fd == -1 ) {
@ -681,7 +687,7 @@ ldap_mark_select_write( LDAP *ld, Sockbuf *sb )
} }
sip->si_fds[empty].fd = sd; sip->si_fds[empty].fd = sd;
sip->si_fds[empty].events = POLLOUT; sip->si_fds[empty].events = POLLWRITE;
} }
#else #else
/* for UNIX select(2) */ /* for UNIX select(2) */
@ -709,7 +715,7 @@ ldap_mark_select_read( LDAP *ld, Sockbuf *sb )
int i; int i;
for(i=0; i < sip->si_maxfd; i++) { for(i=0; i < sip->si_maxfd; i++) {
if( sip->si_fds[i].fd == sd ) { if( sip->si_fds[i].fd == sd ) {
sip->si_fds[i].events |= POLLIN; sip->si_fds[i].events |= POLLREAD;
return; return;
} }
if( empty==-1 && sip->si_fds[i].fd == -1 ) { if( empty==-1 && sip->si_fds[i].fd == -1 ) {
@ -726,7 +732,7 @@ ldap_mark_select_read( LDAP *ld, Sockbuf *sb )
} }
sip->si_fds[empty].fd = sd; sip->si_fds[empty].fd = sd;
sip->si_fds[empty].events = POLLIN; sip->si_fds[empty].events = POLLREAD;
} }
#else #else
/* for UNIX select(2) */ /* for UNIX select(2) */
@ -781,7 +787,7 @@ ldap_is_write_ready( LDAP *ld, Sockbuf *sb )
int i; int i;
for(i=0; i < sip->si_maxfd; i++) { for(i=0; i < sip->si_maxfd; i++) {
if( sip->si_fds[i].fd == sd ) { if( sip->si_fds[i].fd == sd ) {
return sip->si_fds[i].revents & POLLOUT; return sip->si_fds[i].revents & POLLWRITE;
} }
} }
@ -810,7 +816,7 @@ ldap_is_read_ready( LDAP *ld, Sockbuf *sb )
int i; int i;
for(i=0; i < sip->si_maxfd; i++) { for(i=0; i < sip->si_maxfd; i++) {
if( sip->si_fds[i].fd == sd ) { if( sip->si_fds[i].fd == sd ) {
return sip->si_fds[i].revents & POLLIN; return sip->si_fds[i].revents & POLLREAD;
} }
} }