Enlightenment CVS committal Author : sebastid Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_con Modified Files: Ecore_Con.h Makefile.am ecore_con.c ecore_con_private.h Added Files: ecore_con_dns.c Log Message: non-blocking gethostbyname =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Ecore_Con.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- Ecore_Con.h 24 Jun 2005 13:38:27 -0000 1.9 +++ Ecore_Con.h 16 Aug 2005 09:25:02 -0000 1.10 @@ -18,6 +18,8 @@ # endif #endif +#include <netdb.h> + /** * @file Ecore_Con.h * @brief Sockets functions. @@ -161,6 +163,11 @@ EAPI int ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url); EAPI int ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type); + EAPI int ecore_con_dns_gethostbyname(const char *name, + void (*done_cb)(struct hostent *hostent, void *data), + void *data); + + #ifdef __cplusplus } #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/Makefile.am,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- Makefile.am 24 Jun 2005 13:38:27 -0000 1.10 +++ Makefile.am 16 Aug 2005 09:25:02 -0000 1.11 @@ -18,6 +18,7 @@ libecore_con_la_SOURCES = \ ecore_con.c \ +ecore_con_dns.c \ ecore_con_url.c \ ecore_con_private.h @@ -32,5 +33,6 @@ EXTRA_DIST = \ ecore_con.c \ +ecore_con_dns.c \ ecore_con_url.c \ ecore_con_private.h =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- ecore_con.c 15 Aug 2005 23:36:22 -0000 1.43 +++ ecore_con.c 16 Aug 2005 09:25:02 -0000 1.44 @@ -29,6 +29,7 @@ #include <time.h> #endif +static void _ecore_con_cb_gethostbyname(struct hostent *he, void *data); static void _ecore_con_server_free(Ecore_Con_Server *svr); static void _ecore_con_client_free(Ecore_Con_Client *cl); static int _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler); @@ -80,7 +81,10 @@ #if USE_OPENSSL SSL_library_init(); SSL_load_error_strings(); -#endif +#endif + + /* TODO Remember return value, if it fails, use gethostbyname() */ + ecore_con_dns_init(); } if (!servers) servers = ecore_list_new(); @@ -104,6 +108,8 @@ _ecore_con_server_free(ecore_list_remove_first(servers)); ecore_list_destroy(servers); servers = NULL; + + ecore_con_dns_shutdown(); } return 0; } @@ -371,7 +377,6 @@ Ecore_Con_Server *svr; Ecore_Con_Type type; struct sockaddr_un socket_unix; - struct sockaddr_in socket_addr; int curstate = 0; char buf[4096]; @@ -437,36 +442,7 @@ } else if (type == ECORE_CON_REMOTE_SYSTEM) { - struct hostent *he; - - /* FIXME: gethostbyname is blocking... */ - if (!(he = gethostbyname(name))) goto error; - svr->fd = socket(AF_INET, SOCK_STREAM, 0); - if (svr->fd < 0) goto error; - if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error; - if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error; - if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) goto error; - socket_addr.sin_family = AF_INET; - socket_addr.sin_port = htons(port); - memcpy((struct in_addr *)&socket_addr.sin_addr, - he->h_addr, sizeof(struct in_addr)); - if (connect(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) < 0) - { - if (errno != EINPROGRESS) - goto error; - svr->connecting = 1; - svr->fd_handler = ecore_main_fd_handler_add(svr->fd, - ECORE_FD_READ | ECORE_FD_WRITE, - _ecore_con_cl_handler, svr, - NULL, NULL); - } - else - svr->fd_handler = ecore_main_fd_handler_add(svr->fd, - ECORE_FD_READ, - _ecore_con_cl_handler, svr, - NULL, NULL); - - if (!svr->fd_handler) goto error; + ecore_con_dns_gethostbyname(name, _ecore_con_cb_gethostbyname, svr); } #if USE_OPENSSL @@ -922,10 +898,52 @@ svr->fd_handler = NULL; } +static void +_ecore_con_cb_gethostbyname(struct hostent *he, void *data) +{ + Ecore_Con_Server *svr; + struct sockaddr_in socket_addr; + int curstate = 0; + + svr = data; + + svr->fd = socket(AF_INET, SOCK_STREAM, 0); + if (svr->fd < 0) goto error; + if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error; + if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error; + if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) goto error; + socket_addr.sin_family = AF_INET; + socket_addr.sin_port = htons(svr->port); + memcpy((struct in_addr *)&socket_addr.sin_addr, + he->h_addr, sizeof(struct in_addr)); + if (connect(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) < 0) + { + if (errno != EINPROGRESS) + goto error; + svr->connecting = 1; + svr->fd_handler = ecore_main_fd_handler_add(svr->fd, + ECORE_FD_READ | ECORE_FD_WRITE, + _ecore_con_cl_handler, svr, + NULL, NULL); + } + else + svr->fd_handler = ecore_main_fd_handler_add(svr->fd, + ECORE_FD_READ, + _ecore_con_cl_handler, svr, + NULL, NULL); + + if (!svr->fd_handler) goto error; + return; + + error: + kill_server(svr); +} + static int svr_try_connect_plain(Ecore_Con_Server *svr) { - int so_err = 0, size = sizeof(int); + int so_err = 0; + unsigned int size = sizeof(int); if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0) so_err = -1; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con_private.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- ecore_con_private.h 24 Jun 2005 13:38:27 -0000 1.8 +++ ecore_con_private.h 16 Aug 2005 09:25:02 -0000 1.9 @@ -83,4 +83,8 @@ char active : 1; }; #endif + +/* from ecore_con_dns.c */ +int ecore_con_dns_init(void); +void ecore_con_dns_shutdown(void); #endif ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs