lib/eggdrop/dns.h File Reference

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 Documentation

#define DNS_IPV4   1

Definition at line 25 of file dns.h.

#define DNS_IPV6   2

Definition at line 26 of file dns.h.

#define DNS_PORT   53

Definition at line 29 of file dns.h.

Referenced by get_dns_idx().

#define DNS_REVERSE   3

Definition at line 27 of file dns.h.


Typedef Documentation

typedef int(* dns_callback_t)(void *client_data, const char *query, char **result)

Definition at line 31 of file dns.h.


Function Documentation

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 }


Generated on Sun Nov 30 18:43:34 2008 for eggdrop1.9 by  doxygen 1.5.6