From 68e584ec8335cc4f57c89b40c7475c925f2346be Mon Sep 17 00:00:00 2001 From: discomfitor Date: Sat, 10 Dec 2011 05:09:47 +0000 Subject: [PATCH] add windows error events for new code, condense some connect handlers git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@66065 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore_con/ecore_con.c | 213 ++++++++++++---------------------- src/lib/ecore_con/ecore_con_private.h | 3 +- 2 files changed, 74 insertions(+), 142 deletions(-) diff --git a/src/lib/ecore_con/ecore_con.c b/src/lib/ecore_con/ecore_con.c index cd39aa1..679582c 100644 --- a/src/lib/ecore_con/ecore_con.c +++ b/src/lib/ecore_con/ecore_con.c @@ -1178,7 +1178,7 @@ ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info) } void -ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error) +_ecore_con_event_server_error(Ecore_Con_Server *svr, char *error, Eina_Bool duplicate) { Ecore_Con_Event_Server_Error *e; @@ -1186,7 +1186,7 @@ ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error) EINA_SAFETY_ON_NULL_RETURN(e); e->server = svr; - e->error = strdup(error); + e->error = duplicate ? strdup(error) : error; ERR("%s", error); svr->event_count = eina_list_append(svr->event_count, e); ecore_event_add(ECORE_CON_EVENT_SERVER_ERROR, e, (Ecore_End_Cb)_ecore_con_event_server_error_free, NULL); @@ -1461,37 +1461,21 @@ _ecore_con_cb_tcp_listen(void *data, svr = data; + errno = 0; if (!net_info) /* error message has already been handled */ goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); - if (svr->fd < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + 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; lin.l_onoff = 1; lin.l_linger = 0; if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin, sizeof(struct linger)) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY) { @@ -1502,34 +1486,29 @@ _ecore_con_cb_tcp_listen(void *data, sizeof(int)) < 0) #endif { - ecore_con_event_server_error(svr, strerror(errno)); goto error; } } - if (bind(svr->fd, net_info->info.ai_addr, - net_info->info.ai_addrlen) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - if (listen(svr->fd, 4096) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) + goto error; + + if (listen(svr->fd, 4096) < 0) goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, _ecore_con_svr_tcp_handler, svr, NULL, NULL); if (!svr->fd_handler) { ecore_con_event_server_error(svr, "Memory allocation failure"); - goto error; + ecore_con_ssl_server_shutdown(svr); + _ecore_con_server_kill(svr); } return; error: + if (errno) + ecore_con_event_server_error(svr, strerror(errno)); ecore_con_ssl_server_shutdown(svr); _ecore_con_server_kill(svr); } @@ -1550,16 +1529,13 @@ _ecore_con_cb_udp_listen(void *data, type = svr->type; type &= ECORE_CON_TYPE; + errno = 0; if (!net_info) /* error message has already been handled */ goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); - if (svr->fd < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + if (svr->fd < 0) goto error; if (type == ECORE_CON_REMOTE_MCAST) { @@ -1567,62 +1543,34 @@ _ecore_con_cb_udp_listen(void *data, { if (!inet_pton(net_info->info.ai_family, net_info->ip, &mreq.imr_multiaddr)) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) != 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; } #ifdef HAVE_IPV6 else if (net_info->info.ai_family == AF_INET6) { if (!inet_pton(net_info->info.ai_family, net_info->ip, &mreq6.ipv6mr_multiaddr)) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; mreq6.ipv6mr_interface = htonl(INADDR_ANY); if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq6, sizeof(mreq6)) != 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; } #endif } if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + 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 (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, @@ -1630,7 +1578,9 @@ _ecore_con_cb_udp_listen(void *data, if (!svr->fd_handler) { ecore_con_event_server_error(svr, "Memory allocation failure"); - goto error; + ecore_con_ssl_server_shutdown(svr); + _ecore_con_server_kill(svr); + return; } svr->ip = eina_stringshare_add(net_info->ip); @@ -1638,6 +1588,7 @@ _ecore_con_cb_udp_listen(void *data, return; error: + if (errno) ecore_con_event_server_error(svr, strerror(errno)); ecore_con_ssl_server_shutdown(svr); _ecore_con_server_kill(svr); } @@ -1652,34 +1603,19 @@ _ecore_con_cb_tcp_connect(void *data, svr = data; + errno = 0; if (!net_info) /* error message has already been handled */ goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); - if (svr->fd < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + if (svr->fd < 0) goto error; - if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - 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, (const void *)&curstate, sizeof(curstate)) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY) { @@ -1689,7 +1625,6 @@ _ecore_con_cb_tcp_connect(void *data, if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0) #endif { - ecore_con_event_server_error(svr, strerror(errno)); goto error; } } @@ -1699,17 +1634,19 @@ _ecore_con_cb_tcp_connect(void *data, if (res == SOCKET_ERROR) { if (WSAGetLastError() != WSAEINPROGRESS) - goto error; /* FIXME: strerror on windows? */ + { + char *err; + err = evil_format_message(WSAGetLastError()); + _ecore_con_event_server_error(svr, err, EINA_FALSE); + ecore_con_ssl_server_shutdown(svr); + _ecore_con_server_kill(svr); + return; + } #else if (res < 0) { - if (errno != EINPROGRESS) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - + if (errno != EINPROGRESS) goto error; #endif svr->connecting = EINA_TRUE; svr->fd_handler = @@ -1732,15 +1669,17 @@ _ecore_con_cb_tcp_connect(void *data, if (!svr->fd_handler) { ecore_con_event_server_error(svr, "Memory allocation failure"); - goto error; + ecore_con_ssl_server_shutdown(svr); + _ecore_con_server_kill(svr); } - if ((!svr->ecs) || (svr->ecs->lookup)) + if ((!svr->dead) && ((!svr->ecs) || (svr->ecs->lookup))) svr->ip = eina_stringshare_add(net_info->ip); return; error: + if (errno) ecore_con_event_server_error(svr, strerror(errno)); ecore_con_ssl_server_shutdown(svr); _ecore_con_server_kill(svr); } @@ -1754,51 +1693,30 @@ _ecore_con_cb_udp_connect(void *data, int broadcast = 1; svr = data; + errno = 0; if (!net_info) /* error message has already been handled */ goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); - if (svr->fd < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - - if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } - + 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 ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_BROADCAST) { if (setsockopt(svr->fd, SOL_SOCKET, SO_BROADCAST, (const void *)&broadcast, sizeof(broadcast)) < 0) { - ecore_con_event_server_error(svr, strerror(errno)); goto error; } } else if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; if (connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) - { - ecore_con_event_server_error(svr, strerror(errno)); - goto error; - } + goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, _ecore_con_cl_udp_handler, svr, NULL, NULL); @@ -1806,15 +1724,17 @@ _ecore_con_cb_udp_connect(void *data, if (!svr->fd_handler) { ecore_con_event_server_error(svr, "Memory allocation failure"); - goto error; + ecore_con_ssl_server_shutdown(svr); + _ecore_con_server_kill(svr); } - if ((!svr->ecs) || (svr->ecs->lookup)) + if ((!svr->dead) && ((!svr->ecs) || (svr->ecs->lookup))) svr->ip = eina_stringshare_add(net_info->ip); return; error: + if (errno) ecore_con_event_server_error(svr, strerror(errno)); ecore_con_ssl_server_shutdown(svr); _ecore_con_server_kill(svr); } @@ -2040,7 +1960,12 @@ _ecore_con_cl_read(Ecore_Con_Server *svr) errno = 0; if (ioctl(svr->fd, FIONREAD, &num)) goto error; # endif - if (!num) return; /* FIXME: this shouldn't happen */ + if (!num) + { + /* FIXME: this shouldn't happen */ + ERR("read of 0 bytes!"); + return; + } lr = ecore_time_get(); if ((num < 100) && (lr - svr->last_read < 0.01)) num2 = READBUFSIZ / 8; else if (num > READBUFSIZ) num2 = READBUFSIZ; @@ -2087,10 +2012,16 @@ _ecore_con_cl_read(Ecore_Con_Server *svr) return; error: -#ifndef _WIN32 - /* FIXME: strerror on windows */ - ecore_con_event_server_error(svr, strerror(errno)); + { + char *err; +#ifdef _WIN32 + err = evil_format_message(WSAGetLastError()); + _ecore_con_event_server_error(svr, err, EINA_FALSE); +#else + err = strerror(errno); + ecore_con_event_server_error(svr, err); #endif + } #ifdef FIONREAD free(buf); #endif diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index 098ca69..c68b559 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -284,7 +284,8 @@ void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info); void ecore_con_event_proxy_bind(Ecore_Con_Server *svr); void ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate); void ecore_con_event_server_del(Ecore_Con_Server *svr); -void ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error); +#define ecore_con_event_server_error(svr, error) _ecore_con_event_server_error((svr), (char*)(error), EINA_TRUE) +void _ecore_con_event_server_error(Ecore_Con_Server *svr, char *error, Eina_Bool duplicate); void ecore_con_event_client_add(Ecore_Con_Client *cl); void ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate); void ecore_con_event_client_del(Ecore_Con_Client *cl); -- 2.7.4