X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fos-ip.c;h=e300711817129e7e17a89f492271d13e17c53c8f;hb=77b235fba53850c4d498284fb886357c857e92b9;hp=eba57bee271f6c0329802c73dea205bc6d7dc007;hpb=2b79ff2c489db770d0e2c91392bc3554ed06e766;p=openldap diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index eba57bee27..e300711817 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -1,5 +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 @@ -25,19 +26,6 @@ #include #endif /* HAVE_IO_H */ -#if defined( HAVE_FCNTL_H ) -#include -#ifndef O_NONBLOCK -#define O_NONBLOCK O_NDELAY -#endif -#endif /* HAVE_FCNTL_H */ - -#if defined( HAVE_SYS_FILIO_H ) -#include -#elif defined( HAVE_SYS_IOCTL_H ) -#include -#endif - #include "ldap-int.h" int ldap_int_tblsize = 0; @@ -58,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 @@ -79,14 +67,14 @@ 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; return 1; } - SAFEMEMCPY( (char *) new, (char *) src, sizeof(struct timeval)); + SAFEMEMCPY( (char *) new, (const char *) src, sizeof(struct timeval)); *dest = new; return 0; @@ -96,31 +84,14 @@ static int ldap_pvt_ndelay_on(LDAP *ld, int fd) { osip_debug(ld, "ldap_ndelay_on: %d\n",fd,0,0); -#ifdef notyet -/* #if defined( HAVE_FCNTL_H ) */ - return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) | O_NONBLOCK); -#else -{ - ioctl_t status = 1; - return ioctl( fd, FIONBIO, (caddr_t)&status ); -} -#endif - return 0; + return ber_pvt_socket_set_nonblock( fd, 1 ); } static int ldap_pvt_ndelay_off(LDAP *ld, int fd) { osip_debug(ld, "ldap_ndelay_off: %d\n",fd,0,0); -#ifdef notyet -/* #if defined( HAVE_FCNTL_H ) */ - return fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0) & ~O_NONBLOCK); -#else -{ - ioctl_t status = 0; - return ioctl( fd, FIONBIO, (caddr_t)&status ); -} -#endif + return ber_pvt_socket_set_nonblock( fd, 0 ); } static ber_socket_t @@ -146,13 +117,27 @@ ldap_pvt_prepare_socket(LDAP *ld, int fd) #ifdef TCP_NODELAY { int dummy = 1; - if ( setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,&dummy,sizeof(dummy)) == -1 ) - return -1; + if ( setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, + (char*) &dummy, sizeof(dummy) ) == AC_SOCKET_ERROR ) + { + osip_debug(ld, "ldap_prepare_socket: " + "setsockopt(%d, TCP_NODELAY) failed (ignored).\n", + fd, 0, 0); + } } #endif return 0; } +#undef TRACE +#define TRACE do { \ + osip_debug(ld, \ + "ldap_is_socket_ready: error on socket %d: errno: %d (%s)\n", \ + s, \ + errno, \ + sock_errstr(errno) ); \ +} while( 0 ) + /* * check the socket for errors after select returned. */ @@ -161,22 +146,13 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s) { osip_debug(ld, "ldap_is_sock_ready: %d\n",s,0,0); -#define TRACE \ -{ \ - osip_debug(ld, \ - "ldap_is_socket_ready: errror on socket %d: errno: %d (%s)\n", \ - s, \ - errno, \ - strerror(errno) ); \ -} - -#ifdef notyet -/* #ifdef SO_ERROR */ +#if defined( notyet ) /* && defined( SO_ERROR ) */ { int so_errno; int dummy = sizeof(so_errno); - if ( getsockopt(s,SOL_SOCKET,SO_ERROR,&so_errno,&dummy) == -1 ) + if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &so_errno, &dummy ) == -1 ) { return -1; + } if ( so_errno ) { ldap_pvt_set_errno(so_errno); TRACE; @@ -190,34 +166,38 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s) struct sockaddr_in sin; char ch; int dummy = sizeof(sin); - if ( getpeername(s, (struct sockaddr *) &sin, &dummy) == -1 ) { + if ( getpeername( s, (struct sockaddr *) &sin, &dummy ) == -1 ) { + /* XXX: needs to be replace with ber_stream_read() */ read(s, &ch, 1); #ifdef HAVE_WINSOCK ldap_pvt_set_errno( WSAGetLastError() ); #endif TRACE; return -1; - } + } return 0; } #endif return -1; -#undef TRACE } +#undef TRACE static int -ldap_pvt_connect(LDAP *ld, int s, struct sockaddr_in *sin, int async) +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; tv.tv_sec = opt_tv->tv_sec; } - osip_debug(ld, "ldap_connect_timeout: fd: %d tm: %d async: %d\n", - s, opt_tv ? tv.tv_sec : -1, async); + osip_debug(ld, "ldap_connect_timeout: fd: %d tm: %ld async: %d\n", + s, opt_tv ? tv.tv_sec : -1L, async); if ( ldap_pvt_ndelay_on(ld, s) == -1 ) return ( -1 ); @@ -233,18 +213,41 @@ ldap_pvt_connect(LDAP *ld, int s, struct sockaddr_in *sin, int async) ldap_pvt_set_errno( WSAGetLastError() ); #endif - if ( (errno != EINPROGRESS) && (errno != EWOULDBLOCK) ) + if ( errno != EINPROGRESS && errno != EWOULDBLOCK ) { return ( -1 ); + } #ifdef notyet if ( async ) return ( -2 ); #endif - FD_ZERO(&wfds); FD_SET(s, &wfds ); + FD_ZERO(&wfds); + FD_SET(s, &wfds ); + +#ifdef HAVE_WINSOCK + FD_ZERO(&efds); + FD_SET(s, &efds ); +#endif - if ( select(s + 1, z, &wfds, z, opt_tv ? &tv : NULL) == -1) + 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 ); @@ -324,9 +327,9 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb, const char *host, (void)memset((char *)&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = port; - p = (char *)&sin.sin_addr.s_addr; + p = (char *)&sin.sin_addr; q = use_hp ? (char *)hp->h_addr_list[i] : (char *)&address; - SAFEMEMCPY(p, q, sizeof(p) ); + SAFEMEMCPY(p, q, sizeof(sin.sin_addr) ); osip_debug(ld, "ldap_connect_to_host: Trying %s:%d\n", inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),0); @@ -334,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; } @@ -347,19 +350,11 @@ 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 ) { struct hostent *hp; - char *p; socklen_t len; struct sockaddr_in sin; @@ -367,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 ); } @@ -396,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 */ @@ -412,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 ); } } @@ -425,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 ); } } @@ -438,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 ); } @@ -450,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 )); } @@ -461,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 )); }