From 61b7a24f16c9d3a3c41df19ac7073571164eb47a Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Tue, 23 Feb 2010 11:11:37 -0500 Subject: s3 move the sitename cache in its own file --- source3/Makefile.in | 3 +- source3/include/proto.h | 3 - source3/libads/dns.c | 113 --------------------------------- source3/libads/ldap.c | 1 + source3/libads/sitename_cache.c | 136 ++++++++++++++++++++++++++++++++++++++++ source3/libads/sitename_cache.h | 28 +++++++++ source3/libsmb/dsgetdcname.c | 1 + source3/libsmb/namequery.c | 1 + source3/libsmb/namequery_dc.c | 1 + source3/utils/net_lookup.c | 1 + source3/winbindd/winbindd_cm.c | 1 + 11 files changed, 172 insertions(+), 117 deletions(-) create mode 100644 source3/libads/sitename_cache.c create mode 100644 source3/libads/sitename_cache.h diff --git a/source3/Makefile.in b/source3/Makefile.in index c4093084c4..e966023a1a 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -464,7 +464,8 @@ LIBNBT_OBJ = ../libcli/nbt/nbtname.o \ ../librpc/ndr/ndr_svcctl.o LIBNMB_OBJ = libsmb/unexpected.o libsmb/namecache.o libsmb/nmblib.o \ - libsmb/namequery.o ../libcli/nbt/lmhosts.o libsmb/conncache.o libads/dns.o + libsmb/namequery.o ../libcli/nbt/lmhosts.o libsmb/conncache.o \ + libads/dns.o libads/sitename_cache.o NTERR_OBJ = libsmb/nterr.o libsmb/smberr.o DOSERR_OBJ = ../libcli/util/doserr.o diff --git a/source3/include/proto.h b/source3/include/proto.h index ca1a38ba24..f8c3032ff1 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1748,9 +1748,6 @@ NTSTATUS ads_dns_lookup_ns(TALLOC_CTX *ctx, const char *dnsdomain, struct dns_rr_ns **nslist, int *numns); -bool sitename_store(const char *realm, const char *sitename); -char *sitename_fetch(const char *realm); -bool stored_sitename_changed(const char *realm, const char *sitename); NTSTATUS ads_dns_query_dcs(TALLOC_CTX *ctx, const char *realm, const char *sitename, diff --git a/source3/libads/dns.c b/source3/libads/dns.c index 2fa6f18c77..dc573e3a46 100644 --- a/source3/libads/dns.c +++ b/source3/libads/dns.c @@ -726,119 +726,6 @@ NTSTATUS ads_dns_lookup_ns(TALLOC_CTX *ctx, return NT_STATUS_OK; } -/**************************************************************************** - Store and fetch the AD client sitename. -****************************************************************************/ - -#define SITENAME_KEY "AD_SITENAME/DOMAIN/%s" - -static char *sitename_key(const char *realm) -{ - char *keystr; - - if (asprintf_strupper_m(&keystr, SITENAME_KEY, realm) == -1) { - return NULL; - } - - return keystr; -} - - -/**************************************************************************** - Store the AD client sitename. - We store indefinately as every new CLDAP query will re-write this. -****************************************************************************/ - -bool sitename_store(const char *realm, const char *sitename) -{ - time_t expire; - bool ret = False; - char *key; - - if (!realm || (strlen(realm) == 0)) { - DEBUG(0,("sitename_store: no realm\n")); - return False; - } - - key = sitename_key(realm); - - if (!sitename || (sitename && !*sitename)) { - DEBUG(5,("sitename_store: deleting empty sitename!\n")); - ret = gencache_del(key); - SAFE_FREE(key); - return ret; - } - - expire = get_time_t_max(); /* Store indefinately. */ - - DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%u]\n", - realm, sitename, (unsigned int)expire )); - - ret = gencache_set( key, sitename, expire ); - SAFE_FREE(key); - return ret; -} - -/**************************************************************************** - Fetch the AD client sitename. - Caller must free. -****************************************************************************/ - -char *sitename_fetch(const char *realm) -{ - char *sitename = NULL; - time_t timeout; - bool ret = False; - const char *query_realm; - char *key; - - 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 for %s\n", - query_realm)); - } else { - DEBUG(5,("sitename_fetch: Returning sitename for %s: \"%s\"\n", - query_realm, sitename )); - } - return sitename; -} - -/**************************************************************************** - Did the sitename change ? -****************************************************************************/ - -bool stored_sitename_changed(const char *realm, const char *sitename) -{ - bool ret = False; - - char *new_sitename; - - if (!realm || (strlen(realm) == 0)) { - DEBUG(0,("stored_sitename_changed: no realm\n")); - return False; - } - - new_sitename = sitename_fetch(realm); - - if (sitename && new_sitename && !strequal(sitename, new_sitename)) { - ret = True; - } else if ((sitename && !new_sitename) || - (!sitename && new_sitename)) { - ret = True; - } - SAFE_FREE(new_sitename); - return ret; -} - /******************************************************************** Query with optional sitename. ********************************************************************/ diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index 33d22d04ec..df45be5f8a 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -23,6 +23,7 @@ #include "includes.h" #include "lib/ldb/include/ldb.h" +#include "libads/sitename_cache.h" #ifdef HAVE_LDAP diff --git a/source3/libads/sitename_cache.c b/source3/libads/sitename_cache.c new file mode 100644 index 0000000000..cb1bae5239 --- /dev/null +++ b/source3/libads/sitename_cache.c @@ -0,0 +1,136 @@ +/* + Unix SMB/CIFS implementation. + DNS utility library + Copyright (C) Gerald (Jerry) Carter 2006. + Copyright (C) Jeremy Allison 2007. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "libads/sitename_cache.h" + +/**************************************************************************** + Store and fetch the AD client sitename. +****************************************************************************/ + +#define SITENAME_KEY "AD_SITENAME/DOMAIN/%s" + +static char *sitename_key(const char *realm) +{ + char *keystr; + + if (asprintf_strupper_m(&keystr, SITENAME_KEY, realm) == -1) { + return NULL; + } + + return keystr; +} + + +/**************************************************************************** + Store the AD client sitename. + We store indefinately as every new CLDAP query will re-write this. +****************************************************************************/ + +bool sitename_store(const char *realm, const char *sitename) +{ + time_t expire; + bool ret = False; + char *key; + + if (!realm || (strlen(realm) == 0)) { + DEBUG(0,("sitename_store: no realm\n")); + return False; + } + + key = sitename_key(realm); + + if (!sitename || (sitename && !*sitename)) { + DEBUG(5,("sitename_store: deleting empty sitename!\n")); + ret = gencache_del(key); + SAFE_FREE(key); + return ret; + } + + expire = get_time_t_max(); /* Store indefinately. */ + + DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%u]\n", + realm, sitename, (unsigned int)expire )); + + ret = gencache_set( key, sitename, expire ); + SAFE_FREE(key); + return ret; +} + +/**************************************************************************** + Fetch the AD client sitename. + Caller must free. +****************************************************************************/ + +char *sitename_fetch(const char *realm) +{ + char *sitename = NULL; + time_t timeout; + bool ret = False; + const char *query_realm; + char *key; + + 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 for %s\n", + query_realm)); + } else { + DEBUG(5,("sitename_fetch: Returning sitename for %s: \"%s\"\n", + query_realm, sitename )); + } + return sitename; +} + +/**************************************************************************** + Did the sitename change ? +****************************************************************************/ + +bool stored_sitename_changed(const char *realm, const char *sitename) +{ + bool ret = False; + + char *new_sitename; + + if (!realm || (strlen(realm) == 0)) { + DEBUG(0,("stored_sitename_changed: no realm\n")); + return False; + } + + new_sitename = sitename_fetch(realm); + + if (sitename && new_sitename && !strequal(sitename, new_sitename)) { + ret = True; + } else if ((sitename && !new_sitename) || + (!sitename && new_sitename)) { + ret = True; + } + SAFE_FREE(new_sitename); + return ret; +} + diff --git a/source3/libads/sitename_cache.h b/source3/libads/sitename_cache.h new file mode 100644 index 0000000000..4e62f00a61 --- /dev/null +++ b/source3/libads/sitename_cache.h @@ -0,0 +1,28 @@ +/* + Unix SMB/CIFS implementation. + DNS utility library + Copyright (C) Gerald (Jerry) Carter 2006. + Copyright (C) Jeremy Allison 2007. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _LIBADS_SITENAME_CACHE_H_ +#define _LIBADS_SITENAME_CACHE_H_ + +bool sitename_store(const char *realm, const char *sitename); +char *sitename_fetch(const char *realm); +bool stored_sitename_changed(const char *realm, const char *sitename); + +#endif /* _LIBADS_SITENAME_CACHE_H_ */ diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 00339d2d32..6e67e050fe 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -21,6 +21,7 @@ */ #include "includes.h" +#include "libads/sitename_cache.h" #define DSGETDCNAME_FMT "DSGETDCNAME/DOMAIN/%s" /* 15 minutes */ diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index ed718ce536..a77f5e4b46 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -19,6 +19,7 @@ */ #include "includes.h" +#include "libads/sitename_cache.h" /* nmbd.c sets this to True. */ bool global_in_nmbd = False; diff --git a/source3/libsmb/namequery_dc.c b/source3/libsmb/namequery_dc.c index 7b0748f86b..3b3470dcf3 100644 --- a/source3/libsmb/namequery_dc.c +++ b/source3/libsmb/namequery_dc.c @@ -23,6 +23,7 @@ #include "includes.h" +#include "libads/sitename_cache.h" /********************************************************************** Is this our primary domain ? diff --git a/source3/utils/net_lookup.c b/source3/utils/net_lookup.c index 658e904f59..102f1b263f 100644 --- a/source3/utils/net_lookup.c +++ b/source3/utils/net_lookup.c @@ -18,6 +18,7 @@ #include "includes.h" #include "utils/net.h" +#include "libads/sitename_cache.h" int net_lookup_usage(struct net_context *c, int argc, const char **argv) { diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index ed06dde2ff..6bdeac1bd7 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -65,6 +65,7 @@ #include "../librpc/gen_ndr/cli_samr.h" #include "../librpc/gen_ndr/cli_lsa.h" #include "../librpc/gen_ndr/cli_dssetup.h" +#include "libads/sitename_cache.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_WINBIND -- cgit