summaryrefslogtreecommitdiffstats
path: root/source/libsmb/dsgetdcname.c
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2008-04-24 21:53:55 +0200
committerGünther Deschner <gd@samba.org>2008-04-24 22:01:52 +0200
commitd8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3 (patch)
treecc7918a889f1eebb97e501d3e7ed01114ef11656 /source/libsmb/dsgetdcname.c
parent2b178dcae608ecc05f62593a7a0c2a127b8b7ca2 (diff)
downloadsamba-d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3.tar.gz
samba-d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3.tar.xz
samba-d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3.zip
mailslot/dsgetdcname: do what XP does and request nt_version 11.
This allows dsgetdcname to query for a flat, non-dns domain name and come back with all information about the DC (site names, guid, forest, etc.) based on a mailslot reply. The version 11 request is downgraded to version 1 in case we do a query against NT4. Guenther
Diffstat (limited to 'source/libsmb/dsgetdcname.c')
-rw-r--r--source/libsmb/dsgetdcname.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/source/libsmb/dsgetdcname.c b/source/libsmb/dsgetdcname.c
index af1dc04059a..fbc3bda6e4b 100644
--- a/source/libsmb/dsgetdcname.c
+++ b/source/libsmb/dsgetdcname.c
@@ -777,6 +777,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
uint32_t dc_address_type;
uint32_t dc_flags = 0;
const char *dc_name = NULL;
+ const char *dc_forest = NULL;
+ const char *dc_server_site = NULL;
+ const char *dc_client_site = NULL;
+ struct GUID *dc_domain_guid = NULL;
fstring tmp_dc_name;
struct messaging_context *msg_ctx = msg_context(mem_ctx);
struct nbt_ntlogon_packet *reply = NULL;
@@ -798,7 +802,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
if (send_getdc_request(mem_ctx, msg_ctx,
&dclist[i].ss, domain_name,
- NULL, 1))
+ NULL, 11))
{
int k;
smb_msleep(100);
@@ -835,6 +839,25 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
make_reply:
+ if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) {
+
+ dc_flags |= reply->req.reply2.server_type;
+ dc_forest = reply->req.reply2.forest;
+ dc_server_site = reply->req.reply2.server_site;
+ dc_client_site = reply->req.reply2.client_site;
+
+ dc_domain_guid = &reply->req.reply2.domain_uuid;
+
+ if (flags & DS_RETURN_DNS_NAME) {
+ dc_domain_name = reply->req.reply2.dns_domain;
+ dc_hostname = reply->req.reply2.pdc_dns_name;
+ dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+ } else if (flags & DS_RETURN_FLAT_NAME) {
+ dc_domain_name = reply->req.reply2.domain;
+ dc_hostname = reply->req.reply2.pdc_name;
+ }
+ }
+
if (flags & DS_IP_REQUIRED) {
char addr[INET6_ADDRSTRLEN];
print_sockaddr(addr, sizeof(addr), &dclist[i].ss);
@@ -849,16 +872,20 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE;
}
+ if (dc_forest) {
+ dc_flags |= DS_DNS_FOREST;
+ }
+
return make_domain_controller_info(mem_ctx,
dc_hostname,
dc_address,
dc_address_type,
- NULL,
+ dc_domain_guid,
dc_domain_name,
- NULL,
+ dc_forest,
dc_flags,
- NULL,
- NULL,
+ dc_server_site,
+ dc_client_site,
info);
}