diff options
-rw-r--r-- | source3/Makefile.in | 2 | ||||
-rw-r--r-- | source3/libads/dns.c | 15 | ||||
-rw-r--r-- | source3/libsmb/namequery.c | 27 |
3 files changed, 43 insertions, 1 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index b3764cac93..3407dfd215 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -529,7 +529,7 @@ 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 \ + libsmb/namequery.o ../libcli/nbt/lmhosts.o ../libcli/dns/dns_hosts_file.o libsmb/conncache.o \ libads/dns.o libads/sitename_cache.o NTERR_OBJ = libsmb/nterr.o libsmb/smberr.o diff --git a/source3/libads/dns.c b/source3/libads/dns.c index 113e63710b..152003941b 100644 --- a/source3/libads/dns.c +++ b/source3/libads/dns.c @@ -401,11 +401,19 @@ static NTSTATUS ads_dns_lookup_srv( TALLOC_CTX *ctx, int rrnum; int idx = 0; NTSTATUS status; + const char *dns_hosts_file; if ( !ctx || !name || !dclist ) { return NT_STATUS_INVALID_PARAMETER; } + dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL); + if (dns_hosts_file) { + return resolve_dns_hosts_file_as_dns_rr(dns_hosts_file, + name, true, ctx, + dclist, numdcs); + } + /* Send the request. May have to loop several times in case of large replies */ @@ -590,11 +598,18 @@ NTSTATUS ads_dns_lookup_ns(TALLOC_CTX *ctx, int rrnum; int idx = 0; NTSTATUS status; + const char *dns_hosts_file; if ( !ctx || !dnsdomain || !nslist ) { return NT_STATUS_INVALID_PARAMETER; } + dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL); + if (dns_hosts_file) { + DEBUG(1, ("NO 'NS' lookup available when using resolv:host file")); + return NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + /* Send the request. May have to loop several times in case of large replies */ diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 752b4b1eb9..16669c0532 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1738,6 +1738,7 @@ static NTSTATUS resolve_hosts(const char *name, int name_type, struct addrinfo *res = NULL; int ret = -1; int i = 0; + const char *dns_hosts_file; if ( name_type != 0x20 && name_type != 0x0) { DEBUG(5, ("resolve_hosts: not appropriate " @@ -1762,6 +1763,32 @@ static NTSTATUS resolve_hosts(const char *name, int name_type, hints.ai_family = AF_INET; #endif + dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL); + if (dns_hosts_file) { + struct sockaddr_storage *ss_list; + NTSTATUS status; + TALLOC_CTX *ctx = talloc_stackframe(); + if (!ctx) { + return NT_STATUS_NO_MEMORY; + } + + status = resolve_dns_hosts_file_as_sockaddr(dns_hosts_file, name, false, + ctx, &ss_list, return_count); + if (NT_STATUS_IS_OK(status)) { + if (convert_ss2service(return_iplist, + ss_list, + *return_count)) { + talloc_free(ctx); + return NT_STATUS_OK; + } else { + talloc_free(ctx); + return NT_STATUS_NO_MEMORY; + } + } + talloc_free(ctx); + return NT_STATUS_UNSUCCESSFUL; + } + ret = getaddrinfo(name, NULL, &hints, |