dsgetdcname: mailslot replies are identical to the cldap ones, use cldap everywhere.
authorGünther Deschner <gd@samba.org>
Wed, 7 May 2008 16:57:43 +0000 (18:57 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 9 May 2008 12:59:19 +0000 (14:59 +0200)
Guenther
(This used to be commit fe904ee77a7fec1674e9db660978c40c17897f77)

source3/libsmb/clidgram.c
source3/libsmb/dsgetdcname.c
source3/winbindd/winbindd_cm.c

index 1d3293c60f0d6ba84eb8a7e4ff94ff1685a9a8c7..367b028396378f14e43e0cda77cc3cf5c451146b 100644 (file)
@@ -197,14 +197,15 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
 bool receive_getdc_response(TALLOC_CTX *mem_ctx,
                            struct sockaddr_storage *dc_ss,
                            const char *domain_name,
+                           uint32_t *nt_version,
                            const char **dc_name,
-                           struct nbt_ntlogon_packet **reply)
+                           union nbt_cldap_netlogon **reply)
 {
        struct packet_struct *packet;
        const char *my_mailslot = NULL;
        struct in_addr dc_ip;
        DATA_BLOB blob;
-       struct nbt_ntlogon_packet r;
+       union nbt_cldap_netlogon r;
        union dgram_message_body p;
        enum ndr_err_code ndr_err;
 
@@ -259,31 +260,50 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
                return false;
        }
 
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_DEBUG(dgram_smb_packet, &p);
+       }
+
        blob = p.smb.body.trans.data;
 
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
-                      (ndr_pull_flags_fn_t)ndr_pull_nbt_ntlogon_packet);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               DEBUG(0,("failed to parse packet\n"));
+       if (!pull_mailslot_cldap_reply(mem_ctx, &blob,
+                                      &r, nt_version))
+       {
                return false;
        }
 
-       if (DEBUGLEVEL >= 10) {
-               NDR_PRINT_DEBUG(nbt_ntlogon_packet, &r);
-       }
-
-       switch (r.command) {
-               case NTLOGON_SAM_LOGON_REPLY:
-               case NTLOGON_SAM_LOGON_REPLY15:
-                       returned_domain = r.req.reply.domain;
-                       returned_dc = r.req.reply.server;
+       switch (*nt_version) {
+               case 1:
+                       returned_domain = r.logon1.domain_name;
+                       returned_dc = r.logon1.pdc_name;
+                       break;
+               case 2:
+               case 3:
+                       returned_domain = r.logon3.domain_name;
+                       returned_dc = r.logon3.pdc_name;
                        break;
-               case NTLOGON_RESPONSE_FROM_PDC2:
-                       returned_domain = r.req.reply2.domain;
-                       returned_dc = r.req.reply2.pdc_name;
+               case 4:
+               case 5:
+               case 6:
+               case 7:
+                       returned_domain = r.logon5.domain;
+                       returned_dc = r.logon5.pdc_name;
+                       break;
+               case 8:
+               case 9:
+               case 10:
+               case 11:
+               case 12:
+               case 13:
+               case 14:
+               case 15:
+                       returned_domain = r.logon13.domain;
+                       returned_dc = r.logon13.pdc_name;
                        break;
                default:
-                       return false;
+                       returned_domain = r.logon29.domain;
+                       returned_dc = r.logon29.pdc_name;
+                       break;
        }
 
        if (!strequal(returned_domain, domain_name)) {
@@ -301,8 +321,8 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        if (**dc_name == '\\')  *dc_name += 1;
 
        if (reply) {
-               *reply = (struct nbt_ntlogon_packet *)talloc_memdup(
-                       mem_ctx, &r, sizeof(struct nbt_ntlogon_packet));
+               *reply = (union nbt_cldap_netlogon *)talloc_memdup(
+                       mem_ctx, &r, sizeof(union nbt_cldap_netlogon));
                if (!*reply) {
                        return false;
                }
index b64f3404566354a9db4c62fe3cffb03e858e7d74..a21fc9a217fc4a0deecf2d82ceb0fccc8592ce18 100644 (file)
@@ -925,18 +925,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
        enum nbt_name_type name_type = NBT_NAME_LOGON;
 
        int i;
-       const char *dc_hostname, *dc_domain_name;
-       const char *dc_address;
-       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;
+       union nbt_cldap_netlogon *reply = NULL;
        uint32_t nt_version = NETLOGON_VERSION_1 |
                              NETLOGON_VERSION_5 |
                              NETLOGON_VERSION_5EX_WITH_IP;
@@ -968,12 +960,10 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
                                if (receive_getdc_response(mem_ctx,
                                                           &dclist[i].ss,
                                                           domain_name,
+                                                          &nt_version,
                                                           &dc_name,
                                                           &reply)) {
                                        namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list);
-                                       dc_hostname = dc_name;
-                                       dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name);
-                                       NT_STATUS_HAVE_NO_MEMORY(dc_domain_name);
                                        goto make_reply;
                                }
                                smb_msleep(1500);
@@ -986,65 +976,34 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
                                     &dclist[i].ss,
                                     tmp_dc_name))
                {
-                       dc_hostname = tmp_dc_name;
-                       dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name);
-                       namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list);
-                       goto make_reply;
-               }
-       }
+                       struct nbt_cldap_netlogon_1 logon1;
 
-       return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+                       reply = TALLOC_ZERO_P(mem_ctx, union nbt_cldap_netlogon);
+                       NT_STATUS_HAVE_NO_MEMORY(reply);
 
- make_reply:
+                       ZERO_STRUCT(logon1);
 
-       if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) {
+                       nt_version = NETLOGON_VERSION_1;
 
-               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;
+                       logon1.nt_version = nt_version;
+                       logon1.pdc_name = tmp_dc_name;
+                       logon1.domain_name = talloc_strdup_upper(mem_ctx, domain_name);
+                       NT_STATUS_HAVE_NO_MEMORY(logon1.domain_name);
 
-               dc_domain_guid = &reply->req.reply2.domain_uuid;
+                       reply->logon1 = logon1;
 
-               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;
-               }
-       }
+                       namecache_store(tmp_dc_name, NBT_NAME_SERVER, 1, &ip_list);
 
-       if (flags & DS_IP_REQUIRED) {
-               char addr[INET6_ADDRSTRLEN];
-               print_sockaddr(addr, sizeof(addr), &dclist[i].ss);
-               dc_address = talloc_asprintf(mem_ctx, "\\\\%s", addr);
-               dc_address_type = DS_ADDRESS_TYPE_INET;
-       } else {
-               dc_address = talloc_asprintf(mem_ctx, "\\\\%s", dc_hostname);
-               dc_address_type = DS_ADDRESS_TYPE_NETBIOS;
+                       goto make_reply;
+               }
        }
 
-       if (flags & DS_PDC_REQUIRED) {
-               dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE;
-       }
+       return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
 
-       if (dc_forest) {
-               dc_flags |= DS_DNS_FOREST;
-       }
+ make_reply:
 
-       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);
+       return make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss,
+                                            nt_version, reply, info);
 }
 
 /****************************************************************
index 80f6bfaab3063d8ed646ce8d4c0c82018d29f9cf..0b0de5ad4ff7dcf65d5dc5b3303983de22b69de7 100644 (file)
@@ -1101,6 +1101,7 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx,
                smb_msleep(100);
                for (i=0; i<5; i++) {
                        if (receive_getdc_response(mem_ctx, pss, domain->name,
+                                                  &nt_version,
                                                   &dc_name, NULL)) {
                                fstrcpy(name, dc_name);
                                namecache_store(name, 0x20, 1, &ip_list);