svn commit: samba r17928 - in branches/SAMBA_3_0/source: include lib libads libsmb utils

jra at samba.org jra at samba.org
Wed Aug 30 04:40:05 GMT 2006


Author: jra
Date: 2006-08-30 04:40:03 +0000 (Wed, 30 Aug 2006)
New Revision: 17928

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17928

Log:
Implement the basic store for CLDAP sitename
support when looking up DC's. On every CLDAP
call store the returned client sitename (if
present, delete store if not) in gencache with
infinate timeout. On AD DNS DC lookup, try looking
for sitename DC's first, only try generic if
sitename DNS lookup failed.
I still haven't figured out yet how to ensure
we fetch the sitename with a CLDAP query before
doing the generic DC list lookup. This code is
difficult to understand. I'll do some experiments
and backtraces tomorrow to try and work out where
to force a CLDAP site query first.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/include/ads_cldap.h
   branches/SAMBA_3_0/source/lib/gencache.c
   branches/SAMBA_3_0/source/libads/cldap.c
   branches/SAMBA_3_0/source/libads/dns.c
   branches/SAMBA_3_0/source/libads/ldap.c
   branches/SAMBA_3_0/source/libsmb/namequery.c
   branches/SAMBA_3_0/source/utils/net_ads.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/ads_cldap.h
===================================================================
--- branches/SAMBA_3_0/source/include/ads_cldap.h	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/include/ads_cldap.h	2006-08-30 04:40:03 UTC (rev 17928)
@@ -35,8 +35,8 @@
 
 	char unk[MAX_DNS_LABEL];
 	char user_name[MAX_DNS_LABEL];
-	char site_name[MAX_DNS_LABEL];
-	char site_name_2[MAX_DNS_LABEL];
+	char server_site_name[MAX_DNS_LABEL];
+	char client_site_name[MAX_DNS_LABEL];
 
 	uint32 version;
 	uint16 lmnt_token;

Modified: branches/SAMBA_3_0/source/lib/gencache.c
===================================================================
--- branches/SAMBA_3_0/source/lib/gencache.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/lib/gencache.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -431,5 +431,3 @@
 	tdb_unlock_bystring(cache, key);
 	return;
 }
-
-

Modified: branches/SAMBA_3_0/source/libads/cldap.c
===================================================================
--- branches/SAMBA_3_0/source/libads/cldap.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/libads/cldap.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -260,8 +260,8 @@
 		*reply->user_name = 0;
 	}
 
-	p += pull_netlogon_string(reply->site_name, p, (const char *)os3.data);
-	p += pull_netlogon_string(reply->site_name_2, p, (const char *)os3.data);
+	p += pull_netlogon_string(reply->server_site_name, p, (const char *)os3.data);
+	p += pull_netlogon_string(reply->client_site_name, p, (const char *)os3.data);
 
 	reply->version = IVAL(p, 0);
 	reply->lmnt_token = SVAL(p, 4);

Modified: branches/SAMBA_3_0/source/libads/dns.c
===================================================================
--- branches/SAMBA_3_0/source/libads/dns.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/libads/dns.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -565,16 +565,105 @@
 	return NT_STATUS_OK;
 }
 
+/****************************************************************************
+ Store and fetch the AD client sitename.
+****************************************************************************/
 
+#define SITENAME_KEY	"AD_SITENAME"
+
+/****************************************************************************
+ Store the AD client sitename.
+ We store indefinately as every new CLDAP query will re-write this.
+****************************************************************************/
+
+BOOL sitename_store(const char *sitename)
+{
+	time_t expire;
+	BOOL ret = False;
+	
+	if ( !sitename || (sitename && !*sitename)) {
+		DEBUG(2,("sitename_store: deleting empty sitename!\n"));
+		return gencache_del(SITENAME_KEY);
+	}
+	
+	if (!gencache_init()) {
+		return False;
+	}
+	
+	expire = get_time_t_max(); /* Store indefinately. */
+	
+	DEBUG(10,("sitename_store: sitename = [%s], expire = [%u]\n",
+		sitename, (unsigned int)expire ));
+
+	ret = gencache_set( SITENAME_KEY, sitename, expire );
+	return ret;
+}
+
+/****************************************************************************
+ Fetch the AD client sitename.
+ Caller must free.
+****************************************************************************/
+
+static char *sitename_fetch(void)
+{
+	char *sitename = NULL;
+	time_t timeout;
+	BOOL ret = False;
+	
+	if (!gencache_init()) {
+		return False;
+	}
+	
+	ret = gencache_get( SITENAME_KEY, &sitename, &timeout );
+	if ( !ret ) {
+		DEBUG(5,("sitename_fetch: No stored sitename\n"));
+	} else {
+		DEBUG(5,("sitename_fetch: Returning sitename \"%s\"\n",
+			sitename ));
+	}
+	return sitename;
+}
+
 /********************************************************************
+ Query with optional sitename.
 ********************************************************************/
 
