Go to the source code of this file.
Defines | |
#define | DNS_IPV4 1 |
#define | DNS_IPV6 2 |
#define | DNS_REVERSE 3 |
#define | DNS_PORT 53 |
Typedefs | |
typedef int(* | dns_callback_t )(void *client_data, const char *query, char **result) |
Functions | |
int | egg_dns_init (void) |
int | egg_dns_shutdown (void) |
void | egg_dns_send (char *query, int len) |
int | egg_dns_lookup (const char *host, int timeout, dns_callback_t callback, void *client_data, event_owner_t *owner) |
int | egg_dns_reverse (const char *ip, int timeout, dns_callback_t callback, void *client_data, event_owner_t *owner) |
int | egg_dns_cancel (int id, int issue_callback) |
int | egg_dns_cancel_by_owner (struct egg_module *module, void *script) |
#define DNS_PORT 53 |
typedef int(* dns_callback_t)(void *client_data, const char *query, char **result) |
int egg_dns_cancel | ( | int | id, | |
int | issue_callback | |||
) |
Definition at line 557 of file dns.c.
References dns_query::callback, dns_query::client_data, dns_query::id, dns_query::next, NULL, event_owner_b::on_delete, dns_query::owner, and dns_query::query.
Referenced by egg_connect_timeout(), egg_on_delete(), and kill_session().
00558 { 00559 dns_query_t *q, *prev; 00560 00561 prev = NULL; 00562 for (q = query_head; q; q = q->next) { 00563 if (q->id == id) break; 00564 prev = q; 00565 } 00566 if (!q) return(-1); 00567 if (prev) prev->next = q->next; 00568 else query_head = q->next; 00569 00570 if (issue_callback) q->callback(q->client_data, q->query, NULL); 00571 if (q->owner && q->owner->on_delete) q->owner->on_delete(q->owner, q->client_data); 00572 free(q); 00573 return(0); 00574 }
int egg_dns_cancel_by_owner | ( | struct egg_module * | module, | |
void * | script | |||
) |
Definition at line 576 of file dns.c.
References dns_query::client_data, event_owner_b::client_data, event_owner_b::module, dns_query::next, NULL, event_owner_b::on_delete, and dns_query::owner.
Referenced by script_remove_events_by_owner().
00577 { 00578 int removed = 0; 00579 dns_query_t *q, *prev= NULL, *next; 00580 00581 for (q = query_head; q; q = next) { 00582 next = q->next; 00583 if (!q->owner || q->owner->module != module || (script && q->owner->client_data != script)) { 00584 prev = q; 00585 continue; 00586 } 00587 if (prev) prev->next = q->next; 00588 else query_head = q->next; 00589 ++removed; 00590 00591 if (q->owner && q->owner->on_delete) q->owner->on_delete(q->owner, q->client_data); 00592 free(q); 00593 } 00594 return removed; 00595 }
int egg_dns_init | ( | void | ) |
Definition at line 398 of file dns.c.
References expire_queries(), dns_header_t::flags, read_hosts(), read_resolv(), and timer_create_secs().
Referenced by egg_net_init().
00399 { 00400 _dns_header.flags = htons(1 << 8 | 1 << 7); 00401 read_resolv("/etc/resolv.conf"); 00402 read_resolv(".resolv.conf"); 00403 read_hosts("/etc/hosts"); 00404 read_hosts(".hosts"); 00405 timer_create_secs(1, "dns_check_expires", (Function) expire_queries); 00406 return(0); 00407 }
int egg_dns_lookup | ( | const char * | host, | |
int | timeout, | |||
dns_callback_t | callback, | |||
void * | client_data, | |||
event_owner_t * | owner | |||
) |
Definition at line 173 of file dns.c.
References dns_cache_t::answer, answer_add(), answer_free(), answer_init(), cache_find(), dns_query::callback, dns_query::client_data, cut_host(), egg_dns_send(), dns_query::id, dns_answer_t::len, dns_answer_t::list, make_header(), dns_query::next, nhosts, event_owner_b::on_delete, dns_query::owner, dns_query::query, query_id, dns_query::remaining, shuffleArray(), and socket_valid_ip().
Referenced by dcc_dns_set(), egg_client(), and script_dns_lookup().
00174 { 00175 char buf[512]; 00176 dns_query_t *q; 00177 int i, len, cache_id; 00178 00179 if (socket_valid_ip(host)) { 00180 /* If it's already an ip, we're done. */ 00181 dns_answer_t answer; 00182 00183 answer_init(&answer); 00184 answer_add(&answer, host); 00185 callback(client_data, host, answer.list); 00186 answer_free(&answer); 00187 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00188 return(-1); 00189 } 00190 00191 /* Search our cache for the same query */ 00192 cache_id = cache_find(host); 00193 if (cache_id >= 0) { 00194 shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len); 00195 callback(client_data, host, cache[cache_id].answer.list); 00196 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00197 return(-1); 00198 } 00199 00200 /* Ok, now see if it's in our host cache. */ 00201 for (i = 0; i < nhosts; i++) { 00202 if (!strcasecmp(host, hosts[i].host)) { 00203 dns_answer_t answer; 00204 00205 answer_init(&answer); 00206 answer_add(&answer, hosts[i].ip); 00207 callback(client_data, host, answer.list); 00208 answer_free(&answer); 00209 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00210 return(-1); 00211 } 00212 } 00213 00214 /* Allocate our query struct. */ 00215 q = calloc(1, sizeof(*q)); 00216 q->id = query_id; 00217 query_id++; 00218 q->query = strdup(host); 00219 q->callback = callback; 00220 q->client_data = client_data; 00221 q->owner = owner; 00222 q->next = query_head; 00223 query_head = q; 00224 00225 /* Send the ipv4 query. */ 00226 q->remaining = 1; 00227 len = make_header(buf, q->id); 00228 len += cut_host(host, buf + len); 00229 buf[len] = 0; len++; buf[len] = 1; len++; 00230 buf[len] = 0; len++; buf[len] = 1; len++; 00231 00232 egg_dns_send(buf, len); 00233 00234 #ifdef IPV6 00235 /* Now send the ipv6 query. */ 00236 q->remaining++; 00237 len = make_header(buf, q->id); 00238 len += cut_host(host, buf + len); 00239 buf[len] = 0; len++; buf[len] = 28; len++; 00240 buf[len] = 0; len++; buf[len] = 1; len++; 00241 00242 egg_dns_send(buf, len); 00243 #endif 00244 00245 return(q->id); 00246 }
int egg_dns_reverse | ( | const char * | ip, | |
int | timeout, | |||
dns_callback_t | callback, | |||
void * | client_data, | |||
event_owner_t * | owner | |||
) |
Definition at line 251 of file dns.c.
References dns_cache_t::answer, answer_add(), answer_free(), answer_init(), cache_find(), dns_query::callback, dns_query::client_data, cut_host(), egg_dns_send(), dns_query::id, dns_answer_t::len, dns_answer_t::list, make_header(), dns_query::next, nhosts, NULL, event_owner_b::on_delete, dns_query::owner, dns_query::query, query_id, reverse_ip(), shuffleArray(), socket_ipv6_to_dots(), and socket_valid_ip().
Referenced by dcc_on_connect(), irc_on_newclient(), script_dns_reverse(), and telnet_on_newclient().
00252 { 00253 dns_query_t *q; 00254 char buf[512], *reversed_ip; 00255 int i, len, cache_id; 00256 00257 if (!socket_valid_ip(ip)) { 00258 /* If it's not a valid ip, don't even make the request. */ 00259 callback(client_data, ip, NULL); 00260 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00261 return(-1); 00262 } 00263 00264 /* Ok, see if we have it in our host cache. */ 00265 for (i = 0; i < nhosts; i++) { 00266 if (!strcasecmp(hosts[i].ip, ip)) { 00267 dns_answer_t answer; 00268 00269 answer_init(&answer); 00270 answer_add(&answer, hosts[i].host); 00271 callback(client_data, ip, answer.list); 00272 answer_free(&answer); 00273 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00274 return(-1); 00275 } 00276 } 00277 00278 /* Search our cache for the same query */ 00279 cache_id = cache_find(ip); 00280 if (cache_id >= 0) { 00281 shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len); 00282 callback(client_data, ip, cache[cache_id].answer.list); 00283 if (owner && owner->on_delete) owner->on_delete(owner, client_data); 00284 return(-1); 00285 } 00286 00287 /* We need to transform the ip address into the proper form 00288 * for reverse lookup. */ 00289 if (strchr(ip, ':')) { 00290 char temp[64]; 00291 00292 socket_ipv6_to_dots(ip, temp); 00293 reversed_ip = malloc(strlen(temp) + 10); 00294 reverse_ip(temp, reversed_ip); 00295 strcat(reversed_ip, ".ip6.arpa"); 00296 } 00297 else { 00298 reversed_ip = malloc(strlen(ip) + 14); 00299 reverse_ip(ip, reversed_ip); 00300 strcat(reversed_ip, ".in-addr.arpa"); 00301 } 00302 00303 len = make_header(buf, query_id); 00304 len += cut_host(reversed_ip, buf + len); 00305 buf[len] = 0; len++; buf[len] = 12; len++; 00306 buf[len] = 0; len++; buf[len] = 1; len++; 00307 00308 free(reversed_ip); 00309 00310 q = calloc(1, sizeof(*q)); 00311 q->id = query_id; 00312 query_id++; 00313 q->query = strdup(ip); 00314 q->callback = callback; 00315 q->client_data = client_data; 00316 q->owner = owner; 00317 q->next = query_head; 00318 query_head = q; 00319 00320 egg_dns_send(buf, len); 00321 00322 return(q->id); 00323 }
void egg_dns_send | ( | char * | query, | |
int | len | |||
) |
Definition at line 161 of file dns.c.
References dns_idx, get_dns_idx(), and sockbuf_write().
Referenced by egg_dns_lookup(), and egg_dns_reverse().
00162 { 00163 if (dns_idx < 0) { 00164 get_dns_idx(); 00165 if (dns_idx < 0) return; 00166 } 00167 sockbuf_write(dns_idx, query, len); 00168 }
int egg_dns_shutdown | ( | void | ) |
Definition at line 409 of file dns.c.
References nhosts, nservers, and NULL.
Referenced by egg_net_shutdown().
00410 { 00411 int i; 00412 00413 if (nservers > 0) { 00414 for (i = 0; i < nservers; i++) { 00415 if (servers[i].ip) free(servers[i].ip); 00416 } 00417 free(servers); servers = NULL; 00418 nservers = 0; 00419 } 00420 00421 if (nhosts > 0) { 00422 for (i = 0; i < nhosts; i++) { 00423 if (hosts[i].host) free(hosts[i].host); 00424 if (hosts[i].ip) free(hosts[i].ip); 00425 } 00426 free(hosts); hosts = NULL; 00427 nhosts = 0; 00428 } 00429 00430 return (0); 00431 }