2009-01-31 10:33:39 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2010-01-04 15:43:16 -08:00
|
|
|
#include <stdio.h>
|
2010-01-16 05:44:25 -08:00
|
|
|
#include <string.h>
|
2009-11-20 02:58:19 -08:00
|
|
|
#include <sys/types.h>
|
2003-09-23 01:09:32 -07:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <errno.h>
|
2009-01-31 10:33:39 -08:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
2006-03-13 00:50:26 -08:00
|
|
|
|
2010-02-20 11:12:52 -08:00
|
|
|
#ifdef HAVE_NETINET_TCP_H
|
2010-02-20 10:01:50 -08:00
|
|
|
# include <netinet/tcp.h>
|
|
|
|
#endif
|
2006-01-06 09:58:12 -08:00
|
|
|
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
2008-01-25 21:40:53 -08:00
|
|
|
# include <netinet/in.h>
|
|
|
|
#endif
|
2006-01-06 09:58:12 -08:00
|
|
|
|
2011-11-14 14:25:07 -08:00
|
|
|
#ifdef HAVE_ARPA_INET_H
|
|
|
|
# include <arpa/inet.h>
|
|
|
|
#endif
|
|
|
|
|
2010-02-20 11:12:52 -08:00
|
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
|
|
# include <sys/socket.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_UN_H
|
|
|
|
# include <sys/un.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_WS2TCPIP_H
|
|
|
|
# include <ws2tcpip.h>
|
|
|
|
#endif
|
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
# include <Evil.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "Ecore.h"
|
|
|
|
#include "ecore_private.h"
|
|
|
|
#include "Ecore_Con.h"
|
|
|
|
#include "ecore_con_private.h"
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
static Eina_Bool _ecore_con_client_timer(Ecore_Con_Client *cl);
|
|
|
|
static void _ecore_con_cl_timer_update(Ecore_Con_Client *cl);
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
static Eina_Bool _ecore_con_server_timer(Ecore_Con_Server *svr);
|
|
|
|
static void _ecore_con_server_timer_update(Ecore_Con_Server *svr);
|
|
|
|
|
2010-11-03 10:58:37 -07:00
|
|
|
static void _ecore_con_cb_tcp_connect(void *data,
|
|
|
|
Ecore_Con_Info *info);
|
|
|
|
static void _ecore_con_cb_udp_connect(void *data,
|
|
|
|
Ecore_Con_Info *info);
|
|
|
|
static void _ecore_con_cb_tcp_listen(void *data,
|
|
|
|
Ecore_Con_Info *info);
|
|
|
|
static void _ecore_con_cb_udp_listen(void *data,
|
|
|
|
Ecore_Con_Info *info);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
static void _ecore_con_server_free(Ecore_Con_Server *svr);
|
|
|
|
static void _ecore_con_client_free(Ecore_Con_Client *cl);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
static void _ecore_con_cl_read(Ecore_Con_Server *svr);
|
2010-11-03 10:58:37 -07:00
|
|
|
static Eina_Bool _ecore_con_svr_tcp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler);
|
|
|
|
static Eina_Bool _ecore_con_cl_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler);
|
|
|
|
static Eina_Bool _ecore_con_cl_udp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler);
|
|
|
|
static Eina_Bool _ecore_con_svr_udp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler);
|
2010-09-17 22:30:16 -07:00
|
|
|
|
|
|
|
static void _ecore_con_svr_cl_read(Ecore_Con_Client *cl);
|
2010-11-03 10:58:37 -07:00
|
|
|
static Eina_Bool _ecore_con_svr_cl_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler);
|
|
|
|
|
|
|
|
static void _ecore_con_server_flush(Ecore_Con_Server *svr);
|
|
|
|
static void _ecore_con_client_flush(Ecore_Con_Client *cl);
|
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
static void _ecore_con_event_client_add_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev);
|
2011-02-10 11:17:30 -08:00
|
|
|
static void _ecore_con_event_client_del_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev);
|
2011-02-10 11:17:30 -08:00
|
|
|
static void _ecore_con_event_client_data_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev);
|
|
|
|
static void _ecore_con_event_server_add_free(void *data,
|
|
|
|
void *ev);
|
|
|
|
static void _ecore_con_event_server_del_free(void *data,
|
|
|
|
void *ev);
|
|
|
|
static void _ecore_con_event_server_data_free(void *data,
|
|
|
|
void *ev);
|
2011-02-10 11:17:30 -08:00
|
|
|
static void _ecore_con_event_server_error_free(void *data,
|
|
|
|
Ecore_Con_Event_Server_Error *e);
|
|
|
|
static void _ecore_con_event_client_error_free(Ecore_Con_Server *svr,
|
|
|
|
Ecore_Con_Event_Client_Error *e);
|
2011-09-13 16:03:26 -07:00
|
|
|
static void _ecore_con_event_server_write_free(void *data,
|
|
|
|
Ecore_Con_Event_Server_Write *e);
|
|
|
|
static void _ecore_con_event_client_write_free(Ecore_Con_Server *svr,
|
|
|
|
Ecore_Con_Event_Client_Write *e);
|
2010-11-03 10:58:37 -07:00
|
|
|
|
|
|
|
static void _ecore_con_lookup_done(void *data,
|
|
|
|
Ecore_Con_Info *infos);
|
2010-07-22 04:32:55 -07:00
|
|
|
|
2011-09-29 14:05:20 -07:00
|
|
|
static const char * _ecore_con_pretty_ip(struct sockaddr *client_addr);
|
2010-11-16 13:32:50 -08:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int ECORE_CON_EVENT_CLIENT_ADD = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_CLIENT_DEL = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_SERVER_ADD = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_SERVER_DEL = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_CLIENT_DATA = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_SERVER_DATA = 0;
|
2011-09-13 16:03:26 -07:00
|
|
|
EAPI int ECORE_CON_EVENT_CLIENT_WRITE = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_SERVER_WRITE = 0;
|
2011-02-10 00:49:23 -08:00
|
|
|
EAPI int ECORE_CON_EVENT_CLIENT_ERROR = 0;
|
|
|
|
EAPI int ECORE_CON_EVENT_SERVER_ERROR = 0;
|
2003-09-23 01:09:32 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
static Eina_List *servers = NULL;
|
2009-10-09 22:28:43 -07:00
|
|
|
static int _ecore_con_init_count = 0;
|
2011-11-10 18:44:16 -08:00
|
|
|
static int _ecore_con_event_count = 0;
|
2009-12-21 09:32:19 -08:00
|
|
|
int _ecore_con_log_dom = -1;
|
2003-09-23 01:09:32 -07:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_init(void)
|
|
|
|
{
|
2009-10-09 22:28:43 -07:00
|
|
|
if (++_ecore_con_init_count != 1)
|
2010-11-03 10:58:37 -07:00
|
|
|
return _ecore_con_init_count;
|
2009-10-09 22:28:43 -07:00
|
|
|
|
2010-01-14 23:44:27 -08:00
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
if (!evil_init())
|
2010-11-03 10:58:37 -07:00
|
|
|
return --_ecore_con_init_count;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-01-14 23:44:27 -08:00
|
|
|
#endif
|
|
|
|
|
2009-10-09 22:28:43 -07:00
|
|
|
if (!ecore_init())
|
2010-11-03 10:58:37 -07:00
|
|
|
return --_ecore_con_init_count;
|
2005-09-07 02:06:06 -07:00
|
|
|
|
2010-10-07 15:31:46 -07:00
|
|
|
_ecore_con_log_dom = eina_log_domain_register
|
2010-11-03 10:58:37 -07:00
|
|
|
("ecore_con", ECORE_CON_DEFAULT_LOG_COLOR);
|
2010-11-05 18:22:50 -07:00
|
|
|
if (_ecore_con_log_dom < 0)
|
2009-12-21 09:32:19 -08:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
EINA_LOG_ERR("Impossible to create a log domain for Ecore Con.");
|
|
|
|
ecore_shutdown();
|
|
|
|
return --_ecore_con_init_count;
|
2009-12-21 09:32:19 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_mempool_init();
|
|
|
|
|
2005-09-07 02:06:06 -07:00
|
|
|
ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_SERVER_ADD = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_SERVER_DEL = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new();
|
2011-09-13 16:03:26 -07:00
|
|
|
ECORE_CON_EVENT_CLIENT_WRITE = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_SERVER_WRITE = ecore_event_type_new();
|
2011-02-10 00:49:23 -08:00
|
|
|
ECORE_CON_EVENT_CLIENT_ERROR = ecore_event_type_new();
|
|
|
|
ECORE_CON_EVENT_SERVER_ERROR = ecore_event_type_new();
|
2004-03-31 08:47:45 -08:00
|
|
|
|
2010-11-06 10:04:09 -07:00
|
|
|
|
|
|
|
eina_magic_string_set(ECORE_MAGIC_CON_SERVER, "Ecore_Con_Server");
|
|
|
|
eina_magic_string_set(ECORE_MAGIC_CON_CLIENT, "Ecore_Con_Server");
|
|
|
|
eina_magic_string_set(ECORE_MAGIC_CON_URL, "Ecore_Con_Url");
|
|
|
|
|
2005-09-07 02:06:06 -07:00
|
|
|
/* TODO Remember return value, if it fails, use gethostbyname() */
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_init();
|
2008-10-09 05:30:19 -07:00
|
|
|
ecore_con_info_init();
|
2005-09-07 02:06:06 -07:00
|
|
|
|
2009-10-09 22:28:43 -07:00
|
|
|
return _ecore_con_init_count;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_shutdown(void)
|
|
|
|
{
|
2010-11-11 12:34:35 -08:00
|
|
|
Eina_List *l, *l2;
|
|
|
|
Ecore_Con_Server *svr;
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2009-10-09 22:28:43 -07:00
|
|
|
if (--_ecore_con_init_count != 0)
|
2010-11-03 10:58:37 -07:00
|
|
|
return _ecore_con_init_count;
|
2010-01-28 08:07:33 -08:00
|
|
|
|
2010-11-11 12:34:35 -08:00
|
|
|
EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
|
2011-11-10 18:44:16 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Add *ev;
|
|
|
|
|
|
|
|
svr->delete_me = svr->dead = EINA_TRUE;
|
|
|
|
/* some pointer hacks here to prevent double frees if people are being stupid */
|
|
|
|
EINA_LIST_FREE(svr->event_count, ev)
|
|
|
|
ev->server = NULL;
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
2005-09-07 02:06:06 -07:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
if (!_ecore_con_event_count) ecore_con_mempool_shutdown();
|
2011-11-06 04:26:00 -08:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
ecore_con_info_shutdown();
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_shutdown();
|
2009-12-21 09:32:19 -08:00
|
|
|
eina_log_domain_unregister(_ecore_con_log_dom);
|
|
|
|
_ecore_con_log_dom = -1;
|
2006-01-19 01:11:30 -08:00
|
|
|
ecore_shutdown();
|
2010-01-14 23:44:27 -08:00
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
evil_shutdown();
|
|
|
|
#endif
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2009-10-09 22:28:43 -07:00
|
|
|
return _ecore_con_init_count;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-09-20 23:49:07 -07:00
|
|
|
|
|
|
|
EAPI Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_lookup(const char *name,
|
|
|
|
Ecore_Con_Dns_Cb done_cb,
|
|
|
|
const void *data)
|
2010-09-20 23:49:07 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
Ecore_Con_Lookup *lk;
|
|
|
|
struct addrinfo hints;
|
|
|
|
|
|
|
|
if (!name || !done_cb)
|
2010-11-03 10:58:37 -07:00
|
|
|
return EINA_FALSE;
|
2010-09-20 23:49:07 -07:00
|
|
|
|
|
|
|
svr = calloc(1, sizeof(Ecore_Con_Server));
|
|
|
|
if (!svr)
|
2010-11-03 10:58:37 -07:00
|
|
|
return EINA_FALSE;
|
2010-09-20 23:49:07 -07:00
|
|
|
|
|
|
|
lk = malloc(sizeof (Ecore_Con_Lookup));
|
|
|
|
if (!lk)
|
|
|
|
{
|
|
|
|
free(svr);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
lk->done_cb = done_cb;
|
|
|
|
lk->data = data;
|
|
|
|
|
|
|
|
svr->name = strdup(name);
|
|
|
|
if (!svr->name)
|
2010-11-03 10:58:37 -07:00
|
|
|
goto on_error;
|
2010-09-20 23:49:07 -07:00
|
|
|
|
|
|
|
svr->type = ECORE_CON_REMOTE_TCP;
|
|
|
|
svr->port = 1025;
|
|
|
|
svr->data = lk;
|
|
|
|
svr->created = EINA_TRUE;
|
|
|
|
svr->reject_excess_clients = EINA_FALSE;
|
|
|
|
svr->client_limit = -1;
|
|
|
|
svr->clients = NULL;
|
|
|
|
svr->ppid = getpid();
|
|
|
|
|
|
|
|
memset(&hints, 0, sizeof(struct addrinfo));
|
2011-07-04 13:04:18 -07:00
|
|
|
hints.ai_family = AF_UNSPEC;
|
2010-09-20 23:49:07 -07:00
|
|
|
hints.ai_socktype = SOCK_STREAM;
|
|
|
|
hints.ai_flags = AI_CANONNAME;
|
|
|
|
hints.ai_protocol = IPPROTO_TCP;
|
|
|
|
hints.ai_canonname = NULL;
|
|
|
|
hints.ai_next = NULL;
|
|
|
|
hints.ai_addr = NULL;
|
|
|
|
|
|
|
|
if (ecore_con_info_get(svr, _ecore_con_lookup_done, svr,
|
|
|
|
&hints))
|
2010-11-03 10:58:37 -07:00
|
|
|
return EINA_TRUE;
|
2010-09-20 23:49:07 -07:00
|
|
|
|
|
|
|
free(svr->name);
|
|
|
|
on_error:
|
|
|
|
free(lk);
|
|
|
|
free(svr);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2004-09-22 01:17:15 -07:00
|
|
|
/**
|
2010-07-28 17:27:15 -07:00
|
|
|
* @addtogroup Ecore_Con_Server_Group Ecore Connection Server Functions
|
2004-09-22 01:17:15 -07:00
|
|
|
*
|
|
|
|
* Functions that operate on Ecore server objects.
|
2010-09-20 23:49:07 -07:00
|
|
|
*
|
2010-07-28 17:27:15 -07:00
|
|
|
* @{
|
2004-09-22 01:17:15 -07:00
|
|
|
*/
|
|
|
|
|
2010-09-20 23:49:07 -07:00
|
|
|
/**
|
|
|
|
* @example ecore_con_server_example.c
|
|
|
|
* Shows how to write a simple server using the Ecore_Con library.
|
2010-11-03 10:58:37 -07:00
|
|
|
*/
|
2010-09-20 23:49:07 -07:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI Ecore_Con_Server *
|
2010-09-20 23:49:07 -07:00
|
|
|
ecore_con_server_add(Ecore_Con_Type compl_type,
|
2010-11-03 10:58:37 -07:00
|
|
|
const char *name,
|
|
|
|
int port,
|
|
|
|
const void *data)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
Ecore_Con_Type type;
|
|
|
|
|
|
|
|
if (port < 0 || !name)
|
2010-11-03 10:58:37 -07:00
|
|
|
return NULL; /* local user socket: FILE: ~/.ecore/[name]/[port] */
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
/* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */
|
|
|
|
/* remote system socket: TCP/IP: [name]:[port] */
|
|
|
|
svr = calloc(1, sizeof(Ecore_Con_Server));
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr)
|
2010-11-03 10:58:37 -07:00
|
|
|
return NULL;
|
2003-09-23 01:09:32 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->name = strdup(name);
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr->name)
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->type = compl_type;
|
|
|
|
svr->port = port;
|
|
|
|
svr->data = (void *)data;
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->created = EINA_TRUE;
|
2010-10-13 09:40:52 -07:00
|
|
|
if (compl_type & ECORE_CON_LOAD_CERT)
|
|
|
|
svr->use_cert = EINA_TRUE;
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->reject_excess_clients = EINA_FALSE;
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->client_limit = -1;
|
2008-12-11 05:55:47 -08:00
|
|
|
svr->clients = NULL;
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->ppid = getpid();
|
2010-09-18 12:29:43 -07:00
|
|
|
if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL))
|
|
|
|
goto error;
|
2008-10-09 05:30:19 -07:00
|
|
|
|
|
|
|
type = compl_type & ECORE_CON_TYPE;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if ((type == ECORE_CON_LOCAL_USER) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_LOCAL_SYSTEM) ||
|
2006-09-24 00:53:47 -07:00
|
|
|
(type == ECORE_CON_LOCAL_ABSTRACT))
|
2010-11-03 10:58:37 -07:00
|
|
|
/* Local */
|
2011-05-14 10:52:30 -07:00
|
|
|
#ifdef _WIN32
|
|
|
|
if (!ecore_con_local_listen(svr))
|
|
|
|
goto error;
|
|
|
|
#else
|
2010-11-03 10:58:37 -07:00
|
|
|
if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr))
|
|
|
|
goto error;
|
2011-05-14 10:52:30 -07:00
|
|
|
#endif
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if ((type == ECORE_CON_REMOTE_TCP) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_REMOTE_NODELAY))
|
2008-09-17 08:08:48 -07:00
|
|
|
{
|
2008-10-09 05:30:19 -07:00
|
|
|
/* TCP */
|
2010-11-03 10:58:37 -07:00
|
|
|
if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen,
|
|
|
|
svr))
|
2010-07-26 23:30:27 -07:00
|
|
|
goto error;
|
2004-04-14 01:51:19 -07:00
|
|
|
}
|
2010-05-15 20:04:18 -07:00
|
|
|
else if ((type == ECORE_CON_REMOTE_MCAST) ||
|
|
|
|
(type == ECORE_CON_REMOTE_UDP))
|
2010-11-03 10:58:37 -07:00
|
|
|
/* UDP and MCAST */
|
|
|
|
if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen,
|
|
|
|
svr))
|
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
servers = eina_list_append(servers, svr);
|
2008-10-08 17:46:29 -07:00
|
|
|
ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
return svr;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
|
|
|
if (svr->name)
|
2010-11-03 10:58:37 -07:00
|
|
|
free(svr->name);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->path)
|
2010-11-03 10:58:37 -07:00
|
|
|
free(svr->path);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-03-03 13:05:28 -08:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_del(svr->fd_handler);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-01-06 14:35:31 -08:00
|
|
|
if (svr->fd > 0)
|
2010-12-15 20:38:37 -08:00
|
|
|
close(svr->fd);
|
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
if (svr->buf)
|
|
|
|
eina_binbuf_free(svr->buf);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->ip)
|
2010-11-16 13:32:50 -08:00
|
|
|
eina_stringshare_del(svr->ip);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2003-09-23 01:09:32 -07:00
|
|
|
free(svr);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI Ecore_Con_Server *
|
2010-09-20 23:49:07 -07:00
|
|
|
ecore_con_server_connect(Ecore_Con_Type compl_type,
|
2010-11-03 10:58:37 -07:00
|
|
|
const char *name,
|
|
|
|
int port,
|
|
|
|
const void *data)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
Ecore_Con_Type type;
|
|
|
|
|
2010-12-15 21:13:29 -08:00
|
|
|
if ((!name) || (!name[0]))
|
2010-11-03 10:58:37 -07:00
|
|
|
return NULL;
|
2010-09-18 12:26:05 -07:00
|
|
|
/* local user socket: FILE: ~/.ecore/[name]/[port] */
|
2003-09-23 01:09:32 -07:00
|
|
|
/* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */
|
|
|
|
/* remote system socket: TCP/IP: [name]:[port] */
|
|
|
|
svr = calloc(1, sizeof(Ecore_Con_Server));
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr)
|
2010-11-03 10:58:37 -07:00
|
|
|
return NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->name = strdup(name);
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr->name)
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->type = compl_type;
|
|
|
|
svr->port = port;
|
|
|
|
svr->data = (void *)data;
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->created = EINA_FALSE;
|
2010-09-27 20:16:08 -07:00
|
|
|
svr->use_cert = (compl_type & ECORE_CON_LOAD_CERT);
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->reject_excess_clients = EINA_FALSE;
|
2008-12-11 05:55:47 -08:00
|
|
|
svr->clients = NULL;
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->client_limit = -1;
|
2010-09-18 12:29:43 -07:00
|
|
|
if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL))
|
|
|
|
goto error;
|
2008-10-09 05:30:19 -07:00
|
|
|
|
|
|
|
type = compl_type & ECORE_CON_TYPE;
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (((type == ECORE_CON_REMOTE_TCP) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_REMOTE_NODELAY) ||
|
2010-07-26 23:30:27 -07:00
|
|
|
(type == ECORE_CON_REMOTE_UDP) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_REMOTE_BROADCAST)) &&
|
|
|
|
(port < 0))
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if ((type == ECORE_CON_LOCAL_USER) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_LOCAL_SYSTEM) ||
|
2006-09-24 00:53:47 -07:00
|
|
|
(type == ECORE_CON_LOCAL_ABSTRACT))
|
2010-11-03 10:58:37 -07:00
|
|
|
/* Local */
|
2011-05-14 10:52:30 -07:00
|
|
|
#ifdef _WIN32
|
2011-07-04 17:06:27 -07:00
|
|
|
if (!ecore_con_local_connect(svr, _ecore_con_cl_handler))
|
|
|
|
goto error;
|
2011-05-14 10:52:30 -07:00
|
|
|
#else
|
2011-07-04 17:06:27 -07:00
|
|
|
if (!ecore_con_local_connect(svr, _ecore_con_cl_handler, svr))
|
|
|
|
goto error;
|
2011-05-14 10:52:30 -07:00
|
|
|
#endif
|
2004-03-31 08:47:45 -08:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if ((type == ECORE_CON_REMOTE_TCP) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_REMOTE_NODELAY))
|
2006-01-19 01:11:30 -08:00
|
|
|
{
|
2008-10-09 05:30:19 -07:00
|
|
|
/* TCP */
|
2010-11-03 10:58:37 -07:00
|
|
|
if (!ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect,
|
|
|
|
svr))
|
2010-07-26 23:30:27 -07:00
|
|
|
goto error;
|
2006-01-19 01:11:30 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
else if ((type == ECORE_CON_REMOTE_UDP) ||
|
2010-05-15 20:04:18 -07:00
|
|
|
(type == ECORE_CON_REMOTE_BROADCAST))
|
2010-11-03 10:58:37 -07:00
|
|
|
/* UDP and MCAST */
|
|
|
|
if (!ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect,
|
|
|
|
svr))
|
|
|
|
goto error;
|
2005-09-02 20:07:29 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
servers = eina_list_append(servers, svr);
|
2008-10-09 05:30:19 -07:00
|
|
|
ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
|
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
return svr;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
|
|
|
if (svr->name)
|
2010-11-03 10:58:37 -07:00
|
|
|
free(svr->name);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->path)
|
2010-11-03 10:58:37 -07:00
|
|
|
free(svr->path);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_del(svr->fd_handler);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-01-06 14:35:31 -08:00
|
|
|
if (svr->fd > 0)
|
2010-12-15 20:38:37 -08:00
|
|
|
close(svr->fd);
|
|
|
|
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2003-09-23 01:09:32 -07:00
|
|
|
free(svr);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
EAPI void
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_server_timeout_set(Ecore_Con_Server *svr,
|
|
|
|
double timeout)
|
2010-09-21 21:48:09 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_set");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
if (svr->created)
|
|
|
|
svr->client_disconnect_time = timeout;
|
|
|
|
else
|
|
|
|
svr->disconnect_time = timeout;
|
2010-09-21 21:48:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI double
|
|
|
|
ecore_con_server_timeout_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_get");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
return svr->created ? svr->client_disconnect_time : svr->disconnect_time;
|
2010-09-21 21:48:09 -07:00
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void *
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_server_del(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_del");
|
|
|
|
return NULL;
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->delete_me)
|
2010-11-03 10:58:37 -07:00
|
|
|
return NULL;
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
data = svr->data;
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->delete_me = EINA_TRUE;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (svr->event_count)
|
2006-06-02 00:01:49 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (svr->fd_handler)
|
|
|
|
{
|
|
|
|
ecore_main_fd_handler_del(svr->fd_handler);
|
|
|
|
svr->fd_handler = NULL;
|
|
|
|
}
|
2006-06-02 00:01:49 -07:00
|
|
|
}
|
2006-03-19 21:53:12 -08:00
|
|
|
else
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_server_free(svr);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void *
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_server_data_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr,
|
|
|
|
ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_data_get");
|
|
|
|
return NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
return svr->data;
|
|
|
|
}
|
|
|
|
|
2010-07-28 17:27:15 -07:00
|
|
|
EAPI void *
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_server_data_set(Ecore_Con_Server *svr,
|
|
|
|
void *data)
|
2010-07-28 17:27:15 -07:00
|
|
|
{
|
|
|
|
void *ret = NULL;
|
|
|
|
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr,
|
|
|
|
ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_data_get");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = svr->data;
|
|
|
|
svr->data = data;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-09-20 18:48:46 -07:00
|
|
|
EAPI Eina_Bool
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_server_connected_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_connected_get");
|
2010-09-20 18:48:46 -07:00
|
|
|
return EINA_FALSE;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->connecting)
|
2010-11-03 10:58:37 -07:00
|
|
|
return EINA_FALSE;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-20 18:48:46 -07:00
|
|
|
return EINA_TRUE;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2011-07-12 07:37:08 -07:00
|
|
|
EAPI const Eina_List *
|
2006-03-29 22:48:45 -08:00
|
|
|
ecore_con_server_clients_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_clients_get");
|
|
|
|
return NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2006-03-29 22:48:45 -08:00
|
|
|
return svr->clients;
|
|
|
|
}
|
|
|
|
|
2010-08-26 22:16:00 -07:00
|
|
|
EAPI const char *
|
|
|
|
ecore_con_server_name_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_name_get");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return svr->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
|
|
|
ecore_con_server_port_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_port_get");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return svr->port;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2010-09-20 23:49:07 -07:00
|
|
|
ecore_con_server_send(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
const void *data,
|
|
|
|
int size)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_send");
|
|
|
|
return 0;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(svr->dead, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2005-09-22 22:46:56 -07:00
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
if (!svr->buf)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2011-07-16 06:07:39 -07:00
|
|
|
svr->buf = eina_binbuf_new();
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(svr->buf, 0);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2011-07-16 06:07:39 -07:00
|
|
|
eina_binbuf_append_length(svr->buf, data, size);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2004-04-23 00:24:40 -07:00
|
|
|
return size;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2004-09-22 01:17:15 -07:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void
|
2010-09-20 23:49:07 -07:00
|
|
|
ecore_con_server_client_limit_set(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
int client_limit,
|
|
|
|
char reject_excess_clients)
|
2005-04-28 21:51:31 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
|
|
|
|
"ecore_con_server_client_limit_set");
|
|
|
|
return;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2005-04-28 21:51:31 -07:00
|
|
|
svr->client_limit = client_limit;
|
|
|
|
svr->reject_excess_clients = reject_excess_clients;
|
|
|
|
}
|
|
|
|
|
2010-07-28 15:32:39 -07:00
|
|
|
EAPI const char *
|
2006-03-19 23:45:58 -08:00
|
|
|
ecore_con_server_ip_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_ip_get");
|
|
|
|
return NULL;
|
2006-03-19 23:45:58 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2006-03-19 23:45:58 -08:00
|
|
|
return svr->ip;
|
|
|
|
}
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
EAPI double
|
|
|
|
ecore_con_server_uptime_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_uptime_get");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ecore_time_get() - svr->start_time;
|
|
|
|
}
|
2010-11-03 10:58:37 -07:00
|
|
|
|
2007-02-16 10:12:38 -08:00
|
|
|
EAPI void
|
|
|
|
ecore_con_server_flush(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_flush");
|
|
|
|
return;
|
2007-02-16 10:12:38 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2007-02-16 10:12:38 -08:00
|
|
|
_ecore_con_server_flush(svr);
|
|
|
|
}
|
|
|
|
|
2010-07-28 17:27:15 -07:00
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @addtogroup Ecore_Con_Client_Group Ecore Connection Client Functions
|
2004-09-22 01:17:15 -07:00
|
|
|
*
|
|
|
|
* Functions that operate on Ecore connection client objects.
|
2010-09-20 23:49:07 -07:00
|
|
|
*
|
2010-07-28 17:27:15 -07:00
|
|
|
* @{
|
2004-09-22 01:17:15 -07:00
|
|
|
*/
|
|
|
|
|
2010-09-20 23:49:07 -07:00
|
|
|
/**
|
|
|
|
* @example ecore_con_client_example.c
|
|
|
|
* Shows how to write a simple client that connects to the example server.
|
2010-11-03 10:58:37 -07:00
|
|
|
*/
|
2010-09-20 23:49:07 -07:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI int
|
2010-09-20 23:49:07 -07:00
|
|
|
ecore_con_client_send(Ecore_Con_Client *cl,
|
2010-11-03 10:58:37 -07:00
|
|
|
const void *data,
|
|
|
|
int size)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_send");
|
|
|
|
return 0;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(cl->dead, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2005-09-22 22:46:56 -07:00
|
|
|
if (cl->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2010-11-05 18:22:50 -07:00
|
|
|
if (cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP))
|
2010-11-03 10:58:37 -07:00
|
|
|
sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr,
|
|
|
|
cl->client_addr_len);
|
2011-07-16 06:07:39 -07:00
|
|
|
else if (!cl->buf)
|
2008-10-09 05:30:19 -07:00
|
|
|
{
|
2011-07-16 06:07:39 -07:00
|
|
|
cl->buf = eina_binbuf_new();
|
2010-11-03 09:11:12 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cl->buf, 0);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2011-07-16 06:07:39 -07:00
|
|
|
eina_binbuf_append_length(cl->buf, data, size);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2004-04-23 00:24:40 -07:00
|
|
|
return size;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI Ecore_Con_Server *
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_client_server_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
|
|
|
|
"ecore_con_client_server_get");
|
|
|
|
return NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-18 12:26:05 -07:00
|
|
|
return cl->host_server;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2010-11-05 17:17:04 -07:00
|
|
|
EAPI Eina_Bool
|
|
|
|
ecore_con_client_connected_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
|
|
|
|
"ecore_con_client_connected_get");
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return !cl->dead;
|
|
|
|
}
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
EAPI void
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_client_timeout_set(Ecore_Con_Client *cl,
|
|
|
|
double timeout)
|
2010-09-21 21:48:09 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
|
|
|
|
"ecore_con_client_timeout_set");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
cl->disconnect_time = timeout;
|
|
|
|
|
|
|
|
_ecore_con_cl_timer_update(cl);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI double
|
|
|
|
ecore_con_client_timeout_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_timeout_get");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return cl->disconnect_time;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void *
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_client_del(Ecore_Con_Client *cl)
|
|
|
|
{
|
2008-10-09 05:30:19 -07:00
|
|
|
void *data = NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_del");
|
|
|
|
return NULL;
|
2007-08-26 04:17:21 -07:00
|
|
|
}
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2009-11-27 06:36:43 -08:00
|
|
|
data = cl->data;
|
2010-09-17 23:30:13 -07:00
|
|
|
cl->delete_me = EINA_TRUE;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (cl->event_count)
|
2006-06-02 00:01:49 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (cl->fd_handler)
|
|
|
|
{
|
|
|
|
ecore_main_fd_handler_del(cl->fd_handler);
|
|
|
|
cl->fd_handler = NULL;
|
|
|
|
}
|
2006-06-02 00:01:49 -07:00
|
|
|
}
|
2006-03-19 21:53:12 -08:00
|
|
|
else
|
|
|
|
{
|
2010-09-18 12:26:05 -07:00
|
|
|
if (cl->host_server)
|
2010-09-20 12:31:11 -07:00
|
|
|
{
|
|
|
|
cl->host_server->clients = eina_list_remove(cl->host_server->clients, cl);
|
2010-09-23 22:57:03 -07:00
|
|
|
--cl->host_server->client_count;
|
2010-09-20 12:31:11 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
_ecore_con_client_free(cl);
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2003-11-19 15:05:08 -08:00
|
|
|
return data;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_con_client_data_set(Ecore_Con_Client *cl,
|
|
|
|
const void *data)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl,
|
|
|
|
ECORE_MAGIC_CON_CLIENT,
|
|
|
|
"ecore_con_client_data_set");
|
|
|
|
return;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
cl->data = (void *)data;
|
|
|
|
}
|
|
|
|
|
2006-01-06 09:58:12 -08:00
|
|
|
EAPI void *
|
2003-09-23 01:09:32 -07:00
|
|
|
ecore_con_client_data_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl,
|
|
|
|
ECORE_MAGIC_CON_CLIENT,
|
|
|
|
"ecore_con_client_data_get");
|
|
|
|
return NULL;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
return cl->data;
|
|
|
|
}
|
|
|
|
|
2010-07-28 15:32:39 -07:00
|
|
|
EAPI const char *
|
2006-03-19 23:45:58 -08:00
|
|
|
ecore_con_client_ip_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_ip_get");
|
|
|
|
return NULL;
|
2006-03-19 23:45:58 -08:00
|
|
|
}
|
2010-11-16 13:32:50 -08:00
|
|
|
if (!cl->ip)
|
2011-09-29 14:05:20 -07:00
|
|
|
cl->ip = _ecore_con_pretty_ip(cl->client_addr);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2006-03-19 23:45:58 -08:00
|
|
|
return cl->ip;
|
|
|
|
}
|
|
|
|
|
2011-02-10 23:38:27 -08:00
|
|
|
EAPI int
|
|
|
|
ecore_con_client_port_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_port_get");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (cl->client_addr->sa_family == AF_INET)
|
|
|
|
return ((struct sockaddr_in*)cl->client_addr)->sin_port;
|
2011-09-29 14:04:54 -07:00
|
|
|
#ifdef HAVE_IPV6
|
2011-02-10 23:38:27 -08:00
|
|
|
return ((struct sockaddr_in6*)cl->client_addr)->sin6_port;
|
2011-09-29 14:04:54 -07:00
|
|
|
#else
|
|
|
|
return -1;
|
|
|
|
#endif
|
2011-02-10 23:38:27 -08:00
|
|
|
}
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
EAPI double
|
|
|
|
ecore_con_client_uptime_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_uptime_get");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ecore_time_get() - cl->start_time;
|
|
|
|
}
|
|
|
|
|
2007-02-16 10:12:38 -08:00
|
|
|
EAPI void
|
|
|
|
ecore_con_client_flush(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_flush");
|
|
|
|
return;
|
2007-02-16 10:12:38 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2007-02-16 10:12:38 -08:00
|
|
|
_ecore_con_client_flush(cl);
|
|
|
|
}
|
|
|
|
|
2011-09-12 01:30:22 -07:00
|
|
|
EAPI int
|
|
|
|
ecore_con_server_fd_get(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (svr->created) return -1;
|
|
|
|
return ecore_main_fd_handler_fd_get(svr->fd_handler);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
|
|
|
ecore_con_client_fd_get(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
|
|
|
|
{
|
|
|
|
ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, __func__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return ecore_main_fd_handler_fd_get(cl->fd_handler);
|
|
|
|
}
|
|
|
|
|
2010-07-28 17:27:15 -07:00
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
void
|
|
|
|
ecore_con_event_server_add(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
/* we got our server! */
|
|
|
|
Ecore_Con_Event_Server_Add *e;
|
2011-06-15 11:58:34 -07:00
|
|
|
int ev = ECORE_CON_EVENT_SERVER_ADD;
|
2011-02-10 11:17:30 -08:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_server_add_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
svr->event_count = eina_list_append(svr->event_count, e);
|
2011-06-17 04:16:50 -07:00
|
|
|
_ecore_con_server_timer_update(svr);
|
2011-02-10 11:17:30 -08:00
|
|
|
e->server = svr;
|
2011-06-15 11:58:34 -07:00
|
|
|
if (svr->upgrade) ev = ECORE_CON_EVENT_SERVER_UPGRADE;
|
|
|
|
ecore_event_add(ev, e,
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_event_server_add_free, NULL);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_con_event_server_del(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Del *e;
|
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_server_del_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
svr->event_count = eina_list_append(svr->event_count, e);
|
2011-06-17 04:16:50 -07:00
|
|
|
_ecore_con_server_timer_update(svr);
|
2011-02-10 11:17:30 -08:00
|
|
|
e->server = svr;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
|
|
|
|
_ecore_con_event_server_del_free, NULL);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
void
|
|
|
|
ecore_con_event_server_write(Ecore_Con_Server *svr, int num)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Write *e;
|
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_server_write_alloc();
|
2011-09-13 16:03:26 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
svr->event_count = eina_list_append(svr->event_count, e);
|
2011-09-13 16:03:26 -07:00
|
|
|
e->server = svr;
|
|
|
|
e->size = num;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_SERVER_WRITE, e,
|
|
|
|
(Ecore_End_Cb)_ecore_con_event_server_write_free, NULL);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-09-13 16:03:26 -07:00
|
|
|
}
|
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
void
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Data *e;
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_server_data_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
svr->event_count = eina_list_append(svr->event_count, e);
|
2011-06-17 04:16:50 -07:00
|
|
|
_ecore_con_server_timer_update(svr);
|
2011-02-10 11:17:30 -08:00
|
|
|
e->server = svr;
|
2011-05-14 10:52:30 -07:00
|
|
|
if (duplicate)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
2011-05-14 10:52:30 -07:00
|
|
|
e->data = malloc(num);
|
|
|
|
if (!e->data)
|
|
|
|
{
|
2011-11-06 04:26:00 -08:00
|
|
|
ERR("server data allocation failure !");
|
|
|
|
_ecore_con_event_server_data_free(NULL, e);
|
2011-05-14 10:52:30 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
memcpy(e->data, buf, num);
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
2011-05-14 10:52:30 -07:00
|
|
|
else
|
|
|
|
e->data = buf;
|
2011-02-10 11:17:30 -08:00
|
|
|
e->size = num;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
|
|
|
|
_ecore_con_event_server_data_free, NULL);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_con_event_client_add(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Add *e;
|
2011-06-15 11:58:34 -07:00
|
|
|
int ev = ECORE_CON_EVENT_CLIENT_ADD;
|
2011-02-10 11:17:30 -08:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_client_add_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->event_count = eina_list_append(cl->event_count, e);
|
|
|
|
cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_cl_timer_update(cl);
|
|
|
|
e->client = cl;
|
2011-06-15 11:58:34 -07:00
|
|
|
if (cl->upgrade) ev = ECORE_CON_EVENT_CLIENT_UPGRADE;
|
|
|
|
ecore_event_add(ev, e,
|
2011-02-10 11:17:30 -08:00
|
|
|
(Ecore_End_Cb)_ecore_con_event_client_add_free, cl->host_server);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_con_event_client_del(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Del *e;
|
|
|
|
|
2011-11-08 17:18:18 -08:00
|
|
|
if (!cl) return;
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_client_del_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->event_count = eina_list_append(cl->event_count, e);
|
2011-02-10 11:17:30 -08:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
|
2011-11-08 17:18:18 -08:00
|
|
|
_ecore_con_cl_timer_update(cl);
|
2011-02-10 11:17:30 -08:00
|
|
|
e->client = cl;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
|
|
|
|
(Ecore_End_Cb)_ecore_con_event_client_del_free, cl->host_server);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
void
|
|
|
|
ecore_con_event_client_write(Ecore_Con_Client *cl, int num)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Write *e;
|
2011-11-06 04:26:00 -08:00
|
|
|
|
|
|
|
e = ecore_con_event_client_write_alloc();
|
2011-09-13 16:03:26 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->event_count = eina_list_append(cl->event_count, e);
|
|
|
|
cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
|
2011-09-13 16:03:26 -07:00
|
|
|
e->client = cl;
|
|
|
|
e->size = num;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_CLIENT_WRITE, e,
|
|
|
|
(Ecore_End_Cb)_ecore_con_event_client_write_free, cl->host_server);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-09-13 16:03:26 -07:00
|
|
|
}
|
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
void
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Data *e;
|
2011-11-06 04:26:00 -08:00
|
|
|
|
|
|
|
e = ecore_con_event_client_data_alloc();
|
2011-02-10 11:17:30 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->event_count = eina_list_append(cl->event_count, e);
|
|
|
|
cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_cl_timer_update(cl);
|
|
|
|
e->client = cl;
|
2011-05-14 10:52:30 -07:00
|
|
|
if (duplicate)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
2011-05-14 10:52:30 -07:00
|
|
|
e->data = malloc(num);
|
|
|
|
if (!e->data)
|
|
|
|
{
|
2011-11-06 04:26:00 -08:00
|
|
|
ERR("client data allocation failure !");
|
|
|
|
_ecore_con_event_client_data_free(cl->host_server, e);
|
2011-05-14 10:52:30 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
memcpy(e->data, buf, num);
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
2011-05-14 10:52:30 -07:00
|
|
|
else
|
|
|
|
e->data = buf;
|
2011-02-10 11:17:30 -08:00
|
|
|
e->size = num;
|
|
|
|
ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
|
|
|
|
(Ecore_End_Cb)_ecore_con_event_client_data_free, cl->host_server);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-01-21 02:01:04 -08:00
|
|
|
void
|
|
|
|
ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info)
|
|
|
|
{
|
|
|
|
svr->infos = eina_list_remove(svr->infos, info);
|
|
|
|
}
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
void
|
|
|
|
ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Error *e;
|
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_server_error_alloc();
|
2011-02-10 00:49:23 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
|
|
|
e->server = svr;
|
|
|
|
e->error = strdup(error);
|
2011-02-10 11:17:30 -08:00
|
|
|
ERR("%s", error);
|
2011-11-10 18:44:16 -08:00
|
|
|
svr->event_count = eina_list_append(svr->event_count, e);
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_event_add(ECORE_CON_EVENT_SERVER_ERROR, e, (Ecore_End_Cb)_ecore_con_event_server_error_free, NULL);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error)
|
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Error *e;
|
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
e = ecore_con_event_client_error_alloc();
|
2011-02-10 00:49:23 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(e);
|
|
|
|
|
|
|
|
e->client = cl;
|
|
|
|
e->error = strdup(error);
|
2011-02-10 11:17:30 -08:00
|
|
|
ERR("%s", error);
|
2011-11-10 18:44:16 -08:00
|
|
|
cl->event_count = eina_list_append(cl->event_count, e);
|
|
|
|
cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_event_add(ECORE_CON_EVENT_CLIENT_ERROR, e, (Ecore_End_Cb)_ecore_con_event_client_error_free, cl->host_server);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count++;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
static void
|
|
|
|
_ecore_con_server_free(Ecore_Con_Server *svr)
|
|
|
|
{
|
2008-12-11 05:55:47 -08:00
|
|
|
Ecore_Con_Client *cl;
|
2006-05-18 20:52:24 -07:00
|
|
|
double t_start, t;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2011-01-21 02:01:04 -08:00
|
|
|
while (svr->infos)
|
|
|
|
{
|
|
|
|
ecore_con_info_data_clear(svr->infos->data);
|
|
|
|
svr->infos = eina_list_remove_list(svr->infos, svr->infos);
|
|
|
|
}
|
2011-11-10 18:44:16 -08:00
|
|
|
if ((!svr->buf) && svr->delete_me && (!svr->dead) && (!svr->event_count))
|
2010-11-11 11:53:21 -08:00
|
|
|
{
|
|
|
|
/* this is a catch-all for cases when a server is not properly killed. */
|
|
|
|
svr->dead = EINA_TRUE;
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_server_del(svr);
|
2010-11-11 11:53:21 -08:00
|
|
|
return;
|
|
|
|
}
|
2010-11-11 12:20:44 -08:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
if (svr->event_count) return;
|
2007-08-26 04:17:21 -07:00
|
|
|
ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
|
2006-05-18 20:52:24 -07:00
|
|
|
t_start = ecore_time_get();
|
2011-07-16 06:07:39 -07:00
|
|
|
while (svr->buf && (!svr->dead))
|
2006-05-18 20:52:24 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
_ecore_con_server_flush(svr);
|
|
|
|
t = ecore_time_get();
|
|
|
|
if ((t - t_start) > 0.5)
|
|
|
|
{
|
|
|
|
WRN("ECORE_CON: EEK - stuck in _ecore_con_server_free() trying\n"
|
|
|
|
" to flush data out from the server, and have been for\n"
|
|
|
|
" %1.1f seconds. This is taking too long. Aborting flush.",
|
|
|
|
(t - t_start));
|
|
|
|
break;
|
|
|
|
}
|
2006-05-18 20:52:24 -07:00
|
|
|
}
|
2010-09-21 21:48:09 -07:00
|
|
|
|
2011-05-14 10:52:30 -07:00
|
|
|
#ifdef _WIN32
|
|
|
|
ecore_con_local_win32_server_del(svr);
|
|
|
|
#endif
|
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
if (svr->buf)
|
|
|
|
eina_binbuf_free(svr->buf);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
EINA_LIST_FREE(svr->clients, cl)
|
2011-11-10 18:44:16 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Add *ev;
|
|
|
|
|
|
|
|
/* some pointer hacks here to prevent double frees if people are being stupid */
|
|
|
|
EINA_LIST_FREE(cl->event_count, ev)
|
|
|
|
ev->server = NULL;
|
|
|
|
cl->delete_me = cl->dead = EINA_TRUE;
|
|
|
|
_ecore_con_client_free(cl);
|
|
|
|
}
|
2008-10-09 05:30:19 -07:00
|
|
|
if ((svr->created) && (svr->path) && (svr->ppid == getpid()))
|
2010-11-03 10:58:37 -07:00
|
|
|
unlink(svr->path);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2011-11-10 18:44:16 -08:00
|
|
|
free(svr->name);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
free(svr->path);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
eina_stringshare_del(svr->ip);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_del(svr->fd_handler);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-01-06 14:35:31 -08:00
|
|
|
if (svr->fd > 0)
|
2010-12-15 20:38:37 -08:00
|
|
|
close(svr->fd);
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
if (svr->until_deletion)
|
|
|
|
ecore_timer_del(svr->until_deletion);
|
|
|
|
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
servers = eina_list_remove(servers, svr);
|
2010-11-11 11:53:21 -08:00
|
|
|
svr->data = NULL;
|
2003-09-23 01:09:32 -07:00
|
|
|
free(svr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_client_free(Ecore_Con_Client *cl)
|
|
|
|
{
|
2006-05-18 20:52:24 -07:00
|
|
|
double t_start, t;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
if (cl->event_count) return;
|
2010-12-08 22:43:58 -08:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
if (cl->delete_me && (!cl->dead) && (!cl->event_count))
|
2010-09-20 12:32:37 -07:00
|
|
|
{
|
2010-11-11 11:53:21 -08:00
|
|
|
/* this is a catch-all for cases when a client is not properly killed. */
|
2010-11-03 10:58:37 -07:00
|
|
|
cl->dead = EINA_TRUE;
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_del(cl);
|
2010-11-03 12:08:31 -07:00
|
|
|
return;
|
2010-09-20 12:32:37 -07:00
|
|
|
}
|
|
|
|
|
2010-12-08 22:43:58 -08:00
|
|
|
|
2010-11-11 11:53:21 -08:00
|
|
|
ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
|
2006-05-18 20:52:24 -07:00
|
|
|
t_start = ecore_time_get();
|
|
|
|
while ((cl->buf) && (!cl->dead))
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
_ecore_con_client_flush(cl);
|
|
|
|
t = ecore_time_get();
|
|
|
|
if ((t - t_start) > 0.5)
|
|
|
|
{
|
|
|
|
WRN("EEK - stuck in _ecore_con_client_free() trying\n"
|
|
|
|
" to flush data out from the client, and have been for\n"
|
|
|
|
" %1.1f seconds. This is taking too long. Aborting flush.",
|
|
|
|
(t - t_start));
|
|
|
|
break;
|
|
|
|
}
|
2006-05-18 20:52:24 -07:00
|
|
|
}
|
2011-05-14 10:52:30 -07:00
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
ecore_con_local_win32_client_del(cl);
|
|
|
|
#endif
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
free(cl->buf);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-10-15 00:42:29 -07:00
|
|
|
if (cl->host_server->type & ECORE_CON_SSL)
|
2010-09-21 21:48:09 -07:00
|
|
|
ecore_con_ssl_client_shutdown(cl);
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (cl->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_del(cl->fd_handler);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-01-06 14:35:31 -08:00
|
|
|
if (cl->fd > 0)
|
2010-12-15 20:38:37 -08:00
|
|
|
close(cl->fd);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
free(cl->client_addr);
|
2010-12-02 22:14:30 -08:00
|
|
|
cl->client_addr = NULL;
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
if (cl->until_deletion)
|
|
|
|
ecore_timer_del(cl->until_deletion);
|
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
eina_stringshare_del(cl->ip);
|
2010-11-11 11:53:21 -08:00
|
|
|
cl->data = NULL;
|
2010-11-03 10:58:37 -07:00
|
|
|
free(cl);
|
2010-09-23 22:57:03 -07:00
|
|
|
return;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2004-04-25 08:42:57 -07:00
|
|
|
static void
|
2010-09-23 21:15:42 -07:00
|
|
|
_ecore_con_server_kill(Ecore_Con_Server *svr)
|
2004-04-25 08:42:57 -07:00
|
|
|
{
|
2006-06-02 00:24:04 -07:00
|
|
|
if (!svr->delete_me)
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_server_del(svr);
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->dead = EINA_TRUE;
|
2010-07-26 23:30:27 -07:00
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_del(svr->fd_handler);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2004-04-25 08:42:57 -07:00
|
|
|
svr->fd_handler = NULL;
|
|
|
|
}
|
|
|
|
|
2011-06-17 04:16:50 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_con_server_timer(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
ecore_con_server_del(svr);
|
|
|
|
|
2011-07-07 11:18:53 -07:00
|
|
|
svr->until_deletion = NULL;
|
2011-06-17 04:16:50 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_server_timer_update(Ecore_Con_Server *svr)
|
|
|
|
{
|
|
|
|
if (svr->disconnect_time)
|
|
|
|
{
|
|
|
|
if (svr->disconnect_time > 0)
|
|
|
|
{
|
|
|
|
if (svr->until_deletion)
|
|
|
|
ecore_timer_interval_set(svr->until_deletion, svr->disconnect_time);
|
|
|
|
else
|
|
|
|
svr->until_deletion = ecore_timer_add(svr->disconnect_time, (Ecore_Task_Cb)_ecore_con_server_timer, svr);
|
|
|
|
}
|
|
|
|
else if (svr->until_deletion)
|
|
|
|
{
|
|
|
|
ecore_timer_del(svr->until_deletion);
|
|
|
|
svr->until_deletion = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (svr->until_deletion)
|
|
|
|
{
|
|
|
|
ecore_timer_del(svr->until_deletion);
|
|
|
|
svr->until_deletion = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-21 21:48:09 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_con_client_timer(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
ecore_con_client_del(cl);
|
|
|
|
|
2011-07-07 11:18:53 -07:00
|
|
|
cl->until_deletion = NULL;
|
2010-09-21 21:48:09 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_cl_timer_update(Ecore_Con_Client *cl)
|
|
|
|
{
|
|
|
|
if (cl->disconnect_time)
|
|
|
|
{
|
|
|
|
if (cl->disconnect_time > 0)
|
|
|
|
{
|
|
|
|
if (cl->until_deletion)
|
|
|
|
ecore_timer_interval_set(cl->until_deletion, cl->disconnect_time);
|
|
|
|
else
|
|
|
|
cl->until_deletion = ecore_timer_add(cl->disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
|
|
|
|
}
|
|
|
|
else if (cl->until_deletion)
|
|
|
|
{
|
|
|
|
ecore_timer_del(cl->until_deletion);
|
|
|
|
cl->until_deletion = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cl->host_server->client_disconnect_time > 0)
|
|
|
|
{
|
|
|
|
if (cl->until_deletion)
|
|
|
|
ecore_timer_interval_set(cl->until_deletion, cl->host_server->client_disconnect_time);
|
|
|
|
else
|
|
|
|
cl->until_deletion = ecore_timer_add(cl->host_server->client_disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
|
|
|
|
}
|
|
|
|
else if (cl->until_deletion)
|
|
|
|
{
|
|
|
|
ecore_timer_del(cl->until_deletion);
|
|
|
|
cl->until_deletion = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-06 02:41:39 -07:00
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cb_tcp_listen(void *data,
|
|
|
|
Ecore_Con_Info *net_info)
|
2008-10-09 05:30:19 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
struct linger lin;
|
|
|
|
|
|
|
|
svr = data;
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (!net_info) /* error message has already been handled */
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
|
|
|
|
net_info->info.ai_protocol);
|
|
|
|
if (svr->fd < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
lin.l_onoff = 1;
|
|
|
|
lin.l_linger = 0;
|
2010-07-26 23:30:27 -07:00
|
|
|
if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
|
|
|
|
sizeof(struct linger)) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-07-30 10:03:34 -07:00
|
|
|
if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
|
2009-11-20 02:58:19 -08:00
|
|
|
{
|
2011-09-29 14:04:45 -07:00
|
|
|
#ifdef HAVE_NETINET_TCP_H
|
2010-07-26 23:30:27 -07:00
|
|
|
int flag = 1;
|
2009-11-20 02:58:19 -08:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag,
|
|
|
|
sizeof(int)) < 0)
|
2011-09-29 14:04:45 -07:00
|
|
|
#endif
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2009-11-20 02:58:19 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (bind(svr->fd, net_info->info.ai_addr,
|
|
|
|
net_info->info.ai_addrlen) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
if (listen(svr->fd, 4096) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_svr_tcp_handler, svr, NULL, NULL);
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr->fd_handler)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure");
|
|
|
|
goto error;
|
|
|
|
}
|
2008-10-09 05:30:19 -07:00
|
|
|
|
|
|
|
return;
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2010-09-23 21:15:42 -07:00
|
|
|
_ecore_con_server_kill(svr);
|
2008-10-09 05:30:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cb_udp_listen(void *data,
|
|
|
|
Ecore_Con_Info *net_info)
|
2008-10-09 05:30:19 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
Ecore_Con_Type type;
|
|
|
|
struct ip_mreq mreq;
|
2011-09-29 14:04:54 -07:00
|
|
|
#ifdef HAVE_IPV6
|
2008-10-09 05:30:19 -07:00
|
|
|
struct ipv6_mreq mreq6;
|
2011-09-29 14:04:54 -07:00
|
|
|
#endif
|
2008-10-09 05:30:19 -07:00
|
|
|
const int on = 1;
|
|
|
|
|
|
|
|
svr = data;
|
|
|
|
type = svr->type;
|
|
|
|
type &= ECORE_CON_TYPE;
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (!net_info) /* error message has already been handled */
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
|
|
|
|
net_info->info.ai_protocol);
|
2010-11-05 18:22:50 -07:00
|
|
|
if (svr->fd < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2008-10-09 05:30:19 -07:00
|
|
|
|
|
|
|
if (type == ECORE_CON_REMOTE_MCAST)
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (net_info->info.ai_family == AF_INET)
|
|
|
|
{
|
|
|
|
if (!inet_pton(net_info->info.ai_family, net_info->ip,
|
|
|
|
&mreq.imr_multiaddr))
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
|
|
|
if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
2010-11-03 10:58:37 -07:00
|
|
|
(const void *)&mreq, sizeof(mreq)) != 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
}
|
2011-09-29 14:04:54 -07:00
|
|
|
#ifdef HAVE_IPV6
|
2010-07-26 23:30:27 -07:00
|
|
|
else if (net_info->info.ai_family == AF_INET6)
|
|
|
|
{
|
|
|
|
if (!inet_pton(net_info->info.ai_family, net_info->ip,
|
|
|
|
&mreq6.ipv6mr_multiaddr))
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
mreq6.ipv6mr_interface = htonl(INADDR_ANY);
|
|
|
|
if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
2010-11-03 10:58:37 -07:00
|
|
|
(const void *)&mreq6, sizeof(mreq6)) != 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
}
|
2011-09-29 14:04:54 -07:00
|
|
|
#endif
|
2008-10-09 05:30:19 -07:00
|
|
|
}
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0)
|
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2011-01-21 01:45:38 -08:00
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
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;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr->fd_handler =
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
|
|
|
_ecore_con_svr_udp_handler, svr, NULL, NULL);
|
2010-07-26 23:30:27 -07:00
|
|
|
if (!svr->fd_handler)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure");
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-16 13:32:50 -08:00
|
|
|
svr->ip = eina_stringshare_add(net_info->ip);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
|
|
|
return;
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2010-09-23 21:15:42 -07:00
|
|
|
_ecore_con_server_kill(svr);
|
2008-10-09 05:30:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cb_tcp_connect(void *data,
|
|
|
|
Ecore_Con_Info *net_info)
|
2008-10-06 02:41:39 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
int res;
|
|
|
|
int curstate = 0;
|
2008-10-06 02:41:39 -07:00
|
|
|
|
|
|
|
svr = data;
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (!net_info) /* error message has already been handled */
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
|
|
|
|
net_info->info.ai_protocol);
|
|
|
|
if (svr->fd < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0)
|
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-07-30 10:03:34 -07:00
|
|
|
if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
|
2009-11-20 02:58:19 -08:00
|
|
|
{
|
2011-09-29 14:04:45 -07:00
|
|
|
#ifdef HAVE_NETINET_TCP_H
|
2010-07-26 23:30:27 -07:00
|
|
|
int flag = 1;
|
2009-11-20 02:58:19 -08:00
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0)
|
2011-09-29 14:04:45 -07:00
|
|
|
#endif
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2009-11-20 02:58:19 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
res = connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen);
|
|
|
|
#ifdef _WIN32
|
|
|
|
if (res == SOCKET_ERROR)
|
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (WSAGetLastError() != WSAEINPROGRESS)
|
2011-02-10 00:49:23 -08:00
|
|
|
goto error; /* FIXME: strerror on windows? */
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#else
|
|
|
|
if (res < 0)
|
2008-10-06 02:41:39 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (errno != EINPROGRESS)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#endif
|
2010-09-17 23:30:13 -07:00
|
|
|
svr->connecting = EINA_TRUE;
|
2010-07-26 23:30:27 -07:00
|
|
|
svr->fd_handler =
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
|
|
|
|
_ecore_con_cl_handler, svr, NULL, NULL);
|
2008-10-06 02:41:39 -07:00
|
|
|
}
|
|
|
|
else
|
2010-11-03 10:58:37 -07:00
|
|
|
svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
|
|
|
|
_ecore_con_cl_handler, svr, NULL, NULL);
|
2008-10-30 08:26:11 -07:00
|
|
|
|
2010-10-15 00:42:29 -07:00
|
|
|
if (svr->type & ECORE_CON_SSL)
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
|
|
|
svr->handshaking = EINA_TRUE;
|
|
|
|
svr->ssl_state = ECORE_CON_SSL_STATE_INIT;
|
2010-09-28 20:52:32 -07:00
|
|
|
DBG("beginning ssl handshake");
|
2010-09-23 21:15:42 -07:00
|
|
|
if (ecore_con_ssl_server_init(svr))
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (!svr->fd_handler)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure");
|
|
|
|
goto error;
|
|
|
|
}
|
2008-10-06 02:41:39 -07:00
|
|
|
|
2010-11-16 13:32:50 -08:00
|
|
|
svr->ip = eina_stringshare_add(net_info->ip);
|
2008-10-08 17:46:29 -07:00
|
|
|
|
2008-10-06 02:41:39 -07:00
|
|
|
return;
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2010-09-23 21:15:42 -07:00
|
|
|
_ecore_con_server_kill(svr);
|
2008-10-06 02:41:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cb_udp_connect(void *data,
|
|
|
|
Ecore_Con_Info *net_info)
|
2008-10-06 02:41:39 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
int curstate = 0;
|
|
|
|
int broadcast = 1;
|
2008-10-06 02:41:39 -07:00
|
|
|
svr = data;
|
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
if (!net_info) /* error message has already been handled */
|
2010-11-03 10:58:37 -07:00
|
|
|
goto error;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
|
|
|
|
net_info->info.ai_protocol);
|
|
|
|
if (svr->fd < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2009-08-12 04:24:33 -07:00
|
|
|
|
2010-07-30 10:03:34 -07:00
|
|
|
if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_BROADCAST)
|
2009-08-12 04:24:33 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
if (setsockopt(svr->fd, SOL_SOCKET, SO_BROADCAST,
|
|
|
|
(const void *)&broadcast,
|
|
|
|
sizeof(broadcast)) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2009-08-12 04:24:33 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
else if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR,
|
2010-09-17 23:06:05 -07:00
|
|
|
(const void *)&curstate, sizeof(curstate)) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
if (connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
goto error;
|
|
|
|
}
|
2010-09-17 23:06:05 -07:00
|
|
|
|
|
|
|
svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cl_udp_handler, svr, NULL, NULL);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (!svr->fd_handler)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure");
|
|
|
|
goto error;
|
|
|
|
}
|
2009-08-12 04:24:33 -07:00
|
|
|
|
2010-11-16 13:32:50 -08:00
|
|
|
svr->ip = eina_stringshare_add(net_info->ip);
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2008-10-06 02:41:39 -07:00
|
|
|
return;
|
|
|
|
|
2010-07-26 23:30:27 -07:00
|
|
|
error:
|
2008-10-30 08:26:11 -07:00
|
|
|
ecore_con_ssl_server_shutdown(svr);
|
2010-09-23 21:15:42 -07:00
|
|
|
_ecore_con_server_kill(svr);
|
2008-10-06 02:41:39 -07:00
|
|
|
}
|
|
|
|
|
2008-10-01 08:27:52 -07:00
|
|
|
static Ecore_Con_State
|
2004-05-09 13:23:23 -07:00
|
|
|
svr_try_connect_plain(Ecore_Con_Server *svr)
|
2004-04-03 07:03:33 -08:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
int res;
|
|
|
|
int so_err = 0;
|
2011-03-03 13:05:28 -08:00
|
|
|
socklen_t size = sizeof(int);
|
2004-04-03 07:03:33 -08:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
res = getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, (void *)&so_err, &size);
|
|
|
|
#ifdef _WIN32
|
|
|
|
if (res == SOCKET_ERROR)
|
2010-11-17 01:31:15 -08:00
|
|
|
so_err = WSAGetLastError();
|
2010-02-20 10:01:50 -08:00
|
|
|
|
2010-11-17 01:31:15 -08:00
|
|
|
if ((so_err == WSAEINPROGRESS) && !svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CON_INPROGRESS;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#else
|
|
|
|
if (res < 0)
|
2010-11-17 01:31:15 -08:00
|
|
|
so_err = errno;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2010-11-17 01:31:15 -08:00
|
|
|
if ((so_err == EINPROGRESS) && !svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CON_INPROGRESS;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#endif
|
2008-10-01 08:27:52 -07:00
|
|
|
|
2010-11-17 01:31:15 -08:00
|
|
|
if (so_err)
|
2004-04-14 01:51:19 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
/* we lost our server! */
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2010-11-17 01:31:15 -08:00
|
|
|
ERR("Connection lost: %s", strerror(so_err));
|
|
|
|
_ecore_con_server_kill(svr);
|
|
|
|
return ECORE_CON_DISCONNECTED;
|
2004-04-14 01:51:19 -07:00
|
|
|
}
|
2010-09-17 23:06:05 -07:00
|
|
|
|
2010-09-23 22:57:03 -07:00
|
|
|
if ((!svr->delete_me) && (!svr->handshaking) && svr->connecting)
|
2004-04-14 01:51:19 -07:00
|
|
|
{
|
2010-11-03 10:58:37 -07:00
|
|
|
svr->connecting = EINA_FALSE;
|
2010-11-03 12:08:31 -07:00
|
|
|
svr->start_time = ecore_time_get();
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_server_add(svr);
|
2004-04-14 01:51:19 -07:00
|
|
|
}
|
2008-10-01 08:27:52 -07:00
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
if (svr->fd_handler && (!svr->buf))
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
|
2010-09-17 23:06:05 -07:00
|
|
|
|
2008-10-01 08:27:52 -07:00
|
|
|
if (!svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CON_CONNECTED;
|
2008-10-01 08:27:52 -07:00
|
|
|
else
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CON_DISCONNECTED;
|
2004-04-03 07:03:33 -08:00
|
|
|
}
|
|
|
|
|
2010-11-16 13:32:50 -08:00
|
|
|
static const char *
|
2011-09-29 14:05:20 -07:00
|
|
|
_ecore_con_pretty_ip(struct sockaddr *client_addr)
|
2010-01-31 03:58:37 -08:00
|
|
|
{
|
2011-09-29 14:04:54 -07:00
|
|
|
#ifndef HAVE_IPV6
|
|
|
|
char ipbuf[INET_ADDRSTRLEN + 1];
|
|
|
|
#else
|
2010-01-31 03:58:37 -08:00
|
|
|
char ipbuf[INET6_ADDRSTRLEN + 1];
|
2011-09-29 14:05:20 -07:00
|
|
|
#endif
|
|
|
|
int family = client_addr->sa_family;
|
|
|
|
void *src;
|
2010-01-31 03:58:37 -08:00
|
|
|
|
2011-09-29 14:05:20 -07:00
|
|
|
switch(family)
|
2010-01-31 03:58:37 -08:00
|
|
|
{
|
2011-09-29 14:05:20 -07:00
|
|
|
case AF_INET:
|
|
|
|
src = &(((struct sockaddr_in *)client_addr)->sin_addr);
|
|
|
|
break;
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
case AF_INET6:
|
|
|
|
src = &(((struct sockaddr_in6 *)client_addr)->sin6_addr);
|
|
|
|
|
2011-10-15 02:30:58 -07:00
|
|
|
if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)src))
|
2011-09-29 14:05:20 -07:00
|
|
|
{
|
|
|
|
family = AF_INET;
|
|
|
|
src = (char*)src + 12;
|
|
|
|
}
|
|
|
|
break;
|
2011-09-29 14:04:54 -07:00
|
|
|
#endif
|
2011-09-29 14:05:20 -07:00
|
|
|
default:
|
|
|
|
return eina_stringshare_add("0.0.0.0");
|
|
|
|
}
|
2010-01-31 03:58:37 -08:00
|
|
|
|
2011-09-29 14:05:20 -07:00
|
|
|
if (!inet_ntop(family, src, ipbuf, sizeof(ipbuf)))
|
2010-11-16 13:32:50 -08:00
|
|
|
return eina_stringshare_add("0.0.0.0");
|
2010-01-31 03:58:37 -08:00
|
|
|
|
2011-02-10 00:49:23 -08:00
|
|
|
ipbuf[sizeof(ipbuf) - 1] = 0;
|
2010-11-16 13:32:50 -08:00
|
|
|
return eina_stringshare_add(ipbuf);
|
2010-01-31 03:58:37 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_svr_tcp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler __UNUSED__)
|
2008-10-30 08:26:11 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
2010-09-17 23:06:05 -07:00
|
|
|
Ecore_Con_Client *cl = NULL;
|
2010-11-16 13:32:50 -08:00
|
|
|
unsigned char client_addr[256];
|
2011-04-29 00:34:12 -07:00
|
|
|
unsigned int client_addr_len;
|
2008-10-30 08:26:11 -07:00
|
|
|
|
|
|
|
svr = data;
|
2010-07-26 23:30:27 -07:00
|
|
|
if (svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
if (svr->delete_me)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) &&
|
2010-09-20 12:31:11 -07:00
|
|
|
(svr->client_count >= (unsigned int)svr->client_limit))
|
2010-09-17 23:06:05 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2008-10-30 08:26:11 -07:00
|
|
|
/* a new client */
|
2011-04-29 00:22:53 -07:00
|
|
|
|
|
|
|
cl = calloc(1, sizeof(Ecore_Con_Client));
|
|
|
|
if (!cl)
|
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client");
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
cl->host_server = svr;
|
|
|
|
|
2011-04-29 00:34:12 -07:00
|
|
|
client_addr_len = sizeof(client_addr);
|
2010-11-16 13:32:50 -08:00
|
|
|
memset(&client_addr, 0, client_addr_len);
|
2011-04-29 00:22:53 -07:00
|
|
|
cl->fd = accept(svr->fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr_len);
|
|
|
|
if (cl->fd < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2011-04-29 00:22:53 -07:00
|
|
|
goto free_cl;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
2010-09-22 01:03:38 -07:00
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
if ((svr->client_limit >= 0) && (svr->reject_excess_clients) &&
|
2010-09-20 12:31:11 -07:00
|
|
|
(svr->client_count >= (unsigned int)svr->client_limit))
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Maximum client limit reached");
|
2011-04-29 00:22:53 -07:00
|
|
|
goto close_fd;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-04-29 00:22:53 -07:00
|
|
|
if (fcntl(cl->fd, F_SETFL, O_NONBLOCK) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2011-04-29 00:22:53 -07:00
|
|
|
goto close_fd;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
2011-04-29 00:22:53 -07:00
|
|
|
if (fcntl(cl->fd, F_SETFD, FD_CLOEXEC) < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2011-04-29 00:22:53 -07:00
|
|
|
goto close_fd;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
2010-10-13 09:40:52 -07:00
|
|
|
cl->fd_handler = ecore_main_fd_handler_add(cl->fd, ECORE_FD_READ,
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_svr_cl_handler, cl, NULL, NULL);
|
2011-04-29 00:22:53 -07:00
|
|
|
if (!cl->fd_handler)
|
|
|
|
goto close_fd;
|
|
|
|
|
2010-10-13 09:40:52 -07:00
|
|
|
ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
|
|
|
|
|
2011-06-15 11:58:34 -07:00
|
|
|
if ((!svr->upgrade) && (svr->type & ECORE_CON_SSL))
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
|
|
|
cl->handshaking = EINA_TRUE;
|
|
|
|
cl->ssl_state = ECORE_CON_SSL_STATE_INIT;
|
|
|
|
if (ecore_con_ssl_client_init(cl))
|
2011-04-29 00:22:53 -07:00
|
|
|
goto del_handler;
|
2010-09-23 21:15:42 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-16 13:32:50 -08:00
|
|
|
cl->client_addr = malloc(client_addr_len);
|
|
|
|
if (!cl->client_addr)
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client");
|
2011-04-29 00:22:53 -07:00
|
|
|
goto del_handler;
|
2011-02-10 00:49:23 -08:00
|
|
|
}
|
2010-11-16 13:32:50 -08:00
|
|
|
cl->client_addr_len = client_addr_len;
|
|
|
|
memcpy(cl->client_addr, &client_addr, client_addr_len);
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-09-17 21:59:11 -07:00
|
|
|
svr->clients = eina_list_append(svr->clients, cl);
|
2010-09-20 12:31:11 -07:00
|
|
|
svr->client_count++;
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-09-23 21:15:42 -07:00
|
|
|
if ((!cl->delete_me) && (!cl->handshaking))
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_add(cl);
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-09-17 23:06:05 -07:00
|
|
|
|
2011-04-29 00:22:53 -07:00
|
|
|
del_handler:
|
|
|
|
ecore_main_fd_handler_del(cl->fd_handler);
|
|
|
|
close_fd:
|
|
|
|
close(cl->fd);
|
|
|
|
free_cl:
|
|
|
|
free(cl);
|
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2008-10-30 08:26:11 -07:00
|
|
|
}
|
2004-04-03 07:03:33 -08:00
|
|
|
|
2010-09-17 23:06:05 -07:00
|
|
|
static void
|
|
|
|
_ecore_con_cl_read(Ecore_Con_Server *svr)
|
|
|
|
{
|
2010-11-05 18:57:45 -07:00
|
|
|
DBG("svr=%p", svr);
|
2010-11-03 12:08:31 -07:00
|
|
|
int num = 0;
|
|
|
|
Eina_Bool lost_server = EINA_TRUE;
|
|
|
|
unsigned char buf[READBUFSIZ];
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-10-02 14:13:56 -07:00
|
|
|
/* only possible with non-ssl connections */
|
|
|
|
if (svr->connecting && (svr_try_connect_plain(svr) != ECORE_CON_CONNECTED))
|
2010-12-17 17:47:29 -08:00
|
|
|
return;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (svr->handshaking)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
DBG("Continuing ssl handshake");
|
|
|
|
if (!ecore_con_ssl_server_init(svr))
|
2010-12-17 17:47:29 -08:00
|
|
|
lost_server = EINA_FALSE;
|
2011-06-17 04:16:50 -07:00
|
|
|
_ecore_con_server_timer_update(svr);
|
2010-11-03 12:08:31 -07:00
|
|
|
}
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (!(svr->type & ECORE_CON_SSL))
|
|
|
|
{
|
|
|
|
num = read(svr->fd, buf, sizeof(buf));
|
2010-12-17 00:44:53 -08:00
|
|
|
/* 0 is not a valid return value for a tcp socket */
|
2010-12-17 04:09:14 -08:00
|
|
|
if ((num > 0) || ((num < 0) && (errno == EAGAIN)))
|
2010-12-17 17:47:29 -08:00
|
|
|
lost_server = EINA_FALSE;
|
2011-02-15 12:17:48 -08:00
|
|
|
else if (num < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2010-11-03 12:08:31 -07:00
|
|
|
}
|
2010-11-03 12:38:00 -07:00
|
|
|
else
|
|
|
|
{
|
2010-12-17 00:48:36 -08:00
|
|
|
num = ecore_con_ssl_server_read(svr, buf, sizeof(buf));
|
2010-12-17 01:02:44 -08:00
|
|
|
/* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
|
2010-12-17 00:48:36 -08:00
|
|
|
if (num >= 0)
|
2010-11-03 12:38:00 -07:00
|
|
|
lost_server = EINA_FALSE;
|
|
|
|
}
|
2011-04-20 07:15:33 -07:00
|
|
|
|
2010-12-15 23:43:48 -08:00
|
|
|
if ((!svr->delete_me) && (num > 0))
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
|
2004-03-31 08:47:45 -08:00
|
|
|
|
2010-12-15 23:43:48 -08:00
|
|
|
if (lost_server)
|
2010-12-17 17:47:29 -08:00
|
|
|
_ecore_con_server_kill(svr);
|
2010-09-17 23:06:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cl_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler)
|
2010-09-17 23:06:05 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Server *svr;
|
2010-09-29 16:53:00 -07:00
|
|
|
Eina_Bool want_read, want_write;
|
2010-09-17 23:06:05 -07:00
|
|
|
|
|
|
|
svr = data;
|
|
|
|
if (svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-09-17 23:06:05 -07:00
|
|
|
|
|
|
|
if (svr->delete_me)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-09-17 23:06:05 -07:00
|
|
|
|
2010-09-29 16:53:00 -07:00
|
|
|
want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
|
|
|
|
want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
|
|
|
|
|
|
|
|
if (svr->handshaking && (want_read || want_write))
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
2010-09-29 16:53:00 -07:00
|
|
|
DBG("Continuing ssl handshake: preparing to %s...", want_read ? "read" : "write");
|
2010-11-03 09:11:12 -07:00
|
|
|
#ifdef ISCOMFITOR
|
2010-11-03 10:58:37 -07:00
|
|
|
if (want_read)
|
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
char buf[READBUFSIZ];
|
2010-11-03 10:58:37 -07:00
|
|
|
ssize_t len;
|
|
|
|
len = recv(svr->fd, buf, sizeof(buf), MSG_DONTWAIT | MSG_PEEK);
|
|
|
|
DBG("%zu bytes in buffer", len);
|
|
|
|
}
|
2010-09-29 07:52:36 -07:00
|
|
|
#endif
|
2010-10-01 18:32:54 -07:00
|
|
|
if (ecore_con_ssl_server_init(svr))
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
2010-10-01 18:32:54 -07:00
|
|
|
ERR("ssl handshaking failed!");
|
2010-10-28 03:59:30 -07:00
|
|
|
svr->handshaking = EINA_FALSE;
|
2010-11-03 12:08:31 -07:00
|
|
|
|
2010-09-23 22:57:03 -07:00
|
|
|
}
|
2010-10-01 18:32:54 -07:00
|
|
|
else if (!svr->ssl_state)
|
2010-09-23 22:57:03 -07:00
|
|
|
{
|
2010-11-03 10:58:37 -07:00
|
|
|
svr->connecting = EINA_FALSE;
|
2010-11-03 12:08:31 -07:00
|
|
|
svr->start_time = ecore_time_get();
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_server_add(svr);
|
2010-09-23 21:15:42 -07:00
|
|
|
}
|
|
|
|
}
|
2010-09-29 16:53:00 -07:00
|
|
|
else if (want_read)
|
2010-09-17 23:06:05 -07:00
|
|
|
_ecore_con_cl_read(svr);
|
2010-11-03 10:58:37 -07:00
|
|
|
else if (want_write) /* only possible with non-ssl connections */
|
|
|
|
{
|
2010-10-02 14:13:56 -07:00
|
|
|
if (svr->connecting && (!svr_try_connect_plain(svr)))
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
_ecore_con_server_flush(svr);
|
2004-04-14 01:51:19 -07:00
|
|
|
}
|
2004-04-03 07:03:33 -08:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_cl_udp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler)
|
2008-09-25 03:14:31 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
unsigned char buf[READBUFSIZ];
|
|
|
|
int num;
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
2010-11-03 12:08:31 -07:00
|
|
|
Eina_Bool want_read, want_write;
|
|
|
|
|
|
|
|
want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
|
|
|
|
want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
|
2008-09-25 03:14:31 -07:00
|
|
|
|
|
|
|
svr = data;
|
2010-11-03 12:08:31 -07:00
|
|
|
if (svr->dead || svr->delete_me || ((!want_read) && (!want_write)))
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (want_write)
|
|
|
|
{
|
|
|
|
_ecore_con_server_flush(svr);
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
num = read(svr->fd, buf, READBUFSIZ);
|
|
|
|
|
2010-12-17 00:15:52 -08:00
|
|
|
if ((!svr->delete_me) && (num > 0))
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
|
2010-11-03 12:08:31 -07:00
|
|
|
|
2010-12-16 05:16:40 -08:00
|
|
|
if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
_ecore_con_server_kill(svr);
|
|
|
|
}
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2008-09-25 03:14:31 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
static Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_svr_udp_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler)
|
2008-09-17 08:08:48 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
unsigned char buf[READBUFSIZ];
|
|
|
|
unsigned char client_addr[256];
|
2011-03-03 13:05:28 -08:00
|
|
|
socklen_t client_addr_len = sizeof(client_addr);
|
2010-11-03 12:08:31 -07:00
|
|
|
int num;
|
2010-07-26 23:30:27 -07:00
|
|
|
Ecore_Con_Server *svr;
|
* estickies,
* etk,
* PROTO/exalt,
* E-MODULES-EXTRA/diskio,
* E-MODULES-EXTRA/drawer,
* E-MODULES-EXTRA/penguins,
* E-MODULES-EXTRA/slideshow,
* E-MODULES-EXTRA/mail,
* E-MODULES-EXTRA/forecasts,
* E-MODULES-EXTRA/iiirk,
* E-MODULES-EXTRA/places,
* e,
* ewl,
* ecore,
* elitaire,
* entrance,
* e_dbus,
* efreet: Here we go, move from Ecore_List to Eina_List.
NOTE: This patch is huge, I did test it a lot, and I hope nothing is
broken. But if you think something change after this commit, please
contact me ASAP.
SVN revision: 39200
2009-02-25 03:03:47 -08:00
|
|
|
Ecore_Con_Client *cl = NULL;
|
2008-09-17 08:08:48 -07:00
|
|
|
|
2008-10-09 05:30:19 -07:00
|
|
|
svr = data;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-03-03 13:05:28 -08:00
|
|
|
if (svr->delete_me || svr->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
|
2008-09-17 08:08:48 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
_ecore_con_client_flush(cl);
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
2008-09-17 08:08:48 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#ifdef _WIN32
|
2010-11-03 12:08:31 -07:00
|
|
|
num = fcntl(svr->fd, F_SETFL, O_NONBLOCK);
|
|
|
|
if (num >= 0)
|
2011-03-03 13:05:28 -08:00
|
|
|
num = recvfrom(svr->fd, (char *)buf, sizeof(buf), 0,
|
2010-11-03 12:08:31 -07:00
|
|
|
(struct sockaddr *)&client_addr,
|
|
|
|
&client_addr_len);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-02-20 10:01:50 -08:00
|
|
|
#else
|
2010-11-03 12:08:31 -07:00
|
|
|
num = recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT,
|
|
|
|
(struct sockaddr *)&client_addr,
|
|
|
|
&client_addr_len);
|
2010-02-20 10:01:50 -08:00
|
|
|
#endif
|
2008-10-09 05:30:19 -07:00
|
|
|
|
2010-12-16 05:16:40 -08:00
|
|
|
if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
|
2010-11-03 12:08:31 -07:00
|
|
|
{
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
2010-11-03 12:08:31 -07:00
|
|
|
if (!svr->delete_me)
|
2011-11-10 18:44:16 -08:00
|
|
|
ecore_con_event_client_del(NULL);
|
2010-11-03 12:08:31 -07:00
|
|
|
|
|
|
|
svr->dead = EINA_TRUE;
|
|
|
|
svr->fd_handler = NULL;
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2008-09-17 08:08:48 -07:00
|
|
|
}
|
2010-11-03 12:08:31 -07:00
|
|
|
|
|
|
|
|
|
|
|
/* Create a new client for use in the client data event */
|
|
|
|
cl = calloc(1, sizeof(Ecore_Con_Client));
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cl, ECORE_CALLBACK_RENEW);
|
|
|
|
|
|
|
|
cl->host_server = svr;
|
2010-11-16 13:32:50 -08:00
|
|
|
cl->client_addr = malloc(client_addr_len);
|
2010-11-05 18:22:50 -07:00
|
|
|
if (!cl->client_addr)
|
2010-11-03 12:08:31 -07:00
|
|
|
{
|
|
|
|
free(cl);
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
cl->client_addr_len = client_addr_len;
|
|
|
|
|
|
|
|
memcpy(cl->client_addr, &client_addr, client_addr_len);
|
|
|
|
ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
|
|
|
|
svr->clients = eina_list_append(svr->clients, cl);
|
|
|
|
svr->client_count++;
|
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_add(cl);
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2008-09-17 08:08:48 -07:00
|
|
|
}
|
|
|
|
|
2010-09-17 22:30:16 -07:00
|
|
|
static void
|
|
|
|
_ecore_con_svr_cl_read(Ecore_Con_Client *cl)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
int num = 0;
|
|
|
|
Eina_Bool lost_client = EINA_TRUE;
|
|
|
|
unsigned char buf[READBUFSIZ];
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2011-05-14 10:52:30 -07:00
|
|
|
DBG("cl=%p", cl);
|
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
if (cl->handshaking)
|
2010-09-17 22:30:16 -07:00
|
|
|
{
|
2010-11-03 12:08:31 -07:00
|
|
|
/* add an extra handshake attempt just before read, even though
|
|
|
|
* read also attempts to handshake, to try to finish sooner
|
|
|
|
*/
|
|
|
|
if (ecore_con_ssl_client_init(cl))
|
|
|
|
lost_client = EINA_FALSE;
|
2010-09-24 21:22:10 -07:00
|
|
|
|
2010-11-03 12:08:31 -07:00
|
|
|
_ecore_con_cl_timer_update(cl);
|
|
|
|
}
|
2010-09-24 20:02:10 -07:00
|
|
|
|
2011-06-15 11:58:34 -07:00
|
|
|
if (!(cl->host_server->type & ECORE_CON_SSL) || (!cl->upgrade))
|
2010-11-03 12:08:31 -07:00
|
|
|
{
|
|
|
|
num = read(cl->fd, buf, sizeof(buf));
|
2010-12-17 00:44:53 -08:00
|
|
|
/* 0 is not a valid return value for a tcp socket */
|
2010-12-17 04:09:14 -08:00
|
|
|
if ((num > 0) || ((num < 0) && ((errno == EAGAIN) || (errno == EINTR))))
|
2010-11-03 10:58:37 -07:00
|
|
|
lost_client = EINA_FALSE;
|
2011-02-15 12:17:48 -08:00
|
|
|
else if (num < 0)
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_con_event_client_error(cl, strerror(errno));
|
2010-11-03 12:08:31 -07:00
|
|
|
}
|
2010-11-03 12:38:00 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
num = ecore_con_ssl_client_read(cl, buf, sizeof(buf));
|
2010-12-17 01:02:44 -08:00
|
|
|
/* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
|
2010-12-15 23:43:48 -08:00
|
|
|
if (num >= 0)
|
2010-11-03 12:38:00 -07:00
|
|
|
lost_client = EINA_FALSE;
|
|
|
|
}
|
2010-09-17 22:30:16 -07:00
|
|
|
|
2010-12-15 23:43:48 -08:00
|
|
|
if ((!cl->delete_me) && (num > 0))
|
2011-05-14 10:52:30 -07:00
|
|
|
ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
|
2010-12-15 23:43:48 -08:00
|
|
|
|
2010-11-03 12:38:00 -07:00
|
|
|
if (lost_client)
|
|
|
|
{
|
|
|
|
if (!cl->delete_me)
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_del(cl);
|
2010-11-16 13:32:50 -08:00
|
|
|
INF("Lost client %s", (cl->ip) ? cl->ip : "");
|
2010-11-03 12:38:00 -07:00
|
|
|
cl->dead = EINA_TRUE;
|
|
|
|
if (cl->fd_handler)
|
|
|
|
ecore_main_fd_handler_del(cl->fd_handler);
|
|
|
|
|
|
|
|
cl->fd_handler = NULL;
|
|
|
|
return;
|
|
|
|
}
|
2010-09-17 22:30:16 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-17 22:30:16 -07:00
|
|
|
static Eina_Bool
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_svr_cl_handler(void *data,
|
|
|
|
Ecore_Fd_Handler *fd_handler)
|
2010-09-17 22:30:16 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Client *cl;
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-17 22:30:16 -07:00
|
|
|
cl = data;
|
|
|
|
if (cl->dead)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-09-17 22:30:16 -07:00
|
|
|
|
|
|
|
if (cl->delete_me)
|
2010-11-03 10:58:37 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2010-09-17 22:30:16 -07:00
|
|
|
|
2010-09-28 22:08:47 -07:00
|
|
|
if (cl->handshaking && ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ | ECORE_FD_WRITE))
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
2010-10-01 18:32:54 -07:00
|
|
|
if (ecore_con_ssl_client_init(cl))
|
2010-09-23 21:15:42 -07:00
|
|
|
{
|
|
|
|
ERR("ssl handshaking failed!");
|
2010-10-28 03:59:30 -07:00
|
|
|
cl->handshaking = EINA_FALSE;
|
2010-09-23 22:57:03 -07:00
|
|
|
cl->dead = EINA_TRUE;
|
2010-11-16 13:32:50 -08:00
|
|
|
INF("Lost client %s", (cl->ip) ? cl->ip : "");
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_del(cl);
|
2010-09-23 21:15:42 -07:00
|
|
|
}
|
2010-10-01 18:32:54 -07:00
|
|
|
else if (!cl->ssl_state)
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_add(cl);
|
2010-09-23 21:15:42 -07:00
|
|
|
}
|
2010-09-28 22:08:47 -07:00
|
|
|
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
|
2010-09-17 22:30:16 -07:00
|
|
|
_ecore_con_svr_cl_read(cl);
|
2010-09-22 01:03:38 -07:00
|
|
|
|
2010-09-17 22:30:16 -07:00
|
|
|
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
|
|
|
|
_ecore_con_client_flush(cl);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-06-24 09:15:56 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_server_flush(Ecore_Con_Server *svr)
|
|
|
|
{
|
2008-12-15 09:59:19 -08:00
|
|
|
int count, num;
|
2003-09-23 01:09:32 -07:00
|
|
|
|
2011-05-14 10:52:30 -07:00
|
|
|
#ifdef _WIN32
|
|
|
|
if (ecore_con_local_win32_server_flush(svr))
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
if ((!svr->buf) && svr->fd_handler)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
|
|
|
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
|
|
|
|
return;
|
|
|
|
}
|
2004-04-02 10:32:55 -08:00
|
|
|
|
2011-07-16 06:07:39 -07:00
|
|
|
num = eina_binbuf_length_get(svr->buf) - svr->write_buf_offset;
|
2010-12-09 13:02:53 -08:00
|
|
|
|
2004-04-02 10:32:55 -08:00
|
|
|
/* check whether we need to write anything at all.
|
2008-10-09 05:30:19 -07:00
|
|
|
* we must not write zero bytes with SSL_write() since it
|
|
|
|
* causes undefined behaviour
|
|
|
|
*/
|
2010-12-09 13:02:53 -08:00
|
|
|
/* we thank Tommy[D] for needing to check negative buffer sizes
|
|
|
|
* here because his system is amazing.
|
|
|
|
*/
|
|
|
|
if (num <= 0) return;
|
2007-08-26 04:17:21 -07:00
|
|
|
|
2010-09-24 21:22:10 -07:00
|
|
|
if (svr->handshaking)
|
|
|
|
{
|
2010-09-28 20:52:32 -07:00
|
|
|
DBG("Continuing ssl handshake");
|
2010-09-24 21:22:10 -07:00
|
|
|
if (ecore_con_ssl_server_init(svr))
|
2010-09-28 21:06:28 -07:00
|
|
|
_ecore_con_server_kill(svr);
|
2011-06-17 04:16:50 -07:00
|
|
|
_ecore_con_server_timer_update(svr);
|
2010-09-24 21:22:10 -07:00
|
|
|
return;
|
|
|
|
}
|
2010-09-24 20:02:10 -07:00
|
|
|
|
2008-10-30 08:26:11 -07:00
|
|
|
if (!(svr->type & ECORE_CON_SSL))
|
2011-07-16 06:07:39 -07:00
|
|
|
count = write(svr->fd, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num);
|
2008-10-30 08:26:11 -07:00
|
|
|
else
|
2011-07-16 06:07:39 -07:00
|
|
|
count = ecore_con_ssl_server_write(svr, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num);
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-24 20:02:10 -07:00
|
|
|
if (count < 0)
|
2010-09-28 21:06:28 -07:00
|
|
|
{
|
2010-12-11 08:51:29 -08:00
|
|
|
if ((errno != EAGAIN) && (errno != EINTR))
|
2011-02-10 00:49:23 -08:00
|
|
|
{
|
|
|
|
ecore_con_event_server_error(svr, strerror(errno));
|
|
|
|
_ecore_con_server_kill(svr);
|
|
|
|
}
|
2010-11-03 10:58:37 -07:00
|
|
|
return;
|
2010-09-28 21:06:28 -07:00
|
|
|
}
|
2004-04-02 10:32:55 -08:00
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
if (count) ecore_con_event_server_write(svr, count);
|
2004-04-03 07:03:33 -08:00
|
|
|
svr->write_buf_offset += count;
|
2011-07-16 06:07:39 -07:00
|
|
|
if (svr->write_buf_offset >= eina_binbuf_length_get(svr->buf))
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
svr->write_buf_offset = 0;
|
2011-07-16 06:07:39 -07:00
|
|
|
eina_binbuf_free(svr->buf);
|
|
|
|
svr->buf = NULL;
|
2010-07-26 23:30:27 -07:00
|
|
|
if (svr->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2011-04-29 00:22:53 -07:00
|
|
|
else if ((count < num) && svr->fd_handler)
|
2010-11-04 08:01:05 -07:00
|
|
|
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_client_flush(Ecore_Con_Client *cl)
|
|
|
|
{
|
2010-09-24 20:02:10 -07:00
|
|
|
int num, count = 0;
|
2003-09-23 01:09:32 -07:00
|
|
|
|
2011-05-14 10:52:30 -07:00
|
|
|
#ifdef _WIN32
|
|
|
|
if (ecore_con_local_win32_client_flush(cl))
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
2011-04-29 00:22:53 -07:00
|
|
|
if (!cl->buf && cl->fd_handler)
|
2011-02-10 11:17:30 -08:00
|
|
|
{
|
|
|
|
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
|
|
|
|
return;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-24 21:22:10 -07:00
|
|
|
if (cl->handshaking)
|
|
|
|
{
|
|
|
|
if (ecore_con_ssl_client_init(cl))
|
|
|
|
count = -1;
|
|
|
|
|
|
|
|
_ecore_con_cl_timer_update(cl);
|
|
|
|
}
|
2010-09-24 20:02:10 -07:00
|
|
|
|
|
|
|
if (!count)
|
|
|
|
{
|
2011-07-16 06:07:39 -07:00
|
|
|
num = eina_binbuf_length_get(cl->buf) - cl->buf_offset;
|
2010-12-09 13:04:22 -08:00
|
|
|
if (num <= 0) return;
|
2011-06-15 11:58:34 -07:00
|
|
|
if (!(cl->host_server->type & ECORE_CON_SSL) || (!cl->upgrade))
|
2011-07-16 06:07:39 -07:00
|
|
|
count = write(cl->fd, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
|
2010-09-24 20:02:10 -07:00
|
|
|
else
|
2011-07-16 06:07:39 -07:00
|
|
|
count = ecore_con_ssl_client_write(cl, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
|
2010-09-24 20:02:10 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2010-09-24 20:02:10 -07:00
|
|
|
if (count < 0)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-12-11 08:51:29 -08:00
|
|
|
if ((errno != EAGAIN) && (errno != EINTR) && (!cl->delete_me))
|
|
|
|
{
|
2011-02-10 00:49:23 -08:00
|
|
|
ecore_con_event_client_error(cl, strerror(errno));
|
2011-02-10 11:17:30 -08:00
|
|
|
ecore_con_event_client_del(cl);
|
2010-12-11 08:51:29 -08:00
|
|
|
cl->dead = EINA_TRUE;
|
|
|
|
INF("Lost client %s", (cl->ip) ? cl->ip : "");
|
|
|
|
if (cl->fd_handler)
|
|
|
|
ecore_main_fd_handler_del(cl->fd_handler);
|
|
|
|
|
|
|
|
cl->fd_handler = NULL;
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
|
|
|
return;
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
if (count) ecore_con_event_client_write(cl, count);
|
2003-09-23 01:09:32 -07:00
|
|
|
cl->buf_offset += count;
|
2011-07-16 06:07:39 -07:00
|
|
|
if (cl->buf_offset >= eina_binbuf_length_get(cl->buf))
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
2010-07-26 23:30:27 -07:00
|
|
|
cl->buf_offset = 0;
|
2011-07-16 06:07:39 -07:00
|
|
|
eina_binbuf_free(cl->buf);
|
2010-07-26 23:30:27 -07:00
|
|
|
cl->buf = NULL;
|
|
|
|
if (cl->fd_handler)
|
2010-11-03 10:58:37 -07:00
|
|
|
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-12-08 22:16:13 -08:00
|
|
|
else if ((count < num) && cl->fd_handler)
|
2010-11-04 08:01:05 -07:00
|
|
|
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2006-03-19 21:53:12 -08:00
|
|
|
static void
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_event_client_add_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev)
|
2006-03-19 21:53:12 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Add *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->client)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if ((!e->client->event_count) && (e->client->delete_me))
|
|
|
|
ecore_con_client_del(e->client);
|
|
|
|
if (e->client->host_server)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
|
|
|
|
if ((!svr->event_count) && (svr->delete_me))
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_client_add_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_event_client_del_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev)
|
2006-03-19 21:53:12 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Del *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->client)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if ((!e->client->event_count) && (e->client->delete_me))
|
|
|
|
ecore_con_client_del(e->client);
|
|
|
|
if (e->client->host_server)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
|
|
|
|
if ((!svr->event_count) && (svr->delete_me))
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
|
|
|
}
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_client_del_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
static void
|
|
|
|
_ecore_con_event_client_write_free(Ecore_Con_Server *svr,
|
|
|
|
Ecore_Con_Event_Client_Write *e)
|
|
|
|
{
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->client)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if (((!e->client->event_count) && (e->client->delete_me)) ||
|
|
|
|
((e->client->host_server &&
|
|
|
|
((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
|
|
|
|
(e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
|
|
|
|
ecore_con_client_del(e->client);
|
|
|
|
if (e->client->host_server)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if ((!svr->event_count) && (svr->delete_me))
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
|
|
|
}
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_client_write_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2011-09-13 16:03:26 -07:00
|
|
|
}
|
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
static void
|
2011-02-10 11:17:30 -08:00
|
|
|
_ecore_con_event_client_data_free(Ecore_Con_Server *svr,
|
2010-11-03 10:58:37 -07:00
|
|
|
void *ev)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Client_Data *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->client)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if (((!e->client->event_count) && (e->client->delete_me)) ||
|
|
|
|
((e->client->host_server &&
|
|
|
|
((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
|
|
|
|
(e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
|
|
|
|
ecore_con_client_del(e->client);
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
|
|
|
|
if ((!svr->event_count) && (svr->delete_me))
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
|
|
|
free(e->data);
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_client_data_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_event_server_add_free(void *data __UNUSED__,
|
|
|
|
void *ev)
|
2006-03-19 21:53:12 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Add *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->server)
|
|
|
|
{
|
|
|
|
e->server->event_count = eina_list_remove(e->server->event_count, ev);
|
|
|
|
if ((!e->server->event_count) && (e->server->delete_me))
|
|
|
|
_ecore_con_server_free(e->server);
|
|
|
|
}
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_server_add_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2006-03-19 21:53:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_event_server_del_free(void *data __UNUSED__,
|
|
|
|
void *ev)
|
2006-03-19 21:53:12 -08:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Del *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->server)
|
|
|
|
{
|
|
|
|
e->server->event_count = eina_list_remove(e->server->event_count, ev);
|
|
|
|
if ((!e->server->event_count) && (e->server->delete_me))
|
|
|
|
_ecore_con_server_free(e->server);
|
|
|
|
}
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_server_del_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
|
|
|
|
2011-09-13 16:03:26 -07:00
|
|
|
static void
|
|
|
|
_ecore_con_event_server_write_free(void *data __UNUSED__,
|
|
|
|
Ecore_Con_Event_Server_Write *e)
|
|
|
|
{
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->server)
|
|
|
|
{
|
|
|
|
e->server->event_count = eina_list_remove(e->server->event_count, e);
|
|
|
|
if ((!e->server->event_count) && (e->server->delete_me))
|
|
|
|
_ecore_con_server_free(e->server);
|
|
|
|
}
|
2011-09-13 16:03:26 -07:00
|
|
|
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_server_write_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2011-09-13 16:03:26 -07:00
|
|
|
}
|
|
|
|
|
2003-09-23 01:09:32 -07:00
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_event_server_data_free(void *data __UNUSED__,
|
|
|
|
void *ev)
|
2003-09-23 01:09:32 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Event_Server_Data *e;
|
|
|
|
|
|
|
|
e = ev;
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->server)
|
|
|
|
{
|
|
|
|
e->server->event_count = eina_list_remove(e->server->event_count, ev);
|
|
|
|
if ((!e->server->event_count) && (e->server->delete_me))
|
|
|
|
_ecore_con_server_free(e->server);
|
|
|
|
}
|
2011-02-10 11:17:30 -08:00
|
|
|
|
2011-11-10 18:44:16 -08:00
|
|
|
free(e->data);
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_server_data_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_con_event_server_error_free(void *data __UNUSED__, Ecore_Con_Event_Server_Error *e)
|
|
|
|
{
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->server)
|
|
|
|
{
|
|
|
|
e->server->event_count = eina_list_remove(e->server->event_count, e);
|
|
|
|
if ((!e->server->event_count) && (e->server->delete_me))
|
|
|
|
_ecore_con_server_free(e->server);
|
|
|
|
}
|
|
|
|
free(e->error);
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_server_error_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2011-02-10 11:17:30 -08:00
|
|
|
}
|
2010-07-26 23:30:27 -07:00
|
|
|
|
2011-02-10 11:17:30 -08:00
|
|
|
static void
|
|
|
|
_ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client_Error *e)
|
|
|
|
{
|
2011-11-10 18:44:16 -08:00
|
|
|
if (e->client)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if ((!e->client->event_count) && (e->client->delete_me))
|
|
|
|
_ecore_con_client_free(e->client);
|
|
|
|
if (e->client->host_server)
|
|
|
|
{
|
|
|
|
e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
|
|
|
|
if ((!svr->event_count) && (svr->delete_me))
|
|
|
|
_ecore_con_server_free(svr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(e->error);
|
2011-11-06 04:26:00 -08:00
|
|
|
ecore_con_event_client_error_free(e);
|
2011-11-10 18:44:16 -08:00
|
|
|
_ecore_con_event_count--;
|
|
|
|
if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
|
|
|
|
ecore_con_mempool_shutdown();
|
2003-09-23 01:09:32 -07:00
|
|
|
}
|
2010-07-22 04:32:55 -07:00
|
|
|
|
|
|
|
static void
|
2010-11-03 10:58:37 -07:00
|
|
|
_ecore_con_lookup_done(void *data,
|
|
|
|
Ecore_Con_Info *infos)
|
2010-07-22 04:32:55 -07:00
|
|
|
{
|
|
|
|
Ecore_Con_Server *svr;
|
|
|
|
Ecore_Con_Lookup *lk;
|
|
|
|
|
|
|
|
svr = data;
|
|
|
|
lk = svr->data;
|
|
|
|
|
|
|
|
if (infos)
|
2010-11-03 10:58:37 -07:00
|
|
|
lk->done_cb(infos->info.ai_canonname, infos->ip,
|
|
|
|
infos->info.ai_addr, infos->info.ai_addrlen,
|
|
|
|
(void *)lk->data);
|
2010-07-22 04:32:55 -07:00
|
|
|
else
|
2010-11-03 10:58:37 -07:00
|
|
|
lk->done_cb(NULL, NULL, NULL, 0, (void *)lk->data);
|
2010-07-22 04:32:55 -07:00
|
|
|
|
|
|
|
free(svr->name);
|
|
|
|
free(lk);
|
|
|
|
free(svr);
|
|
|
|
}
|
2010-11-03 10:58:37 -07:00
|
|
|
|