+ 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_Ident(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;
+
+ hostname[0] = '\0';
+ array_init(&resolved_addr);
+ ng_ipaddr_tostr_r(Addr, tmp_ip_str);
+
+ /* Skip DNS lookup when DNS is disabled; just return an empty ("") host
+ * name but still issue an IDENT query, if supported and enabled. */
+ if (!Conf_DNS)
+ goto dns_done;
+
+ Log_Subprocess(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
+ 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));
+ }
+ Log_Subprocess(LOG_DEBUG, "Ok, translated %s to \"%s\".", tmp_ip_str, hostname);
+ 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;