Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : wins server dns proxy
5 :
6 : Copyright (C) Stefan Metzmacher 2005
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "nbt_server/nbt_server.h"
24 : #include "nbt_server/wins/winsdb.h"
25 : #include "nbt_server/wins/winsserver.h"
26 : #include "system/time.h"
27 : #include "libcli/composite/composite.h"
28 : #include "samba/service_task.h"
29 : #include "libcli/resolve/resolve.h"
30 : #include "lib/socket/socket.h"
31 :
32 : struct wins_dns_proxy_state {
33 : struct nbt_name_socket *nbtsock;
34 : struct nbt_name_packet *packet;
35 : struct socket_address *src;
36 : };
37 :
38 0 : static void nbtd_wins_dns_proxy_handler(struct composite_context *creq)
39 : {
40 : NTSTATUS status;
41 0 : struct wins_dns_proxy_state *s = talloc_get_type(creq->async.private_data,
42 : struct wins_dns_proxy_state);
43 0 : struct nbt_name *name = &s->packet->questions[0].name;
44 : const char *address;
45 : const char **addresses;
46 0 : uint16_t nb_flags = 0; /* TODO: ... */
47 :
48 0 : status = resolve_name_recv(creq, s->packet, &address);
49 0 : if (!NT_STATUS_IS_OK(status)) {
50 0 : goto notfound;
51 : }
52 :
53 0 : addresses = str_list_add(NULL, address);
54 0 : talloc_steal(s->packet, addresses);
55 0 : if (!addresses) goto notfound;
56 :
57 0 : nbtd_name_query_reply(s->nbtsock, s->packet, s->src, name,
58 : 0, nb_flags, addresses);
59 0 : return;
60 0 : notfound:
61 0 : nbtd_negative_name_query_reply(s->nbtsock, s->packet, s->src);
62 : }
63 :
64 : /*
65 : dns proxy query a name
66 : */
67 0 : void nbtd_wins_dns_proxy_query(struct nbt_name_socket *nbtsock,
68 : struct nbt_name_packet *packet,
69 : struct socket_address *src)
70 : {
71 0 : struct nbt_name *name = &packet->questions[0].name;
72 0 : struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private_data,
73 : struct nbtd_interface);
74 : struct wins_dns_proxy_state *s;
75 : struct composite_context *creq;
76 : struct resolve_context *resolve_ctx;
77 :
78 0 : s = talloc(nbtsock, struct wins_dns_proxy_state);
79 0 : if (!s) goto failed;
80 0 : s->nbtsock = nbtsock;
81 0 : s->packet = talloc_steal(s, packet);
82 0 : s->src = socket_address_copy(s, src);
83 0 : if (s->src == NULL) {
84 0 : goto failed;
85 : }
86 :
87 0 : resolve_ctx = resolve_context_init(s);
88 0 : if (resolve_ctx == NULL) goto failed;
89 0 : resolve_context_add_host_method(resolve_ctx);
90 :
91 0 : creq = resolve_name_send(resolve_ctx, s, name, iface->nbtsrv->task->event_ctx);
92 0 : if (!creq) goto failed;
93 :
94 0 : creq->async.fn = nbtd_wins_dns_proxy_handler;
95 0 : creq->async.private_data= s;
96 0 : return;
97 0 : failed:
98 0 : nbtd_negative_name_query_reply(nbtsock, packet, src);
99 : }
|