+ Log_Subprocess(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_Subprocess( 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_Subprocess(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
+#endif
+ if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
+ goto dns_done;
+
+ 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));
+ }
+ } else {
+ Log_Forgery_NoIP(tmp_ip_str, hostname);
+ strlcpy(hostname, tmp_ip_str, sizeof(hostname));
+ }
+#ifdef DEBUG
+ Log_Subprocess(LOG_DEBUG, "Ok, translated %s to \"%s\".", tmp_ip_str, hostname);
+#endif
+ dns_done:
+ len = strlen(hostname);
+ hostname[len] = '\n';
+ if (!array_copyb(&resolved_addr, hostname, ++len)) {
+ Log_Subprocess(LOG_CRIT,
+ "Resolver: Can't copy resolved name: %s!",
+ strerror(errno));
+ array_free(&resolved_addr);
+ return;