1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-14 09:49:28 +03:00

libsmb/namequery.c: add saf_join_store() function

saf_join_store() should be called after a successful
domain join, the affinity to the dc used at join time
has a larger ttl, to avoid problems with delayed replication.

metze

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Günther Deschner <gd@samba.org>
This commit is contained in:
Stefan Metzmacher
2008-10-27 19:31:30 +01:00
committed by Günther Deschner
parent c127367b1d
commit 80e74a27c5

View File

@ -34,6 +34,8 @@ BOOL global_in_nmbd = False;
****************************************************************************/ ****************************************************************************/
#define SAFKEY_FMT "SAF/DOMAIN/%s" #define SAFKEY_FMT "SAF/DOMAIN/%s"
#define SAF_TTL 900 #define SAF_TTL 900
#define SAFJOINKEY_FMT "SAFJOIN/DOMAIN/%s"
#define SAFJOIN_TTL 3600
static char *saf_key(const char *domain) static char *saf_key(const char *domain)
{ {
@ -44,6 +46,15 @@ static char *saf_key(const char *domain)
return keystr; return keystr;
} }
static char *saf_join_key(const char *domain)
{
char *keystr;
asprintf( &keystr, SAFJOINKEY_FMT, strupper_static(domain) );
return keystr;
}
/**************************************************************************** /****************************************************************************
****************************************************************************/ ****************************************************************************/
@ -67,7 +78,7 @@ BOOL saf_store( const char *domain, const char *servername )
return False; return False;
key = saf_key( domain ); key = saf_key( domain );
expire = time( NULL ) + SAF_TTL; expire = time( NULL ) + lp_parm_int(-1, "saf","ttl", SAF_TTL);
DEBUG(10,("saf_store: domain = [%s], server = [%s], expire = [%u]\n", DEBUG(10,("saf_store: domain = [%s], server = [%s], expire = [%u]\n",
@ -80,6 +91,38 @@ BOOL saf_store( const char *domain, const char *servername )
return ret; return ret;
} }
BOOL saf_join_store( const char *domain, const char *servername )
{
char *key;
time_t expire;
BOOL ret = False;
if ( !domain || !servername ) {
DEBUG(2,("saf_join_store: Refusing to store empty domain or servername!\n"));
return False;
}
if ( (strlen(domain) == 0) || (strlen(servername) == 0) ) {
DEBUG(0,("saf_join_store: refusing to store 0 length domain or servername!\n"));
return False;
}
if ( !gencache_init() )
return False;
key = saf_join_key( domain );
expire = time( NULL ) + lp_parm_int(-1, "saf","join ttl", SAFJOIN_TTL);
DEBUG(10,("saf_join_store: domain = [%s], server = [%s], expire = [%u]\n",
domain, servername, (unsigned int)expire ));
ret = gencache_set( key, servername, expire );
SAFE_FREE( key );
return ret;
}
BOOL saf_delete( const char *domain ) BOOL saf_delete( const char *domain )
{ {
char *key; char *key;
@ -93,15 +136,22 @@ BOOL saf_delete( const char *domain )
if ( !gencache_init() ) if ( !gencache_init() )
return False; return False;
key = saf_join_key(domain);
ret = gencache_del(key);
SAFE_FREE(key);
if (ret) {
DEBUG(10,("saf_delete[join]: domain = [%s]\n", domain ));
}
key = saf_key(domain); key = saf_key(domain);
ret = gencache_del(key); ret = gencache_del(key);
SAFE_FREE(key);
if (ret) { if (ret) {
DEBUG(10,("saf_delete: domain = [%s]\n", domain )); DEBUG(10,("saf_delete: domain = [%s]\n", domain ));
} }
SAFE_FREE( key );
return ret; return ret;
} }
@ -122,7 +172,19 @@ char *saf_fetch( const char *domain )
if ( !gencache_init() ) if ( !gencache_init() )
return False; return False;
key = saf_join_key( domain );
ret = gencache_get( key, &server, &timeout );
SAFE_FREE( key );
if ( ret ) {
DEBUG(5,("saf_fetch[join]: Returning \"%s\" for \"%s\" domain\n",
server, domain ));
return server;
}
key = saf_key( domain ); key = saf_key( domain );
ret = gencache_get( key, &server, &timeout ); ret = gencache_get( key, &server, &timeout );