+static void
+Log_Forgery_NoIP(const char *ip, const char *host)
+{
+ Log_Resolver(LOG_WARNING, "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_Resolver(LOG_WARNING,"Possible forgery: %s resolved to %s "
+ "(which points to different address)", ip, host);
+}
+
+
+static void
+ArrayWrite(int fd, const array *a)
+{
+ size_t len = array_bytes(a);
+ const char *data = array_start(a);
+
+ assert(data);
+
+ if( (size_t)write(fd, data, len) != len )
+ Log_Resolver( LOG_CRIT, "Resolver: Can't write to parent: %s!",
+ strerror(errno));
+}
+
+
+static void
+Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
+{
+ /* Resolver sub-process: resolve IP address and write result into
+ * pipe to parent. */
+ char hostname[CLIENT_HOST_LEN];
+ char tmp_ip_str[NG_INET_ADDRSTRLEN];
+ size_t len;
+ array resolved_addr;
+
+ array_init(&resolved_addr);
+ ng_ipaddr_tostr_r(Addr, tmp_ip_str);
+#ifdef DEBUG
+ Log_Resolver(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
+#endif
+ if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
+ goto dns_done;
+
+ if (ForwardLookup(hostname, &resolved_addr)) {
+ if (!Addr_in_list(&resolved_addr, Addr)) {
+ Log_Forgery_WrongIP(tmp_ip_str, hostname);
+ strlcpy(hostname, tmp_ip_str, sizeof(hostname));
+ }
+ } else {
+ Log_Forgery_NoIP(tmp_ip_str, hostname);
+ strlcpy(hostname, tmp_ip_str, sizeof(hostname));