[PATCH] Small cleanups around name lookup

Jeremy Allison jra at samba.org
Fri Mar 30 16:07:12 UTC 2018


On Fri, Mar 30, 2018 at 03:51:13PM +0200, Volker Lendecke via samba-technical wrote:
> Hi!
> 
> Review appreciated!

Just a quick check - will these apply or conflict with the name lookup
changes you posted about a week ago to make all NetBIOS lookups go
through the same path ?

I was planning to review that one very soon and didn't want to
conflict things.

Jeremy.

> -- 
> SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
> phone: +49-551-370000-0, fax: +49-551-370000-9
> AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
> http://www.sernet.de, mailto:kontakt at sernet.de

> From c25ff11cdee5fff645c149da04094e0683744626 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Thu, 25 Jan 2018 14:07:53 +0100
> Subject: [PATCH 1/8] nmbd: Fix a typo
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/nmbd/nmbd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
> index 9be708a9c02..73a3b8bf960 100644
> --- a/source3/nmbd/nmbd.c
> +++ b/source3/nmbd/nmbd.c
> @@ -531,7 +531,7 @@ static void process(struct messaging_context *msg)
>  		 * Process all incoming packets
>  		 * read above. This calls the success and
>  		 * failure functions registered when response
> -		 * packets arrrive, and also deals with request
> +		 * packets arrive, and also deals with request
>  		 * packets from other sources.
>  		 * (nmbd_packets.c)
>  		 */
> -- 
> 2.11.0
> 
> 
> From 2af102e4916fe4adb2a8502386b3148922ff7610 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Thu, 25 Jan 2018 14:21:22 +0100
> Subject: [PATCH 2/8] nmbd: Fix a typo
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/nmbd/nmbd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
> index 73a3b8bf960..7884ff8dd06 100644
> --- a/source3/nmbd/nmbd.c
> +++ b/source3/nmbd/nmbd.c
> @@ -338,7 +338,7 @@ static void reload_interfaces(time_t t)
>  			}
>  		}
>  		if (n == -1) {
> -			/* oops, an interface has disapeared. This is
> +			/* oops, an interface has disappeared. This is
>  			 tricky, we don't dare actually free the
>  			 interface as it could be being used, so
>  			 instead we just wear the memory leak and
> -- 
> 2.11.0
> 
> 
> From eaead1cb4f6f44d625de3525d99c73731ca4dbe0 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Sat, 10 Mar 2018 15:35:43 +0100
> Subject: [PATCH 3/8] libsmb: Remove unused trustdom_cache.c
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/include/proto.h         |   7 -
>  source3/libsmb/trustdom_cache.c | 360 ----------------------------------------
>  source3/wscript_build           |   1 -
>  3 files changed, 368 deletions(-)
>  delete mode 100644 source3/libsmb/trustdom_cache.c
> 
> diff --git a/source3/include/proto.h b/source3/include/proto.h
> index fa87407ff24..778107a4d84 100644
> --- a/source3/include/proto.h
> +++ b/source3/include/proto.h
> @@ -817,13 +817,6 @@ const char *get_dos_error_msg(WERROR result);
>  const char *smb_dos_err_class(uint8_t e_class);
>  WERROR map_werror_from_unix(int error);
>  
> -/* The following definitions come from libsmb/trustdom_cache.c  */
> -
> -bool trustdom_cache_store(const char *name, const struct dom_sid *sid);
> -bool trustdom_cache_fetch(const char* name, struct dom_sid* sid);
> -void trustdom_cache_flush(void);
> -void update_trustdom_cache( void );
> -
>  /* The following definitions come from libsmb/trusts_util.c  */
>  
>  struct netlogon_creds_cli_context;
> diff --git a/source3/libsmb/trustdom_cache.c b/source3/libsmb/trustdom_cache.c
> deleted file mode 100644
> index 54f959173c7..00000000000
> --- a/source3/libsmb/trustdom_cache.c
> +++ /dev/null
> @@ -1,360 +0,0 @@
> -/*
> -   Unix SMB/CIFS implementation.
> -
> -   Trusted domain names cache on top of gencache.
> -
> -   Copyright (C) Rafal Szczesniak	2002
> -
> -   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 <http://www.gnu.org/licenses/>.
> -*/
> -
> -#include "includes.h"
> -#include "../libcli/security/security.h"
> -#include "../librpc/gen_ndr/ndr_lsa_c.h"
> -#include "libsmb/libsmb.h"
> -#include "rpc_client/cli_pipe.h"
> -#include "rpc_client/cli_lsarpc.h"
> -
> -#undef DBGC_CLASS
> -#define DBGC_CLASS DBGC_ALL	/* there's no proper class yet */
> -
> -#define TDOMKEY_FMT  "TDOM/%s"
> -#define TDOMTSKEY    "TDOMCACHE/TIMESTAMP"
> -#define TRUSTDOM_UPDATE_INTERVAL	600
> -
> -
> -/**
> - * @file trustdom_cache.c
> - *
> - * Implementation of trusted domain names cache useful when
> - * samba acts as domain member server. In such case, caching
> - * domain names currently trusted gives a performance gain
> - * because there's no need to query PDC each time we need
> - * list of trusted domains
> - **/
> -
> -/**
> - * Form up trustdom name key. It is based only
> - * on domain name now.
> - *
> - * @param name trusted domain name
> - * @return cache key for use in gencache mechanism
> - **/
> -
> -static char *trustdom_cache_key(TALLOC_CTX *mem_ctx, const char *name)
> -{
> -	return talloc_asprintf_strupper_m(mem_ctx, TDOMKEY_FMT, name);
> -}
> -
> -
> -/**
> - * Store trusted domain in gencache as the domain name (key)
> - * and trusted domain's SID (value)
> - *
> - * @param name trusted domain name
> - * @param alt_name alternative trusted domain name (used in ADS domains)
> - * @param sid trusted domain's SID
> - * @param timeout cache entry expiration time
> - * @return true upon successful value storing or
> - *         false if store attempt failed
> - **/
> -
> -bool trustdom_cache_store(const char *name, const struct dom_sid *sid)
> -{
> -	char *key;
> -	fstring sid_string;
> -	bool ret;
> -
> -	DEBUG(5, ("trustdom_store: storing SID %s of domain %s\n",
> -	          sid_string_dbg(sid), name));
> -
> -	key = trustdom_cache_key(talloc_tos(), name);
> -
> -	/* Generate string representation domain SID */
> -	sid_to_fstring(sid_string, sid);
> -
> -	ret = gencache_set(key, sid_string,
> -			   time(NULL) + TRUSTDOM_UPDATE_INTERVAL);
> -	TALLOC_FREE(key);
> -	return ret;
> -}
> -
> -
> -/**
> - * Fetch trusted domain's SID from the gencache.
> - * This routine can also be used to check whether given
> - * domain is currently trusted one.
> - *
> - * @param name trusted domain name
> - * @param sid trusted domain's SID to be returned
> - * @return true if entry is found or
> - *         false if has expired/doesn't exist
> - **/
> -
> -bool trustdom_cache_fetch(const char* name, struct dom_sid* sid)
> -{
> -	char *key = NULL, *value = NULL;
> -	time_t timeout;
> -	bool ok;
> -
> -	/* exit now if null pointers were passed as they're required further */
> -	if (sid == NULL) {
> -		return false;
> -	}
> -
> -	/* prepare a key and get the value */
> -	key = trustdom_cache_key(talloc_tos(), name);
> -	if (key == NULL) {
> -		return false;
> -	}
> -
> -	ok = gencache_get(key, talloc_tos(), &value, &timeout);
> -	TALLOC_FREE(key);
> -	if (!ok) {
> -		DEBUG(5, ("no entry for trusted domain %s found.\n", name));
> -		return false;
> -	}
> -
> -	DEBUG(5, ("trusted domain %s found (%s)\n", name, value));
> -
> -	/* convert sid string representation into struct dom_sid structure */
> -	ok = string_to_sid(sid, value);
> -	TALLOC_FREE(value);
> -	return ok;
> -}
> -
> -/*******************************************************************
> - fetch the timestamp from the last update
> -*******************************************************************/
> -
> -static uint32_t trustdom_cache_fetch_timestamp(void)
> -{
> -	char *value = NULL;
> -	time_t timeout;
> -	uint32_t timestamp;
> -
> -	if (!gencache_get(TDOMTSKEY, talloc_tos(), &value, &timeout)) {
> -		DEBUG(5, ("no timestamp for trusted domain cache located.\n"));
> -		SAFE_FREE(value);
> -		return 0;
> -	}
> -
> -	timestamp = atoi(value);
> -
> -	TALLOC_FREE(value);
> -	return timestamp;
> -}
> -
> -/*******************************************************************
> - store the timestamp from the last update
> -*******************************************************************/
> -
> -static bool trustdom_cache_store_timestamp(uint32_t t, time_t timeout)
> -{
> -	fstring value;
> -
> -	fstr_sprintf(value, "%d", t );
> -
> -	if (!gencache_set(TDOMTSKEY, value, timeout)) {
> -		DEBUG(5, ("failed to set timestamp for trustdom_cache\n"));
> -		return False;
> -	}
> -
> -	return True;
> -}
> -
> -
> -/**
> - * Delete single trustdom entry. Look at the
> - * gencache_iterate definition.
> - *
> - **/
> -
> -static void flush_trustdom_name(const char* key, const char *value, time_t timeout, void* dptr)
> -{
> -	gencache_del(key);
> -	DEBUG(5, ("Deleting entry %s\n", key));
> -}
> -
> -
> -/**
> - * Flush all the trusted domains entries from the cache.
> - **/
> -
> -void trustdom_cache_flush(void)
> -{
> -	char *key = trustdom_cache_key(talloc_tos(), "*");
> -	/*
> -	 * iterate through each TDOM cache's entry and flush it
> -	 * by flush_trustdom_name function
> -	 */
> -	gencache_iterate(flush_trustdom_name, NULL, key);
> -	TALLOC_FREE(key);
> -	DEBUG(5, ("Trusted domains cache flushed\n"));
> -}
> -
> -/*********************************************************************
> - Enumerate the list of trusted domains from a DC
> -*********************************************************************/
> -
> -static bool enumerate_domain_trusts( TALLOC_CTX *mem_ctx, const char *domain,
> -                                     char ***domain_names, uint32_t *num_domains,
> -				     struct dom_sid **sids )
> -{
> -	struct policy_handle 	pol;
> -	NTSTATUS status, result;
> -	fstring 	dc_name;
> -	struct sockaddr_storage	dc_ss;
> -	uint32_t 		enum_ctx = 0;
> -	struct cli_state *cli = NULL;
> -	struct rpc_pipe_client *lsa_pipe = NULL;
> -	struct lsa_DomainList dom_list;
> -	int i;
> -	struct dcerpc_binding_handle *b = NULL;
> -
> -	*domain_names = NULL;
> -	*num_domains = 0;
> -	*sids = NULL;
> -
> -	/* lookup a DC first */
> -
> -	if ( !get_dc_name(domain, NULL, dc_name, &dc_ss) ) {
> -		DEBUG(3,("enumerate_domain_trusts: can't locate a DC for domain %s\n",
> -			domain));
> -		return False;
> -	}
> -
> -	/* setup the anonymous connection */
> -
> -	status = cli_full_connection( &cli, lp_netbios_name(), dc_name, &dc_ss, 0, "IPC$", "IPC",
> -		"", "", "", 0, Undefined);
> -	if ( !NT_STATUS_IS_OK(status) )
> -		goto done;
> -
> -	/* open the LSARPC_PIPE	*/
> -
> -	status = cli_rpc_pipe_open_noauth(cli, &ndr_table_lsarpc,
> -					  &lsa_pipe);
> -	if (!NT_STATUS_IS_OK(status)) {
> -		goto done;
> -	}
> -
> -	b = lsa_pipe->binding_handle;
> -
> -	/* get a handle */
> -
> -	status = rpccli_lsa_open_policy(lsa_pipe, mem_ctx, True,
> -		LSA_POLICY_VIEW_LOCAL_INFORMATION, &pol);
> -	if ( !NT_STATUS_IS_OK(status) )
> -		goto done;
> -
> -	/* Lookup list of trusted domains */
> -
> -	status = dcerpc_lsa_EnumTrustDom(b, mem_ctx,
> -					 &pol,
> -					 &enum_ctx,
> -					 &dom_list,
> -					 (uint32_t)-1,
> -					 &result);
> -	if ( !NT_STATUS_IS_OK(status) )
> -		goto done;
> -	if (!NT_STATUS_IS_OK(result)) {
> -		status = result;
> -		goto done;
> -	}
> -
> -	*num_domains = dom_list.count;
> -
> -	*domain_names = talloc_zero_array(mem_ctx, char *, *num_domains);
> -	if (!*domain_names) {
> -		status = NT_STATUS_NO_MEMORY;
> -		goto done;
> -	}
> -
> -	*sids = talloc_zero_array(mem_ctx, struct dom_sid, *num_domains);
> -	if (!*sids) {
> -		status = NT_STATUS_NO_MEMORY;
> -		goto done;
> -	}
> -
> -	for (i=0; i< *num_domains; i++) {
> -		(*domain_names)[i] = discard_const_p(char, dom_list.domains[i].name.string);
> -		(*sids)[i] = *dom_list.domains[i].sid;
> -	}
> -
> -done:
> -	/* cleanup */
> -	if (cli) {
> -		DEBUG(10,("enumerate_domain_trusts: shutting down connection...\n"));
> -		cli_shutdown( cli );
> -	}
> -
> -	return NT_STATUS_IS_OK(status);
> -}
> -
> -/********************************************************************
> - update the trustdom_cache if needed
> -********************************************************************/
> -
> -void update_trustdom_cache( void )
> -{
> -	char **domain_names;
> -	struct dom_sid *dom_sids;
> -	uint32_t num_domains;
> -	uint32_t last_check;
> -	int time_diff;
> -	TALLOC_CTX *mem_ctx = NULL;
> -	time_t now = time(NULL);
> -	int i;
> -
> -	/* get the timestamp.  We have to initialise it if the last timestamp == 0 */
> -	if ( (last_check = trustdom_cache_fetch_timestamp()) == 0 )
> -		trustdom_cache_store_timestamp(0, now+TRUSTDOM_UPDATE_INTERVAL);
> -
> -	time_diff = (int) (now - last_check);
> -
> -	if ( (time_diff > 0) && (time_diff < TRUSTDOM_UPDATE_INTERVAL) ) {
> -		DEBUG(10,("update_trustdom_cache: not time to update trustdom_cache yet\n"));
> -		return;
> -	}
> -
> -	/* note that we don't lock the timestamp. This prevents this
> -	   smbd from blocking all other smbd daemons while we
> -	   enumerate the trusted domains */
> -	trustdom_cache_store_timestamp(now, now+TRUSTDOM_UPDATE_INTERVAL);
> -
> -	if ( !(mem_ctx = talloc_init("update_trustdom_cache")) ) {
> -		DEBUG(0,("update_trustdom_cache: talloc_init() failed!\n"));
> -		goto done;
> -	}
> -
> -	/* get the domains and store them */
> -
> -	if ( enumerate_domain_trusts(mem_ctx, lp_workgroup(), &domain_names,
> -		&num_domains, &dom_sids)) {
> -		for ( i=0; i<num_domains; i++ ) {
> -			trustdom_cache_store(domain_names[i], &dom_sids[i]);
> -		}
> -	} else {
> -		/* we failed to fetch the list of trusted domains - restore the old
> -		   timestamp */
> -		trustdom_cache_store_timestamp(last_check,
> -					       last_check+TRUSTDOM_UPDATE_INTERVAL);
> -	}
> -
> -done:
> -	talloc_destroy( mem_ctx );
> -
> -	return;
> -}
> diff --git a/source3/wscript_build b/source3/wscript_build
> index ed9ed24fae2..5080b2a114d 100644
> --- a/source3/wscript_build
> +++ b/source3/wscript_build
> @@ -929,7 +929,6 @@ bld.SAMBA3_SUBSYSTEM('SLCACHE',
>  bld.SAMBA3_SUBSYSTEM('DCUTIL',
>                      source='''
>                             libsmb/namequery_dc.c
> -                           libsmb/trustdom_cache.c
>                             libsmb/dsgetdcname.c
>                             ''',
>                      deps='''
> -- 
> 2.11.0
> 
> 
> From 1fc7a07967bd6101a9c28a7dd5ec21a3deb41ea6 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Sat, 10 Mar 2018 15:31:11 +0100
> Subject: [PATCH 4/8] libsmb: Give namequery.c its own header
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/include/proto.h                     |  90 ----------------------
>  source3/libads/kerberos.c                   |   1 +
>  source3/libads/ldap.c                       |   1 +
>  source3/libnet/libnet_join.c                |   1 +
>  source3/libsmb/cliconnect.c                 |   1 +
>  source3/libsmb/dsgetdcname.c                |   1 +
>  source3/libsmb/libsmb_dir.c                 |   1 +
>  source3/libsmb/namequery.c                  |   1 +
>  source3/libsmb/namequery.h                  | 115 ++++++++++++++++++++++++++++
>  source3/libsmb/namequery_dc.c               |   1 +
>  source3/rpc_client/cli_pipe.c               |   1 +
>  source3/rpc_server/spoolss/srv_spoolss_nt.c |   1 +
>  source3/smbd/reply.c                        |   1 +
>  source3/torture/torture.c                   |   1 +
>  source3/utils/net_ads.c                     |   1 +
>  source3/utils/net_lookup.c                  |   1 +
>  source3/utils/net_rpc.c                     |   1 +
>  source3/utils/net_time.c                    |   1 +
>  source3/utils/net_util.c                    |   1 +
>  source3/utils/nmblookup.c                   |   1 +
>  source3/utils/smbfilter.c                   |   1 +
>  source3/utils/smbtree.c                     |   1 +
>  source3/winbindd/idmap_ad.c                 |   1 +
>  source3/winbindd/winbindd_ads.c             |   1 +
>  source3/winbindd/winbindd_cm.c              |   1 +
>  source3/winbindd/winbindd_pam.c             |   1 +
>  source3/winbindd/winbindd_wins_byip.c       |   1 +
>  source3/winbindd/winbindd_wins_byname.c     |   1 +
>  28 files changed, 141 insertions(+), 90 deletions(-)
>  create mode 100644 source3/libsmb/namequery.h
> 
> diff --git a/source3/include/proto.h b/source3/include/proto.h
> index 778107a4d84..3dab5d7ade6 100644
> --- a/source3/include/proto.h
> +++ b/source3/include/proto.h
> @@ -713,96 +713,6 @@ bool namecache_status_fetch(const char *keyname,
>  				const struct sockaddr_storage *keyip,
>  				char *srvname_out);
>  
> -/* The following definitions come from libsmb/namequery.c  */
> -
> -bool saf_store( const char *domain, const char *servername );
> -bool saf_join_store( const char *domain, const char *servername );
> -bool saf_delete( const char *domain );
> -char *saf_fetch(TALLOC_CTX *mem_ctx, const char *domain );
> -struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
> -					  struct tevent_context *ev,
> -					  struct nmb_name *name,
> -					  const struct sockaddr_storage *addr);
> -NTSTATUS node_status_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> -				struct node_status **pnode_status,
> -				int *pnum_names,
> -				struct node_status_extra *extra);
> -NTSTATUS node_status_query(TALLOC_CTX *mem_ctx, struct nmb_name *name,
> -			   const struct sockaddr_storage *addr,
> -			   struct node_status **pnode_status,
> -			   int *pnum_names,
> -			   struct node_status_extra *extra);
> -bool name_status_find(const char *q_name,
> -			int q_type,
> -			int type,
> -			const struct sockaddr_storage *to_ss,
> -			fstring name);
> -int remove_duplicate_addrs2(struct ip_service *iplist, int count );
> -struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
> -				   struct tevent_context *ev,
> -				   const char *name, int name_type,
> -				   bool bcast, bool recurse,
> -				   const struct sockaddr_storage *addr);
> -NTSTATUS name_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> -			 struct sockaddr_storage **addrs, int *num_addrs,
> -			 uint8_t *flags);
> -NTSTATUS name_query(const char *name, int name_type,
> -		    bool bcast, bool recurse,
> -		    const struct sockaddr_storage *to_ss,
> -		    TALLOC_CTX *mem_ctx,
> -		    struct sockaddr_storage **addrs,
> -		    int *num_addrs, uint8_t *flags);
> -struct tevent_req *name_resolve_bcast_send(TALLOC_CTX *mem_ctx,
> -					   struct tevent_context *ev,
> -					   const char *name,
> -					   int name_type);
> -NTSTATUS name_resolve_bcast_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> -				 struct sockaddr_storage **addrs,
> -				 int *num_addrs);
> -NTSTATUS name_resolve_bcast(const char *name,
> -			int name_type,
> -			TALLOC_CTX *mem_ctx,
> -			struct sockaddr_storage **return_iplist,
> -			int *return_count);
> -struct tevent_req *resolve_wins_send(TALLOC_CTX *mem_ctx,
> -				     struct tevent_context *ev,
> -				     const char *name,
> -				     int name_type);
> -NTSTATUS resolve_wins_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> -			   struct sockaddr_storage **addrs,
> -			   int *num_addrs, uint8_t *flags);
> -NTSTATUS resolve_wins(const char *name,
> -		int name_type,
> -		TALLOC_CTX *mem_ctx,
> -		struct sockaddr_storage **return_iplist,
> -		int *return_count);
> -NTSTATUS internal_resolve_name(const char *name,
> -			        int name_type,
> -				const char *sitename,
> -				struct ip_service **return_iplist,
> -				int *return_count,
> -				const char **resolve_order);
> -bool resolve_name(const char *name,
> -		struct sockaddr_storage *return_ss,
> -		int name_type,
> -		bool prefer_ipv4);
> -NTSTATUS resolve_name_list(TALLOC_CTX *ctx,
> -		const char *name,
> -		int name_type,
> -		struct sockaddr_storage **return_ss_arr,
> -		unsigned int *p_num_entries);
> -bool find_master_ip(const char *group, struct sockaddr_storage *master_ss);
> -bool get_pdc_ip(const char *domain, struct sockaddr_storage *pss);
> -NTSTATUS get_sorted_dc_list( const char *domain,
> -			const char *sitename,
> -			struct ip_service **ip_list,
> -			int *count,
> -			bool ads_only );
> -NTSTATUS get_kdc_list( const char *realm,
> -			const char *sitename,
> -			struct ip_service **ip_list,
> -			int *count);
> -
>  /* The following definitions come from libsmb/namequery_dc.c  */
>  
>  bool get_dc_name(const char *domain,
> diff --git a/source3/libads/kerberos.c b/source3/libads/kerberos.c
> index 82f118a021e..e623f2456a8 100644
> --- a/source3/libads/kerberos.c
> +++ b/source3/libads/kerberos.c
> @@ -22,6 +22,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "system/filesys.h"
>  #include "smb_krb5.h"
>  #include "../librpc/gen_ndr/ndr_misc.h"
> diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
> index f9463043cc8..e8dcd1baa57 100644
> --- a/source3/libads/ldap.c
> +++ b/source3/libads/ldap.c
> @@ -31,6 +31,7 @@
>  #include "../libcli/security/security.h"
>  #include "../librpc/gen_ndr/netlogon.h"
>  #include "lib/param/loadparm.h"
> +#include "libsmb/namequery.h"
>  
>  #ifdef HAVE_LDAP
>  
> diff --git a/source3/libnet/libnet_join.c b/source3/libnet/libnet_join.c
> index bbe604b729e..5bf0b7fff2d 100644
> --- a/source3/libnet/libnet_join.c
> +++ b/source3/libnet/libnet_join.c
> @@ -20,6 +20,7 @@
>  
>  #include "includes.h"
>  #include "ads.h"
> +#include "libsmb/namequery.h"
>  #include "librpc/gen_ndr/ndr_libnet_join.h"
>  #include "libnet/libnet_join.h"
>  #include "libcli/auth/libcli_auth.h"
> diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
> index 7689910fae9..837299d9220 100644
> --- a/source3/libsmb/cliconnect.c
> +++ b/source3/libsmb/cliconnect.c
> @@ -22,6 +22,7 @@
>  
>  #include "includes.h"
>  #include "libsmb/libsmb.h"
> +#include "libsmb/namequery.h"
>  #include "auth_info.h"
>  #include "../libcli/auth/libcli_auth.h"
>  #include "../libcli/auth/spnego.h"
> diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c
> index a7fe5a1e748..98649006324 100644
> --- a/source3/libsmb/dsgetdcname.c
> +++ b/source3/libsmb/dsgetdcname.c
> @@ -21,6 +21,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "libads/sitename_cache.h"
>  #include "../librpc/gen_ndr/ndr_netlogon.h"
>  #include "libads/cldap.h"
> diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c
> index 72441c46736..8c3fed672f8 100644
> --- a/source3/libsmb/libsmb_dir.c
> +++ b/source3/libsmb/libsmb_dir.c
> @@ -23,6 +23,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "libsmb/libsmb.h"
>  #include "auth_info.h"
>  #include "libsmbclient.h"
> diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
> index b616a64b896..8c23f09f442 100644
> --- a/source3/libsmb/namequery.c
> +++ b/source3/libsmb/namequery.c
> @@ -19,6 +19,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "../lib/util/tevent_ntstatus.h"
>  #include "libads/sitename_cache.h"
>  #include "../lib/addns/dnsquery.h"
> diff --git a/source3/libsmb/namequery.h b/source3/libsmb/namequery.h
> new file mode 100644
> index 00000000000..d7bd4d338b4
> --- /dev/null
> +++ b/source3/libsmb/namequery.h
> @@ -0,0 +1,115 @@
> +/*
> + * Unix SMB/CIFS implementation.
> + * Copyright (C) Volker Lendecke 2018
> + *
> + * 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 <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __LIBSMB_NAMEQUERY_H__
> +#define __LIBSMB_NAMEQUERY_H__
> +
> +#include "includes.h"
> +#include <tevent.h>
> +
> +/* The following definitions come from libsmb/namequery.c  */
> +
> +bool saf_store( const char *domain, const char *servername );
> +bool saf_join_store( const char *domain, const char *servername );
> +bool saf_delete( const char *domain );
> +char *saf_fetch(TALLOC_CTX *mem_ctx, const char *domain );
> +struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
> +					  struct tevent_context *ev,
> +					  struct nmb_name *name,
> +					  const struct sockaddr_storage *addr);
> +NTSTATUS node_status_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +				struct node_status **pnode_status,
> +				int *pnum_names,
> +				struct node_status_extra *extra);
> +NTSTATUS node_status_query(TALLOC_CTX *mem_ctx, struct nmb_name *name,
> +			   const struct sockaddr_storage *addr,
> +			   struct node_status **pnode_status,
> +			   int *pnum_names,
> +			   struct node_status_extra *extra);
> +bool name_status_find(const char *q_name,
> +			int q_type,
> +			int type,
> +			const struct sockaddr_storage *to_ss,
> +			fstring name);
> +int remove_duplicate_addrs2(struct ip_service *iplist, int count );
> +struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
> +				   struct tevent_context *ev,
> +				   const char *name, int name_type,
> +				   bool bcast, bool recurse,
> +				   const struct sockaddr_storage *addr);
> +NTSTATUS name_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +			 struct sockaddr_storage **addrs, int *num_addrs,
> +			 uint8_t *flags);
> +NTSTATUS name_query(const char *name, int name_type,
> +		    bool bcast, bool recurse,
> +		    const struct sockaddr_storage *to_ss,
> +		    TALLOC_CTX *mem_ctx,
> +		    struct sockaddr_storage **addrs,
> +		    int *num_addrs, uint8_t *flags);
> +struct tevent_req *name_resolve_bcast_send(TALLOC_CTX *mem_ctx,
> +					   struct tevent_context *ev,
> +					   const char *name,
> +					   int name_type);
> +NTSTATUS name_resolve_bcast_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +				 struct sockaddr_storage **addrs,
> +				 int *num_addrs);
> +NTSTATUS name_resolve_bcast(const char *name,
> +			int name_type,
> +			TALLOC_CTX *mem_ctx,
> +			struct sockaddr_storage **return_iplist,
> +			int *return_count);
> +struct tevent_req *resolve_wins_send(TALLOC_CTX *mem_ctx,
> +				     struct tevent_context *ev,
> +				     const char *name,
> +				     int name_type);
> +NTSTATUS resolve_wins_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
> +			   struct sockaddr_storage **addrs,
> +			   int *num_addrs, uint8_t *flags);
> +NTSTATUS resolve_wins(const char *name,
> +		int name_type,
> +		TALLOC_CTX *mem_ctx,
> +		struct sockaddr_storage **return_iplist,
> +		int *return_count);
> +NTSTATUS internal_resolve_name(const char *name,
> +			        int name_type,
> +				const char *sitename,
> +				struct ip_service **return_iplist,
> +				int *return_count,
> +				const char **resolve_order);
> +bool resolve_name(const char *name,
> +		struct sockaddr_storage *return_ss,
> +		int name_type,
> +		bool prefer_ipv4);
> +NTSTATUS resolve_name_list(TALLOC_CTX *ctx,
> +		const char *name,
> +		int name_type,
> +		struct sockaddr_storage **return_ss_arr,
> +		unsigned int *p_num_entries);
> +bool find_master_ip(const char *group, struct sockaddr_storage *master_ss);
> +bool get_pdc_ip(const char *domain, struct sockaddr_storage *pss);
> +NTSTATUS get_sorted_dc_list( const char *domain,
> +			const char *sitename,
> +			struct ip_service **ip_list,
> +			int *count,
> +			bool ads_only );
> +NTSTATUS get_kdc_list( const char *realm,
> +			const char *sitename,
> +			struct ip_service **ip_list,
> +			int *count);
> +
> +#endif
> diff --git a/source3/libsmb/namequery_dc.c b/source3/libsmb/namequery_dc.c
> index d08456590f6..4ee5b5278e4 100644
> --- a/source3/libsmb/namequery_dc.c
> +++ b/source3/libsmb/namequery_dc.c
> @@ -23,6 +23,7 @@
>  
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "libads/sitename_cache.h"
>  #include "ads.h"
>  #include "../librpc/gen_ndr/nbt.h"
> diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
> index d449a828b5a..81b6bfb75bf 100644
> --- a/source3/rpc_client/cli_pipe.c
> +++ b/source3/rpc_client/cli_pipe.c
> @@ -20,6 +20,7 @@
>   */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "../lib/util/tevent_ntstatus.h"
>  #include "librpc/gen_ndr/ndr_epmapper_c.h"
>  #include "../librpc/gen_ndr/ndr_dssetup.h"
> diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
> index 2f42e6d4c39..296d8025429 100644
> --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
> +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
> @@ -28,6 +28,7 @@
>     up, all the errors returned are DOS errors, not NT status codes. */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "ntdomain.h"
>  #include "nt_printing.h"
>  #include "srv_spoolss_util.h"
> diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
> index 881667a6b44..92a65f5b90b 100644
> --- a/source3/smbd/reply.c
> +++ b/source3/smbd/reply.c
> @@ -25,6 +25,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/namequery.h"
>  #include "system/filesys.h"
>  #include "printing.h"
>  #include "smbd/smbd.h"
> diff --git a/source3/torture/torture.c b/source3/torture/torture.c
> index df6604de9fe..56cc6ff3628 100644
> --- a/source3/torture/torture.c
> +++ b/source3/torture/torture.c
> @@ -20,6 +20,7 @@
>  
>  #include "includes.h"
>  #include "system/shmem.h"
> +#include "libsmb/namequery.h"
>  #include "wbc_async.h"
>  #include "torture/proto.h"
>  #include "libcli/security/security.h"
> diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c
> index c4c1a0d4051..ffa67d8f525 100644
> --- a/source3/utils/net_ads.c
> +++ b/source3/utils/net_ads.c
> @@ -22,6 +22,7 @@
>  
>  #include "includes.h"
>  #include "utils/net.h"
> +#include "libsmb/namequery.h"
>  #include "rpc_client/cli_pipe.h"
>  #include "librpc/gen_ndr/ndr_krb5pac.h"
>  #include "../librpc/gen_ndr/ndr_spoolss.h"
> diff --git a/source3/utils/net_lookup.c b/source3/utils/net_lookup.c
> index 597e098e2e1..4e7a74d1e00 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 "libsmb/namequery.h"
>  #include "libads/sitename_cache.h"
>  #include "../lib/addns/dnsquery.h"
>  #include "../librpc/gen_ndr/ndr_netlogon.h"
> diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
> index 8a989d790f2..52d313edfaa 100644
> --- a/source3/utils/net_rpc.c
> +++ b/source3/utils/net_rpc.c
> @@ -22,6 +22,7 @@
>  
>  #include "includes.h"
>  #include "utils/net.h"
> +#include "libsmb/namequery.h"
>  #include "rpc_client/cli_pipe.h"
>  #include "../libcli/auth/libcli_auth.h"
>  #include "../librpc/gen_ndr/ndr_samr_c.h"
> diff --git a/source3/utils/net_time.c b/source3/utils/net_time.c
> index 595d903c0be..0091fc86333 100644
> --- a/source3/utils/net_time.c
> +++ b/source3/utils/net_time.c
> @@ -19,6 +19,7 @@
>  #include "includes.h"
>  #include "utils/net.h"
>  #include "libsmb/nmblib.h"
> +#include "libsmb/namequery.h"
>  #include "libsmb/libsmb.h"
>  #include "../libcli/smb/smbXcli_base.h"
>  
> diff --git a/source3/utils/net_util.c b/source3/utils/net_util.c
> index 86a46672f56..a84b4f5500e 100644
> --- a/source3/utils/net_util.c
> +++ b/source3/utils/net_util.c
> @@ -21,6 +21,7 @@
>  
>  #include "includes.h"
>  #include "utils/net.h"
> +#include "libsmb/namequery.h"
>  #include "rpc_client/cli_pipe.h"
>  #include "../librpc/gen_ndr/ndr_lsa_c.h"
>  #include "rpc_client/cli_lsarpc.h"
> diff --git a/source3/utils/nmblookup.c b/source3/utils/nmblookup.c
> index dadd30fdb74..602f3cd4624 100644
> --- a/source3/utils/nmblookup.c
> +++ b/source3/utils/nmblookup.c
> @@ -22,6 +22,7 @@
>  #include "includes.h"
>  #include "popt_common.h"
>  #include "libsmb/nmblib.h"
> +#include "libsmb/namequery.h"
>  
>  static bool give_flags = false;
>  static bool use_bcast = true;
> diff --git a/source3/utils/smbfilter.c b/source3/utils/smbfilter.c
> index 85aca4f9334..35fb7521384 100644
> --- a/source3/utils/smbfilter.c
> +++ b/source3/utils/smbfilter.c
> @@ -20,6 +20,7 @@
>  #include "includes.h"
>  #include "system/filesys.h"
>  #include "system/select.h"
> +#include "libsmb/namequery.h"
>  #include "../lib/util/select.h"
>  #include "libsmb/nmblib.h"
>  #include "lib/util/sys_rw_data.h"
> diff --git a/source3/utils/smbtree.c b/source3/utils/smbtree.c
> index fb0c130d350..3b539ef1045 100644
> --- a/source3/utils/smbtree.c
> +++ b/source3/utils/smbtree.c
> @@ -24,6 +24,7 @@
>  #include "rpc_client/cli_pipe.h"
>  #include "../librpc/gen_ndr/ndr_srvsvc_c.h"
>  #include "libsmb/libsmb.h"
> +#include "libsmb/namequery.h"
>  #include "libsmb/clirap.h"
>  
>  static int use_bcast;
> diff --git a/source3/winbindd/idmap_ad.c b/source3/winbindd/idmap_ad.c
> index 15304109a2d..8f1cb375dfb 100644
> --- a/source3/winbindd/idmap_ad.c
> +++ b/source3/winbindd/idmap_ad.c
> @@ -19,6 +19,7 @@
>  
>  #include "includes.h"
>  #include "winbindd.h"
> +#include "libsmb/namequery.h"
>  #include "idmap.h"
>  #include "tldap_gensec_bind.h"
>  #include "tldap_util.h"
> diff --git a/source3/winbindd/winbindd_ads.c b/source3/winbindd/winbindd_ads.c
> index 725fa4ff977..76d6a304366 100644
> --- a/source3/winbindd/winbindd_ads.c
> +++ b/source3/winbindd/winbindd_ads.c
> @@ -24,6 +24,7 @@
>  #include "includes.h"
>  #include "winbindd.h"
>  #include "winbindd_ads.h"
> +#include "libsmb/namequery.h"
>  #include "rpc_client/rpc_client.h"
>  #include "../librpc/gen_ndr/ndr_netlogon_c.h"
>  #include "../libds/common/flags.h"
> diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
> index bf5a2b4d7b1..30f65c66bc4 100644
> --- a/source3/winbindd/winbindd_cm.c
> +++ b/source3/winbindd/winbindd_cm.c
> @@ -60,6 +60,7 @@
>  
>  #include "includes.h"
>  #include "winbindd.h"
> +#include "libsmb/namequery.h"
>  #include "../libcli/auth/libcli_auth.h"
>  #include "../librpc/gen_ndr/ndr_netlogon_c.h"
>  #include "rpc_client/cli_pipe.h"
> diff --git a/source3/winbindd/winbindd_pam.c b/source3/winbindd/winbindd_pam.c
> index 8403d7d57b6..e273ab3b8be 100644
> --- a/source3/winbindd/winbindd_pam.c
> +++ b/source3/winbindd/winbindd_pam.c
> @@ -24,6 +24,7 @@
>  
>  #include "includes.h"
>  #include "winbindd.h"
> +#include "libsmb/namequery.h"
>  #include "../libcli/auth/libcli_auth.h"
>  #include "../librpc/gen_ndr/ndr_samr_c.h"
>  #include "rpc_client/cli_pipe.h"
> diff --git a/source3/winbindd/winbindd_wins_byip.c b/source3/winbindd/winbindd_wins_byip.c
> index c995dd1b0dc..4d3dddf0864 100644
> --- a/source3/winbindd/winbindd_wins_byip.c
> +++ b/source3/winbindd/winbindd_wins_byip.c
> @@ -19,6 +19,7 @@
>  
>  #include "includes.h"
>  #include "winbindd.h"
> +#include "libsmb/namequery.h"
>  #include "librpc/gen_ndr/ndr_winbind_c.h"
>  #include "libsmb/nmblib.h"
>  
> diff --git a/source3/winbindd/winbindd_wins_byname.c b/source3/winbindd/winbindd_wins_byname.c
> index db6a04d4ecb..8661401331a 100644
> --- a/source3/winbindd/winbindd_wins_byname.c
> +++ b/source3/winbindd/winbindd_wins_byname.c
> @@ -19,6 +19,7 @@
>  
>  #include "includes.h"
>  #include "winbindd.h"
> +#include "libsmb/namequery.h"
>  #include "librpc/gen_ndr/ndr_winbind_c.h"
>  #include "libsmb/nmblib.h"
>  #include "lib/util/string_wrappers.h"
> -- 
> 2.11.0
> 
> 
> From 196a8ef8c24d6b6d8dd7f6dfae10395ae0344628 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Fri, 5 Jan 2018 14:21:05 +0100
> Subject: [PATCH 5/8] libsmb: Give dsgetdcname.c its own header
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/include/proto.h                     | 12 ----------
>  source3/lib/netapi/getdc.c                  |  1 +
>  source3/lib/netapi/joindomain.c             |  1 +
>  source3/lib/netapi/serverinfo.c             |  1 +
>  source3/libnet/libnet_join.c                |  1 +
>  source3/libsmb/dsgetdcname.c                |  1 +
>  source3/libsmb/dsgetdcname.h                | 37 +++++++++++++++++++++++++++++
>  source3/rpc_server/netlogon/srv_netlog_nt.c |  1 +
>  source3/utils/net_lookup.c                  |  1 +
>  source3/utils/net_rpc.c                     |  1 +
>  source3/winbindd/winbindd_dual_srv.c        |  1 +
>  11 files changed, 46 insertions(+), 12 deletions(-)
>  create mode 100644 source3/libsmb/dsgetdcname.h
> 
> diff --git a/source3/include/proto.h b/source3/include/proto.h
> index 3dab5d7ade6..4c51e4d3059 100644
> --- a/source3/include/proto.h
> +++ b/source3/include/proto.h
> @@ -676,18 +676,6 @@ NTSTATUS check_negative_conn_cache( const char *domain, const char *server);
>  void add_failed_connection_entry(const char *domain, const char *server, NTSTATUS result) ;
>  void flush_negative_conn_cache_for_domain(const char *domain);
>  
> -/* The following definitions come from libsmb/dsgetdcname.c  */
> -
> -struct netr_DsRGetDCNameInfo;
> -
> -NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx,
> -		     struct messaging_context *msg_ctx,
> -		     const char *domain_name,
> -		     const struct GUID *domain_guid,
> -		     const char *site_name,
> -		     uint32_t flags,
> -		     struct netr_DsRGetDCNameInfo **info);
> -
>  /* The following definitions come from libsmb/errormap.c  */
>  
>  NTSTATUS dos_to_ntstatus(uint8_t eclass, uint32_t ecode);
> diff --git a/source3/lib/netapi/getdc.c b/source3/lib/netapi/getdc.c
> index 2d47ee45840..d4633752c78 100644
> --- a/source3/lib/netapi/getdc.c
> +++ b/source3/lib/netapi/getdc.c
> @@ -24,6 +24,7 @@
>  #include "lib/netapi/netapi.h"
>  #include "lib/netapi/netapi_private.h"
>  #include "lib/netapi/libnetapi.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  /********************************************************************
>  ********************************************************************/
> diff --git a/source3/lib/netapi/joindomain.c b/source3/lib/netapi/joindomain.c
> index 7d27bd9d0fe..ff2154ba803 100644
> --- a/source3/lib/netapi/joindomain.c
> +++ b/source3/lib/netapi/joindomain.c
> @@ -29,6 +29,7 @@
>  #include "../librpc/gen_ndr/ndr_wkssvc_c.h"
>  #include "rpc_client/cli_pipe.h"
>  #include "secrets.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  /****************************************************************
>  ****************************************************************/
> diff --git a/source3/lib/netapi/serverinfo.c b/source3/lib/netapi/serverinfo.c
> index 2fd7668c682..7d9cc481c8c 100644
> --- a/source3/lib/netapi/serverinfo.c
> +++ b/source3/lib/netapi/serverinfo.c
> @@ -26,6 +26,7 @@
>  #include "../librpc/gen_ndr/ndr_srvsvc_c.h"
>  #include "lib/smbconf/smbconf.h"
>  #include "lib/smbconf/smbconf_reg.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  /****************************************************************
>  ****************************************************************/
> diff --git a/source3/libnet/libnet_join.c b/source3/libnet/libnet_join.c
> index 5bf0b7fff2d..a9405e8d288 100644
> --- a/source3/libnet/libnet_join.c
> +++ b/source3/libnet/libnet_join.c
> @@ -44,6 +44,7 @@
>  #include "libcli/auth/netlogon_creds_cli.h"
>  #include "auth/credentials/credentials.h"
>  #include "krb5_env.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  /****************************************************************
>  ****************************************************************/
> diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c
> index 98649006324..3afe6a85b91 100644
> --- a/source3/libsmb/dsgetdcname.c
> +++ b/source3/libsmb/dsgetdcname.c
> @@ -21,6 +21,7 @@
>  */
>  
>  #include "includes.h"
> +#include "libsmb/dsgetdcname.h"
>  #include "libsmb/namequery.h"
>  #include "libads/sitename_cache.h"
>  #include "../librpc/gen_ndr/ndr_netlogon.h"
> diff --git a/source3/libsmb/dsgetdcname.h b/source3/libsmb/dsgetdcname.h
> new file mode 100644
> index 00000000000..0aa06c32b83
> --- /dev/null
> +++ b/source3/libsmb/dsgetdcname.h
> @@ -0,0 +1,37 @@
> +/*
> + * Unix SMB/CIFS implementation.
> + * Copyright (C) Volker Lendecke 2018
> + *
> + * 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 <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __LIBSMB_DSGETDCNAME_H__
> +#define __LIBSMB_DSGETDCNAME_H__
> +
> +#include "replace.h"
> +#include <talloc.h>
> +#include "librpc/gen_ndr/misc.h"
> +
> +struct netr_DsRGetDCNameInfo;
> +struct messaging_context;
> +
> +NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx,
> +		     struct messaging_context *msg_ctx,
> +		     const char *domain_name,
> +		     const struct GUID *domain_guid,
> +		     const char *site_name,
> +		     uint32_t flags,
> +		     struct netr_DsRGetDCNameInfo **info);
> +
> +#endif
> diff --git a/source3/rpc_server/netlogon/srv_netlog_nt.c b/source3/rpc_server/netlogon/srv_netlog_nt.c
> index 83e68417c76..9b9947455ed 100644
> --- a/source3/rpc_server/netlogon/srv_netlog_nt.c
> +++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
> @@ -47,6 +47,7 @@
>  #include "messages.h"
>  #include "../lib/tsocket/tsocket.h"
>  #include "lib/param/param.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  extern userdom_struct current_user_info;
>  
> diff --git a/source3/utils/net_lookup.c b/source3/utils/net_lookup.c
> index 4e7a74d1e00..05a3dbc6e2b 100644
> --- a/source3/utils/net_lookup.c
> +++ b/source3/utils/net_lookup.c
> @@ -25,6 +25,7 @@
>  #include "smb_krb5.h"
>  #include "../libcli/security/security.h"
>  #include "passdb/lookup_sid.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  int net_lookup_usage(struct net_context *c, int argc, const char **argv)
>  {
> diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
> index 52d313edfaa..b99a036fca1 100644
> --- a/source3/utils/net_rpc.c
> +++ b/source3/utils/net_rpc.c
> @@ -47,6 +47,7 @@
>  #include "nsswitch/libwbclient/wbclient.h"
>  #include "passdb.h"
>  #include "../libcli/smb/smbXcli_base.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  static int net_mode_share;
>  static NTSTATUS sync_files(struct copy_clistate *cp_clistate, const char *mask);
> diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c
> index 4cea73feaf9..8cb05f06db6 100644
> --- a/source3/winbindd/winbindd_dual_srv.c
> +++ b/source3/winbindd/winbindd_dual_srv.c
> @@ -35,6 +35,7 @@
>  #include "../source4/dsdb/samdb/samdb.h"
>  #include "rpc_client/cli_netlogon.h"
>  #include "rpc_client/util_netlogon.h"
> +#include "libsmb/dsgetdcname.h"
>  
>  void _wbint_Ping(struct pipes_struct *p, struct wbint_Ping *r)
>  {
> -- 
> 2.11.0
> 
> 
> From 38a4621b466a46ee0c20a68264313bf99fbceed2 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Sat, 10 Mar 2018 18:01:08 +0100
> Subject: [PATCH 6/8] libsmb: Introduce a helper variable
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/libsmb/clidgram.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/source3/libsmb/clidgram.c b/source3/libsmb/clidgram.c
> index 4ae57a30d33..cb319b1a7e8 100644
> --- a/source3/libsmb/clidgram.c
> +++ b/source3/libsmb/clidgram.c
> @@ -308,6 +308,7 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  	struct tevent_req *req, *subreq;
>  	struct nbt_getdc_state *state;
>  	uint16_t dgm_id;
> +	bool ok;
>  
>  	req = tevent_req_create(mem_ctx, &state, struct nbt_getdc_state);
>  	if (req == NULL) {
> @@ -338,9 +339,10 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  
>  	generate_random_buffer((uint8_t *)(void *)&dgm_id, sizeof(dgm_id));
>  
> -	if (!prep_getdc_request(dc_addr, domain_name, sid, nt_version,
> +	ok = prep_getdc_request(dc_addr, domain_name, sid, nt_version,
>  				state->my_mailslot, dgm_id & 0x7fff,
> -				&state->p)) {
> +				&state->p);
> +	if (!ok) {
>  		DEBUG(3, ("prep_getdc_request failed\n"));
>  		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
>  		return tevent_req_post(req, ev);
> -- 
> 2.11.0
> 
> 
> From 862584ac8b39a6917a03542181d118e2f8fe6a58 Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Sat, 10 Mar 2018 18:06:03 +0100
> Subject: [PATCH 7/8] libsmb: Pass "account_name/flags" through
>  prep_getdc_request
> 
> Don't hardcode values that we might want to change later
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/libsmb/clidgram.c | 30 +++++++++++++++++++-----------
>  1 file changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/source3/libsmb/clidgram.c b/source3/libsmb/clidgram.c
> index cb319b1a7e8..7b10f2601c6 100644
> --- a/source3/libsmb/clidgram.c
> +++ b/source3/libsmb/clidgram.c
> @@ -120,6 +120,8 @@ static char *mailslot_name(TALLOC_CTX *mem_ctx, struct in_addr dc_ip)
>  }
>  
>  static bool prep_getdc_request(const struct sockaddr_storage *dc_ss,
> +			       const char *account_name,
> +			       uint32_t account_flags,
>  			       const char *domain_name,
>  			       const struct dom_sid *sid,
>  			       uint32_t nt_version,
> @@ -128,7 +130,6 @@ static bool prep_getdc_request(const struct sockaddr_storage *dc_ss,
>  			       struct packet_struct *p)
>  {
>  	TALLOC_CTX *frame = talloc_stackframe();
> -	const char *my_acct_name;
>  	struct nbt_netlogon_packet packet;
>  	struct NETLOGON_SAM_LOGON_REQUEST *s;
>  	enum ndr_err_code ndr_err;
> @@ -143,19 +144,14 @@ static bool prep_getdc_request(const struct sockaddr_storage *dc_ss,
>  		my_sid = *sid;
>  	}
>  
> -	my_acct_name = talloc_asprintf(talloc_tos(), "%s$", lp_netbios_name());
> -	if (my_acct_name == NULL) {
> -		goto fail;
> -	}
> -
>  	packet.command	= LOGON_SAM_LOGON_REQUEST;
>  	s		= &packet.req.logon;
>  
>  	s->request_count	= 0;
>  	s->computer_name	= lp_netbios_name();
> -	s->user_name		= my_acct_name;
> +	s->user_name		= account_name;
>  	s->mailslot_name	= my_mailslot;
> -	s->acct_control		= ACB_WSTRUST;
> +	s->acct_control		= account_flags;
>  	s->sid			= my_sid;
>  	s->nt_version		= nt_version;
>  	s->lmnt_token		= 0xffff;
> @@ -339,9 +335,21 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  
>  	generate_random_buffer((uint8_t *)(void *)&dgm_id, sizeof(dgm_id));
>  
> -	ok = prep_getdc_request(dc_addr, domain_name, sid, nt_version,
> -				state->my_mailslot, dgm_id & 0x7fff,
> -				&state->p);
> +	{
> +		size_t len = strlen(lp_netbios_name());
> +		char my_acct_name[len+2];
> +
> +		snprintf(my_acct_name,
> +			 sizeof(my_acct_name),
> +			 "%s$",
> +			 lp_netbios_name());
> +
> +		ok = prep_getdc_request(dc_addr, my_acct_name, ACB_WSTRUST,
> +					domain_name, sid, nt_version,
> +					state->my_mailslot, dgm_id & 0x7fff,
> +					&state->p);
> +	}
> +
>  	if (!ok) {
>  		DEBUG(3, ("prep_getdc_request failed\n"));
>  		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
> -- 
> 2.11.0
> 
> 
> From e1a0256fed4ad33845037ef9f6ffbed301dcce1e Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Sat, 10 Mar 2018 18:06:03 +0100
> Subject: [PATCH 8/8] libsmb: Pass "account_name/flags" through nb_getdc
> 
> Don't hardcode values that we might want to change later
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  source3/libsmb/clidgram.c      | 24 +++++++++---------------
>  source3/libsmb/clidgram.h      |  4 ++++
>  source3/libsmb/dsgetdcname.c   |  9 ++++++++-
>  source3/winbindd/winbindd_cm.c | 18 +++++++++++++++---
>  4 files changed, 36 insertions(+), 19 deletions(-)
> 
> diff --git a/source3/libsmb/clidgram.c b/source3/libsmb/clidgram.c
> index 7b10f2601c6..bed507626c1 100644
> --- a/source3/libsmb/clidgram.c
> +++ b/source3/libsmb/clidgram.c
> @@ -299,6 +299,8 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  				  const struct sockaddr_storage *dc_addr,
>  				  const char *domain_name,
>  				  const struct dom_sid *sid,
> +				  const char *account_name,
> +				  uint32_t account_flags,
>  				  uint32_t nt_version)
>  {
>  	struct tevent_req *req, *subreq;
> @@ -335,20 +337,10 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  
>  	generate_random_buffer((uint8_t *)(void *)&dgm_id, sizeof(dgm_id));
>  
> -	{
> -		size_t len = strlen(lp_netbios_name());
> -		char my_acct_name[len+2];
> -
> -		snprintf(my_acct_name,
> -			 sizeof(my_acct_name),
> -			 "%s$",
> -			 lp_netbios_name());
> -
> -		ok = prep_getdc_request(dc_addr, my_acct_name, ACB_WSTRUST,
> -					domain_name, sid, nt_version,
> -					state->my_mailslot, dgm_id & 0x7fff,
> -					&state->p);
> -	}
> +	ok = prep_getdc_request(dc_addr, account_name, account_flags,
> +				domain_name, sid, nt_version,
> +				state->my_mailslot, dgm_id & 0x7fff,
> +				&state->p);
>  
>  	if (!ok) {
>  		DEBUG(3, ("prep_getdc_request failed\n"));
> @@ -452,6 +444,8 @@ NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
>  		   const struct sockaddr_storage *dc_addr,
>  		   const char *domain_name,
>  		   const struct dom_sid *sid,
> +		   const char *account_name,
> +		   uint32_t account_flags,
>  		   uint32_t nt_version,
>  		   TALLOC_CTX *mem_ctx,
>  		   uint32_t *pnt_version,
> @@ -468,7 +462,7 @@ NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
>  		goto fail;
>  	}
>  	req = nbt_getdc_send(ev, ev, msg_ctx, dc_addr, domain_name,
> -			     sid, nt_version);
> +			     sid, account_name, account_flags, nt_version);
>  	if (req == NULL) {
>  		goto fail;
>  	}
> diff --git a/source3/libsmb/clidgram.h b/source3/libsmb/clidgram.h
> index 6cd6222df68..46e11f42676 100644
> --- a/source3/libsmb/clidgram.h
> +++ b/source3/libsmb/clidgram.h
> @@ -32,6 +32,8 @@ struct tevent_req *nbt_getdc_send(TALLOC_CTX *mem_ctx,
>  				  const struct sockaddr_storage *dc_addr,
>  				  const char *domain_name,
>  				  const struct dom_sid *sid,
> +				  const char *account_name,
> +				  uint32_t account_flags,
>  				  uint32_t nt_version);
>  NTSTATUS nbt_getdc_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
>  			uint32_t *nt_version, const char **dc_name,
> @@ -41,6 +43,8 @@ NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
>  		   const struct sockaddr_storage *dc_addr,
>  		   const char *domain_name,
>  		   const struct dom_sid *sid,
> +		   const char *account_name,
> +		   uint32_t account_flags,
>  		   uint32_t nt_version,
>  		   TALLOC_CTX *mem_ctx,
>  		   uint32_t *pnt_version,
> diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c
> index 3afe6a85b91..bf96a243379 100644
> --- a/source3/libsmb/dsgetdcname.c
> +++ b/source3/libsmb/dsgetdcname.c
> @@ -911,6 +911,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
>  	uint32_t nt_version = NETLOGON_NT_VERSION_1 |
>  			      NETLOGON_NT_VERSION_5 |
>  			      NETLOGON_NT_VERSION_5EX_WITH_IP;
> +	size_t len = strlen(lp_netbios_name());
> +	char my_acct_name[len+2];
>  
>  	if (msg_ctx == NULL) {
>  		return NT_STATUS_INVALID_PARAMETER;
> @@ -922,6 +924,11 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
>  
>  	nt_version |= map_ds_flags_to_nt_version(flags);
>  
> +	snprintf(my_acct_name,
> +		 sizeof(my_acct_name),
> +		 "%s$",
> +		 lp_netbios_name());
> +
>  	DEBUG(10,("process_dc_netbios\n"));
>  
>  	for (i=0; i<num_dcs; i++) {
> @@ -937,7 +944,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
>  		}
>  
>  		status = nbt_getdc(msg_ctx, 10, &dclist[i].ss, domain_name,
> -				   NULL, nt_version,
> +				   NULL, my_acct_name, ACB_WSTRUST, nt_version,
>  				   mem_ctx, &nt_version, &dc_name, &r);
>  		if (NT_STATUS_IS_OK(status)) {
>  			store_cache = true;
> diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
> index 30f65c66bc4..9c2773d5d67 100644
> --- a/source3/winbindd/winbindd_cm.c
> +++ b/source3/winbindd/winbindd_cm.c
> @@ -1466,9 +1466,21 @@ static bool dcip_check_name(TALLOC_CTX *mem_ctx,
>  	}
>  #endif
>  
> -	status = nbt_getdc(server_messaging_context(), 10, pss, domain->name,
> -			   &domain->sid, nt_version, mem_ctx, &nt_version,
> -			   &dc_name, NULL);
> +	{
> +		size_t len = strlen(lp_netbios_name());
> +		char my_acct_name[len+2];
> +
> +		snprintf(my_acct_name,
> +			 sizeof(my_acct_name),
> +			 "%s$",
> +			 lp_netbios_name());
> +
> +		status = nbt_getdc(server_messaging_context(), 10, pss,
> +				   domain->name, &domain->sid,
> +				   my_acct_name, ACB_WSTRUST,
> +				   nt_version, mem_ctx, &nt_version,
> +				   &dc_name, NULL);
> +	}
>  	if (NT_STATUS_IS_OK(status)) {
>  		*name = talloc_strdup(mem_ctx, dc_name);
>  		if (*name == NULL) {
> -- 
> 2.11.0
> 




More information about the samba-technical mailing list