/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2009 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Asynchronous resolver
*/
-#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
-#include <signal.h>
#ifdef IDENTAUTH
#ifdef HAVE_IDENT_H
#endif
#endif
-#include "array.h"
#include "conn.h"
#include "conf.h"
-#include "defines.h"
#include "log.h"
#include "ng_ipaddr.h"
-#include "exp.h"
#include "resolve.h"
-#include "io.h"
-
static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
} else if( pid == 0 ) {
/* Sub process */
Log_Init_Subprocess("Resolver");
- Do_ResolveAddr( Addr, identsock, pipefd[1]);
+ Conn_CloseAllSockets(identsock);
+ Do_ResolveAddr(Addr, identsock, pipefd[1]);
Log_Exit_Subprocess("Resolver");
exit(0);
}
} else if( pid == 0 ) {
/* Sub process */
Log_Init_Subprocess("Resolver");
+ Conn_CloseAllSockets(NONE);
Do_ResolveName(Host, pipefd[1]);
Log_Exit_Subprocess("Resolver");
exit(0);
return false;
} /* Resolve_Name */
-
-#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
-#if !defined(WANT_IPV6) && defined(h_errno)
+#if !defined(HAVE_WORKING_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
+#ifdef h_errno
static char *
Get_Error( int H_Error )
{
assert(reslen >= NG_INET_ADDRSTRLEN);
ng_ipaddr_tostr_r(IpAddr, tmp_ip_str);
- Log_Subprocess(LOG_WARNING, "%s: Can't resolve address \"%s\": %s",
- funcname, tmp_ip_str, errmsg);
+ Log_Subprocess(LOG_WARNING, "Can't resolve address \"%s\": %s [%s].",
+ tmp_ip_str, errmsg, funcname);
strlcpy(resbuf, tmp_ip_str, reslen);
return false;
}
* @return true if lookup successful, false if domain name not found
*/
static bool
+#ifdef HAVE_WORKING_GETADDRINFO
ForwardLookup(const char *hostname, array *IpAddr, int af)
+#else
+ForwardLookup(const char *hostname, array *IpAddr, UNUSED int af)
+#endif
{
ng_ipaddr_t addr;
-#ifdef HAVE_GETADDRINFO
+#ifdef HAVE_WORKING_GETADDRINFO
int res;
struct addrinfo *a, *ai_results;
static struct addrinfo hints;
}
for (a = ai_results; a != NULL; a = a->ai_next) {
- assert(a->ai_addrlen <= sizeof(addr));
+ assert((size_t)a->ai_addrlen <= sizeof(addr));
- if (a->ai_addrlen > sizeof(addr))
+ if ((size_t)a->ai_addrlen > sizeof(addr))
continue;
memcpy(&addr, a->ai_addr, a->ai_addrlen);
Log_Forgery_NoIP(const char *ip, const char *host)
{
Log_Subprocess(LOG_WARNING,
- "Possible forgery: %s resolved to %s (which has no ip address)", ip, host);
+ "Possible forgery: %s resolved to \"%s\", which has no IP address!",
+ ip, host);
}
static void
Log_Forgery_WrongIP(const char *ip, const char *host)
{
Log_Subprocess(LOG_WARNING,
- "Possible forgery: %s resolved to %s (which points to different address)", ip, host);
+ "Possible forgery: %s resolved to \"%s\", which points to a different address!",
+ ip, host);
}
if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
goto dns_done;
- if (ForwardLookup(hostname, &resolved_addr, AF_UNSPEC)) {
+ if (ForwardLookup(hostname, &resolved_addr, ng_ipaddr_af(Addr))) {
if (!Addr_in_list(&resolved_addr, Addr)) {
Log_Forgery_WrongIP(tmp_ip_str, hostname);
strlcpy(hostname, tmp_ip_str, sizeof(hostname));