diff options
Diffstat (limited to 'source3/libsmb')
| -rw-r--r-- | source3/libsmb/namequery.c | 68 | 
1 files changed, 65 insertions, 3 deletions
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 87ed5af14c..05679570d4 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -34,6 +34,8 @@ bool global_in_nmbd = False;  ****************************************************************************/  #define SAFKEY_FMT	"SAF/DOMAIN/%s"  #define SAF_TTL		900 +#define SAFJOINKEY_FMT	"SAFJOIN/DOMAIN/%s" +#define SAFJOIN_TTL	3600  static char *saf_key(const char *domain)  { @@ -44,6 +46,15 @@ static char *saf_key(const char *domain)  	return keystr;  } +static char *saf_join_key(const char *domain) +{ +	char *keystr; + +	asprintf_strupper_m(&keystr, SAFJOINKEY_FMT, domain); + +	return keystr; +} +  /****************************************************************************  ****************************************************************************/ @@ -69,7 +80,7 @@ bool saf_store( const char *domain, const char *servername )  		return False;  	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",  		domain, servername, (unsigned int)expire )); @@ -81,6 +92,38 @@ bool saf_store( const char *domain, const char *servername )  	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 )  {  	char *key; @@ -94,15 +137,22 @@ bool saf_delete( const char *domain )  	if ( !gencache_init() )  		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);  	ret = gencache_del(key); +	SAFE_FREE(key);  	if (ret) {  		DEBUG(10,("saf_delete: domain = [%s]\n", domain ));  	} -	SAFE_FREE( key ); -  	return ret;  } @@ -124,6 +174,18 @@ char *saf_fetch( const char *domain )  	if ( !gencache_init() )  		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 );  	ret = gencache_get( key, &server, &timeout );  | 
