summaryrefslogtreecommitdiff
path: root/source3/libads
diff options
context:
space:
mode:
Diffstat (limited to 'source3/libads')
-rw-r--r--source3/libads/dns.c71
-rw-r--r--source3/libads/ldap.c10
2 files changed, 63 insertions, 18 deletions
diff --git a/source3/libads/dns.c b/source3/libads/dns.c
index bd280fea62..b405d29d96 100644
--- a/source3/libads/dns.c
+++ b/source3/libads/dns.c
@@ -577,7 +577,19 @@ NTSTATUS ads_dns_lookup_ns( TALLOC_CTX *ctx, const char *dnsdomain, struct dns_r
Store and fetch the AD client sitename.
****************************************************************************/
-#define SITENAME_KEY "AD_SITENAME"
+#define SITENAME_KEY "AD_SITENAME/DOMAIN/%s"
+
+static char *sitename_key(const char *realm)
+{
+ char *keystr;
+
+ if (asprintf(&keystr, SITENAME_KEY, strupper_static(realm)) == -1) {
+ return NULL;
+ }
+
+ return keystr;
+}
+
/****************************************************************************
Store the AD client sitename.
@@ -586,26 +598,37 @@ NTSTATUS ads_dns_lookup_ns( TALLOC_CTX *ctx, const char *dnsdomain, struct dns_r
as this isn't a valid DNS name.
****************************************************************************/
-BOOL sitename_store(const char *sitename)
+BOOL sitename_store(const char *realm, const char *sitename)
{
time_t expire;
BOOL ret = False;
+ char *key;
if (!gencache_init()) {
return False;
}
+
+ if (!realm || (strlen(realm) == 0)) {
+ DEBUG(0,("no realm\n"));
+ return False;
+ }
+ key = sitename_key(realm);
+
if (!sitename || (sitename && !*sitename)) {
DEBUG(5,("sitename_store: deleting empty sitename!\n"));
- return gencache_del(SITENAME_KEY);
+ ret = gencache_del(sitename_key(realm));
+ SAFE_FREE(key);
+ return ret;
}
expire = get_time_t_max(); /* Store indefinately. */
- DEBUG(10,("sitename_store: sitename = [%s], expire = [%u]\n",
- sitename, (unsigned int)expire ));
+ DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%u]\n",
+ realm, sitename, (unsigned int)expire ));
- ret = gencache_set( SITENAME_KEY, sitename, expire );
+ ret = gencache_set( key, sitename, expire );
+ SAFE_FREE(key);
return ret;
}
@@ -614,22 +637,34 @@ BOOL sitename_store(const char *sitename)
Caller must free.
****************************************************************************/
-char *sitename_fetch(void)
+char *sitename_fetch(const char *realm)
{
char *sitename = NULL;
time_t timeout;
BOOL ret = False;
+ const char *query_realm;
+ char *key;
if (!gencache_init()) {
return False;
}
-
- ret = gencache_get( SITENAME_KEY, &sitename, &timeout );
+
+ if (!realm || (strlen(realm) == 0)) {
+ query_realm = lp_realm();
+ } else {
+ query_realm = realm;
+ }
+
+ key = sitename_key(query_realm);
+
+ ret = gencache_get( key, &sitename, &timeout );
+ SAFE_FREE(key);
if ( !ret ) {
- DEBUG(5,("sitename_fetch: No stored sitename\n"));
+ DEBUG(5,("sitename_fetch: No stored sitename for %s\n",
+ query_realm));
} else {
- DEBUG(5,("sitename_fetch: Returning sitename \"%s\"\n",
- sitename ));
+ DEBUG(5,("sitename_fetch: Returning sitename for %s: \"%s\"\n",
+ query_realm, sitename ));
}
return sitename;
}
@@ -638,10 +673,18 @@ char *sitename_fetch(void)
Did the sitename change ?
****************************************************************************/
-BOOL stored_sitename_changed(const char *sitename)
+BOOL stored_sitename_changed(const char *realm, const char *sitename)
{
BOOL ret = False;
- char *new_sitename = sitename_fetch();
+
+ char *new_sitename;
+
+ if (!realm || (strlen(realm) == 0)) {
+ DEBUG(0,("no realm\n"));
+ return False;
+ }
+
+ new_sitename = sitename_fetch(realm);
if (sitename && new_sitename && !strequal(sitename, new_sitename)) {
ret = True;
diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
index 2ceae4d957..4802f79d3e 100644
--- a/source3/libads/ldap.c
+++ b/source3/libads/ldap.c
@@ -230,7 +230,7 @@ BOOL ads_try_connect(ADS_STRUCT *ads, const char *server )
SAFE_FREE(srv);
/* Store our site name. */
- sitename_store( cldap_reply.client_site_name );
+ sitename_store( cldap_reply.domain, cldap_reply.client_site_name );
return True;
}
@@ -249,7 +249,7 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads)
pstring realm;
BOOL got_realm = False;
BOOL use_own_domain = False;
- char *sitename = sitename_fetch();
+ char *sitename;
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
/* if the realm and workgroup are both empty, assume they are ours */
@@ -268,7 +268,6 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads)
if (c_realm && *c_realm)
got_realm = True;
-again:
/* we need to try once with the realm name and fallback to the
netbios domain name if we fail (if netbios has not been disabled */
@@ -280,7 +279,6 @@ again:
}
if ( !c_realm || !*c_realm ) {
- SAFE_FREE(sitename);
DEBUG(0,("ads_find_dc: no realm or workgroup! Don't know what to do\n"));
return NT_STATUS_INVALID_PARAMETER; /* rather need MISSING_PARAMETER ... */
}
@@ -288,6 +286,10 @@ again:
pstrcpy( realm, c_realm );
+ sitename = sitename_fetch(realm);
+
+ again:
+
DEBUG(6,("ads_find_dc: looking for %s '%s'\n",
(got_realm ? "realm" : "domain"), realm));