dsgetdcname: add make_dc_info_from_cldap_reply().
authorGünther Deschner <gd@samba.org>
Wed, 7 May 2008 16:36:03 +0000 (18:36 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 9 May 2008 12:59:18 +0000 (14:59 +0200)
Guenther
(This used to be commit 9db2e50a20caabaf90ce03203a066ddd7820d33a)

source3/libsmb/dsgetdcname.c

index 5d6e2daba4e674f6865adee2ff3b16af7338f457..72a0bb5984fd643e7491e40d878e19a02091831b 100644 (file)
@@ -640,6 +640,7 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx,
        if (forest_name) {
                info->forest_name = talloc_strdup(mem_ctx, forest_name);
                NT_STATUS_HAVE_NO_MEMORY(info->forest_name);
+               flags |= DS_DNS_FOREST;
        }
 
        info->dc_flags = flags;
@@ -663,6 +664,151 @@ static NTSTATUS make_domain_controller_info(TALLOC_CTX *mem_ctx,
 /****************************************************************
 ****************************************************************/
 
+static NTSTATUS make_dc_info_from_cldap_reply(TALLOC_CTX *mem_ctx,
+                                             uint32_t flags,
+                                             struct sockaddr_storage *ss,
+                                             uint32_t nt_version,
+                                             union nbt_cldap_netlogon *r,
+                                             struct netr_DsRGetDCNameInfo **info)
+{
+       const char *dc_hostname, *dc_domain_name;
+       const char *dc_address = NULL;
+       const char *dc_forest = NULL;
+       uint32_t dc_address_type = 0;
+       uint32_t dc_flags = 0;
+       struct GUID *dc_domain_guid = NULL;
+       const char *dc_server_site = NULL;
+       const char *dc_client_site = NULL;
+
+       char addr[INET6_ADDRSTRLEN];
+
+       print_sockaddr(addr, sizeof(addr), ss);
+
+       dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr);
+       NT_STATUS_HAVE_NO_MEMORY(dc_address);
+       dc_address_type = DS_ADDRESS_TYPE_INET;
+
+       switch (nt_version & 0x000000ff) {
+               case 0:
+                       return NT_STATUS_INVALID_PARAMETER;
+               case 1:
+                       dc_hostname     = r->logon1.pdc_name;
+                       dc_domain_name  = r->logon1.domain_name;
+                       if (flags & DS_PDC_REQUIRED) {
+                               dc_flags = NBT_SERVER_WRITABLE | NBT_SERVER_PDC;
+                       }
+                       break;
+               case 2:
+               case 3:
+                       switch (flags & 0xf0000000) {
+                               case DS_RETURN_FLAT_NAME:
+                                       dc_hostname     = r->logon3.pdc_name;
+                                       dc_domain_name  = r->logon3.domain_name;
+                                       break;
+                               case DS_RETURN_DNS_NAME:
+                               default:
+                                       dc_hostname     = r->logon3.pdc_dns_name;
+                                       dc_domain_name  = r->logon3.dns_domain;
+                                       dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+                                       break;
+                       }
+
+                       dc_flags        |= r->logon3.server_type;
+                       dc_forest       = r->logon3.forest;
+                       dc_domain_guid  = &r->logon3.domain_uuid;
+
+                       break;
+               case 4:
+               case 5:
+               case 6:
+               case 7:
+                       switch (flags & 0xf0000000) {
+                               case DS_RETURN_FLAT_NAME:
+                                       dc_hostname     = r->logon5.pdc_name;
+                                       dc_domain_name  = r->logon5.domain;
+                                       break;
+                               case DS_RETURN_DNS_NAME:
+                               default:
+                                       dc_hostname     = r->logon5.pdc_dns_name;
+                                       dc_domain_name  = r->logon5.dns_domain;
+                                       dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+                                       break;
+                       }
+
+                       dc_flags        |= r->logon5.server_type;
+                       dc_forest       = r->logon5.forest;
+                       dc_domain_guid  = &r->logon5.domain_uuid;
+                       dc_server_site  = r->logon5.server_site;
+                       dc_client_site  = r->logon5.client_site;
+
+                       break;
+               case 8:
+               case 9:
+               case 10:
+               case 11:
+               case 12:
+               case 13:
+               case 14:
+               case 15:
+                       switch (flags & 0xf0000000) {
+                               case DS_RETURN_FLAT_NAME:
+                                       dc_hostname     = r->logon13.pdc_name;
+                                       dc_domain_name  = r->logon13.domain;
+                                       break;
+                               case DS_RETURN_DNS_NAME:
+                               default:
+                                       dc_hostname     = r->logon13.pdc_dns_name;
+                                       dc_domain_name  = r->logon13.dns_domain;
+                                       dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+                                       break;
+                       }
+
+                       dc_flags        |= r->logon13.server_type;
+                       dc_forest       = r->logon13.forest;
+                       dc_domain_guid  = &r->logon13.domain_uuid;
+                       dc_server_site  = r->logon13.server_site;
+                       dc_client_site  = r->logon13.client_site;
+
+                       break;
+               default:
+                       switch (flags & 0xf0000000) {
+                               case DS_RETURN_FLAT_NAME:
+                                       dc_hostname     = r->logon29.pdc_name;
+                                       dc_domain_name  = r->logon29.domain;
+                                       break;
+                               case DS_RETURN_DNS_NAME:
+                               default:
+                                       dc_hostname     = r->logon29.pdc_dns_name;
+                                       dc_domain_name  = r->logon29.dns_domain;
+                                       dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+                                       break;
+                       }
+
+                       dc_flags        |= r->logon29.server_type;
+                       dc_forest       = r->logon29.forest;
+                       dc_domain_guid  = &r->logon29.domain_uuid;
+                       dc_server_site  = r->logon29.server_site;
+                       dc_client_site  = r->logon29.client_site;
+
+                       break;
+       }
+
+       return make_domain_controller_info(mem_ctx,
+                                          dc_hostname,
+                                          dc_address,
+                                          dc_address_type,
+                                          dc_domain_guid,
+                                          dc_domain_name,
+                                          dc_forest,
+                                          dc_flags,
+                                          dc_server_site,
+                                          dc_client_site,
+                                          info);
+}
+
+/****************************************************************
+****************************************************************/
+
 static uint32_t map_ds_flags_to_nt_version(uint32_t flags)
 {
        uint32_t nt_version = 0;