]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/request.c
Extern URI code to support literal IPv6 addresses
[openldap] / libraries / libldap / request.c
index 87d6c84bfac115832d66c01372a85cbf99bb7e60..cb645b18a7dc9a3ab4529ace7461a31e74ac09df 100644 (file)
@@ -45,9 +45,6 @@
 static LDAPConn *find_connection LDAP_P(( LDAP *ld, LDAPURLDesc *srv, int any ));
 static void use_connection LDAP_P(( LDAP *ld, LDAPConn *lc ));
 
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-static LDAPURLDesc *dn2servers LDAP_P(( LDAP *ld, const char *dn ));
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
 
 static BerElement *re_encode_request LDAP_P((
        LDAP *ld,
@@ -64,10 +61,6 @@ ldap_alloc_ber_with_options( LDAP *ld )
 
     if (( ber = ber_alloc_t( ld->ld_lberoptions )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
-#ifdef STR_TRANSLATION
-       } else {
-               ldap_set_ber_options( ld, ber );
-#endif /* STR_TRANSLATION */
        }
 
        return( ber );
@@ -78,13 +71,6 @@ void
 ldap_set_ber_options( LDAP *ld, BerElement *ber )
 {
        ber->ber_options = ld->ld_lberoptions;
-#ifdef STR_TRANSLATION
-       if (( ld->ld_lberoptions & LBER_TRANSLATE_STRINGS ) != 0 ) {
-               ber_set_string_translators( ber,
-                   ld->ld_lber_encode_translate_proc,
-                   ld->ld_lber_decode_translate_proc );
-       }
-#endif /* STR_TRANSLATION */
 }
 
 
@@ -100,7 +86,7 @@ ldap_send_initial_request(
 
        Debug( LDAP_DEBUG_TRACE, "ldap_send_initial_request\n", 0, 0, 0 );
 
-       if ( ! ber_pvt_sb_in_use(&ld->ld_sb ) ) {
+       if ( ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, NULL ) == -1 ) {
                /* not connected yet */
                int rc = ldap_open_defconn( ld );
 
@@ -114,33 +100,6 @@ ldap_send_initial_request(
                        ( ld->ld_host == NULL ) ? "(null)" : ld->ld_host, 0, 0 );
        }
 
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-       if ( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_DNS )
-               && ldap_is_dns_dn( dn ) )
-       {
-               if (( servers = dn2servers( ld, dn )) == NULL ) {
-                       ber_free( ber, 1 );
-                       return( -1 );
-               }
-
-#ifdef LDAP_DEBUG
-               if ( ldap_debug & LDAP_DEBUG_TRACE ) {
-                       LDAPURLDesc     *srv;
-
-                       for (   srv = servers;
-                                       srv != NULL;
-                               srv = srv->lud_next )
-                       {
-                               fprintf( stderr,
-                                   "LDAP server %s:  dn %s, port %d\n",
-                                   srv->lud_host, ( srv->lud_dn == NULL ) ?
-                                   "(default)" : srv->lud_dn,
-                                   srv->lud_port );
-                       }
-               }
-#endif /* LDAP_DEBUG */
-       } else
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
        {
                /*
                 * use of DNS is turned off or this is an X.500 DN...
@@ -293,7 +252,7 @@ ldap_new_connection( LDAP *ld, LDAPURLDesc *srvlist, int use_ldsb,
                return( NULL );
        }
 
-       lc->lconn_sb = ( use_ldsb ) ? &ld->ld_sb : sb;
+       lc->lconn_sb = ( use_ldsb ) ? ld->ld_sb : sb;
 
        if ( connect ) {
                for ( srv = srvlist; srv != NULL; srv = srv->lud_next ) {
@@ -433,10 +392,6 @@ ldap_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbind )
                        }
                }
 
-               /* force closure */
-               ldap_close_connection( lc->lconn_sb );
-               ber_pvt_sb_destroy( lc->lconn_sb );
-
                if( lc->lconn_ber != NULL ) {
                        ber_free( lc->lconn_ber, 1 );
                }
@@ -458,13 +413,13 @@ ldap_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbind )
                if ( lc->lconn_krbinstance != NULL ) {
                        LDAP_FREE( lc->lconn_krbinstance );
                }
-               if ( lc->lconn_sb != &ld->ld_sb ) {
+               if ( lc->lconn_sb != ld->ld_sb ) {
                        ber_sockbuf_free( lc->lconn_sb );
                }
                if( lc->lconn_rebind_queue != NULL) {
                        int i;
                        for( i = 0; lc->lconn_rebind_queue[i] != NULL; i++) {
-                               free_strarray(lc->lconn_rebind_queue[i]);
+                               LDAP_VFREE(lc->lconn_rebind_queue[i]);
                        }
                        LDAP_FREE( lc->lconn_rebind_queue);
                }
@@ -493,7 +448,7 @@ ldap_dump_connection( LDAP *ld, LDAPConn *lconns, int all )
                            ( lc->lconn_server->lud_host == NULL ) ? "(null)"
                            : lc->lconn_server->lud_host,
                            lc->lconn_server->lud_port, ( lc->lconn_sb ==
-                           &ld->ld_sb ) ? "  (default)" : "" );
+                           ld->ld_sb ) ? "  (default)" : "" );
                }
                fprintf( stderr, "  refcnt: %d  status: %s\n", lc->lconn_refcnt,
                    ( lc->lconn_status == LDAP_CONNST_NEEDSOCKET ) ?
@@ -768,7 +723,7 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **errstrp,
 
                        if( lc->lconn_rebind_queue != NULL) {
                                /* Release resources of previous list */
-                               free_strarray(refarray);
+                               LDAP_VFREE(refarray);
                                refarray = NULL;
                                ldap_free_urllist(srv);
                                srv = NULL;
@@ -792,7 +747,7 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **errstrp,
                }
        } /* end for loop */
 done:
