LCOV - code coverage report
Current view: top level - source4/nbt_server/wins - wins_dns_proxy.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 26 40 65.0 %
Date: 2024-04-21 15:09:00 Functions: 2 2 100.0 %

          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          12 : static void nbtd_wins_dns_proxy_handler(struct composite_context *creq)
      39             : {
      40           0 :         NTSTATUS status;
      41          12 :         struct wins_dns_proxy_state *s = talloc_get_type(creq->async.private_data,
      42             :                                                          struct wins_dns_proxy_state);
      43          12 :         struct nbt_name *name = &s->packet->questions[0].name;
      44           0 :         const char *address;
      45           0 :         const char **addresses;
      46          12 :         uint16_t nb_flags = 0; /* TODO: ... */
      47             : 
      48          12 :         status = resolve_name_recv(creq, s->packet, &address);
      49          12 :         if (!NT_STATUS_IS_OK(status)) {
      50          12 :                 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          12 : notfound:
      61          12 :         nbtd_negative_name_query_reply(s->nbtsock, s->packet, s->src);
      62             : }
      63             : 
      64             : /*
      65             :   dns proxy query a name
      66             : */
      67          12 : void nbtd_wins_dns_proxy_query(struct nbt_name_socket *nbtsock, 
      68             :                                struct nbt_name_packet *packet, 
      69             :                                struct socket_address *src)
      70             : {
      71          12 :         struct nbt_name *name = &packet->questions[0].name;
      72          12 :         struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private_data,
      73             :                                                        struct nbtd_interface);
      74           0 :         struct wins_dns_proxy_state *s;
      75           0 :         struct composite_context *creq;
      76           0 :         struct resolve_context *resolve_ctx;
      77             : 
      78          12 :         s = talloc(nbtsock, struct wins_dns_proxy_state);
      79          12 :         if (!s) goto failed;
      80          12 :         s->nbtsock   = nbtsock;
      81          12 :         s->packet    = talloc_steal(s, packet);
      82          12 :         s->src               = socket_address_copy(s, src);
      83          12 :         if (s->src == NULL) {
      84           0 :                 goto failed;
      85             :         }
      86             : 
      87          12 :         resolve_ctx = resolve_context_init(s);
      88          12 :         if (resolve_ctx == NULL) goto failed;
      89          12 :         resolve_context_add_host_method(resolve_ctx);
      90             : 
      91          12 :         creq = resolve_name_send(resolve_ctx, s, name, iface->nbtsrv->task->event_ctx);
      92          12 :         if (!creq) goto failed;
      93             : 
      94          12 :         creq->async.fn               = nbtd_wins_dns_proxy_handler;
      95          12 :         creq->async.private_data= s;
      96          12 :         return;
      97           0 : failed:
      98           0 :         nbtd_negative_name_query_reply(nbtsock, packet, src);
      99             : }

Generated by: LCOV version 1.14