int LDAP_CALL ldap_url_search( LDAP *ld, const char *url, int attrsonly ) { int err, msgid; LDAPURLDesc *ludp; BerElement *ber; LDAPServer *srv; char *host; if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) { return( -1 ); /* punt */ } if ( ldap_url_parse( url, &ludp ) != 0 ) { LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL ); return( -1 ); } LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK ); msgid = ++ld->ld_msgid; LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK ); if ( nsldapi_build_search_req( ld, ludp->lud_dn, ludp->lud_scope, ludp->lud_filter, ludp->lud_attrs, attrsonly, NULL, NULL, -1, -1, msgid, &ber ) != LDAP_SUCCESS ) { return( -1 ); } err = 0; if ( ludp->lud_host == NULL ) { host = ld->ld_defhost; } else { host = ludp->lud_host; } if (( srv = (LDAPServer *)NSLDAPI_CALLOC( 1, sizeof( LDAPServer ))) == NULL || ( host != NULL && ( srv->lsrv_host = nsldapi_strdup( host )) == NULL )) { if ( srv != NULL ) { NSLDAPI_FREE( srv ); } LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL ); err = -1; } else { if ( ludp->lud_port == 0 ) { if (( ludp->lud_options & LDAP_URL_OPT_SECURE ) == 0 ) { srv->lsrv_port = LDAP_PORT; } else { srv->lsrv_port = LDAPS_PORT; } } else { srv->lsrv_port = ludp->lud_port; } } if (( ludp->lud_options & LDAP_URL_OPT_SECURE ) != 0 ) { srv->lsrv_options |= LDAP_SRV_OPT_SECURE; } if ( err != 0 ) { ber_free( ber, 1 ); } else { err = nsldapi_send_server_request( ld, ber, msgid, NULL, srv, NULL, NULL, 1 ); } ldap_free_urldesc( ludp ); return( err ); }
/* * Like ldap_search_ext() except an integer timelimit is passed instead of * using the overloaded struct timeval *timeoutp. */ static int nsldapi_search( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPControl **serverctrls, LDAPControl **clientctrls, int timelimit, /* -1 means use ld->ld_timelimit */ int sizelimit, /* -1 means use ld->ld_sizelimit */ int *msgidp ) { BerElement *ber; int rc, rc_key; unsigned long key; /* XXXmcs: memcache */ LDAPDebug( LDAP_DEBUG_TRACE, "ldap_search_ext\n", 0, 0, 0 ); if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) { return( LDAP_PARAM_ERROR ); } if ( base == NULL ) { base = ""; } if ( filter == NULL ) { filter = "(objectclass=*)"; } if ( msgidp == NULL || ( scope != LDAP_SCOPE_BASE && scope != LDAP_SCOPE_ONELEVEL && scope != LDAP_SCOPE_SUBTREE ) || ( sizelimit < -1 )) { LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL ); return( LDAP_PARAM_ERROR ); } LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK ); *msgidp = ++ld->ld_msgid; LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK ); /* * XXXmcs: should use cache function pointers to hook in memcache */ if ( ld->ld_memcache == NULL ) { rc_key = LDAP_NOT_SUPPORTED; } else if (( rc_key = ldap_memcache_createkey( ld, base, scope, filter, attrs, attrsonly, serverctrls, clientctrls, &key)) == LDAP_SUCCESS && ldap_memcache_result( ld, *msgidp, key ) == LDAP_SUCCESS ) { return LDAP_SUCCESS; } /* check the cache */ if ( ld->ld_cache_on && ld->ld_cache_search != NULL ) { LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK ); if ( (rc = (ld->ld_cache_search)( ld, *msgidp, LDAP_REQ_SEARCH, base, scope, filter, attrs, attrsonly )) != 0 ) { *msgidp = rc; LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK ); return( LDAP_SUCCESS ); } LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK ); } /* caching off or did not find it in the cache - check the net */ if (( rc = nsldapi_build_search_req( ld, base, scope, filter, attrs, attrsonly, serverctrls, clientctrls, timelimit, sizelimit, *msgidp, &ber )) != LDAP_SUCCESS ) { return( rc ); } /* send the message */ rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_SEARCH, (char *) base, ber ); /* * XXXmcs: should use cache function pointers to hook in memcache */ if ( (rc_key == LDAP_SUCCESS) && (rc >= 0) ) { ldap_memcache_new( ld, rc, key, base ); } *msgidp = rc; return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS ); }