| 21 |
|
|
| 22 |
|
#include "stdinc.h" |
| 23 |
|
#include "list.h" |
| 24 |
– |
#include "balloc.h" |
| 24 |
|
#include "client.h" |
| 25 |
|
#include "event.h" |
| 26 |
|
#include "irc_string.h" |
| 28 |
– |
#include "sprintf_irc.h" |
| 27 |
|
#include "ircd.h" |
| 28 |
|
#include "numeric.h" |
| 29 |
|
#include "rng_mt.h" |
| 30 |
|
#include "fdlist.h" |
| 33 |
– |
#include "fileio.h" /* for fbopen / fbclose / fbputs */ |
| 31 |
|
#include "s_bsd.h" |
| 32 |
< |
#include "s_log.h" |
| 32 |
> |
#include "log.h" |
| 33 |
> |
#include "s_misc.h" |
| 34 |
|
#include "send.h" |
| 35 |
|
#include "memory.h" |
| 36 |
+ |
#include "mempool.h" |
| 37 |
|
#include "irc_res.h" |
| 38 |
|
#include "irc_reslib.h" |
| 40 |
– |
#include "common.h" |
| 39 |
|
|
| 40 |
|
#if (CHAR_BIT != 8) |
| 41 |
|
#error this code needs to be able to address individual octets |
| 90 |
|
|
| 91 |
|
static fde_t ResolverFileDescriptor; |
| 92 |
|
static dlink_list request_list = { NULL, NULL, 0 }; |
| 93 |
< |
static BlockHeap *dns_heap = NULL; |
| 93 |
> |
static mp_pool_t *dns_pool = NULL; |
| 94 |
|
|
| 95 |
|
static void rem_request(struct reslist *); |
| 96 |
|
static struct reslist *make_request(dns_callback_fnc, void *); |
| 128 |
|
const struct sockaddr_in *v4in = (const struct sockaddr_in *)inp; |
| 129 |
|
int ns; |
| 130 |
|
|
| 131 |
< |
for (ns = 0; ns < irc_nscount; ns++) |
| 131 |
> |
for (ns = 0; ns < irc_nscount; ++ns) |
| 132 |
|
{ |
| 133 |
|
const struct irc_ssaddr *srv = &irc_nsaddr_list[ns]; |
| 134 |
|
#ifdef IPV6 |
| 146 |
|
case AF_INET6: |
| 147 |
|
if (srv->ss.ss_family == inp->ss.ss_family) |
| 148 |
|
if (v6->sin6_port == v6in->sin6_port) |
| 149 |
< |
if ((memcmp(&v6->sin6_addr.s6_addr, &v6in->sin6_addr.s6_addr, |
| 150 |
< |
sizeof(struct in6_addr)) == 0) || |
| 153 |
< |
(memcmp(&v6->sin6_addr.s6_addr, &in6addr_any, |
| 154 |
< |
sizeof(struct in6_addr)) == 0)) |
| 149 |
> |
if (!memcmp(&v6->sin6_addr.s6_addr, &v6in->sin6_addr.s6_addr, |
| 150 |
> |
sizeof(struct in6_addr))) |
| 151 |
|
return 1; |
| 152 |
|
break; |
| 153 |
|
#endif |
| 154 |
|
case AF_INET: |
| 155 |
|
if (srv->ss.ss_family == inp->ss.ss_family) |
| 156 |
|
if (v4->sin_port == v4in->sin_port) |
| 157 |
< |
if ((v4->sin_addr.s_addr == INADDR_ANY) || |
| 162 |
< |
(v4->sin_addr.s_addr == v4in->sin_addr.s_addr)) |
| 157 |
> |
if (v4->sin_addr.s_addr == v4in->sin_addr.s_addr) |
| 158 |
|
return 1; |
| 159 |
|
break; |
| 160 |
|
default: |
| 243 |
|
void |
| 244 |
|
init_resolver(void) |
| 245 |
|
{ |
| 246 |
< |
dns_heap = BlockHeapCreate("dns", sizeof(struct reslist), DNS_HEAP_SIZE); |
| 246 |
> |
dns_pool = mp_pool_new(sizeof(struct reslist), MP_CHUNK_SIZE_DNS); |
| 247 |
|
memset(&ResolverFileDescriptor, 0, sizeof(fde_t)); |
| 248 |
|
start_resolver(); |
| 249 |
|
} |
| 270 |
|
dlinkDelete(&request->node, &request_list); |
| 271 |
|
|
| 272 |
|
MyFree(request->name); |
| 273 |
< |
BlockHeapFree(dns_heap, request); |
| 273 |
> |
mp_pool_release(request); |
| 274 |
|
} |
| 275 |
|
|
| 276 |
|
/* |
| 279 |
|
static struct reslist * |
| 280 |
|
make_request(dns_callback_fnc callback, void *ctx) |
| 281 |
|
{ |
| 282 |
< |
struct reslist *request = BlockHeapAlloc(dns_heap); |
| 282 |
> |
struct reslist *request = mp_pool_get(dns_pool); |
| 283 |
|
|
| 284 |
+ |
memset(request, 0, sizeof(*request)); |
| 285 |
|
request->sentat = CurrentTime; |
| 286 |
|
request->retries = 3; |
| 287 |
|
request->resend = 1; |
| 675 |
|
* but its possible its just a broken nameserver with still |
| 676 |
|
* valid answers. But lets do some rudimentary logging for now... |
| 677 |
|
*/ |
| 678 |
< |
ilog(L_ERROR, "irc_res.c bogus type %d", type); |
| 678 |
> |
ilog(LOG_TYPE_IRCD, "irc_res.c bogus type %d", type); |
| 679 |
|
break; |
| 680 |
|
} |
| 681 |
|
} |