- switch( H_Error )
- {
- case HOST_NOT_FOUND:
- return "host not found";
- case NO_DATA:
- return "name valid but no IP address defined";
- case NO_RECOVERY:
- return "name server error";
- case TRY_AGAIN:
- return "name server temporary not available";
- default:
- return "unknown error";
+
+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)) {
+ 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));