X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fos-ip.c;h=e300711817129e7e17a89f492271d13e17c53c8f;hb=77b235fba53850c4d498284fb886357c857e92b9;hp=4a908d05755ed4ff62adb235a31024223975f455;hpb=7d98b59dfa1be44b23211a335e646fe2bed57503;p=openldap diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index 4a908d0575..e300711817 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -46,7 +46,7 @@ int ldap_int_tblsize = 0; #define osip_debug(ld,fmt,arg1,arg2,arg3) \ do { \ - ldap_log_printf(ld, LDAP_DEBUG_TRACE, fmt, arg1, arg2, arg3); \ + ldap_log_printf(NULL, LDAP_DEBUG_TRACE, fmt, arg1, arg2, arg3); \ } while(0) static void @@ -67,7 +67,7 @@ ldap_int_timeval_dup( struct timeval **dest, const struct timeval *src ) return 0; } - new = (struct timeval *) malloc(sizeof(struct timeval)); + new = (struct timeval *) LDAP_MALLOC(sizeof(struct timeval)); if( new == NULL ) { *dest = NULL; @@ -132,10 +132,10 @@ ldap_pvt_prepare_socket(LDAP *ld, int fd) #undef TRACE #define TRACE do { \ osip_debug(ld, \ - "ldap_is_socket_ready: errror on socket %d: errno: %d (%s)\n", \ + "ldap_is_socket_ready: error on socket %d: errno: %d (%s)\n", \ s, \ errno, \ - strerror(errno) ); \ + sock_errstr(errno) ); \ } while( 0 ) /* @@ -187,6 +187,9 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr_in *sin, int async) { struct timeval tv, *opt_tv=NULL; fd_set wfds, *z=NULL; +#ifdef HAVE_WINSOCK + fd_set efds; +#endif if ( (opt_tv = ld->ld_options.ldo_tm_net) != NULL ) { tv.tv_usec = opt_tv->tv_usec; @@ -221,9 +224,30 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr_in *sin, int async) FD_ZERO(&wfds); FD_SET(s, &wfds ); - if ( select(ldap_int_tblsize, z, &wfds, z, opt_tv ? &tv : NULL) == -1) +#ifdef HAVE_WINSOCK + FD_ZERO(&efds); + FD_SET(s, &efds ); +#endif + + if ( select(ldap_int_tblsize, z, &wfds, +#ifdef HAVE_WINSOCK + &efds, +#else + z, +#endif + opt_tv ? &tv : NULL) == -1) return ( -1 ); +#ifdef HAVE_WINSOCK + /* This means the connection failed */ + if (FD_ISSET(s, &efds)) + { + ldap_pvt_set_errno(WSAECONNREFUSED); + 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 ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return ( -1 ); @@ -313,7 +337,7 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb, const char *host, rc = ldap_pvt_connect(ld, s, &sin, async); if ( (rc == 0) || (rc == -2) ) { - ber_pvt_sb_set_desc( sb, s ); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_SET_FD, &s ); break; } @@ -326,14 +350,7 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb, const char *host, return rc; } -void -ldap_close_connection( Sockbuf *sb ) -{ - ber_pvt_sb_close( sb ); -} - - -#if defined( HAVE_KERBEROS ) || defined( HAVE_TLS ) +#if defined( LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND ) || defined( HAVE_TLS ) || defined( HAVE_CYRUS_SASL ) char * ldap_host_connected_to( Sockbuf *sb ) { @@ -345,12 +362,14 @@ ldap_host_connected_to( Sockbuf *sb ) struct hostent he_buf; int local_h_errno; char *ha_buf=NULL; + ber_socket_t sd; #define DO_RETURN(x) if (ha_buf) LDAP_FREE(ha_buf); return (x); (void)memset( (char *)&sin, 0, sizeof( struct sockaddr_in )); len = sizeof( sin ); - if ( getpeername( ber_pvt_sb_get_desc(sb), (struct sockaddr *)&sin, &len ) == -1 ) { + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + if ( getpeername( sd, (struct sockaddr *)&sin, &len ) == -1 ) { return( NULL ); } @@ -374,7 +393,7 @@ ldap_host_connected_to( Sockbuf *sb ) } #undef DO_RETURN -#endif /* HAVE_KERBEROS || HAVE_TLS */ +#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND || HAVE_TLS */ /* for UNIX */ @@ -390,11 +409,13 @@ void ldap_mark_select_write( LDAP *ld, Sockbuf *sb ) { struct selectinfo *sip; + ber_socket_t sd; sip = (struct selectinfo *)ld->ld_selectinfo; - if ( !FD_ISSET( ber_pvt_sb_get_desc(sb), &sip->si_writefds )) { - FD_SET( (u_int) sb->sb_sd, &sip->si_writefds ); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + if ( !FD_ISSET( sd, &sip->si_writefds )) { + FD_SET( sd, &sip->si_writefds ); } } @@ -403,11 +424,13 @@ void ldap_mark_select_read( LDAP *ld, Sockbuf *sb ) { struct selectinfo *sip; + ber_socket_t sd; sip = (struct selectinfo *)ld->ld_selectinfo; - if ( !FD_ISSET( ber_pvt_sb_get_desc(sb), &sip->si_readfds )) { - FD_SET( (u_int) sb->sb_sd, &sip->si_readfds ); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + if ( !FD_ISSET( sd, &sip->si_readfds )) { + FD_SET( sd, &sip->si_readfds ); } } @@ -416,11 +439,13 @@ void ldap_mark_select_clear( LDAP *ld, Sockbuf *sb ) { struct selectinfo *sip; + ber_socket_t sd; sip = (struct selectinfo *)ld->ld_selectinfo; - FD_CLR( (u_int) ber_pvt_sb_get_desc(sb), &sip->si_writefds ); - FD_CLR( (u_int) ber_pvt_sb_get_desc(sb), &sip->si_readfds ); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + FD_CLR( sd, &sip->si_writefds ); + FD_CLR( sd, &sip->si_readfds ); } @@ -428,10 +453,12 @@ int ldap_is_write_ready( LDAP *ld, Sockbuf *sb ) { struct selectinfo *sip; + ber_socket_t sd; sip = (struct selectinfo *)ld->ld_selectinfo; - return( FD_ISSET( ber_pvt_sb_get_desc(sb), &sip->si_use_writefds )); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + return( FD_ISSET( sd, &sip->si_use_writefds )); } @@ -439,10 +466,12 @@ int ldap_is_read_ready( LDAP *ld, Sockbuf *sb ) { struct selectinfo *sip; + ber_socket_t sd; sip = (struct selectinfo *)ld->ld_selectinfo; - return( FD_ISSET( ber_pvt_sb_get_desc(sb), &sip->si_use_readfds )); + ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd ); + return( FD_ISSET( sd, &sip->si_use_readfds )); }