add windows error events for new code, condense some connect handlers

SVN revision: 66065
This commit is contained in:
Mike Blumenkrantz 2011-12-10 05:09:47 +00:00
parent 0b109fb5c2
commit ff57b89995
2 changed files with 74 additions and 142 deletions

View File

@ -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

View File

@ -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);