forked from enlightenment/efl
revert 66063 + related commits: my dreams of zero-copy ecore-con transfers were shattered by the inconsistency of linux socket operations. way to go kernel developers.
SVN revision: 66078
This commit is contained in:
parent
5eeae75b21
commit
083d3466a1
|
@ -390,7 +390,3 @@
|
||||||
* Allow SSL certificates to be loaded for STARTTLS
|
* Allow SSL certificates to be loaded for STARTTLS
|
||||||
* Added functions to set/get the hostname used for SSL certificate verification
|
* Added functions to set/get the hostname used for SSL certificate verification
|
||||||
* ecore_con_ssl_server_cafile_add() now accepts directories
|
* ecore_con_ssl_server_cafile_add() now accepts directories
|
||||||
|
|
||||||
2011-12-09 Mike Blumenkrantz
|
|
||||||
|
|
||||||
* Created optimized reading mechanism for remote server connections
|
|
||||||
|
|
|
@ -1415,7 +1415,6 @@ AC_ARG_ENABLE([ipv6],
|
||||||
|
|
||||||
if test "x${have_ecore_con}" = "xyes" ; then
|
if test "x${have_ecore_con}" = "xyes" ; then
|
||||||
|
|
||||||
AC_CHECK_HEADERS([sys/ioctl.h winsock2.h])
|
|
||||||
# Verify IPV6 availability in headers
|
# Verify IPV6 availability in headers
|
||||||
if test "x${want_ipv6}" != "xno" ; then
|
if test "x${want_ipv6}" != "xno" ; then
|
||||||
AC_CHECK_TYPES([struct ipv6_mreq],
|
AC_CHECK_TYPES([struct ipv6_mreq],
|
||||||
|
|
|
@ -38,14 +38,6 @@
|
||||||
# include <Evil.h>
|
# include <Evil.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_IOCTL_H
|
|
||||||
# include <sys/ioctl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_WINSOCK2_H
|
|
||||||
# include <winsock2.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "Ecore.h"
|
#include "Ecore.h"
|
||||||
#include "ecore_private.h"
|
#include "ecore_private.h"
|
||||||
#include "Ecore_Con.h"
|
#include "Ecore_Con.h"
|
||||||
|
@ -1012,11 +1004,7 @@ ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num,
|
||||||
Ecore_Con_Event_Server_Data *e;
|
Ecore_Con_Event_Server_Data *e;
|
||||||
|
|
||||||
e = ecore_con_event_server_data_alloc();
|
e = ecore_con_event_server_data_alloc();
|
||||||
if (!e)
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
||||||
{
|
|
||||||
if (!duplicate) free(buf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
svr->event_count = eina_list_append(svr->event_count, e);
|
svr->event_count = eina_list_append(svr->event_count, e);
|
||||||
_ecore_con_server_timer_update(svr);
|
_ecore_con_server_timer_update(svr);
|
||||||
|
@ -1890,14 +1878,9 @@ error:
|
||||||
static void
|
static void
|
||||||
_ecore_con_cl_read(Ecore_Con_Server *svr)
|
_ecore_con_cl_read(Ecore_Con_Server *svr)
|
||||||
{
|
{
|
||||||
int num2 = 0, num = 0;
|
int num = 0;
|
||||||
#ifdef FIONREAD
|
|
||||||
double lr;
|
|
||||||
unsigned char *buf = NULL;
|
|
||||||
#else
|
|
||||||
unsigned char buf[READBUFSIZ];
|
|
||||||
#endif
|
|
||||||
Eina_Bool lost_server = EINA_TRUE;
|
Eina_Bool lost_server = EINA_TRUE;
|
||||||
|
unsigned char buf[READBUFSIZ];
|
||||||
|
|
||||||
DBG("svr=%p", svr);
|
DBG("svr=%p", svr);
|
||||||
|
|
||||||
|
@ -1912,50 +1895,23 @@ _ecore_con_cl_read(Ecore_Con_Server *svr)
|
||||||
lost_server = EINA_FALSE;
|
lost_server = EINA_FALSE;
|
||||||
_ecore_con_server_timer_update(svr);
|
_ecore_con_server_timer_update(svr);
|
||||||
}
|
}
|
||||||
#ifdef FIONREAD
|
|
||||||
# ifdef _WIN32
|
|
||||||
if (ioctlsocket(svr->fd, FIONREAD, &num)) goto error;
|
|
||||||
# else
|
|
||||||
errno = 0;
|
|
||||||
if (ioctl(svr->fd, FIONREAD, &num)) goto error;
|
|
||||||
# endif
|
|
||||||
if (!num)
|
|
||||||
{
|
|
||||||
int flags;
|
|
||||||
/* FIXME: this shouldn't happen */
|
|
||||||
ERR("EEK! read of 0 bytes! your app has broken ecore-con!");
|
|
||||||
flags = ECORE_FD_WRITE * ecore_main_fd_handler_active_get(svr->fd_handler, ECORE_FD_WRITE);
|
|
||||||
ecore_main_fd_handler_active_set(svr->fd_handler, flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lr = ecore_time_get();
|
|
||||||
if ((num < 100) && (lr - svr->last_read < 0.01)) num2 = READBUFSIZ / 8;
|
|
||||||
else if (num > READBUFSIZ) num2 = READBUFSIZ;
|
|
||||||
if (num2)
|
|
||||||
{
|
|
||||||
DBG("%d bytes available for read from ioctl(), trying size (%d) to avoid congestion", num, num2);
|
|
||||||
num = num2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DBG("%d bytes available for read", num);
|
|
||||||
svr->last_read = lr;
|
|
||||||
buf = malloc(num);
|
|
||||||
if (!buf) goto error;
|
|
||||||
#else
|
|
||||||
num = sizeof(buf);
|
|
||||||
(void)num2;
|
|
||||||
#endif
|
|
||||||
if (svr->ecs_state || !(svr->type & ECORE_CON_SSL))
|
if (svr->ecs_state || !(svr->type & ECORE_CON_SSL))
|
||||||
{
|
{
|
||||||
num = read(svr->fd, buf, num);
|
errno = 0;
|
||||||
|
num = read(svr->fd, buf, sizeof(buf));
|
||||||
/* 0 is not a valid return value for a tcp socket */
|
/* 0 is not a valid return value for a tcp socket */
|
||||||
if ((num < 0) || (errno && (errno != EAGAIN))) goto error;
|
if ((num > 0) || ((num < 0) && (errno == EAGAIN)))
|
||||||
|
lost_server = EINA_FALSE;
|
||||||
|
else if (num < 0)
|
||||||
|
ecore_con_event_server_error(svr, strerror(errno));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
num = ecore_con_ssl_server_read(svr, buf, num);
|
num = ecore_con_ssl_server_read(svr, buf, sizeof(buf));
|
||||||
/* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
|
/* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
|
||||||
if (num < 0) goto error;
|
if (num >= 0)
|
||||||
|
lost_server = EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!svr->delete_me) && (num > 0))
|
if ((!svr->delete_me) && (num > 0))
|
||||||
|
@ -1963,31 +1919,11 @@ _ecore_con_cl_read(Ecore_Con_Server *svr)
|
||||||
if (svr->ecs_state)
|
if (svr->ecs_state)
|
||||||
ecore_con_socks_read(svr, buf, num);
|
ecore_con_socks_read(svr, buf, num);
|
||||||
else
|
else
|
||||||
ecore_con_event_server_data(svr, buf, num,
|
ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
|
||||||
#ifdef FIONREAD
|
|
||||||
EINA_FALSE
|
|
||||||
#else
|
|
||||||
EINA_TRUE
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
if (lost_server)
|
||||||
error:
|
_ecore_con_server_kill(svr);
|
||||||
{
|
|
||||||
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
|
|
||||||
_ecore_con_server_kill(svr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
|
|
|
@ -150,7 +150,6 @@ struct _Ecore_Con_Server
|
||||||
const char *proxyip;
|
const char *proxyip;
|
||||||
int proxyport;
|
int proxyport;
|
||||||
/* endsocks */
|
/* endsocks */
|
||||||
/* SSL */
|
|
||||||
const char *verify_name;
|
const char *verify_name;
|
||||||
#if USE_GNUTLS
|
#if USE_GNUTLS
|
||||||
gnutls_session_t session;
|
gnutls_session_t session;
|
||||||
|
@ -166,9 +165,7 @@ struct _Ecore_Con_Server
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
#endif
|
#endif
|
||||||
/* ENDSSL */
|
|
||||||
double start_time;
|
double start_time;
|
||||||
double last_read;
|
|
||||||
Ecore_Timer *until_deletion;
|
Ecore_Timer *until_deletion;
|
||||||
double disconnect_time;
|
double disconnect_time;
|
||||||
double client_disconnect_time;
|
double client_disconnect_time;
|
||||||
|
|
|
@ -103,25 +103,11 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
|
||||||
DBG("SOCKS: %d bytes", num);
|
DBG("SOCKS: %d bytes", num);
|
||||||
if (num < 8)
|
if (num < 8)
|
||||||
{
|
{
|
||||||
#ifdef FIONREAD
|
|
||||||
if (!svr->ecs_recvbuf)
|
|
||||||
svr->ecs_recvbuf = eina_binbuf_manage_new_length(buf, num);
|
|
||||||
else
|
|
||||||
eina_binbuf_append_length(svr->ecs_recvbuf, buf, num);
|
|
||||||
if (!svr->ecs_recvbuf) goto error;
|
|
||||||
#else
|
|
||||||
if (!svr->ecs_recvbuf) svr->ecs_recvbuf = eina_binbuf_new();
|
if (!svr->ecs_recvbuf) svr->ecs_recvbuf = eina_binbuf_new();
|
||||||
if (!svr->ecs_recvbuf) goto error;
|
if (!svr->ecs_recvbuf) goto error;
|
||||||
eina_binbuf_append_length(svr->ecs_recvbuf, buf, num);
|
eina_binbuf_append_length(svr->ecs_recvbuf, buf, num);
|
||||||
#endif
|
|
||||||
/* the slowest connection on earth */
|
/* the slowest connection on earth */
|
||||||
if (eina_binbuf_length_get(svr->ecs_recvbuf) != 8)
|
if (eina_binbuf_length_get(svr->ecs_recvbuf) != 8) return;
|
||||||
{
|
|
||||||
#ifdef FIONREAD
|
|
||||||
free(buf);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
data = eina_binbuf_string_get(svr->ecs_recvbuf);
|
data = eina_binbuf_string_get(svr->ecs_recvbuf);
|
||||||
}
|
}
|
||||||
else if (num > 8) goto error;
|
else if (num > 8) goto error;
|
||||||
|
@ -163,9 +149,6 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
|
||||||
svr->ecs_state = ECORE_CON_SOCKS_STATE_DONE;
|
svr->ecs_state = ECORE_CON_SOCKS_STATE_DONE;
|
||||||
INF("PROXY CONNECTED");
|
INF("PROXY CONNECTED");
|
||||||
if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
|
if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
|
||||||
#ifdef FIONREAD
|
|
||||||
else free(buf);
|
|
||||||
#endif
|
|
||||||
svr->ecs_recvbuf = NULL;
|
svr->ecs_recvbuf = NULL;
|
||||||
svr->ecs_buf_offset = svr->ecs_addrlen = 0;
|
svr->ecs_buf_offset = svr->ecs_addrlen = 0;
|
||||||
memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr));
|
memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr));
|
||||||
|
@ -176,9 +159,6 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
error:
|
error:
|
||||||
#ifdef FIONREAD
|
|
||||||
free(buf);
|
|
||||||
#endif
|
|
||||||
_ecore_con_server_kill(svr);
|
_ecore_con_server_kill(svr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue