void make_connection(struct connection *c, int port, int *sock, void (*func)(struct connection *)) { int as; unsigned char *host; struct conn_info *b; if (!(host = get_host_name(c->url))) { setcstate(c, S_INTERNAL); abort_connection(c); return; } if (c->newconn) internal("already making a connection"); b = mem_alloc(sizeof(struct conn_info)); b->func = func; b->sock = sock; b->port = port; c->newconn = b; log_data("\nCONNECTION: ", 13); log_data(host, strlen(host)); log_data("\n", 1); if (c->no_cache >= NC_RELOAD) as = find_host_no_cache(host, &b->addr, &c->dnsquery, (void(*)(void *, int))dns_found, c); else as = find_host(host, &b->addr, &c->dnsquery, (void(*)(void *, int))dns_found, c); mem_free(host); if (as) setcstate(c, S_DNS); }
int find_host(unsigned char *name, ip__address *addr, void **qp, void (*fn)(void *, int), void *data) { struct dnsentry *dnsentry; if (qp) *qp = NULL; if (!find_in_dns_cache(name, &dnsentry)) { if ((uttime)get_time() - (uttime)dnsentry->get_time > DNS_TIMEOUT) goto timeout; memcpy(addr, &dnsentry->addr, sizeof(ip__address)); fn(data, 0); return 0; } timeout: return find_host_no_cache(name, addr, qp, fn, data); }