]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
r17928: Implement the basic store for CLDAP sitename
authorJeremy Allison <jra@samba.org>
Wed, 30 Aug 2006 04:40:03 +0000 (04:40 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:38:59 +0000 (11:38 -0500)
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.
(This used to be commit ab3f0c5b1e9c5fd192c5514cbe9451b938f9cd5d)

source3/include/ads_cldap.h
source3/lib/gencache.c
source3/libads/cldap.c
source3/libads/dns.c
source3/libads/ldap.c
source3/libsmb/namequery.c
source3/utils/net_ads.c

index 65feb072e0f401c32b74bf22610a596e13365cd5..e5df892a40e37cd9333317efff9926eed8ec225b 100644 (file)
@@ -35,8 +35,8 @@ struct cldap_netlogon_reply {
 
        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;
index d4582b34f9d2dd087d1be70aec61e08a930f9b65..fe038011d8843e184bb39c763e244079e6588535 100644 (file)
@@ -431,5 +431,3 @@ void gencache_unlock_entry( const char *key )
        tdb_unlock_bystring(cache, key);
        return;
 }
-
-
index 2e96270e906f16677bd9f4ef1543f62496cc5cef..3a6083558f13380bce902dbd96fc64963372ec69 100644 (file)
@@ -260,8 +260,8 @@ static int recv_cldap_netlogon(int sock, struct cldap_netlogon_reply *reply)
                *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);
index 8cc68a0c146adf38a38a4242aafc5d67bdfdb05b..937cd9213f9845d014d861cf3844261ebce2b112 100644 (file)
@@ -565,16 +565,105 @@ NTSTATUS ads_dns_lookup_ns( TALLOC_CTX *ctx, const char *dnsdomain, struct dns_r
        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.
+****************************************************************************/
 
-NTSTATUS ads_dns_query_dcs( TALLOC_CTX *ctx, const char *domain, struct dns_rr_srv **dclist, int *numdcs )
+BOOL sitename_store(const char *sitename)
 {
-       pstring name;
+       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;
+}
 
-       snprintf( name, sizeof(name), "_ldap._tcp.dc._msdcs.%s", domain );
+/****************************************************************************
+ 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_internal(TALLOC_CTX *ctx,
+                               const char *domain,
+                               const char *sitename,
+                               struct dns_rr_srv **dclist,
+                               int *numdcs )
+{
+       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 );
 }
 
+/********************************************************************
+ Query for AD DC's. Transparently use sitename.
+********************************************************************/
+
+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;
+}
index c6d1fc9c6039cf5d7a9d62211dd33d9fb01837c9..c943558bd369579863e8de9a76ccb1439c1f9cb0 100644 (file)
@@ -173,6 +173,9 @@ BOOL ads_try_connect(ADS_STRUCT *ads, const char *server )
 
        saf_store( ads->server.workgroup, server );
 
+       /* Store our site name. */
+       sitename_store( cldap_reply.client_site_name );
+
        return True;
 }
 
index dcb7dbf07087aedd241412d20c55baf8bf541665..4c361a37165889b74fb34ecf7daf8c0d596dcd78 100644 (file)
@@ -111,7 +111,6 @@ char *saf_fetch( const char *domain )
        return server;
 }
 
-
 /****************************************************************************
  Generate a random trn_id.
 ****************************************************************************/
@@ -1044,6 +1043,7 @@ static BOOL resolve_ads(const char *name, int name_type,
                
        status = ads_dns_query_dcs( ctx, name, &dcs, &numdcs );
        if ( !NT_STATUS_IS_OK( status ) ) {
+               talloc_destroy(ctx);
                return False;
        }
 
@@ -1053,6 +1053,7 @@ static BOOL resolve_ads(const char *name, int name_type,
                
        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 @@ static BOOL resolve_ads(const char *name, int name_type,
                        (*return_count)++;
        }
                
-       TALLOC_FREE( dcs );
-                               
+       talloc_destroy(ctx);
        return True;
 }
 
index e6ad7c21b3fd316d07d6dca4d8f96092dfa82f86..83e2114135fc178ad44f0231cb949297cf48c8ce 100644 (file)
@@ -135,8 +135,8 @@ static int net_ads_cldap_netlogon(ADS_STRUCT *ads)
        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);