예제 #1
0
파일: netlogon.c 프로젝트: srimalik/samba
/*
  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);
}
예제 #2
0
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;
}