svn commit: samba r12648 - in
branches/SAMBA_4_0/source/nbt_server/wins: .
metze at samba.org
metze at samba.org
Sat Dec 31 11:32:56 GMT 2005
Author: metze
Date: 2005-12-31 11:32:55 +0000 (Sat, 31 Dec 2005)
New Revision: 12648
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12648
Log:
implement the dns proxy feature
metze
Modified:
branches/SAMBA_4_0/source/nbt_server/wins/wins_dns_proxy.c
Changeset:
Modified: branches/SAMBA_4_0/source/nbt_server/wins/wins_dns_proxy.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/wins/wins_dns_proxy.c 2005-12-31 11:19:18 UTC (rev 12647)
+++ branches/SAMBA_4_0/source/nbt_server/wins/wins_dns_proxy.c 2005-12-31 11:32:55 UTC (rev 12648)
@@ -28,6 +28,38 @@
#include "libcli/composite/composite.h"
#include "smbd/service_task.h"
+struct wins_dns_proxy_state {
+ struct nbt_name_socket *nbtsock;
+ struct nbt_name_packet *packet;
+ struct nbt_peer_socket src;
+};
+
+static void nbtd_wins_dns_proxy_handler(struct composite_context *creq)
+{
+ NTSTATUS status;
+ struct wins_dns_proxy_state *s = talloc_get_type(creq->async.private_data,
+ struct wins_dns_proxy_state);
+ struct nbt_name *name = &s->packet->questions[0].name;
+ const char *address;
+ const char **addresses;
+ uint16_t nb_flags = 0; /* TODO: ... */
+
+ status = resolve_name_recv(creq, s->packet, &address);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto notfound;
+ }
+
+ addresses = str_list_add(NULL, address);
+ talloc_steal(s->packet, addresses);
+ if (!addresses) goto notfound;
+
+ nbtd_name_query_reply(s->nbtsock, s->packet, &s->src, name,
+ 0, nb_flags, addresses);
+ return;
+notfound:
+ nbtd_negative_name_query_reply(s->nbtsock, s->packet, &s->src);
+}
+
/*
dns proxy query a name
*/
@@ -35,6 +67,29 @@
struct nbt_name_packet *packet,
const struct nbt_peer_socket *src)
{
- /* TODO: add a real implementation here */
+ struct nbt_name *name = &packet->questions[0].name;
+ struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
+ struct nbtd_interface);
+ struct wins_dns_proxy_state *s;
+ struct composite_context *creq;
+ const char *methods[] = {
+ "host",
+ NULL
+ };
+
+ s = talloc(nbtsock, struct wins_dns_proxy_state);
+ if (!s) goto failed;
+ s->nbtsock = nbtsock;
+ s->packet = talloc_steal(s, packet);
+ s->src = *src;
+ talloc_steal(s, src->addr);
+
+ creq = resolve_name_send(name, iface->nbtsrv->task->event_ctx, methods);
+ if (!creq) goto failed;
+
+ creq->async.fn = nbtd_wins_dns_proxy_handler;
+ creq->async.private_data= s;
+ return;
+failed:
nbtd_negative_name_query_reply(nbtsock, packet, src);
}
More information about the samba-cvs
mailing list