2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
7 * http://www.faqs.org/rfcs/rfc1035.html
10 * And a sneakpeek at ares, ftp://athena-dist.mit.edu/pub/ATHENA/ares/
14 * * Check env LOCALDOMAIN to override search
15 * * Check env RES_OPTIONS to override options
17 * * Read /etc/host.conf
19 * RESOLV_HOST_CONF, RESOLV_SERV_ORDER
23 * We should store all names returned when CNAME, might have different ttl.
24 * Check against search and hostname when querying cache?
25 * * Remember all querys and delete them on shutdown
27 * * Need more buffer overflow checks.
29 #include "ecore_private.h"
31 #include "ecore_con_private.h"
34 #include <netinet/in.h>
35 #include <sys/socket.h>
36 #include <arpa/inet.h>
37 #include <arpa/nameser.h>
40 typedef struct _CB_Data CB_Data;
44 Ecore_List2 __list_data;
45 void (*cb_done) (void *data, struct hostent *hostent);
47 Ecore_Fd_Handler *fdh;
49 Ecore_Event_Handler *handler;
53 static void _ecore_con_dns_readdata(CB_Data *cbdata);
54 static void _ecore_con_dns_slave_free(CB_Data *cbdata);
55 static int _ecore_con_dns_data_handler(void *data, Ecore_Fd_Handler *fd_handler);
56 static int _ecore_con_dns_exit_handler(void *data, int type __UNUSED__, void *event);
58 static int dns_init = 0;
59 static Ecore_List2 *dns_slaves = NULL;
62 ecore_con_dns_init(void)
69 ecore_con_dns_shutdown(void)
74 while (dns_slaves) _ecore_con_dns_slave_free((CB_Data *)dns_slaves);
80 ecore_con_dns_lookup(const char *name,
81 void (*done_cb) (void *data, struct hostent *hostent),
87 if (pipe(fd) < 0) return 0;
88 cbdata = calloc(1, sizeof(CB_Data));
95 cbdata->cb_done = done_cb;
98 if (!(cbdata->fdh = ecore_main_fd_handler_add(fd[0], ECORE_FD_READ,
99 _ecore_con_dns_data_handler,
109 if ((cbdata->pid = fork()) == 0)
114 he = gethostbyname(name);
119 memcpy((struct in_addr *)&addr, he->h_addr,
120 sizeof(struct in_addr));
121 write(fd[1], &(addr.s_addr), sizeof(in_addr_t));
131 cbdata->handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_dns_exit_handler, cbdata);
132 if (!cbdata->handler)
134 ecore_main_fd_handler_del(cbdata->fdh);
140 dns_slaves = _ecore_list2_append(dns_slaves, cbdata);
145 _ecore_con_dns_readdata(CB_Data *cbdata)
152 size = read(ecore_main_fd_handler_fd_get(cbdata->fdh), &(addr.s_addr),
154 if (size == sizeof(in_addr_t))
156 addr2 = (char *)&addr;
157 he.h_addrtype = AF_INET;
158 he.h_length = sizeof(in_addr_t);
159 he.h_addr_list = &addr2;
160 cbdata->cb_done(cbdata->data, &he);
163 cbdata->cb_done(cbdata->data, NULL);
164 cbdata->cb_done = NULL;
168 _ecore_con_dns_slave_free(CB_Data *cbdata)
170 dns_slaves = _ecore_list2_remove(dns_slaves, cbdata);
171 close(ecore_main_fd_handler_fd_get(cbdata->fdh));
173 ecore_main_fd_handler_del(cbdata->fdh);
174 ecore_event_handler_del(cbdata->handler);
179 _ecore_con_dns_data_handler(void *data, Ecore_Fd_Handler *fd_handler)
186 if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
187 _ecore_con_dns_readdata(cbdata);
190 cbdata->cb_done(cbdata->data, NULL);
191 cbdata->cb_done = NULL;
194 _ecore_con_dns_slave_free(cbdata);
199 _ecore_con_dns_exit_handler(void *data, int type __UNUSED__, void *event)
202 Ecore_Exe_Event_Del *ev;
206 if (cbdata->pid != ev->pid) return 1;
208 _ecore_con_dns_slave_free(cbdata);