/* handle incoming netlogon mailslot requests */ void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot, struct nbt_dgram_packet *packet, struct socket_address *src) { NTSTATUS status = NT_STATUS_NO_MEMORY; struct nbtd_interface *iface = talloc_get_type(dgmslot->private_data, struct nbtd_interface); struct nbt_netlogon_packet *netlogon = talloc(dgmslot, struct nbt_netlogon_packet); struct nbtd_iface_name *iname; struct nbt_name *name = &packet->data.msg.dest_name; if (netlogon == NULL) goto failed; /* see if the we are listening on the destination netbios name */ iname = nbtd_find_iname(iface, name, 0); if (iname == NULL) { status = NT_STATUS_BAD_NETWORK_NAME; goto failed; } DEBUG(5,("netlogon request to %s from %s:%d\n", nbt_name_string(netlogon, name), src->addr, src->port)); status = dgram_mailslot_netlogon_parse_request(dgmslot, netlogon, packet, netlogon); if (!NT_STATUS_IS_OK(status)) goto failed; switch (netlogon->command) { case LOGON_PRIMARY_QUERY: nbtd_netlogon_getdc(dgmslot, iface, packet, src, netlogon); break; case LOGON_SAM_LOGON_REQUEST: nbtd_netlogon_samlogon(dgmslot, iface, packet, src, netlogon); break; default: DEBUG(2,("unknown netlogon op %d from %s:%d\n", netlogon->command, src->addr, src->port)); NDR_PRINT_DEBUG(nbt_netlogon_packet, netlogon); break; } talloc_free(netlogon); return; failed: DEBUG(2,("nbtd netlogon handler failed from %s:%d to %s - %s\n", src->addr, src->port, nbt_name_string(netlogon, name), nt_errstr(status))); talloc_free(netlogon); }
static NTSTATUS nbtd_mailslot_netlogon_reply( struct nbtd_interface *iface, struct nbt_dgram_packet *packet, struct socket_address *src, TALLOC_CTX *mem_ctx, struct nbt_netlogon_response **presponse, char **preply_mailslot) { struct nbt_netlogon_packet *netlogon; struct nbt_name *dst_name = &packet->data.msg.dest_name; struct nbt_netlogon_response *response = NULL; struct nbtd_iface_name *iname; char *reply_mailslot = NULL; NTSTATUS status; /* see if the we are listening on the destination netbios name */ iname = nbtd_find_iname(iface, dst_name, 0); if (iname == NULL) { return NT_STATUS_BAD_NETWORK_NAME; } netlogon = talloc(mem_ctx, struct nbt_netlogon_packet); if (netlogon == NULL) { return NT_STATUS_NO_MEMORY; } status = dgram_mailslot_netlogon_parse_request(netlogon, packet, netlogon); if (!NT_STATUS_IS_OK(status)) { goto failed; } switch (netlogon->command) { case LOGON_PRIMARY_QUERY: status = nbtd_netlogon_getdc( iface->nbtsrv, &packet->data.msg.dest_name, netlogon, mem_ctx, &response, &reply_mailslot); break; case LOGON_SAM_LOGON_REQUEST: status = nbtd_netlogon_samlogon( iface->nbtsrv, &packet->data.msg.dest_name, src, netlogon, mem_ctx, &response, &reply_mailslot); break; default: DEBUG(2,("unknown netlogon op %d from %s:%d\n", netlogon->command, src->addr, src->port)); NDR_PRINT_DEBUG(nbt_netlogon_packet, netlogon); status = NT_STATUS_NOT_SUPPORTED; break; } if (!NT_STATUS_IS_OK(status)) { DBG_DEBUG("Calculating reply failed: %s\n", nt_errstr(status)); goto failed; } *presponse = response; *preply_mailslot = reply_mailslot; return NT_STATUS_OK; failed: TALLOC_FREE(reply_mailslot); TALLOC_FREE(netlogon); return status; }