From 73b9ffc3e557d764455645f82248cbf93ccdb60b Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 16 Jun 2000 19:10:43 +0000 Subject: [PATCH] Add referral generator --- servers/slapd/back-dnssrv/referral.c | 108 +++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 servers/slapd/back-dnssrv/referral.c diff --git a/servers/slapd/back-dnssrv/referral.c b/servers/slapd/back-dnssrv/referral.c new file mode 100644 index 0000000000..90f7d3c64f --- /dev/null +++ b/servers/slapd/back-dnssrv/referral.c @@ -0,0 +1,108 @@ +/* referral.c - DNS SRV backend referral handler */ +/* $OpenLDAP$ */ +/* + * Copyright 2000 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include + +#include +#include + +#include "slap.h" +#include "external.h" + +int +dnssrv_back_referrals( + Backend *be, + Connection *conn, + Operation *op, + const char *dn, + const char *ndn, + const char **text ) +{ + int i; + int rc = LDAP_OTHER; + char *domain = NULL; + char *hostlist = NULL; + char **hosts = NULL; + struct berval **urls = NULL; + + if( ndn == NULL || *ndn == '\0' ) { + *text = "operation upon null (empty) DN disallowed"; + return LDAP_UNWILLING_TO_PERFORM; + } + + if( get_manageDSAit( op ) ) { + if( op->o_tag == LDAP_REQ_SEARCH ) { + return LDAP_SUCCESS; + } + + *text = "DNS SRV problem processing manageDSAit control"; + return LDAP_OTHER; + } + + if( ldap_dn2domain( dn, &domain ) ) { + send_ldap_result( conn, op, LDAP_REFERRAL, + NULL, NULL, default_referral, NULL ); + return LDAP_REFERRAL; + } + + Debug( LDAP_DEBUG_TRACE, "DNSSRV: dn=\"%s\" -> domain=\"%s\"\n", + dn == NULL ? "" : dn, + domain == NULL ? "" : domain, + 0 ); + + if( rc = ldap_domain2hostlist( domain, &hostlist ) ) { + Debug( LDAP_DEBUG_TRACE, "DNSSRV: domain2hostlist returned %d\n", + rc, 0, 0 ); + *text = "no DNS SRV RR available for DN"; + rc = LDAP_NO_SUCH_OBJECT; + goto done; + } + + hosts = str2charray( hostlist, " " ); + + if( hosts == NULL ) { + Debug( LDAP_DEBUG_TRACE, "DNSSRV: str2charrary error\n", 0, 0, 0 ); + *text = "problem processing DNS SRV records for DN"; + goto done; + } + + for( i=0; hosts[i] != NULL; i++) { + struct berval *url = ch_malloc( sizeof( struct berval ) ); + + url->bv_len = sizeof("ldap://")-1 + strlen(hosts[i]); + url->bv_val = ch_malloc( url->bv_len + 1 ); + + strcpy( url->bv_val, "ldap://" ); + strcpy( &url->bv_val[sizeof("ldap://")-1], hosts[i] ); + + if( ber_bvecadd( &urls, url ) < 0 ) { + ber_bvfree( url ); + *text = "problem processing DNS SRV records for DN"; + goto done; + } + } + + Statslog( LDAP_DEBUG_STATS, + "conn=%ld op=%d DNSSRV p=%d dn=\"%s\" url=\"%s\"\n", + op->o_connid, op->o_opid, op->o_protocol, dn, urls[0]->bv_val ); + + Debug( LDAP_DEBUG_TRACE, "DNSSRV: dn=\"%s\" -> url=\"%s\"\n", + dn == NULL ? "" : dn, + urls[0]->bv_val, 0 ); + + send_ldap_result( conn, op, rc = LDAP_REFERRAL, + NULL, "DNS SRV generated referrals", urls, NULL ); + +done: + if( domain != NULL ) ch_free( domain ); + if( hostlist != NULL ) ch_free( hostlist ); + if( hosts != NULL ) charray_free( hosts ); + ber_bvecfree( urls ); + return rc; +} -- 2.39.5