-       free_strarray(refarray);
+       LDAP_VFREE(refarray);
        ldap_free_urllist(srv);
        LDAP_FREE( *errstrp );
        
@@ -814,9 +769,6 @@ int
 ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
 {
        int             rc, count, len, newdn;
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-       int             ldapref;
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
        char            *p, *ports, *ref, *tmpref, *refdn, *unfollowed;
        LDAPRequest     *origreq;
        LDAPURLDesc     *srv;
@@ -865,9 +817,6 @@ ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
 
        /* parse out & follow referrals */
        for ( ref = p; rc == 0 && ref != NULL; ref = p ) {
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-               ldapref = 0;
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
 
                if (( p = strchr( ref, '\n' )) != NULL ) {
                        *p++ = '\0';
@@ -878,21 +827,13 @@ ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
                ldap_pvt_hex_unescape( ref );
                len = strlen( ref );
 
+               /* FIXME: we should use the URL Parser */
+
                if ( len > LDAP_LDAP_REF_STR_LEN && strncasecmp( ref,
                    LDAP_LDAP_REF_STR, LDAP_LDAP_REF_STR_LEN ) == 0 ) {
                        Debug( LDAP_DEBUG_TRACE,
                            "chasing LDAP referral: <%s>\n", ref, 0, 0 );
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-                       ldapref = 1;
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
                        tmpref = ref + LDAP_LDAP_REF_STR_LEN;
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-               } else if ( len > LDAP_DX_REF_STR_LEN && strncasecmp( ref,
-                   LDAP_DX_REF_STR, LDAP_DX_REF_STR_LEN ) == 0 ) {
-                       Debug( LDAP_DEBUG_TRACE,
-                           "chasing DX referral: <%s>\n", ref, 0, 0 );
-                       tmpref = ref + LDAP_DX_REF_STR_LEN;
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
                } else {
                        Debug( LDAP_DEBUG_TRACE,
                            "ignoring unknown referral <%s>\n", ref, 0, 0 );
@@ -919,9 +860,6 @@ ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
                        return( -1 );
                }
 
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-               if ( ldapref ) {
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
                        if (( srv = (LDAPURLDesc *)LDAP_CALLOC( 1,
                            sizeof( LDAPURLDesc ))) == NULL ) {
                                ber_free( ber, 1 );
@@ -929,6 +867,13 @@ ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
                                return( -1 );
                        }
 
+                       if (( srv->lud_scheme = LDAP_STRDUP("ldap")) == NULL ) {
+                               LDAP_FREE( (char *)srv );
+                               ber_free( ber, 1 );
+                               ld->ld_errno = LDAP_NO_MEMORY;
+                               return( -1 );
+                       }
+
                        if (( srv->lud_host = LDAP_STRDUP( tmpref )) == NULL ) {
                                LDAP_FREE( (char *)srv );
                                ber_free( ber, 1 );
@@ -940,13 +885,8 @@ ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp )
                                *ports++ = '\0';
                                srv->lud_port = atoi( ports );
                        } else {
-                               srv->lud_port = ldap_int_global_options.ldo_defport;
+                               srv->lud_port = (LDAP_INT_GLOBAL_OPT())->ldo_defport;
                        }
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-               } else {
-                       srv = dn2servers( ld, tmpref );
-               }
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */
 
                rinfo.ri_msgid = origreq->lr_origid;
                if ( srv != NULL && ldap_send_server_request( ld, ber, ld->ld_msgid,
@@ -1122,47 +1062,3 @@ ldap_find_request_by_msgid( LDAP *ld, ber_int_t msgid )
 }
 
 
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
-static LDAPURLDesc *
-dn2servers( LDAP *ld, const char *dn ) /* dn can also be a domain.... */
-{
-       char            *p, *host, *server_dn, **dxs;
-       const char *domain;
-       int             i, port;
-       LDAPURLDesc     *srvlist, *prevsrv, *srv;
-
-       if (( domain = strrchr( dn, '@' )) != NULL ) {
-               ++domain;
-       } else {
-               domain = dn;
-       }
-
-       if (( dxs = ldap_getdxbyname( domain )) == NULL ) {
-               ld->ld_errno = LDAP_NO_MEMORY;
-               return( NULL );
-       }
-
-       srvlist = NULL;
-       for ( i = 0; dxs[ i ] != NULL; ++i ) {
-               if (ldap_url_parselist(&srv, dxs[i]) == LDAP_SUCCESS
-                       || ldap_url_parsehosts(&srv, dxs[i]) == LDAP_SUCCESS)
-               {
-                       /* add to end of list of servers */
-                       if ( srvlist == NULL ) {
-                               srvlist = srv;
-                       } else {
-                               prevsrv->lud_next = srv;
-                       }
-                       prevsrv = srv;
-               }
-       }
-
-       ldap_value_free( dxs );
-
-       if ( srvlist == NULL ) {
-               ld->ld_errno = LDAP_SERVER_DOWN;
-       }
-
-       return( srvlist );
-}
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_DNS */