/* * DNS event related code */ static void dns_event_success(struct resolve *rp, int type) { if (!rp) return; if (type == T_PTR) { debug2("DNS resolved %s to %s", iptostr(rp->ip), rp->hostn); call_hostbyip(ntohl(rp->ip), rp->hostn, 1); } else if (type == T_A) { debug2("DNS resolved %s to %s", rp->hostn, iptostr(rp->ip)); call_ipbyhost(rp->hostn, ntohl(rp->ip), 1); } }
static void dns_event_failure(struct resolve *rp, int type) { if (!rp) return; if (type == T_PTR) { static char s[UHOSTLEN]; debug1("DNS resolve failed for %s", iptostr(rp->ip)); strcpy(s, iptostr(rp->ip)); call_hostbyip(ntohl(rp->ip), s, 0); } else if (type == T_A) { debug1("DNS resolve failed for %s", rp->hostn); call_ipbyhost(rp->hostn, 0, 0); } else debug2("DNS resolve failed for unknown %s / %s", iptostr(rp->ip), nonull(rp->hostn)); return; }
void block_dns_hostbyip(IP ip) { struct hostent *hp; unsigned long addr = my_htonl(ip); static char s[UHOSTLEN]; Context; if (!setjmp(alarmret)) { alarm(resolve_timeout); hp = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET); alarm(0); if (hp) { strncpy(s, hp->h_name, UHOSTLEN - 1); s[UHOSTLEN - 1] = 0; } else strcpy(s, iptostr(addr)); } else { hp = NULL; strcpy(s, iptostr(addr)); } /* Call hooks. */ call_hostbyip(ip, s, hp ? 1 : 0); Context; }