s3: Factor out parse_getdc_response
authorVolker Lendecke <vl@samba.org>
Sun, 2 Jan 2011 13:43:18 +0000 (14:43 +0100)
committerVolker Lendecke <vl@samba.org>
Fri, 7 Jan 2011 12:28:06 +0000 (13:28 +0100)
source3/libsmb/clidgram.c

index 734564dcbb5b349b2a6d7f6dfecc28634cc39659..fe6269b9e13cb2d03f51ac13fef4a0a7cbefcd88 100644 (file)
@@ -216,19 +216,16 @@ bool send_getdc_request(struct messaging_context *msg_ctx,
        return NT_STATUS_IS_OK(status);
 }
 
-bool receive_getdc_response(TALLOC_CTX *mem_ctx,
-                           const struct sockaddr_storage *dc_ss,
-                           const char *domain_name,
-                           int dgm_id,
-                           uint32_t *nt_version,
-                           const char **dc_name,
-                           struct netlogon_samlogon_response **samlogon_response)
+static bool parse_getdc_response(
+       struct packet_struct *packet,
+       TALLOC_CTX *mem_ctx,
+       const char *domain_name,
+       uint32_t *nt_version,
+       const char **dc_name,
+       struct netlogon_samlogon_response **samlogon_response)
 {
-       struct packet_struct *packet = NULL;
-       char *my_mailslot = NULL;
-       struct in_addr dc_ip;
        DATA_BLOB blob;
-       struct netlogon_samlogon_response *r = NULL;
+       struct netlogon_samlogon_response *r;
        union dgram_message_body p;
        enum ndr_err_code ndr_err;
        NTSTATUS status;
@@ -236,37 +233,16 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        const char *returned_dc = NULL;
        const char *returned_domain = NULL;
 
-       if (dc_ss->ss_family != AF_INET) {
-               return false;
-       }
-
-       dc_ip = ((struct sockaddr_in *)dc_ss)->sin_addr;
-
-       my_mailslot = mailslot_name(mem_ctx, dc_ip);
-       if (!my_mailslot) {
-               return false;
-       }
-
-       packet = receive_unexpected(DGRAM_PACKET, dgm_id, my_mailslot);
-
-       if (packet == NULL) {
-               DEBUG(5, ("Did not receive packet for %s\n", my_mailslot));
-               return False;
-       }
-
-       DEBUG(5, ("Received packet for %s\n", my_mailslot));
-
        blob = data_blob_const(packet->packet.dgram.data,
                               packet->packet.dgram.datasize);
-
        if (blob.length < 4) {
-               DEBUG(0,("invalid length: %d\n", (int)blob.length));
-               goto fail;
+               DEBUG(1, ("invalid length: %d\n", (int)blob.length));
+               return false;
        }
 
        if (RIVAL(blob.data,0) != DGRAM_SMB) {
-               DEBUG(0,("invalid packet\n"));
-               goto fail;
+               DEBUG(1, ("invalid packet\n"));
+               return false;
        }
 
        blob.data += 4;
@@ -275,13 +251,13 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, &p, DGRAM_SMB,
                       (ndr_pull_flags_fn_t)ndr_pull_dgram_smb_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               DEBUG(0,("failed to parse packet\n"));
-               goto fail;
+               DEBUG(1, ("failed to parse packet\n"));
+               return false;
        }
 
        if (p.smb.smb_command != SMB_TRANSACTION) {
-               DEBUG(0,("invalid smb_command: %d\n", p.smb.smb_command));
-               goto fail;
+               DEBUG(1, ("invalid smb_command: %d\n", p.smb.smb_command));
+               return false;
        }
 
        if (DEBUGLEVEL >= 10) {
@@ -292,12 +268,13 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
 
        r = TALLOC_ZERO_P(mem_ctx, struct netlogon_samlogon_response);
        if (!r) {
-               goto fail;
+               return false;
        }
 
        status = pull_netlogon_samlogon_response(&blob, mem_ctx, r);
        if (!NT_STATUS_IS_OK(status)) {
-               goto fail;
+               TALLOC_FREE(r);
+               return false;
        }
 
        map_netlogon_samlogon_response(r);
@@ -311,17 +288,19 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        if (!strequal(returned_domain, domain_name)) {
                DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
                          domain_name, returned_domain));
-               goto fail;
+               TALLOC_FREE(r);
+               return false;
        }
 
+       if (*returned_dc == '\\') returned_dc += 1;
+       if (*returned_dc == '\\') returned_dc += 1;
+
        *dc_name = talloc_strdup(mem_ctx, returned_dc);
        if (!*dc_name) {
-               goto fail;
+               TALLOC_FREE(r);
+               return false;
        }
 
-       if (**dc_name == '\\')  *dc_name += 1;
-       if (**dc_name == '\\')  *dc_name += 1;
-
        if (samlogon_response) {
                *samlogon_response = r;
        } else {
@@ -331,15 +310,46 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
        DEBUG(10, ("GetDC gave name %s for domain %s\n",
                   *dc_name, returned_domain));
 
-       free_packet(packet);
-       TALLOC_FREE(my_mailslot);
        return True;
+}
 
-fail:
-       TALLOC_FREE(my_mailslot);
-       TALLOC_FREE(r);
-       if (packet != NULL) {
-               free_packet(packet);
+bool receive_getdc_response(TALLOC_CTX *mem_ctx,
+                           const struct sockaddr_storage *dc_ss,
+                           const char *domain_name,
+                           int dgm_id,
+                           uint32_t *nt_version,
+                           const char **dc_name,
+                           struct netlogon_samlogon_response **samlogon_response)
+{
+       struct packet_struct *packet = NULL;
+       char *my_mailslot = NULL;
+       struct in_addr dc_ip;
+       bool ret;
+
+
+       if (dc_ss->ss_family != AF_INET) {
+               return false;
+       }
+
+       dc_ip = ((struct sockaddr_in *)dc_ss)->sin_addr;
+
+       my_mailslot = mailslot_name(mem_ctx, dc_ip);
+       if (!my_mailslot) {
+               return false;
        }
-       return false;
+
+       packet = receive_unexpected(DGRAM_PACKET, dgm_id, my_mailslot);
+
+       if (packet == NULL) {
+               DEBUG(5, ("Did not receive packet for %s\n", my_mailslot));
+               return False;
+       }
+
+       DEBUG(5, ("Received packet for %s\n", my_mailslot));
+
+       ret = parse_getdc_response(packet, mem_ctx, domain_name, nt_version,
+                                  dc_name, samlogon_response);
+
+       free_packet(packet);
+       return ret;
 }