X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fopen.c;h=7f60452a9dd5e6095284901855b940b9202f6f9f;hb=0e8b176d1ff00c81ebe57de14151357e7f8749d5;hp=d67326333cc10e318d8674299428e5f758b024a6;hpb=93d9fde132a6bcab590d7616db4b7991bb846cc3;p=openldap diff --git a/libraries/libldap/open.c b/libraries/libldap/open.c index d67326333c..7f60452a9d 100644 --- a/libraries/libldap/open.c +++ b/libraries/libldap/open.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -22,7 +22,10 @@ #include #include +#include + #include "ldap-int.h" +#include "ldap_log.h" int ldap_open_defconn( LDAP *ld ) { @@ -54,9 +57,15 @@ ldap_open( LDAP_CONST char *host, int port ) int rc; LDAP *ld; - Debug( LDAP_DEBUG_TRACE, "ldap_open\n", 0, 0, 0 ); +#ifdef NEW_LOGGING + LDAP_LOG ( CONNECTION, ARGS, "ldap_open(%s, %d)\n", host, port, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, "ldap_open(%s, %d)\n", + host, port, 0 ); +#endif - if (( ld = ldap_init( host, port )) == NULL ) { + ld = ldap_init( host, port ); + if ( ld == NULL ) { return( NULL ); } @@ -64,13 +73,18 @@ ldap_open( LDAP_CONST char *host, int port ) if( rc < 0 ) { ldap_ld_free( ld, 0, NULL, NULL ); - return( NULL ); + ld = NULL; } - Debug( LDAP_DEBUG_TRACE, "ldap_open successful, ld_host is %s\n", - ( ld->ld_host == NULL ) ? "(null)" : ld->ld_host, 0, 0 ); +#ifdef NEW_LOGGING + LDAP_LOG ( CONNECTION, RESULTS, "ldap_open: %s\n", + ld == NULL ? "succeeded" : "failed", 0, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, "ldap_open: %s\n", + ld == NULL ? "succeeded" : "failed", 0, 0 ); +#endif - return( ld ); + return ld; } @@ -90,47 +104,17 @@ ldap_create( LDAP **ldp ) /* Initialize the global options, if not already done. */ if( gopts->ldo_valid != LDAP_INITIALIZED ) { ldap_int_initialize(gopts, NULL); + if ( gopts->ldo_valid != LDAP_INITIALIZED ) + return LDAP_LOCAL_ERROR; } +#ifdef NEW_LOGGING + LDAP_LOG ( CONNECTION, ENTRY, "ldap_create\n", 0, 0, 0 ); +#else Debug( LDAP_DEBUG_TRACE, "ldap_create\n", 0, 0, 0 ); - -#ifdef HAVE_WINSOCK2 -{ WORD wVersionRequested; - WSADATA wsaData; - - wVersionRequested = MAKEWORD( 2, 0 ); - if ( WSAStartup( wVersionRequested, &wsaData ) != 0 ) { - /* Tell the user that we couldn't find a usable */ - /* WinSock DLL. */ - return LDAP_LOCAL_ERROR; - } - - /* Confirm that the WinSock DLL supports 2.0.*/ - /* Note that if the DLL supports versions greater */ - /* than 2.0 in addition to 2.0, it will still return */ - /* 2.0 in wVersion since that is the version we */ - /* requested. */ - - if ( LOBYTE( wsaData.wVersion ) != 2 || - HIBYTE( wsaData.wVersion ) != 0 ) - { - /* Tell the user that we couldn't find a usable */ - /* WinSock DLL. */ - WSACleanup( ); - return LDAP_LOCAL_ERROR; - } -} /* The WinSock DLL is acceptable. Proceed. */ - -#elif HAVE_WINSOCK -{ WSADATA wsaData; - if ( WSAStartup( 0x0101, &wsaData ) != 0 ) { - return LDAP_LOCAL_ERROR; - } -} #endif if ( (ld = (LDAP *) LDAP_CALLOC( 1, sizeof(LDAP) )) == NULL ) { - WSACleanup( ); return( LDAP_NO_MEMORY ); } @@ -158,14 +142,12 @@ ldap_create( LDAP **ldp ) if ( ld->ld_options.ldo_defludp == NULL ) { LDAP_FREE( (char*)ld ); - WSACleanup( ); return LDAP_NO_MEMORY; } if (( ld->ld_selectinfo = ldap_new_select_info()) == NULL ) { ldap_free_urllist( ld->ld_options.ldo_defludp ); LDAP_FREE( (char*) ld ); - WSACleanup( ); return LDAP_NO_MEMORY; } @@ -175,10 +157,13 @@ ldap_create( LDAP **ldp ) if ( ld->ld_sb == NULL ) { ldap_free_urllist( ld->ld_options.ldo_defludp ); LDAP_FREE( (char*) ld ); - WSACleanup( ); return LDAP_NO_MEMORY; } +#ifdef LDAP_R_COMPILE + ldap_pvt_thread_mutex_init( &ld->ld_req_mutex ); + ldap_pvt_thread_mutex_init( &ld->ld_res_mutex ); +#endif *ldp = ld; return LDAP_SUCCESS; } @@ -234,6 +219,10 @@ ldap_initialize( LDAP **ldp, LDAP_CONST char *url ) ldap_ld_free(ld, 1, NULL, NULL); return rc; } +#ifdef LDAP_CONNECTIONLESS + if (ldap_is_ldapc_url(url)) + LDAP_IS_UDP(ld) = 1; +#endif } *ldp = ld; @@ -248,25 +237,35 @@ ldap_int_open_connection( int async ) { int rc = -1; -#ifdef HAVE_CYRUS_SASL - char *sasl_host = NULL; - int sasl_ssf = 0; -#endif - int port; - long addr; + char *host; + int port, proto; +#ifdef NEW_LOGGING + LDAP_LOG ( CONNECTION, ENTRY, "ldap_int_open_connection\n", 0, 0, 0 ); +#else Debug( LDAP_DEBUG_TRACE, "ldap_int_open_connection\n", 0, 0, 0 ); +#endif - switch ( ldap_pvt_url_scheme2proto( srv->lud_scheme ) ) { + switch ( proto = ldap_pvt_url_scheme2proto( srv->lud_scheme ) ) { case LDAP_PROTO_TCP: - port = htons( (short) srv->lud_port ); + port = srv->lud_port; + + if ( srv->lud_host == NULL || *srv->lud_host == 0 ) { + host = NULL; + } else { + host = srv->lud_host; + } - addr = 0; - if ( srv->lud_host == NULL || *srv->lud_host == 0 ) - addr = htonl( INADDR_LOOPBACK ); + if( !port ) { + if( strcmp(srv->lud_scheme, "ldaps") == 0 ) { + port = LDAPS_PORT; + } else { + port = LDAP_PORT; + } + } - rc = ldap_connect_to_host( ld, conn->lconn_sb, 0, - srv->lud_host, addr, port, async ); + rc = ldap_connect_to_host( ld, conn->lconn_sb, + proto, host, port, async ); if ( rc == -1 ) return rc; @@ -277,17 +276,43 @@ ldap_int_open_connection( ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_tcp, LBER_SBIOD_LEVEL_PROVIDER, NULL ); -#ifdef HAVE_CYRUS_SASL - sasl_host = ldap_host_connected_to( conn->lconn_sb ); + break; + +#ifdef LDAP_CONNECTIONLESS + case LDAP_PROTO_UDP: + port = srv->lud_port; + + if ( srv->lud_host == NULL || *srv->lud_host == 0 ) { + host = NULL; + } else { + host = srv->lud_host; + } + + if( !port ) port = LDAP_PORT; + + LDAP_IS_UDP(ld) = 1; + rc = ldap_connect_to_host( ld, conn->lconn_sb, + proto, host, port, async ); + + if ( rc == -1 ) return rc; +#ifdef LDAP_DEBUG + ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_debug, + LBER_SBIOD_LEVEL_PROVIDER, (void *)"udp_" ); #endif + ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_udp, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); + + ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_readahead, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); + break; +#endif case LDAP_PROTO_IPC: #ifdef LDAP_PF_LOCAL /* only IPC mechanism supported is PF_LOCAL (PF_UNIX) */ rc = ldap_connect_to_path( ld, conn->lconn_sb, srv->lud_host, async ); if ( rc == -1 ) return rc; - #ifdef LDAP_DEBUG ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_debug, LBER_SBIOD_LEVEL_PROVIDER, (void *)"ipc_" ); @@ -295,10 +320,6 @@ ldap_int_open_connection( ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_fd, LBER_SBIOD_LEVEL_PROVIDER, NULL ); -#ifdef HAVE_CYRUS_SASL - sasl_host = ldap_host_connected_to( conn->lconn_sb ); - sasl_ssf = LDAP_PVT_SASL_LOCAL_SSF; -#endif break; #endif /* LDAP_PF_LOCAL */ default: @@ -306,26 +327,24 @@ ldap_int_open_connection( break; } -#ifdef HAVE_CYRUS_SASL - if( sasl_host != NULL ) { - ldap_int_sasl_open( ld, conn, sasl_host, sasl_ssf ); - } -#endif - - ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_readahead, - LBER_SBIOD_LEVEL_PROVIDER, NULL ); - #ifdef LDAP_DEBUG ber_sockbuf_add_io( conn->lconn_sb, &ber_sockbuf_io_debug, INT_MAX, (void *)"ldap_" ); #endif +#ifdef LDAP_CONNECTIONLESS + if( proto == LDAP_PROTO_UDP ) return 0; +#endif + #ifdef HAVE_TLS if (ld->ld_options.ldo_tls_mode == LDAP_OPT_X_TLS_HARD || strcmp( srv->lud_scheme, "ldaps" ) == 0 ) { - rc = ldap_pvt_tls_start( ld, conn->lconn_sb, - ld->ld_options.ldo_tls_ctx ); + ++conn->lconn_refcnt; /* avoid premature free */ + + rc = ldap_int_tls_start( ld, conn, srv ); + + --conn->lconn_refcnt; if (rc != LDAP_SUCCESS) { return -1; @@ -336,7 +355,8 @@ ldap_int_open_connection( #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND if ( conn->lconn_krbinstance == NULL ) { char *c; - conn->lconn_krbinstance = ldap_host_connected_to( conn->lconn_sb ); + conn->lconn_krbinstance = ldap_host_connected_to( + conn->lconn_sb, host ); if( conn->lconn_krbinstance != NULL && ( c = strchr( conn->lconn_krbinstance, '.' )) != NULL ) { @@ -372,6 +392,7 @@ int ldap_open_internal_connection( LDAP **ldp, ber_socket_t *fdp ) lr->lr_msgid = 0; lr->lr_status = LDAP_REQST_INPROGRESS; lr->lr_res_errno = LDAP_SUCCESS; + /* no mutex lock needed, we just created this ld here */ (*ldp)->ld_requests = lr; /* Attach the passed socket as the *LDAP's connection */