-NTSTATUS ads_dns_query_dcs( TALLOC_CTX *ctx, const char *domain, struct dns_rr_srv **dclist, int *numdcs )
+NTSTATUS ads_dns_query_dcs_internal(TALLOC_CTX *ctx,
+				const char *domain,
+				const char *sitename,
+				struct dns_rr_srv **dclist,
+				int *numdcs )
 {
-	pstring name;
+	char *name;
+	if (sitename) {
+		name = talloc_asprintf(ctx, "_ldap._tcp.%s._sites.dc._msdcs.%s",
+				sitename, domain );
+	} else {
+		name = talloc_asprintf(ctx, "_ldap._tcp.dc._msdcs.%s", domain );
+	}
+	if (!name) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	return ads_dns_lookup_srv( ctx, name, dclist, numdcs );
+}
 
-	snprintf( name, sizeof(name), "_ldap._tcp.dc._msdcs.%s", domain );
+/********************************************************************
+ Query for AD DC's. Transparently use sitename.
+********************************************************************/
 
-	return ads_dns_lookup_srv( ctx, name, dclist, numdcs );
+NTSTATUS ads_dns_query_dcs(TALLOC_CTX *ctx,
+			const char *domain,
+			struct dns_rr_srv **dclist,
+			int *numdcs )
+{
+	NTSTATUS status;
+	char *sitename = sitename_fetch();
+
+	status = ads_dns_query_dcs_internal(ctx, domain, sitename, dclist, numdcs);
+	if (sitename && !NT_STATUS_IS_OK(status)) {
+		/* Sitename DNS query may have failed. Try without. */
+		status = ads_dns_query_dcs_internal(ctx, domain, NULL, dclist, numdcs);
+	}
+	SAFE_FREE(sitename);
+	return status;
 }
-

Modified: branches/SAMBA_3_0/source/libads/ldap.c
===================================================================
--- branches/SAMBA_3_0/source/libads/ldap.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/libads/ldap.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -173,6 +173,9 @@
 
 	saf_store( ads->server.workgroup, server );
 
+	/* Store our site name. */
+	sitename_store( cldap_reply.client_site_name );
+
 	return True;
 }
 

Modified: branches/SAMBA_3_0/source/libsmb/namequery.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/namequery.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/libsmb/namequery.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -111,7 +111,6 @@
 	return server;
 }
 
-
 /****************************************************************************
  Generate a random trn_id.
 ****************************************************************************/
@@ -1044,6 +1043,7 @@
 		
 	status = ads_dns_query_dcs( ctx, name, &dcs, &numdcs );
 	if ( !NT_STATUS_IS_OK( status ) ) {
+		talloc_destroy(ctx);
 		return False;
 	}
 
@@ -1053,6 +1053,7 @@
 		
 	if ( (*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, numaddrs)) == NULL ) {
 		DEBUG(0,("resolve_ads: malloc failed for %d entries\n", numaddrs ));
+		talloc_destroy(ctx);
 		return False;
 	}
 	
@@ -1096,8 +1097,7 @@
 			(*return_count)++;
 	}
 		
-	TALLOC_FREE( dcs );
-				
+	talloc_destroy(ctx);
 	return True;
 }
 

Modified: branches/SAMBA_3_0/source/utils/net_ads.c
===================================================================
--- branches/SAMBA_3_0/source/utils/net_ads.c	2006-08-30 01:34:22 UTC (rev 17927)
+++ branches/SAMBA_3_0/source/utils/net_ads.c	2006-08-30 04:40:03 UTC (rev 17928)
@@ -135,8 +135,8 @@
 	if (*reply.unk) printf("Unk:\t\t\t%s\n", reply.unk);
 	if (*reply.user_name) printf("User name:\t%s\n", reply.user_name);
 
-	printf("Site Name:\t\t%s\n", reply.site_name);
-	printf("Site Name (2):\t\t%s\n", reply.site_name_2);
+	printf("Server Site Name :\t\t%s\n", reply.server_site_name);
+	printf("Client Site Name (2):\t\t%s\n", reply.client_site_name);
 
 	d_printf("NT Version: %d\n", reply.version);
 	d_printf("LMNT Token: %.2x\n", reply.lmnt_token);



More information about the samba-cvs mailing list