/** Send a failed DNS lookup request again. * @param[in] request Request to resend. */ static void resend_query(struct reslist *request) { if (request->resend == 0) return; switch(request->type) { case T_PTR: do_query_number(NULL, NULL, &request->addr, request); break; case T_A: do_query_name(NULL, NULL, request->name, request, request->type); break; case T_AAAA: /* didn't work, try A */ if (request->state == REQ_AAAA) do_query_name(NULL, NULL, request->name, request, T_A); default: break; } }
/* * ar_resent_query * * resends a query. */ int Resolver :: ar_resend_query(DNSSession* session) { if (!session->getResends()) return -1; switch(session->getType()) { case T_PTR: ar_reinfo.re_resends++; /* XXXMB - I think this should be: (char *)&(session->re_addr) */ return do_query_number(NULL, (char *)(session->getReaddr()), session, session->getReaddrtype()); case T_A: ar_reinfo.re_resends++; return do_query_name(NULL, session->getName(), session, T_A); case T_AAAA: ar_reinfo.re_resends++; return do_query_name(NULL, session->getName(), session, T_AAAA); default: break; } return -1; }
PRBool Resolver :: process(DNSSession* session) { PR_AtomicIncrement(&curlookups); PRBool locstatus = PR_FALSE; char host[MAXDNAME]; resinfo_t resi; resinfo_t* rp = &resi; struct hostent* hp = NULL; PRInt32 rv = 0; int querytype = 0; if (session) { session->setStatus(DNS_IN_PROCESS); if (FORWARD_LOOKUP == session->getQType ()) { PR_AtomicIncrement(&namelookups); memset((char *)rp, 0, sizeof(resi)); ar_reinfo.re_na_look++; strncpy(host, session->getName(), 64); host[64] = '\0'; locstatus = PR_TRUE; switch(session->getFamily()) { case PR_AF_INET: querytype = T_A; break; case PR_AF_INET6: querytype = T_AAAA; break; default: locstatus = PR_FALSE; } // Makes and sends the query // the session gets automatically added to the hash table if (PR_TRUE == locstatus) { if (do_query_name(rp, host, session, querytype) == -1) { PR_SetError(PR_BAD_ADDRESS_ERROR, 0); locstatus = PR_FALSE; } } } else if (REVERSE_LOOKUP == session->getQType ()) { PR_AtomicIncrement(&addrlookups); memset((char *)rp, 0, sizeof(resi)); ar_reinfo.re_na_look++; const PRNetAddr* addrp = session->getIP(); locstatus = PR_TRUE; switch(addrp->raw.family) { case PR_AF_INET: rv = do_query_number(rp, (char *) &addrp->inet.ip, session, PR_AF_INET); break; case PR_AF_INET6: rv = do_query_number(rp, (char *) &addrp->ipv6.ip, session, PR_AF_INET6); break; default: locstatus = PR_FALSE; PR_SetError(PR_BAD_ADDRESS_ERROR, 0); break; } if (-1 == rv) { locstatus = PR_FALSE; } } } if (PR_TRUE == locstatus) { locstatus = PR_FALSE; int resend; do { resend = 0; session->wait(); if (DNS_COMPLETED == session->getStatus() ) { // Process answer and return meaningful data to caller. if (FORWARD_LOOKUP == session->getQType()) { if ((hp = ar_answer(session, &resend, NULL, 0)) != NULL) { PRInt32 rv = CopyHostent(session->getHentp(), hp, session->getBuffer(), session->getBufferSize()); if (rv != PR_AR_OK) PR_SetError(rv, 0); else locstatus = PR_TRUE; } } else if (REVERSE_LOOKUP == session->getQType()) { if (hp = ar_answer(session, &resend, NULL, 0)) { PRInt32 rv = CopyHostent(session->getHentp(), hp, session->getBuffer(), session->getBufferSize()); if (rv != PR_AR_OK) PR_SetError(rv, 0); else locstatus = PR_TRUE; } } } else if (DNS_TIMED_OUT == session->getStatus()) { PR_SetError(PR_IO_TIMEOUT_ERROR, 0); } else { PR_SetError(PR_BAD_ADDRESS_ERROR, 0); } } while (resend); } PR_AtomicDecrement(&curlookups); return locstatus; }
/** Try to look up hostname for an address. * @param[in] addr Address to look up. * @param[in] query Callback information. */ void gethost_byaddr(const struct irc_in_addr *addr, dns_callback_f callback, void *ctx) { do_query_number(callback, ctx, addr, NULL); }