*/
#include "includes.h"
+#include "librpc/gen_ndr/messaging.h"
+#include "libsmb/clidgram.h"
/*
* cli_send_mailslot, send a mailslot for client code ...
char *buf, int len,
const char *srcname, int src_type,
const char *dstname, int dest_type,
- const struct sockaddr_storage *dest_ss)
+ const struct sockaddr_storage *dest_ss,
+ int dgm_id)
{
struct packet_struct p;
struct dgram_packet *dgram = &p.packet.dgram;
dgram->header.flags.node_type = M_NODE;
dgram->header.flags.first = True;
dgram->header.flags.more = False;
- dgram->header.dgm_id = ((unsigned)time(NULL)%(unsigned)0x7FFF) +
- ((unsigned)sys_getpid()%(unsigned)100);
+ dgram->header.dgm_id = dgm_id;
/* source ip is filled by nmbd */
dgram->header.dgm_length = 0; /* Let build_dgram() handle this. */
dgram->header.packet_offset = 0;
bool send_getdc_request(TALLOC_CTX *mem_ctx,
struct messaging_context *msg_ctx,
- struct sockaddr_storage *dc_ss,
+ const struct sockaddr_storage *dc_ss,
const char *domain_name,
- const DOM_SID *sid,
- uint32_t nt_version)
+ const struct dom_sid *sid,
+ uint32_t nt_version,
+ int dgm_id)
{
struct in_addr dc_ip;
const char *my_acct_name = NULL;
NDR_PRINT_DEBUG(nbt_netlogon_packet, &packet);
}
- ndr_err = ndr_push_struct_blob(&blob, mem_ctx, NULL, &packet,
+ ndr_err = ndr_push_struct_blob(&blob, mem_ctx, &packet,
(ndr_push_flags_fn_t)ndr_push_nbt_netlogon_packet);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
return false;
false, NBT_MAILSLOT_NTLOGON, 0,
(char *)blob.data, blob.length,
global_myname(), 0, domain_name, 0x1c,
- dc_ss);
+ dc_ss, dgm_id);
}
bool receive_getdc_response(TALLOC_CTX *mem_ctx,
struct sockaddr_storage *dc_ss,
const char *domain_name,
+ int dgm_id,
uint32_t *nt_version,
const char **dc_name,
- struct netlogon_samlogon_response **_r)
+ struct netlogon_samlogon_response **samlogon_response)
{
struct packet_struct *packet;
const char *my_mailslot = NULL;
struct in_addr dc_ip;
DATA_BLOB blob;
- struct netlogon_samlogon_response r;
+ struct netlogon_samlogon_response *r;
union dgram_message_body p;
enum ndr_err_code ndr_err;
NTSTATUS status;
return false;
}
- packet = receive_unexpected(DGRAM_PACKET, 0, my_mailslot);
+ packet = receive_unexpected(DGRAM_PACKET, dgm_id, my_mailslot);
if (packet == NULL) {
DEBUG(5, ("Did not receive packet for %s\n", my_mailslot));
blob.data += 4;
blob.length -= 4;
- ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, NULL, &p, DGRAM_SMB,
+ 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"));
blob = p.smb.body.trans.data;
- ZERO_STRUCT(r);
+ r = TALLOC_ZERO_P(mem_ctx, struct netlogon_samlogon_response);
+ if (!r) {
+ return false;
+ }
- status = pull_netlogon_samlogon_response(&blob, mem_ctx, NULL, &r);
+ status = pull_netlogon_samlogon_response(&blob, mem_ctx, r);
if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(r);
return false;
}
- map_netlogon_samlogon_response(&r);
+ map_netlogon_samlogon_response(r);
/* do we still need this ? */
- *nt_version = r.ntver;
+ *nt_version = r->ntver;
- returned_domain = r.data.nt5_ex.domain_name;
- returned_dc = r.data.nt5_ex.pdc_name;
+ returned_domain = r->data.nt5_ex.domain_name;
+ returned_dc = r->data.nt5_ex.pdc_name;
if (!strequal(returned_domain, domain_name)) {
DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
domain_name, returned_domain));
+ TALLOC_FREE(r);
return false;
}
*dc_name = talloc_strdup(mem_ctx, returned_dc);
if (!*dc_name) {
+ TALLOC_FREE(r);
return false;
}
if (**dc_name == '\\') *dc_name += 1;
if (**dc_name == '\\') *dc_name += 1;
- if (_r) {
- *_r = (struct netlogon_samlogon_response *)talloc_memdup(
- mem_ctx, &r, sizeof(struct netlogon_samlogon_response));
- if (!*_r) {
- return false;
- }
+ if (samlogon_response) {
+ *samlogon_response = r;
+ } else {
+ TALLOC_FREE(r);
}
DEBUG(10, ("GetDC gave name %s for domain %s\n",