diff --git a/src/Makefile_Ecore_Con.am b/src/Makefile_Ecore_Con.am index 699a64cb28..a659162ba1 100644 --- a/src/Makefile_Ecore_Con.am +++ b/src/Makefile_Ecore_Con.am @@ -5,17 +5,21 @@ ecorecon_eobuiltheaders = \ lib/ecore_con/ecore_con.eo.h \ lib/ecore_con/ecore_con.eo.legacy.h \ lib/ecore_con/ecore_con_client.eo.h \ - lib/ecore_con/ecore_con_client.eo.legacy.h + lib/ecore_con/ecore_con_client.eo.legacy.h \ + lib/ecore_con/ecore_con_server.eo.h \ + lib/ecore_con/ecore_con_server.eo.legacy.h BUILT_SOURCES += \ ${ecorecon_eobuiltheaders} \ lib/ecore_con/ecore_con.eo.c \ - lib/ecore_con/ecore_con_client.eo.c + lib/ecore_con/ecore_con_client.eo.c \ + lib/ecore_con/ecore_con_server.eo.c ecoreconeolianfilesdir = $(datadir)/eolian/include/ecore-@VMAJ@ ecoreconeolianfiles_DATA = \ lib/ecore_con/ecore_con.eo \ - lib/ecore_con/ecore_con_client.eo + lib/ecore_con/ecore_con_client.eo \ + lib/ecore_con/ecore_con_server.eo EXTRA_DIST += \ ${ecoreconeolianfiles_DATA} diff --git a/src/lib/ecore_con/Ecore_Con.h b/src/lib/ecore_con/Ecore_Con.h index c96cc00ae5..ce95aeb23d 100644 --- a/src/lib/ecore_con/Ecore_Con.h +++ b/src/lib/ecore_con/Ecore_Con.h @@ -222,14 +222,6 @@ extern "C" { #define ECORE_CON_USE_SSL ECORE_CON_USE_SSL2 #define ECORE_CON_REMOTE_SYSTEM ECORE_CON_REMOTE_TCP - -/** - * @typedef Ecore_Con_Server - * A connection handle to a server - * @ingroup Ecore_Con_Server_Group - */ -typedef struct _Ecore_Con_Server Ecore_Con_Server; - /** * @typedef Ecore_Con_Socks * An object representing a SOCKS proxy @@ -897,28 +889,7 @@ EAPI void * ecore_con_server_data_set(Ecore_Con_Server *svr, * @param svr The given server. * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise. */ -EAPI Eina_Bool ecore_con_server_connected_get(Ecore_Con_Server *svr); -/** - * Retrieves the current list of clients. - * - * @param svr The given server. - * @return The list of clients on this server. - * - * Each node in the returned list points to an @ref Ecore_Con_Client. This list - * cannot be modified or freed. It can also change if new clients are connected - * or disconnected, and will become invalid when the server is deleted/freed. - */ -EAPI const Eina_List * ecore_con_server_clients_get(Ecore_Con_Server *svr); - -/** - * Retrieves the name of server. - * - * @param svr The given server. - * @return The name of the server. - * - * The name returned is the name used to connect on this server. - */ -EAPI const char * ecore_con_server_name_get(Ecore_Con_Server *svr); +EAPI Eina_Bool ecore_con_server_connected_get(const Ecore_Con_Server *svr); /** * Retrieves the server port in use. @@ -928,7 +899,7 @@ EAPI const char * ecore_con_server_name_get(Ecore_Con_Server *svr); * * The port where the server is listening for connections. */ -EAPI int ecore_con_server_port_get(Ecore_Con_Server *svr); +EAPI int ecore_con_server_port_get(const Ecore_Con_Server *svr); /** * @brief Check how long a server has been connected * @@ -939,7 +910,7 @@ EAPI int ecore_con_server_port_get(Ecore_Con_Server *svr); * This function is used to find out the time that has been elapsed since * ecore_con_server_add() succeeded. */ -EAPI double ecore_con_server_uptime_get(Ecore_Con_Server *svr); +EAPI double ecore_con_server_uptime_get(const Ecore_Con_Server *svr); /** * Sends the given data to the given server. * @@ -996,7 +967,7 @@ EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr, * deletion for the @p svr object. If no IP is known @c NULL is * returned. */ -EAPI const char * ecore_con_server_ip_get(Ecore_Con_Server *svr); +EAPI const char * ecore_con_server_ip_get(const Ecore_Con_Server *svr); /** * Flushes all pending data to the given server. * @@ -1039,7 +1010,7 @@ EAPI void ecore_con_server_timeout_set(Ecore_Con_Server *svr, doubl * @see ecore_con_server_timeout_set() * @see ecore_con_client_timeout_get() */ -EAPI double ecore_con_server_timeout_get(Ecore_Con_Server *svr); +EAPI double ecore_con_server_timeout_get(const Ecore_Con_Server *svr); /** * Get the fd that the server is connected to @@ -1053,7 +1024,7 @@ EAPI double ecore_con_server_timeout_get(Ecore_Con_Server *svr); * @warning Seriously. Don't use this unless you know what you are doing. * @since 1.1 */ -EAPI int ecore_con_server_fd_get(Ecore_Con_Server *svr); +EAPI int ecore_con_server_fd_get(const Ecore_Con_Server *svr); /** * Get the fd that the client is connected to diff --git a/src/lib/ecore_con/Ecore_Con_Eo.h b/src/lib/ecore_con/Ecore_Con_Eo.h index bbc28227a6..eed562a125 100644 --- a/src/lib/ecore_con/Ecore_Con_Eo.h +++ b/src/lib/ecore_con/Ecore_Con_Eo.h @@ -1,2 +1,3 @@ #include "ecore_con.eo.h" +#include "ecore_con_server.eo.h" #include "ecore_con_client.eo.h" diff --git a/src/lib/ecore_con/Ecore_Con_Legacy.h b/src/lib/ecore_con/Ecore_Con_Legacy.h index e65ae8ab56..0f66ff8f46 100644 --- a/src/lib/ecore_con/Ecore_Con_Legacy.h +++ b/src/lib/ecore_con/Ecore_Con_Legacy.h @@ -1,2 +1,3 @@ #include "ecore_con.eo.legacy.h" +#include "ecore_con_server.eo.legacy.h" #include "ecore_con_client.eo.legacy.h" diff --git a/src/lib/ecore_con/ecore_con.c b/src/lib/ecore_con/ecore_con.c index 9432c670e9..6fb0938ff4 100644 --- a/src/lib/ecore_con/ecore_con.c +++ b/src/lib/ecore_con/ecore_con.c @@ -131,12 +131,13 @@ _ecore_con_client_kill(Ecore_Con_Client *obj) } void -_ecore_con_server_kill(Ecore_Con_Server *svr) +_ecore_con_server_kill(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (svr->delete_me) DBG("Multi kill request for svr %p", svr); else - ecore_con_event_server_del(svr); + ecore_con_event_server_del(obj); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); @@ -234,7 +235,7 @@ EAPI int ecore_con_shutdown(void) { Eina_List *l, *l2; - Ecore_Con_Server *svr; + Ecore_Con_Server *obj; if (--_ecore_con_init_count != 0) return _ecore_con_init_count; @@ -243,8 +244,9 @@ ecore_con_shutdown(void) EINA_LOG_STATE_START, EINA_LOG_STATE_SHUTDOWN); - EINA_LIST_FOREACH_SAFE(servers, l, l2, svr) + EINA_LIST_FOREACH_SAFE(servers, l, l2, obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Server_Add *ev; svr->delete_me = EINA_TRUE; @@ -252,7 +254,7 @@ ecore_con_shutdown(void) /* 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); + _ecore_con_server_free(obj); } ecore_con_socks_shutdown(); @@ -271,16 +273,17 @@ ecore_con_shutdown(void) } EOLIAN static Eina_Bool -_ecore_con_lookup(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, const char *name, Ecore_Con_Dns_Cb done_cb, const void *data) +_ecore_con_lookup(Eo *kls_obj EINA_UNUSED, void *pd EINA_UNUSED, const char *name, Ecore_Con_Dns_Cb done_cb, const void *data) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj; Ecore_Con_Lookup *lk; struct addrinfo hints; if (!name || !done_cb) return EINA_FALSE; - svr = calloc(1, sizeof(Ecore_Con_Server)); + obj = eo_add(ECORE_CON_SERVER_CLASS, NULL); + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (!svr) return EINA_FALSE; @@ -316,14 +319,14 @@ _ecore_con_lookup(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, const char *name, E hints.ai_next = NULL; hints.ai_addr = NULL; - if (ecore_con_info_get(svr, _ecore_con_lookup_done, svr, + if (ecore_con_info_get(obj, _ecore_con_lookup_done, svr, &hints)) return EINA_TRUE; free(svr->name); on_error: free(lk); - free(svr); + eo_del(obj); return EINA_FALSE; } @@ -346,7 +349,7 @@ ecore_con_server_add(Ecore_Con_Type compl_type, int port, const void *data) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj; Ecore_Con_Type type; if (port < 0 || !name) @@ -354,11 +357,9 @@ ecore_con_server_add(Ecore_Con_Type compl_type, /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */ /* remote system socket: TCP/IP: [name]:[port] */ - svr = calloc(1, sizeof(Ecore_Con_Server)); - if (!svr) - return NULL; + obj = eo_add(ECORE_CON_SERVER_CLASS, NULL); + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); - ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER); svr->fd = -1; svr->start_time = ecore_time_get(); svr->type = compl_type; @@ -371,13 +372,13 @@ ecore_con_server_add(Ecore_Con_Type compl_type, svr->clients = NULL; svr->ppid = getpid(); - servers = eina_list_append(servers, svr); + servers = eina_list_append(servers, obj); svr->name = strdup(name); if (!svr->name) goto error; - if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL)) + if (ecore_con_ssl_server_prepare(obj, compl_type & ECORE_CON_SSL)) goto error; type = compl_type & ECORE_CON_TYPE; @@ -387,10 +388,10 @@ ecore_con_server_add(Ecore_Con_Type compl_type, (type == ECORE_CON_LOCAL_ABSTRACT)) /* Local */ #ifdef _WIN32 - if (!ecore_con_local_listen(svr)) + if (!ecore_con_local_listen(obj)) goto error; #else - if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr)) + if (!ecore_con_local_listen(obj, _ecore_con_svr_tcp_handler, obj)) goto error; #endif @@ -399,22 +400,22 @@ ecore_con_server_add(Ecore_Con_Type compl_type, (type == ECORE_CON_REMOTE_CORK)) { /* TCP */ - if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen, - svr)) + if (!ecore_con_info_tcp_listen(obj, _ecore_con_cb_tcp_listen, + obj)) goto error; } else if ((type == ECORE_CON_REMOTE_MCAST) || (type == ECORE_CON_REMOTE_UDP)) /* UDP and MCAST */ - if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen, - svr)) + if (!ecore_con_info_udp_listen(obj, _ecore_con_cb_udp_listen, + obj)) goto error; - return svr; + return obj; error: if (svr->delete_me) return NULL; - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); return NULL; } @@ -424,7 +425,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, int port, const void *data) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj; Ecore_Con_Type type; if ((!name) || (!name[0])) @@ -432,11 +433,9 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, /* local user socket: FILE: ~/.ecore/[name]/[port] */ /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */ /* remote system socket: TCP/IP: [name]:[port] */ - svr = calloc(1, sizeof(Ecore_Con_Server)); - if (!svr) - return NULL; + obj = eo_add(ECORE_CON_SERVER_CLASS, NULL); + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); - ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER); svr->fd = -1; svr->type = compl_type; svr->port = port; @@ -448,7 +447,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, svr->clients = NULL; svr->client_limit = -1; - servers = eina_list_append(servers, svr); + servers = eina_list_append(servers, obj); svr->name = strdup(name); if (!svr->name) @@ -473,7 +472,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, svr->ecs_state = ECORE_CON_PROXY_STATE_RESOLVED; } } - EINA_SAFETY_ON_TRUE_GOTO(ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL), error); + EINA_SAFETY_ON_TRUE_GOTO(ecore_con_ssl_server_prepare(obj, compl_type & ECORE_CON_SSL), error); EINA_SAFETY_ON_TRUE_GOTO(((type == ECORE_CON_REMOTE_TCP) || (type == ECORE_CON_REMOTE_NODELAY) || @@ -487,9 +486,9 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, (type == ECORE_CON_LOCAL_ABSTRACT)) /* Local */ #ifdef _WIN32 - if (!ecore_con_local_connect(svr, _ecore_con_cl_handler)) goto error; + if (!ecore_con_local_connect(obj, _ecore_con_cl_handler)) goto error; #else - if (!ecore_con_local_connect(svr, _ecore_con_cl_handler, svr)) goto error; + if (!ecore_con_local_connect(obj, _ecore_con_cl_handler, obj)) goto error; #endif if ((type == ECORE_CON_REMOTE_TCP) || @@ -497,160 +496,131 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, (type == ECORE_CON_REMOTE_CORK)) { /* TCP */ - EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect, svr), error); + EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_tcp_connect(obj, _ecore_con_cb_tcp_connect, obj), error); } else if ((type == ECORE_CON_REMOTE_UDP) || (type == ECORE_CON_REMOTE_BROADCAST)) /* UDP and MCAST */ - EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect, svr), error); + EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_udp_connect(obj, _ecore_con_cb_udp_connect, obj), error); - return svr; + return obj; error: if (svr->delete_me) return NULL; - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); return NULL; } EAPI void -ecore_con_server_timeout_set(Ecore_Con_Server *svr, - double timeout) +ecore_con_server_timeout_set(Ecore_Con *obj, double timeout) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_set"); - return; - } + eo_do((Ecore_Con *)obj, ecore_con_obj_timeout_set(timeout)); +} +EOLIAN static void +_ecore_con_server_ecore_con_timeout_set(Eo *obj, Ecore_Con_Server_Data *svr, double timeout) +{ if (svr->created) svr->client_disconnect_time = timeout; else svr->disconnect_time = timeout; - _ecore_con_server_timer_update(svr); + _ecore_con_server_timer_update(obj); } EAPI double -ecore_con_server_timeout_get(Ecore_Con_Server *svr) +ecore_con_server_timeout_get(const Ecore_Con *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_get"); - return 0; - } + return eo_do((Ecore_Con *)obj, ecore_con_obj_timeout_get()); +} +EOLIAN static double +_ecore_con_server_ecore_con_timeout_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr) +{ return svr->created ? svr->client_disconnect_time : svr->disconnect_time; } EAPI void * -ecore_con_server_del(Ecore_Con_Server *svr) +ecore_con_server_del(Ecore_Con_Server *obj) { - if (!svr) return NULL; - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_del"); - return NULL; - } + if (!obj) return NULL; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (svr->delete_me) return NULL; - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); return svr->data; } EAPI void * -ecore_con_server_data_get(Ecore_Con_Server *svr) +ecore_con_server_data_get(Ecore_Con_Server *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_data_get"); - return NULL; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) + return NULL; return svr->data; } EAPI void * -ecore_con_server_data_set(Ecore_Con_Server *svr, +ecore_con_server_data_set(Ecore_Con_Server *obj, void *data) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) + return NULL; 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; } EAPI Eina_Bool -ecore_con_server_connected_get(Ecore_Con_Server *svr) +ecore_con_server_connected_get(const Ecore_Con *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_connected_get"); - return EINA_FALSE; - } - - if (svr->connecting) - return EINA_FALSE; - - return EINA_TRUE; + return eo_do((Ecore_Con *)obj, ecore_con_obj_connected_get()); } -EAPI const Eina_List * -ecore_con_server_clients_get(Ecore_Con_Server *svr) +EOLIAN static Eina_Bool +_ecore_con_server_ecore_con_connected_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, - "ecore_con_server_clients_get"); - return NULL; - } + return !svr->connecting; +} +EOLIAN const Eina_List * +_ecore_con_server_clients_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr) +{ return svr->clients; } -EAPI const char * -ecore_con_server_name_get(Ecore_Con_Server *svr) +EOLIAN static const char * +_ecore_con_server_name_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *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) +ecore_con_server_port_get(const Ecore_Con *obj) +{ + return eo_do((Ecore_Con *)obj, ecore_con_obj_port_get()); +} + +EOLIAN static int +_ecore_con_server_ecore_con_port_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *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; } EAPI int -ecore_con_server_send(Ecore_Con_Server *svr, - const void *data, - int size) +ecore_con_server_send(Ecore_Con *obj, const void *data, int size) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_send"); - return 0; - } + return eo_do((Ecore_Con *)obj, ecore_con_obj_send(data, size)); +} +EOLIAN static int +_ecore_con_server_ecore_con_send(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr, const void *data, int size) +{ EINA_SAFETY_ON_TRUE_RETURN_VAL(svr->delete_me, 0); EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); @@ -680,56 +650,58 @@ ecore_con_server_send(Ecore_Con_Server *svr, return size; } -EAPI void -ecore_con_server_client_limit_set(Ecore_Con_Server *svr, +EOLIAN static void +_ecore_con_server_client_limit_set(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr, int client_limit, char reject_excess_clients) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, - "ecore_con_server_client_limit_set"); - return; - } - svr->client_limit = client_limit; svr->reject_excess_clients = reject_excess_clients; } -EAPI const char * -ecore_con_server_ip_get(Ecore_Con_Server *svr) +EOLIAN static void +_ecore_con_server_client_limit_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr, + int *client_limit, + char *reject_excess_clients) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_ip_get"); - return NULL; - } + if (client_limit) *client_limit = svr->client_limit; + if (reject_excess_clients) *reject_excess_clients = svr->reject_excess_clients; +} +EAPI const char * +ecore_con_server_ip_get(const Ecore_Con *obj) +{ + return eo_do(obj, ecore_con_obj_ip_get()); +} + +EOLIAN static const char * +_ecore_con_server_ecore_con_ip_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr) +{ return svr->ip; } EAPI double -ecore_con_server_uptime_get(Ecore_Con_Server *svr) +ecore_con_server_uptime_get(const Ecore_Con *obj) { - 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 eo_do(obj, ecore_con_obj_uptime_get()); +} +EOLIAN static double +_ecore_con_server_ecore_con_uptime_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *svr) +{ return ecore_time_get() - svr->start_time; } EAPI void -ecore_con_server_flush(Ecore_Con_Server *svr) +ecore_con_server_flush(Ecore_Con *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_flush"); - return; - } + eo_do((Ecore_Con *)obj, ecore_con_obj_flush()); +} - _ecore_con_server_flush(svr); +EOLIAN static void +_ecore_con_server_ecore_con_flush(Eo *obj, Ecore_Con_Server_Data *svr EINA_UNUSED) +{ + _ecore_con_server_flush(obj); } /** @@ -758,6 +730,7 @@ ecore_con_client_send(Ecore_Con *obj, const void *data, int size) EOLIAN static int _ecore_con_client_ecore_con_send(Eo *obj EINA_UNUSED, Ecore_Con_Client_Data *cl, const void *data, int size) { + Ecore_Con_Server_Data *host_server = NULL; EINA_SAFETY_ON_TRUE_RETURN_VAL(cl->delete_me, 0); EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); @@ -767,8 +740,12 @@ _ecore_con_client_ecore_con_send(Eo *obj EINA_UNUSED, Ecore_Con_Client_Data *cl, if (cl->fd_handler) ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); - if (cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP)) - sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr, + if (cl->host_server) + host_server = eo_data_scope_get(cl->host_server, ECORE_CON_CLIENT_CLASS); + + + if (cl->host_server && ((host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP)) + sendto(host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr, cl->client_addr_len); else { @@ -777,7 +754,7 @@ _ecore_con_client_ecore_con_send(Eo *obj EINA_UNUSED, Ecore_Con_Client_Data *cl, cl->buf = eina_binbuf_new(); EINA_SAFETY_ON_NULL_RETURN_VAL(cl->buf, 0); #ifdef TCP_CORK - if ((cl->fd >= 0) && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK)) + if ((cl->fd >= 0) && ((host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK)) { int state = 1; if (setsockopt(cl->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0) @@ -926,13 +903,14 @@ ecore_con_client_flush(Ecore_Con *obj) } EAPI int -ecore_con_server_fd_get(Ecore_Con_Server *svr) +ecore_con_server_fd_get(const Ecore_Con *obj) +{ + return eo_do((Ecore_Con *)obj, ecore_con_obj_fd_get()); +} + +EOLIAN static int +_ecore_con_server_ecore_con_fd_get(Eo *obj EINA_UNUSED, Ecore_Con_Server_Data *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; if (svr->delete_me) return -1; return ecore_main_fd_handler_fd_get(svr->fd_handler); @@ -955,8 +933,9 @@ ecore_con_client_fd_get(const Ecore_Con *obj) */ void -ecore_con_event_proxy_bind(Ecore_Con_Server *svr) +ecore_con_event_proxy_bind(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Proxy_Bind *e; int ev = ECORE_CON_EVENT_PROXY_BIND; @@ -964,8 +943,8 @@ ecore_con_event_proxy_bind(Ecore_Con_Server *svr) EINA_SAFETY_ON_NULL_RETURN(e); svr->event_count = eina_list_append(svr->event_count, e); - _ecore_con_server_timer_update(svr); - e->server = svr; + _ecore_con_server_timer_update(obj); + e->server = obj; e->ip = svr->proxyip; e->port = svr->proxyport; ecore_event_add(ev, e, @@ -974,8 +953,9 @@ ecore_con_event_proxy_bind(Ecore_Con_Server *svr) } void -ecore_con_event_server_add(Ecore_Con_Server *svr) +ecore_con_event_server_add(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); /* we got our server! */ Ecore_Con_Event_Server_Add *e; int ev = ECORE_CON_EVENT_SERVER_ADD; @@ -986,8 +966,8 @@ ecore_con_event_server_add(Ecore_Con_Server *svr) svr->connecting = EINA_FALSE; svr->start_time = ecore_time_get(); svr->event_count = eina_list_append(svr->event_count, e); - _ecore_con_server_timer_update(svr); - e->server = svr; + _ecore_con_server_timer_update(obj); + e->server = obj; if (svr->upgrade) ev = ECORE_CON_EVENT_SERVER_UPGRADE; ecore_event_add(ev, e, _ecore_con_event_server_add_free, NULL); @@ -995,8 +975,9 @@ ecore_con_event_server_add(Ecore_Con_Server *svr) } void -ecore_con_event_server_del(Ecore_Con_Server *svr) +ecore_con_event_server_del(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Server_Del *e; svr->delete_me = EINA_TRUE; @@ -1005,8 +986,8 @@ ecore_con_event_server_del(Ecore_Con_Server *svr) EINA_SAFETY_ON_NULL_RETURN(e); svr->event_count = eina_list_append(svr->event_count, e); - _ecore_con_server_timer_update(svr); - e->server = svr; + _ecore_con_server_timer_update(obj); + e->server = obj; if (svr->ecs) { svr->ecs_state = svr->ecs->lookup ? ECORE_CON_PROXY_STATE_RESOLVED : ECORE_CON_PROXY_STATE_DONE; @@ -1019,8 +1000,9 @@ ecore_con_event_server_del(Ecore_Con_Server *svr) } void -ecore_con_event_server_write(Ecore_Con_Server *svr, int num) +ecore_con_event_server_write(Ecore_Con_Server *obj, int num) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Server_Write *e; e = ecore_con_event_server_write_alloc(); @@ -1028,7 +1010,7 @@ ecore_con_event_server_write(Ecore_Con_Server *svr, int num) INF("Wrote %d bytes", num); svr->event_count = eina_list_append(svr->event_count, e); - e->server = svr; + e->server = obj; e->size = num; ecore_event_add(ECORE_CON_EVENT_SERVER_WRITE, e, (Ecore_End_Cb)_ecore_con_event_server_write_free, NULL); @@ -1036,16 +1018,17 @@ ecore_con_event_server_write(Ecore_Con_Server *svr, int num) } void -ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate) +ecore_con_event_server_data(Ecore_Con_Server *obj, unsigned char *buf, int num, Eina_Bool duplicate) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Server_Data *e; e = ecore_con_event_server_data_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); svr->event_count = eina_list_append(svr->event_count, e); - _ecore_con_server_timer_update(svr); - e->server = svr; + _ecore_con_server_timer_update(obj); + e->server = obj; if (duplicate) { e->data = malloc(num); @@ -1075,8 +1058,10 @@ ecore_con_event_client_add(Ecore_Con_Client *obj) e = ecore_con_event_client_add_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + cl->event_count = eina_list_append(cl->event_count, e); - cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e); + host_server->event_count = eina_list_append(host_server->event_count, e); _ecore_con_cl_timer_update(obj); cl->start_time = ecore_time_get(); e->client = obj; @@ -1100,7 +1085,9 @@ ecore_con_event_client_del(Ecore_Con_Client *obj) EINA_SAFETY_ON_NULL_RETURN(e); cl->event_count = eina_list_append(cl->event_count, e); - cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + + host_server->event_count = eina_list_append(host_server->event_count, e); _ecore_con_cl_timer_update(obj); e->client = obj; ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, @@ -1117,8 +1104,10 @@ ecore_con_event_client_write(Ecore_Con_Client *obj, int num) e = ecore_con_event_client_write_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + cl->event_count = eina_list_append(cl->event_count, e); - cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e); + host_server->event_count = eina_list_append(host_server->event_count, e); e->client = obj; e->size = num; ecore_event_add(ECORE_CON_EVENT_CLIENT_WRITE, e, @@ -1135,8 +1124,10 @@ ecore_con_event_client_data(Ecore_Con_Client *obj, unsigned char *buf, int num, e = ecore_con_event_client_data_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + cl->event_count = eina_list_append(cl->event_count, e); - cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e); + host_server->event_count = eina_list_append(host_server->event_count, e); _ecore_con_cl_timer_update(obj); e->client = obj; if ((duplicate) && (num > 0)) @@ -1165,20 +1156,22 @@ ecore_con_event_client_data(Ecore_Con_Client *obj, unsigned char *buf, int num, } void -ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info) +ecore_con_server_infos_del(Ecore_Con_Server *obj, void *info) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); svr->infos = eina_list_remove(svr->infos, info); } void -_ecore_con_event_server_error(Ecore_Con_Server *svr, char *error, Eina_Bool duplicate) +_ecore_con_event_server_error(Ecore_Con_Server *obj, char *error, Eina_Bool duplicate) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Server_Error *e; e = ecore_con_event_server_error_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); - e->server = svr; + e->server = obj; e->error = duplicate ? strdup(error) : error; DBG("%s", error); svr->event_count = eina_list_append(svr->event_count, e); @@ -1195,18 +1188,26 @@ ecore_con_event_client_error(Ecore_Con_Client *obj, const char *error) e = ecore_con_event_client_error_alloc(); EINA_SAFETY_ON_NULL_RETURN(e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + e->client = obj; e->error = strdup(error); DBG("%s", error); cl->event_count = eina_list_append(cl->event_count, e); - cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e); + host_server->event_count = eina_list_append(host_server->event_count, e); ecore_event_add(ECORE_CON_EVENT_CLIENT_ERROR, e, (Ecore_End_Cb)_ecore_con_event_client_error_free, cl->host_server); eo_do(obj, eo_event_callback_call(ECORE_CON_EVENT_CONNECTION_ERROR, e->error)); _ecore_con_event_count++; } static void -_ecore_con_server_free(Ecore_Con_Server *svr) +_ecore_con_server_free(Ecore_Con_Server *obj) +{ + eo_del(obj); +} + +EOLIAN static void +_ecore_con_server_eo_base_destructor(Eo *obj, Ecore_Con_Server_Data *svr) { Ecore_Con_Client *cl_obj; double t_start, t; @@ -1222,7 +1223,7 @@ _ecore_con_server_free(Ecore_Con_Server *svr) t_start = ecore_time_get(); while (svr->buf && (!svr->delete_me)) { - _ecore_con_server_flush(svr); + _ecore_con_server_flush(obj); t = ecore_time_get(); if ((t - t_start) > 0.5) { @@ -1238,7 +1239,6 @@ _ecore_con_server_free(Ecore_Con_Server *svr) ecore_con_local_win32_server_del(svr); #endif if (svr->event_count) return; - ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE); if (svr->buf) eina_binbuf_free(svr->buf); @@ -1258,7 +1258,7 @@ _ecore_con_server_free(Ecore_Con_Server *svr) if ((svr->created) && (svr->path) && (svr->ppid == getpid())) unlink(svr->path); - ecore_con_ssl_server_shutdown(svr); + ecore_con_ssl_server_shutdown(obj); free(svr->name); free(svr->path); @@ -1278,9 +1278,10 @@ _ecore_con_server_free(Ecore_Con_Server *svr) if (svr->until_deletion) ecore_timer_del(svr->until_deletion); - servers = eina_list_remove(servers, svr); + servers = eina_list_remove(servers, obj); svr->data = NULL; - free(svr); + + eo_do_super(obj, ECORE_CON_SERVER_CLASS, eo_destructor()); } static void @@ -1310,8 +1311,10 @@ _ecore_con_client_eo_base_destructor(Eo *obj, Ecore_Con_Client_Data *cl) break; } } - cl->host_server->clients = eina_list_remove(cl->host_server->clients, obj); - --cl->host_server->client_count; + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + + host_server->clients = eina_list_remove(host_server->clients, obj); + --host_server->client_count; #ifdef _WIN32 ecore_con_local_win32_client_del(cl); @@ -1321,7 +1324,7 @@ _ecore_con_client_eo_base_destructor(Eo *obj, Ecore_Con_Client_Data *cl) if (cl->buf) eina_binbuf_free(cl->buf); - if (cl->host_server->type & ECORE_CON_SSL) + if (host_server->type & ECORE_CON_SSL) ecore_con_ssl_client_shutdown(obj); if (cl->fd_handler) @@ -1343,17 +1346,19 @@ _ecore_con_client_eo_base_destructor(Eo *obj, Ecore_Con_Client_Data *cl) } static Eina_Bool -_ecore_con_server_timer(Ecore_Con_Server *svr) +_ecore_con_server_timer(Ecore_Con_Server *obj) { - ecore_con_server_del(svr); + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + ecore_con_server_del(obj); svr->until_deletion = NULL; return ECORE_CALLBACK_CANCEL; } static void -_ecore_con_server_timer_update(Ecore_Con_Server *svr) +_ecore_con_server_timer_update(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (svr->disconnect_time) { if (svr->disconnect_time > 0) @@ -1364,7 +1369,7 @@ _ecore_con_server_timer_update(Ecore_Con_Server *svr) ecore_timer_reset(svr->until_deletion); } else - svr->until_deletion = ecore_timer_add(svr->disconnect_time, (Ecore_Task_Cb)_ecore_con_server_timer, svr); + svr->until_deletion = ecore_timer_add(svr->disconnect_time, (Ecore_Task_Cb)_ecore_con_server_timer, obj); } else if (svr->until_deletion) { @@ -1416,15 +1421,17 @@ _ecore_con_cl_timer_update(Ecore_Con_Client *obj) } else { - if (cl->host_server->client_disconnect_time > 0) + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + + if (host_server->client_disconnect_time > 0) { if (cl->until_deletion) { - ecore_timer_interval_set(cl->until_deletion, cl->host_server->client_disconnect_time); + ecore_timer_interval_set(cl->until_deletion, host_server->client_disconnect_time); ecore_timer_reset(cl->until_deletion); } else - cl->until_deletion = ecore_timer_add(cl->host_server->client_disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl); + cl->until_deletion = ecore_timer_add(host_server->client_disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl); } else if (cl->until_deletion) { @@ -1438,12 +1445,11 @@ static void _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *net_info) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); struct linger lin; const char *memerr = NULL; - svr = data; - errno = 0; if (!net_info) /* error message has already been handled */ { @@ -1522,7 +1528,7 @@ _ecore_con_cb_tcp_listen(void *data, fd_ready: #endif svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_svr_tcp_handler, svr, NULL, NULL); + _ecore_con_svr_tcp_handler, obj, NULL, NULL); if (!svr->fd_handler) { memerr = "Memory allocation failure"; @@ -1532,16 +1538,17 @@ fd_ready: return; error: - if (errno || memerr) ecore_con_event_server_error(svr, memerr ? : strerror(errno)); - ecore_con_ssl_server_shutdown(svr); - _ecore_con_server_kill(svr); + if (errno || memerr) ecore_con_event_server_error(obj, memerr ? : strerror(errno)); + ecore_con_ssl_server_shutdown(obj); + _ecore_con_server_kill(obj); } static void _ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *net_info) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Type type; struct ip_mreq mreq; #ifdef HAVE_IPV6 @@ -1550,7 +1557,6 @@ _ecore_con_cb_udp_listen(void *data, const int on = 1; const char *memerr = NULL; - svr = data; type = svr->type; type &= ECORE_CON_TYPE; @@ -1625,7 +1631,7 @@ fd_ready: #endif svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_svr_udp_handler, svr, NULL, NULL); + _ecore_con_svr_udp_handler, obj, NULL, NULL); if (!svr->fd_handler) { memerr = "Memory allocation failure"; @@ -1637,22 +1643,21 @@ fd_ready: return; error: - if (errno || memerr) ecore_con_event_server_error(svr, memerr ? : strerror(errno)); - ecore_con_ssl_server_shutdown(svr); - _ecore_con_server_kill(svr); + if (errno || memerr) ecore_con_event_server_error(obj, memerr ? : strerror(errno)); + ecore_con_ssl_server_shutdown(obj); + _ecore_con_server_kill(obj); } static void _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int res; int curstate = 0; const char *memerr = NULL; - svr = data; - errno = 0; if (!net_info) /* error message has already been handled */ { @@ -1702,18 +1707,18 @@ _ecore_con_cb_tcp_connect(void *data, svr->connecting = EINA_TRUE; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, - _ecore_con_cl_handler, svr, NULL, NULL); + _ecore_con_cl_handler, obj, NULL, NULL); } else svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_cl_handler, svr, NULL, NULL); + _ecore_con_cl_handler, obj, NULL, NULL); if (svr->type & ECORE_CON_SSL) { svr->handshaking = EINA_TRUE; svr->ssl_state = ECORE_CON_SSL_STATE_INIT; DBG("%s ssl handshake", svr->ecs_state ? "Queuing" : "Beginning"); - if ((!svr->ecs_state) && ecore_con_ssl_server_init(svr)) + if ((!svr->ecs_state) && ecore_con_ssl_server_init(obj)) goto error; } @@ -1729,21 +1734,21 @@ _ecore_con_cb_tcp_connect(void *data, return; error: - ecore_con_event_server_error(svr, + ecore_con_event_server_error(obj, memerr ? : errno ? strerror(errno) : "DNS error"); - ecore_con_ssl_server_shutdown(svr); - _ecore_con_server_kill(svr); + ecore_con_ssl_server_shutdown(obj); + _ecore_con_server_kill(obj); } static void _ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *net_info) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; int curstate = 0; int broadcast = 1; const char *memerr = NULL; - svr = data; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); errno = 0; if (!net_info) /* error message has already been handled */ @@ -1774,7 +1779,7 @@ _ecore_con_cb_udp_connect(void *data, goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, - _ecore_con_cl_udp_handler, svr, NULL, NULL); + _ecore_con_cl_udp_handler, obj, NULL, NULL); if (!svr->fd_handler) { @@ -1788,14 +1793,15 @@ _ecore_con_cb_udp_connect(void *data, return; error: - if (errno || memerr) ecore_con_event_server_error(svr, memerr ? : strerror(errno)); - ecore_con_ssl_server_shutdown(svr); - _ecore_con_server_kill(svr); + if (errno || memerr) ecore_con_event_server_error(obj, memerr ? : strerror(errno)); + ecore_con_ssl_server_shutdown(obj); + _ecore_con_server_kill(obj); } static Ecore_Con_State -svr_try_connect_plain(Ecore_Con_Server *svr) +svr_try_connect_plain(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int res; int so_err = 0; socklen_t size = sizeof(int); @@ -1820,9 +1826,9 @@ svr_try_connect_plain(Ecore_Con_Server *svr) if (so_err) { /* we lost our server! */ - ecore_con_event_server_error(svr, strerror(so_err)); + ecore_con_event_server_error(obj, strerror(so_err)); ERR("Connection lost: %s", strerror(so_err)); - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); return ECORE_CON_DISCONNECTED; } @@ -1830,11 +1836,11 @@ svr_try_connect_plain(Ecore_Con_Server *svr) { if (svr->ecs) { - if (ecore_con_socks_svr_init(svr)) + if (ecore_con_socks_svr_init(obj)) return ECORE_CON_INPROGRESS; } else - ecore_con_event_server_add(svr); + ecore_con_event_server_add(obj); } if (svr->fd_handler) @@ -1895,13 +1901,13 @@ static Eina_Bool _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler EINA_UNUSED) { - Ecore_Con_Server *svr; + Ecore_Con_Server *svr_obj = data; Ecore_Con_Client *obj = NULL; unsigned char client_addr[256]; unsigned int client_addr_len; const char *clerr = NULL; + Ecore_Con_Server_Data *svr = eo_data_scope_get(svr_obj, ECORE_CON_SERVER_CLASS); - svr = data; if (svr->delete_me) return ECORE_CALLBACK_RENEW; @@ -1915,10 +1921,10 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Con_Client_Data *cl = eo_data_scope_get(obj, ECORE_CON_CLIENT_CLASS); if (!cl) { - ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client"); + ecore_con_event_server_error(svr_obj, "Memory allocation failure when attempting to add a new client"); return ECORE_CALLBACK_RENEW; } - cl->host_server = svr; + cl->host_server = svr_obj; client_addr_len = sizeof(client_addr); memset(&client_addr, 0, client_addr_len); @@ -1975,13 +1981,14 @@ error: } } free(cl); - if (clerr || errno) ecore_con_event_server_error(svr, clerr ? : strerror(errno)); + if (clerr || errno) ecore_con_event_server_error(svr_obj, clerr ? : strerror(errno)); return ECORE_CALLBACK_RENEW; } static void -_ecore_con_cl_read(Ecore_Con_Server *svr) +_ecore_con_cl_read(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int num = 0; Eina_Bool lost_server = EINA_TRUE; unsigned char buf[READBUFSIZ]; @@ -1989,15 +1996,15 @@ _ecore_con_cl_read(Ecore_Con_Server *svr) DBG("svr=%p", svr); /* only possible with non-ssl connections */ - if (svr->connecting && (svr_try_connect_plain(svr) != ECORE_CON_CONNECTED)) + if (svr->connecting && (svr_try_connect_plain(obj) != ECORE_CON_CONNECTED)) return; if (svr->handshaking && (!svr->ecs_state)) { DBG("Continuing ssl handshake"); - if (!ecore_con_ssl_server_init(svr)) + if (!ecore_con_ssl_server_init(obj)) lost_server = EINA_FALSE; - _ecore_con_server_timer_update(svr); + _ecore_con_server_timer_update(obj); } if (svr->ecs_state || !(svr->type & ECORE_CON_SSL)) @@ -2008,11 +2015,11 @@ _ecore_con_cl_read(Ecore_Con_Server *svr) if ((num > 0) || ((num < 0) && (errno == EAGAIN))) lost_server = EINA_FALSE; else if (num < 0) - ecore_con_event_server_error(svr, strerror(errno)); + ecore_con_event_server_error(obj, strerror(errno)); } else { - num = ecore_con_ssl_server_read(svr, buf, sizeof(buf)); + num = ecore_con_ssl_server_read(obj, buf, sizeof(buf)); /* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */ if (num >= 0) lost_server = EINA_FALSE; @@ -2021,23 +2028,23 @@ _ecore_con_cl_read(Ecore_Con_Server *svr) if ((!svr->delete_me) && (num > 0)) { if (svr->ecs_state) - ecore_con_socks_read(svr, buf, num); + ecore_con_socks_read(obj, buf, num); else - ecore_con_event_server_data(svr, buf, num, EINA_TRUE); + ecore_con_event_server_data(obj, buf, num, EINA_TRUE); } if (lost_server) - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); } static Eina_Bool _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; Eina_Bool want_read, want_write; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); - svr = data; if (svr->delete_me) return ECORE_CALLBACK_RENEW; @@ -2059,13 +2066,13 @@ _ecore_con_cl_handler(void *data, DBG("%zu bytes in buffer", len); } #endif - if (ecore_con_ssl_server_init(svr)) + if (ecore_con_ssl_server_init(obj)) { ERR("ssl handshaking failed!"); svr->handshaking = EINA_FALSE; } else if (!svr->ssl_state) - ecore_con_event_server_add(svr); + ecore_con_event_server_add(obj); return ECORE_CALLBACK_RENEW; } if (svr->ecs && svr->ecs_state && (svr->ecs_state < ECORE_CON_PROXY_STATE_READ) && (!svr->ecs_buf)) @@ -2075,16 +2082,16 @@ _ecore_con_cl_handler(void *data, INF("PROXY STATE++"); svr->ecs_state++; } - if (ecore_con_socks_svr_init(svr)) return ECORE_CALLBACK_RENEW; + if (ecore_con_socks_svr_init(obj)) return ECORE_CALLBACK_RENEW; } if (want_read) - _ecore_con_cl_read(svr); + _ecore_con_cl_read(obj); else if (want_write) /* only possible with non-ssl connections */ { - if (svr->connecting && (!svr_try_connect_plain(svr)) && (!svr->ecs_state)) + if (svr->connecting && (!svr_try_connect_plain(obj)) && (!svr->ecs_state)) return ECORE_CALLBACK_RENEW; - _ecore_con_server_flush(svr); + _ecore_con_server_flush(obj); } return ECORE_CALLBACK_RENEW; @@ -2096,31 +2103,31 @@ _ecore_con_cl_udp_handler(void *data, { unsigned char buf[READBUFSIZ]; int num; - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; Eina_Bool want_read, want_write; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); 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); - svr = data; if (svr->delete_me || ((!want_read) && (!want_write))) return ECORE_CALLBACK_RENEW; if (want_write) { - _ecore_con_server_flush(svr); + _ecore_con_server_flush(obj); return ECORE_CALLBACK_RENEW; } num = read(svr->fd, buf, READBUFSIZ); if ((!svr->delete_me) && (num > 0)) - ecore_con_event_server_data(svr, buf, num, EINA_TRUE); + ecore_con_event_server_data(obj, buf, num, EINA_TRUE); if (num < 0 && (errno != EAGAIN) && (errno != EINTR)) { - ecore_con_event_server_error(svr, strerror(errno)); - _ecore_con_server_kill(svr); + ecore_con_event_server_error(obj, strerror(errno)); + _ecore_con_server_kill(obj); } return ECORE_CALLBACK_RENEW; @@ -2134,11 +2141,10 @@ _ecore_con_svr_udp_handler(void *data, unsigned char client_addr[256]; socklen_t client_addr_len = sizeof(client_addr); int num; - Ecore_Con_Server *svr; + Ecore_Con_Server *svr_obj = data; Ecore_Con_Client *obj = NULL; - svr = data; - + Ecore_Con_Server_Data *svr = eo_data_scope_get(svr_obj, ECORE_CON_SERVER_CLASS); if (svr->delete_me) return ECORE_CALLBACK_RENEW; @@ -2163,10 +2169,10 @@ _ecore_con_svr_udp_handler(void *data, if (num < 0 && (errno != EAGAIN) && (errno != EINTR)) { - ecore_con_event_server_error(svr, strerror(errno)); + ecore_con_event_server_error(svr_obj, strerror(errno)); if (!svr->delete_me) ecore_con_event_client_del(NULL); - _ecore_con_server_kill(svr); + _ecore_con_server_kill(svr_obj); return ECORE_CALLBACK_CANCEL; } @@ -2175,7 +2181,7 @@ _ecore_con_svr_udp_handler(void *data, Ecore_Con_Client_Data *cl = eo_data_scope_get(obj, ECORE_CON_CLIENT_CLASS); EINA_SAFETY_ON_NULL_RETURN_VAL(cl, ECORE_CALLBACK_RENEW); - cl->host_server = svr; + cl->host_server = svr_obj; cl->client_addr = malloc(client_addr_len); if (!cl->client_addr) { @@ -2215,7 +2221,8 @@ _ecore_con_svr_cl_read(Ecore_Con_Client *obj) _ecore_con_cl_timer_update(obj); } - if (!(cl->host_server->type & ECORE_CON_SSL) && (!cl->upgrade)) + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if (!(host_server->type & ECORE_CON_SSL) && (!cl->upgrade)) { num = read(cl->fd, buf, sizeof(buf)); /* 0 is not a valid return value for a tcp socket */ @@ -2269,8 +2276,9 @@ _ecore_con_svr_cl_handler(void *data, } static void -_ecore_con_server_flush(Ecore_Con_Server *svr) +_ecore_con_server_flush(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int count; size_t num; size_t buf_len; @@ -2317,28 +2325,28 @@ _ecore_con_server_flush(Ecore_Con_Server *svr) if ((!svr->ecs_state) && svr->handshaking) { DBG("Continuing ssl handshake"); - if (ecore_con_ssl_server_init(svr)) - _ecore_con_server_kill(svr); - _ecore_con_server_timer_update(svr); + if (ecore_con_ssl_server_init(obj)) + _ecore_con_server_kill(obj); + _ecore_con_server_timer_update(obj); return; } if (svr->ecs_state || (!(svr->type & ECORE_CON_SSL))) count = write(svr->fd, buf + *buf_offset, num); else - count = ecore_con_ssl_server_write(svr, buf + *buf_offset, num); + count = ecore_con_ssl_server_write(obj, buf + *buf_offset, num); if (count < 0) { if ((errno != EAGAIN) && (errno != EINTR)) { - ecore_con_event_server_error(svr, strerror(errno)); - _ecore_con_server_kill(svr); + ecore_con_event_server_error(obj, strerror(errno)); + _ecore_con_server_kill(obj); } return; } - if (count && (!svr->ecs_state)) ecore_con_event_server_write(svr, count); + if (count && (!svr->ecs_state)) ecore_con_event_server_write(obj, count); if (!eina_binbuf_remove(buf_p, 0, count)) *buf_offset += count; @@ -2410,7 +2418,8 @@ _ecore_con_client_flush(Ecore_Con_Client *obj) if (!cl->buf) return; num = eina_binbuf_length_get(cl->buf) - cl->buf_offset; if (num <= 0) return; - if (!(cl->host_server->type & ECORE_CON_SSL) && (!cl->upgrade)) + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if (!(host_server->type & ECORE_CON_SSL) && (!cl->upgrade)) count = write(cl->fd, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num); else count = ecore_con_ssl_client_write(obj, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num); @@ -2435,7 +2444,8 @@ _ecore_con_client_flush(Ecore_Con_Client *obj) eina_binbuf_free(cl->buf); cl->buf = NULL; #ifdef TCP_CORK - if ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK) + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if ((host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK) { int state = 0; if (setsockopt(cl->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0) @@ -2451,9 +2461,10 @@ _ecore_con_client_flush(Ecore_Con_Client *obj) } static void -_ecore_con_event_client_add_free(Ecore_Con_Server *svr, +_ecore_con_event_client_add_free(Ecore_Con_Server *obj, void *ev) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Client_Add *e; e = ev; @@ -2465,10 +2476,11 @@ _ecore_con_event_client_add_free(Ecore_Con_Server *svr, cl->event_count = eina_list_remove(cl->event_count, e); if (cl->host_server) { - cl->host_server->event_count = eina_list_remove(cl->host_server->event_count, ev); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + host_server->event_count = eina_list_remove(host_server->event_count, ev); if ((!svr->event_count) && (svr->delete_me)) { - _ecore_con_server_free(svr); + _ecore_con_server_free(obj); svrfreed = EINA_TRUE; } } @@ -2486,9 +2498,10 @@ _ecore_con_event_client_add_free(Ecore_Con_Server *svr, } static void -_ecore_con_event_client_del_free(Ecore_Con_Server *svr, +_ecore_con_event_client_del_free(Ecore_Con_Server *obj, void *ev) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Client_Del *e; e = ev; @@ -2500,10 +2513,11 @@ _ecore_con_event_client_del_free(Ecore_Con_Server *svr, cl->event_count = eina_list_remove(cl->event_count, e); if (cl->host_server) { - cl->host_server->event_count = eina_list_remove(cl->host_server->event_count, ev); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + host_server->event_count = eina_list_remove(host_server->event_count, ev); if ((!svr->event_count) && (svr->delete_me)) { - _ecore_con_server_free(svr); + _ecore_con_server_free(obj); svrfreed = EINA_TRUE; } } @@ -2520,9 +2534,10 @@ _ecore_con_event_client_del_free(Ecore_Con_Server *svr, } static void -_ecore_con_event_client_write_free(Ecore_Con_Server *svr, +_ecore_con_event_client_write_free(Ecore_Con_Server *obj, Ecore_Con_Event_Client_Write *e) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (e->client) { Ecore_Con_Client_Data *cl = eo_data_scope_get(e->client, ECORE_CON_CLIENT_CLASS); @@ -2531,19 +2546,21 @@ _ecore_con_event_client_write_free(Ecore_Con_Server *svr, cl->event_count = eina_list_remove(cl->event_count, e); if (cl->host_server) { - cl->host_server->event_count = eina_list_remove(cl->host_server->event_count, e); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + host_server->event_count = eina_list_remove(host_server->event_count, e); if ((!svr->event_count) && (svr->delete_me)) { - _ecore_con_server_free(svr); + _ecore_con_server_free(obj); svrfreed = EINA_TRUE; } } if (!svrfreed) { + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); if (((!cl->event_count) && (cl->delete_me)) || ((cl->host_server && - ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP || - (cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST)))) + ((host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP || + (host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST)))) ecore_con_client_del(e->client); } } @@ -2554,9 +2571,10 @@ _ecore_con_event_client_write_free(Ecore_Con_Server *svr, } static void -_ecore_con_event_client_data_free(Ecore_Con_Server *svr, +_ecore_con_event_client_data_free(Ecore_Con_Server *obj, void *ev) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_Event_Client_Data *e; e = ev; @@ -2568,19 +2586,21 @@ _ecore_con_event_client_data_free(Ecore_Con_Server *svr, cl->event_count = eina_list_remove(cl->event_count, e); if (cl->host_server) { - cl->host_server->event_count = eina_list_remove(cl->host_server->event_count, ev); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + host_server->event_count = eina_list_remove(host_server->event_count, ev); } if ((!svr->event_count) && (svr->delete_me)) { - _ecore_con_server_free(svr); + _ecore_con_server_free(obj); svrfreed = EINA_TRUE; } if (!svrfreed) { + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); if (((!cl->event_count) && (cl->delete_me)) || ((cl->host_server && - ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP || - (cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST)))) + ((host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP || + (host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST)))) ecore_con_client_del(e->client); } } @@ -2600,8 +2620,9 @@ _ecore_con_event_server_add_free(void *data EINA_UNUSED, e = ev; 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_Data *svr = eo_data_scope_get(e->server, ECORE_CON_SERVER_CLASS); + svr->event_count = eina_list_remove(svr->event_count, ev); + if ((!svr->event_count) && (svr->delete_me)) _ecore_con_server_free(e->server); } ecore_con_event_server_add_free(e); @@ -2619,8 +2640,9 @@ _ecore_con_event_server_del_free(void *data EINA_UNUSED, e = ev; if (e->server) { - e->server->event_count = eina_list_remove(e->server->event_count, ev); - if (!e->server->event_count) + Ecore_Con_Server_Data *svr = eo_data_scope_get(e->server, ECORE_CON_SERVER_CLASS); + svr->event_count = eina_list_remove(svr->event_count, ev); + if (!svr->event_count) _ecore_con_server_free(e->server); } ecore_con_event_server_del_free(e); @@ -2635,8 +2657,9 @@ _ecore_con_event_server_write_free(void *data EINA_UNUSED, { 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_Data *svr = eo_data_scope_get(e->server, ECORE_CON_SERVER_CLASS); + svr->event_count = eina_list_remove(svr->event_count, e); + if ((!svr->event_count) && (svr->delete_me)) _ecore_con_server_free(e->server); } @@ -2655,8 +2678,9 @@ _ecore_con_event_server_data_free(void *data EINA_UNUSED, e = ev; 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_Data *svr = eo_data_scope_get(e->server, ECORE_CON_SERVER_CLASS); + svr->event_count = eina_list_remove(svr->event_count, ev); + if ((!svr->event_count) && (svr->delete_me)) _ecore_con_server_free(e->server); } @@ -2672,8 +2696,9 @@ _ecore_con_event_server_error_free(void *data EINA_UNUSED, Ecore_Con_Event_Serve { 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_Data *svr = eo_data_scope_get(e->server, ECORE_CON_SERVER_CLASS); + svr->event_count = eina_list_remove(svr->event_count, e); + if ((!svr->event_count) && (svr->delete_me)) _ecore_con_server_free(e->server); } free(e->error); @@ -2684,8 +2709,9 @@ _ecore_con_event_server_error_free(void *data EINA_UNUSED, Ecore_Con_Event_Serve } static void -_ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client_Error *e) +_ecore_con_event_client_error_free(Ecore_Con_Server *obj, Ecore_Con_Event_Client_Error *e) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (e->client) { Ecore_Con_Client_Data *cl = eo_data_scope_get(e->client, ECORE_CON_CLIENT_CLASS); @@ -2704,7 +2730,7 @@ _ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client if (!svrfreed) { if ((!svr->event_count) && (svr->delete_me)) - _ecore_con_server_free(svr); + _ecore_con_server_free(obj); } } free(e->error); @@ -2718,10 +2744,10 @@ static void _ecore_con_lookup_done(void *data, Ecore_Con_Info *infos) { - Ecore_Con_Server *svr; + Ecore_Con_Server *obj = data; Ecore_Con_Lookup *lk; - svr = data; + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); lk = svr->data; if (infos) @@ -2738,3 +2764,4 @@ _ecore_con_lookup_done(void *data, #include "ecore_con.eo.c" #include "ecore_con_client.eo.c" +#include "ecore_con_server.eo.c" diff --git a/src/lib/ecore_con/ecore_con_client.eo b/src/lib/ecore_con/ecore_con_client.eo index c360a2252a..8a5b1940b1 100644 --- a/src/lib/ecore_con/ecore_con_client.eo +++ b/src/lib/ecore_con/ecore_con_client.eo @@ -2,7 +2,7 @@ class Ecore.Con.Client (Ecore.Con) { eo_prefix: ecore_con_client_obj; properties { server { - /** + /*@ * Controls the server representing the socket the client has * connected to. * @@ -10,8 +10,7 @@ class Ecore.Con.Client (Ecore.Con) { get { } values { - /* FIXME: Should be Ecore.Con.Server. */ - Ecore_Con_Server *svr; /*@ The server the client is connected to. */ + Ecore.Con.Server *svr; /*@ The server the client is connected to. */ } } } diff --git a/src/lib/ecore_con/ecore_con_dns.c b/src/lib/ecore_con/ecore_con_dns.c index 986c3a49ac..0d19cc00b5 100644 --- a/src/lib/ecore_con/ecore_con_dns.c +++ b/src/lib/ecore_con/ecore_con_dns.c @@ -57,7 +57,10 @@ _ecore_con_dns_free(Ecore_Con_DNS *dns) static void _ecore_con_dns_del(Ecore_Con_DNS *dns) { - if (dns->svr && dns->svr->infos) dns->svr->infos = eina_list_remove(dns->svr->infos, dns); + Ecore_Con_Server_Data *svr = NULL; + if (dns->svr) + svr = eo_data_scope_get(dns->svr, ECORE_CON_CLIENT_CLASS); + if (svr->infos) svr->infos = eina_list_remove(svr->infos, dns); _ecore_con_dns_free(dns); } @@ -284,18 +287,22 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr, } EAPI int -ecore_con_info_get(Ecore_Con_Server *svr, +ecore_con_info_get(Ecore_Con_Server *obj, Ecore_Con_Info_Cb done_cb, void *data, struct addrinfo *hints) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); Ecore_Con_DNS *dns; int error = 0; + if (!svr) + return 0; + dns = calloc(1, sizeof(Ecore_Con_DNS)); if (!dns) return 0; - dns->svr = svr; + dns->svr = obj; dns->done_cb = done_cb; dns->data = data; @@ -308,7 +315,7 @@ ecore_con_info_get(Ecore_Con_Server *svr, goto reserr; } - error = _dns_addrinfo_get(dns, svr->ecs ? svr->ecs->ip : svr->name, dns->svr->ecs ? dns->svr->ecs->port : dns->svr->port); + error = _dns_addrinfo_get(dns, svr->ecs ? svr->ecs->ip : svr->name, svr->ecs ? svr->ecs->port : svr->port); if (error && (error != EAGAIN)) { ERR("resolver: %s", dns_strerror(error)); diff --git a/src/lib/ecore_con/ecore_con_local.c b/src/lib/ecore_con/ecore_con_local.c index bb54b52e9e..e928f0c339 100644 --- a/src/lib/ecore_con/ecore_con_local.c +++ b/src/lib/ecore_con/ecore_con_local.c @@ -56,13 +56,14 @@ ecore_con_local_shutdown(void) } int -ecore_con_local_connect(Ecore_Con_Server *svr, +ecore_con_local_connect(Ecore_Con_Server *obj, Eina_Bool (*cb_done)(void *data, Ecore_Fd_Handler *fd_handler), void *data EINA_UNUSED) { #ifndef HAVE_LOCAL_SOCKETS return 0; #else + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); char buf[4096]; struct sockaddr_un socket_unix; int curstate = 0; @@ -182,7 +183,7 @@ ecore_con_local_connect(Ecore_Con_Server *svr, return 0; if (svr->type & ECORE_CON_SSL) - ecore_con_ssl_server_init(svr); + ecore_con_ssl_server_init(obj); svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, @@ -190,7 +191,7 @@ ecore_con_local_connect(Ecore_Con_Server *svr, if (!svr->fd_handler) return 0; - if (!svr->delete_me) ecore_con_event_server_add(svr); + if (!svr->delete_me) ecore_con_event_server_add(obj); return 1; #endif @@ -198,7 +199,7 @@ ecore_con_local_connect(Ecore_Con_Server *svr, int ecore_con_local_listen( - Ecore_Con_Server *svr, + Ecore_Con_Server *obj, Eina_Bool (* cb_listen)(void *data, Ecore_Fd_Handler * @@ -207,6 +208,7 @@ ecore_con_local_listen( EINA_UNUSED) { #ifdef HAVE_LOCAL_SOCKETS + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); char buf[4096]; struct sockaddr_un socket_unix; struct linger lin; diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index bd5d35f7fb..53c024a4d0 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -124,9 +124,8 @@ struct _Ecore_Con_Client_Data typedef struct _Ecore_Con_Client_Data Ecore_Con_Client_Data; -struct _Ecore_Con_Server +struct _Ecore_Con_Server_Data { - ECORE_MAGIC; int fd; Ecore_Con_Type type; char *name; @@ -197,6 +196,8 @@ struct _Ecore_Con_Server #endif }; +typedef struct _Ecore_Con_Server_Data Ecore_Con_Server_Data; + struct _Ecore_Con_Url { ECORE_MAGIC; diff --git a/src/lib/ecore_con/ecore_con_server.eo b/src/lib/ecore_con/ecore_con_server.eo new file mode 100644 index 0000000000..c6ebed2262 --- /dev/null +++ b/src/lib/ecore_con/ecore_con_server.eo @@ -0,0 +1,68 @@ +/* FIXME: make abstract. */ +class Ecore.Con.Server (Ecore.Con) { + eo_prefix: ecore_con_server_obj; + properties { + name { + /*@ + * Retrieves the name of server. + * + * The name returned is the name used to connect on this server. + */ + get { + } + values { + const(char) *name; /*@ The name of the server. */ + } + } + client_limit { + /*@ + * Sets a limit on the number of clients that can be handled concurrently + * by the given server, and a policy on what to do if excess clients try to + * connect. + * + * + * Beware that if you set this once ecore is already running, you may + * already have pending CLIENT_ADD events in your event queue. Those + * clients have already connected and will not be affected by this call. + * Only clients subsequently trying to connect will be affected. + */ + set { + } + get { + legacy: null; + } + values { + int client_limit; /*@ The maximum number of clients to handle concurrently. -1 means unlimited (default). 0 effectively disables the server. */ + char reject_excess_clients; /*@ Set to 1 to automatically disconnect excess clients as soon as they connect if you are already handling client_limit clients. Set to 0 (default) to just hold off on the "accept()" system call until the number of active clients drops. This causes the kernel to queue up to 4096 connections (or your kernel's limit, whichever is lower). */ + } + } + /* FIXME: Should this return an iterator? */ + clients { + /*@ + * Retrieves the current list of clients. + * + * + * Each node in the returned list points to an @ref Ecore_Con_Client. This list + * cannot be modified or freed. It can also change if new clients are connected + * or disconnected, and will become invalid when the server is deleted/freed. + */ + get { + } + values { + const(Eina_List ) *clients; /*@ The list of clients on this server. */ + } + } + } + implements { + Eo.Base.destructor; + Ecore.Con.ip.get; + Ecore.Con.uptime.get; + Ecore.Con.port.get; + Ecore.Con.fd.get; + Ecore.Con.connected.get; + Ecore.Con.timeout.set; + Ecore.Con.timeout.get; + Ecore.Con.flush; + Ecore.Con.send; + } +} diff --git a/src/lib/ecore_con/ecore_con_socks.c b/src/lib/ecore_con/ecore_con_socks.c index 5ff74b477e..a3ba58cbaf 100644 --- a/src/lib/ecore_con/ecore_con_socks.c +++ b/src/lib/ecore_con/ecore_con_socks.c @@ -134,8 +134,9 @@ _ecore_con_socks_free(Ecore_Con_Socks *ecs) } static Eina_Bool -_ecore_con_socks_svr_init_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4) +_ecore_con_socks_svr_init_v4(Ecore_Con_Server *obj, Ecore_Con_Socks_v4 *v4) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); size_t addrlen, buflen, ulen = 1; unsigned char *sbuf; @@ -145,8 +146,8 @@ _ecore_con_socks_svr_init_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4) sbuf = malloc(buflen); if (!sbuf) { - ecore_con_event_server_error(svr, "Memory allocation failure!"); - _ecore_con_server_kill(svr); + ecore_con_event_server_error(obj, "Memory allocation failure!"); + _ecore_con_server_kill(obj); return EINA_FALSE; } /* http://en.wikipedia.org/wiki/SOCKS */ @@ -173,8 +174,9 @@ _ecore_con_socks_svr_init_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4) } static Eina_Bool -_ecore_con_socks_svr_init_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5) +_ecore_con_socks_svr_init_v5(Ecore_Con_Server *obj, Ecore_Con_Socks_v5 *v5) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); size_t buflen; unsigned int x; unsigned char *sbuf; @@ -186,8 +188,8 @@ _ecore_con_socks_svr_init_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5) sbuf = malloc(buflen); if (!sbuf) { - ecore_con_event_server_error(svr, "Memory allocation failure!"); - _ecore_con_server_kill(svr); + ecore_con_event_server_error(obj, "Memory allocation failure!"); + _ecore_con_server_kill(obj); return EINA_FALSE; } /* http://en.wikipedia.org/wiki/SOCKS @@ -226,8 +228,9 @@ _ecore_con_socks_svr_init_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5) data = buf static void -_ecore_con_socks_read_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4 EINA_UNUSED, const unsigned char *buf, unsigned int num) +_ecore_con_socks_read_v4(Ecore_Con_Server *obj, Ecore_Con_Socks_v4 *v4 EINA_UNUSED, const unsigned char *buf, unsigned int num) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); const unsigned char *data; DBG("SOCKS: %d bytes", num); ECORE_CON_SOCKS_READ(8); @@ -241,19 +244,19 @@ _ecore_con_socks_read_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4 EINA_UNUS break; case 91: - ecore_con_event_server_error(svr, "proxy request rejected or failed"); + ecore_con_event_server_error(obj, "proxy request rejected or failed"); goto error; case 92: - ecore_con_event_server_error(svr, "proxying SOCKS server could not perform authentication"); + ecore_con_event_server_error(obj, "proxying SOCKS server could not perform authentication"); goto error; case 93: - ecore_con_event_server_error(svr, "proxy request authentication rejected"); + ecore_con_event_server_error(obj, "proxy request authentication rejected"); goto error; default: - ecore_con_event_server_error(svr, "garbage data from proxy"); + ecore_con_event_server_error(obj, "garbage data from proxy"); goto error; } if (svr->ecs->bind) @@ -266,7 +269,7 @@ _ecore_con_socks_read_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4 EINA_UNUS if (!inet_ntop(AF_INET, &data[4], naddr, sizeof(naddr))) goto error; svr->proxyip = eina_stringshare_add(naddr); - ecore_con_event_proxy_bind(svr); + ecore_con_event_proxy_bind(obj); } svr->ecs_state = ECORE_CON_PROXY_STATE_DONE; INF("PROXY CONNECTED"); @@ -275,17 +278,18 @@ _ecore_con_socks_read_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4 EINA_UNUS svr->ecs_buf_offset = svr->ecs_addrlen = 0; memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr)); if (!svr->ssl_state) - ecore_con_event_server_add(svr); + ecore_con_event_server_add(obj); if (svr->ssl_state || (svr->buf && eina_binbuf_length_get(svr->buf))) ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); return; error: - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); } static Eina_Bool -_ecore_con_socks_auth_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5) +_ecore_con_socks_auth_v5(Ecore_Con_Server *obj, Ecore_Con_Socks_v5 *v5) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); size_t size; unsigned char *data; switch (v5->method) @@ -322,8 +326,9 @@ _ecore_con_socks_auth_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5) } static void -_ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const unsigned char *buf, unsigned int num) +_ecore_con_socks_read_v5(Ecore_Con_Server *obj, Ecore_Con_Socks_v5 *v5, const unsigned char *buf, unsigned int num) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); const unsigned char *data; DBG("SOCKS: %d bytes", num); @@ -335,15 +340,15 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un if (data[0] != 5) goto error; if (data[1] == 0xFF) { - ecore_con_event_server_error(svr, "proxy authentication methods rejected"); + ecore_con_event_server_error(obj, "proxy authentication methods rejected"); goto error; } v5->method = data[1]; - if (!_ecore_con_socks_auth_v5(svr, v5)) goto error; + if (!_ecore_con_socks_auth_v5(obj, v5)) goto error; if (svr->ecs_state == ECORE_CON_PROXY_STATE_REQUEST) { /* run again to skip auth reading */ - _ecore_con_socks_read_v5(svr, v5, NULL, 0); + _ecore_con_socks_read_v5(obj, v5, NULL, 0); return; } ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); @@ -365,12 +370,12 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un case ECORE_CON_SOCKS_V5_METHOD_USERPASS: if (data[0] != 1) { - ecore_con_event_server_error(svr, "protocol error"); + ecore_con_event_server_error(obj, "protocol error"); goto error; /* wrong version */ } if (data[1]) { - ecore_con_event_server_error(svr, "proxy request authentication rejected"); + ecore_con_event_server_error(obj, "proxy request authentication rejected"); goto error; } @@ -387,7 +392,7 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un sbuf = malloc(buflen); if (!sbuf) { - ecore_con_event_server_error(svr, "Memory allocation failure!"); + ecore_con_event_server_error(obj, "Memory allocation failure!"); goto error; } sbuf[0] = 5; @@ -448,7 +453,7 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un break; default: - ecore_con_event_server_error(svr, "protocol error"); + ecore_con_event_server_error(obj, "protocol error"); goto error; } /* at this point, we finally know exactly how much we need to read */ @@ -456,7 +461,7 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un if (data[0] != 5) { - ecore_con_event_server_error(svr, "protocol error"); + ecore_con_event_server_error(obj, "protocol error"); goto error; /* wrong version */ } switch (data[1]) @@ -465,47 +470,47 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un break; case 1: - ecore_con_event_server_error(svr, "general proxy failure"); + ecore_con_event_server_error(obj, "general proxy failure"); goto error; case 2: - ecore_con_event_server_error(svr, "connection not allowed by ruleset"); + ecore_con_event_server_error(obj, "connection not allowed by ruleset"); goto error; case 3: - ecore_con_event_server_error(svr, "network unreachable"); + ecore_con_event_server_error(obj, "network unreachable"); goto error; case 4: - ecore_con_event_server_error(svr, "host unreachable"); + ecore_con_event_server_error(obj, "host unreachable"); goto error; case 5: - ecore_con_event_server_error(svr, "connection refused by destination host"); + ecore_con_event_server_error(obj, "connection refused by destination host"); goto error; case 6: - ecore_con_event_server_error(svr, "TTL expired"); + ecore_con_event_server_error(obj, "TTL expired"); goto error; case 7: - ecore_con_event_server_error(svr, "command not supported / protocol error"); + ecore_con_event_server_error(obj, "command not supported / protocol error"); goto error; case 8: - ecore_con_event_server_error(svr, "address type not supported"); + ecore_con_event_server_error(obj, "address type not supported"); default: goto error; } if (data[2]) { - ecore_con_event_server_error(svr, "protocol error"); + ecore_con_event_server_error(obj, "protocol error"); goto error; } memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr)); if (!svr->ssl_state) - ecore_con_event_server_add(svr); + ecore_con_event_server_add(obj); if (svr->ssl_state || (svr->buf && eina_binbuf_length_get(svr->buf))) ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); svr->ecs_buf_offset = svr->ecs_addrlen = 0; @@ -522,7 +527,7 @@ _ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const un return; error: - _ecore_con_server_kill(svr); + _ecore_con_server_kill(obj); } ///////////////////////////////////////////////////////////////////////////////////// @@ -537,20 +542,22 @@ ecore_con_socks_shutdown(void) } void -ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num) +ecore_con_socks_read(Ecore_Con_Server *obj, unsigned char *buf, int num) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); ECORE_CON_SOCKS_VERSION_CHECK(svr->ecs); ECORE_CON_SOCKS_CAST(svr->ecs); if (svr->ecs_state < ECORE_CON_PROXY_STATE_READ) return; - if (v4) _ecore_con_socks_read_v4(svr, v4, buf, (unsigned int)num); - else _ecore_con_socks_read_v5(svr, v5, buf, (unsigned int)num); + if (v4) _ecore_con_socks_read_v4(obj, v4, buf, (unsigned int)num); + else _ecore_con_socks_read_v5(obj, v5, buf, (unsigned int)num); } Eina_Bool -ecore_con_socks_svr_init(Ecore_Con_Server *svr) +ecore_con_socks_svr_init(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); ECORE_CON_SOCKS_VERSION_CHECK_RETURN(svr->ecs, EINA_FALSE); ECORE_CON_SOCKS_CAST(svr->ecs); @@ -558,13 +565,14 @@ ecore_con_socks_svr_init(Ecore_Con_Server *svr) if (svr->ecs_buf) return EINA_FALSE; if (svr->ecs_state != ECORE_CON_PROXY_STATE_INIT) return EINA_FALSE; ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); - if (v4) return _ecore_con_socks_svr_init_v4(svr, v4); - return _ecore_con_socks_svr_init_v5(svr, v5); + if (v4) return _ecore_con_socks_svr_init_v4(obj, v4); + return _ecore_con_socks_svr_init_v5(obj, v5); } void -ecore_con_socks_dns_cb(const char *canonname EINA_UNUSED, const char *ip, struct sockaddr *addr, int addrlen EINA_UNUSED, Ecore_Con_Server *svr) +ecore_con_socks_dns_cb(const char *canonname EINA_UNUSED, const char *ip, struct sockaddr *addr, int addrlen EINA_UNUSED, Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); svr->ip = eina_stringshare_add(ip); svr->ecs_state++; if (addr->sa_family == AF_INET) @@ -579,7 +587,7 @@ ecore_con_socks_dns_cb(const char *canonname EINA_UNUSED, const char *ip, struct svr->ecs_addrlen = 16; } #endif - ecore_con_socks_svr_init(svr); + ecore_con_socks_svr_init(obj); } void diff --git a/src/lib/ecore_con/ecore_con_ssl.c b/src/lib/ecore_con/ecore_con_ssl.c index 7decaf4734..4f7b7b5989 100644 --- a/src/lib/ecore_con/ecore_con_ssl.c +++ b/src/lib/ecore_con/ecore_con_ssl.c @@ -486,19 +486,21 @@ ecore_con_ssl_server_prepare(Ecore_Con_Server *svr, } Ecore_Con_Ssl_Error -ecore_con_ssl_server_init(Ecore_Con_Server *svr) +ecore_con_ssl_server_init(Ecore_Con_Server *obj) { - if (!(svr->type & ECORE_CON_SSL)) + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr || !(svr->type & ECORE_CON_SSL)) return ECORE_CON_SSL_ERROR_NONE; - return SSL_SUFFIX(_ecore_con_ssl_server_init) (svr); + return SSL_SUFFIX(_ecore_con_ssl_server_init) (obj); } Ecore_Con_Ssl_Error -ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr) +ecore_con_ssl_server_shutdown(Ecore_Con_Server *obj) { - if (!(svr->type & ECORE_CON_SSL)) + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr || !(svr->type & ECORE_CON_SSL)) return ECORE_CON_SSL_ERROR_NONE; - return SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (svr); + return SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (obj); } int @@ -521,7 +523,10 @@ Ecore_Con_Ssl_Error ecore_con_ssl_client_init(Ecore_Con_Client *obj) { Ecore_Con_Client_Data *cl = eo_data_scope_get(obj, ECORE_CON_CLIENT_CLASS); - if (!(cl->host_server->type & ECORE_CON_SSL)) + if (!cl) + return ECORE_CON_SSL_ERROR_NONE; + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if (host_server || !(host_server->type & ECORE_CON_SSL)) return ECORE_CON_SSL_ERROR_NONE; return SSL_SUFFIX(_ecore_con_ssl_client_init) (obj); } @@ -530,7 +535,10 @@ Ecore_Con_Ssl_Error ecore_con_ssl_client_shutdown(Ecore_Con_Client *obj) { Ecore_Con_Client_Data *cl = eo_data_scope_get(obj, ECORE_CON_CLIENT_CLASS); - if (!(cl->host_server->type & ECORE_CON_SSL)) + if (!cl) + return ECORE_CON_SSL_ERROR_NONE; + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if (!host_server || !(host_server->type & ECORE_CON_SSL)) return ECORE_CON_SSL_ERROR_NONE; return SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (obj); } @@ -579,13 +587,11 @@ ecore_con_ssl_available_get(void) * @param svr The server object */ EAPI void -ecore_con_ssl_server_verify(Ecore_Con_Server *svr) +ecore_con_ssl_server_verify(Ecore_Con_Server *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_verify"); - return; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return; + svr->verify = EINA_TRUE; } @@ -600,13 +606,11 @@ ecore_con_ssl_server_verify(Ecore_Con_Server *svr) * @since 1.1 */ EAPI void -ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr) +ecore_con_ssl_server_verify_basic(Ecore_Con_Server *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__); - return; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return; + svr->verify_basic = EINA_TRUE; } @@ -624,13 +628,11 @@ ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr) * @since 1.2 */ EAPI void -ecore_con_ssl_server_verify_name_set(Ecore_Con_Server *svr, const char *name) +ecore_con_ssl_server_verify_name_set(Ecore_Con_Server *obj, const char *name) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__); - return; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return; + eina_stringshare_replace(&svr->verify_name, name); } @@ -645,13 +647,11 @@ ecore_con_ssl_server_verify_name_set(Ecore_Con_Server *svr, const char *name) * @since 1.2 */ EAPI const char * -ecore_con_ssl_server_verify_name_get(Ecore_Con_Server *svr) +ecore_con_ssl_server_verify_name_get(Ecore_Con_Server *obj) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__); - return NULL; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return NULL; + return svr->verify_name ? : svr->name; } @@ -667,24 +667,21 @@ ecore_con_ssl_server_verify_name_get(Ecore_Con_Server *svr) */ EAPI Eina_Bool -ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, +ecore_con_ssl_server_cert_add(Ecore_Con_Server *obj, const char *cert) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cert_add"); - return EINA_FALSE; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return EINA_FALSE; if (!svr->ssl_prepared) { svr->use_cert = EINA_TRUE; svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT; - if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL)) + if (ecore_con_ssl_server_prepare(obj, svr->type & ECORE_CON_SSL)) return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (svr, cert); + return SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (obj, cert); } /** @@ -700,24 +697,21 @@ ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, */ EAPI Eina_Bool -ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, +ecore_con_ssl_server_cafile_add(Ecore_Con_Server *obj, const char *ca_file) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cafile_add"); - return EINA_FALSE; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return EINA_FALSE; if (!svr->ssl_prepared) { svr->use_cert = EINA_TRUE; svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT; - if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL)) + if (ecore_con_ssl_server_prepare(obj, svr->type & ECORE_CON_SSL)) return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (svr, ca_file); + return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (obj, ca_file); } /** @@ -732,24 +726,21 @@ ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, */ EAPI Eina_Bool -ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, +ecore_con_ssl_server_privkey_add(Ecore_Con_Server *obj, const char *key_file) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_privkey_add"); - return EINA_FALSE; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return EINA_FALSE; if (!svr->ssl_prepared) { svr->use_cert = EINA_TRUE; svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT; - if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL)) + if (ecore_con_ssl_server_prepare(obj, svr->type & ECORE_CON_SSL)) return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (svr, key_file); + return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (obj, key_file); } /** @@ -764,24 +755,21 @@ ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, */ EAPI Eina_Bool -ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, +ecore_con_ssl_server_crl_add(Ecore_Con_Server *obj, const char *crl_file) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_crl_add"); - return EINA_FALSE; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return EINA_FALSE; if (!svr->ssl_prepared) { svr->use_cert = EINA_TRUE; svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT; - if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL)) + if (ecore_con_ssl_server_prepare(obj, svr->type & ECORE_CON_SSL)) return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (svr, crl_file); + return SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (obj, crl_file); } /** @@ -799,20 +787,17 @@ ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, */ EAPI Eina_Bool -ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type ssl_type) +ecore_con_ssl_server_upgrade(Ecore_Con_Server *obj, Ecore_Con_Type ssl_type) { - if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) - { - ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__); - return EINA_FALSE; - } + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); + if (!svr) return EINA_FALSE; #if _ECORE_CON_SSL_AVAILABLE == 0 return EINA_FALSE; #endif if (!svr->ssl_prepared) { - if (ecore_con_ssl_server_prepare(svr, ssl_type)) + if (ecore_con_ssl_server_prepare(obj, ssl_type)) return EINA_FALSE; } if (!svr->use_cert) @@ -820,7 +805,7 @@ ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type ssl_type) svr->upgrade = EINA_TRUE; svr->handshaking = EINA_TRUE; svr->ssl_state = ECORE_CON_SSL_STATE_INIT; - return !SSL_SUFFIX(_ecore_con_ssl_server_init) (svr); + return !SSL_SUFFIX(_ecore_con_ssl_server_init) (obj); } /** @@ -848,15 +833,16 @@ ecore_con_ssl_client_upgrade(Ecore_Con_Client *obj, Ecore_Con_Type ssl_type) return EINA_FALSE; #endif - if (!cl->host_server->ssl_prepared) + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); + if (!host_server->ssl_prepared) { if (ecore_con_ssl_server_prepare(cl->host_server, ssl_type)) return EINA_FALSE; } - if (!cl->host_server->use_cert) - cl->host_server->type |= ssl_type; + if (!host_server->use_cert) + host_server->type |= ssl_type; cl->upgrade = EINA_TRUE; - cl->host_server->upgrade = EINA_TRUE; + host_server->upgrade = EINA_TRUE; cl->handshaking = EINA_TRUE; cl->ssl_state = ECORE_CON_SSL_STATE_INIT; return SSL_SUFFIX(_ecore_con_ssl_client_init) (obj); @@ -1527,9 +1513,10 @@ _ecore_con_ssl_shutdown_openssl(void) } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *obj, int ssl_type) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); long options; int dh = 0; @@ -1599,13 +1586,14 @@ error: } else _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR); - _ecore_con_ssl_server_shutdown_openssl(svr); + _ecore_con_ssl_server_shutdown_openssl(obj); return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr) +_ecore_con_ssl_server_init_openssl(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int ret = -1; switch (svr->ssl_state) @@ -1692,14 +1680,15 @@ _ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr) error: _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR); - _ecore_con_ssl_server_shutdown_openssl(svr); + _ecore_con_ssl_server_shutdown_openssl(obj); return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } static Eina_Bool -_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *obj, const char *ca_file) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); struct stat st; if (stat(ca_file, &st)) return EINA_FALSE; @@ -1715,9 +1704,10 @@ error: } static Eina_Bool -_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *obj, const char *crl_file) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); X509_STORE *st; X509_LOOKUP *lu; static Eina_Bool flag = EINA_FALSE; @@ -1739,9 +1729,10 @@ error: } static Eina_Bool -_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *obj, const char *key_file) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); FILE *fp = NULL; EVP_PKEY *privkey = NULL; @@ -1765,9 +1756,10 @@ error: } static Eina_Bool -_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *obj, const char *cert_file) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); FILE *fp = NULL; X509 *cert = NULL; @@ -1790,8 +1782,9 @@ error: } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr) +_ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *obj) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); if (svr->ssl) { if (!SSL_shutdown(svr->ssl)) @@ -1811,10 +1804,11 @@ _ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr) } static int -_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *obj, unsigned char *buf, int size) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int num; if (!svr->ssl) return -1; @@ -1841,10 +1835,11 @@ _ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr, } static int -_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr, +_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *obj, const unsigned char *buf, int size) { + Ecore_Con_Server_Data *svr = eo_data_scope_get(obj, ECORE_CON_SERVER_CLASS); int num; num = SSL_write(svr->ssl, buf, size); @@ -1873,6 +1868,7 @@ static Ecore_Con_Ssl_Error _ecore_con_ssl_client_init_openssl(Ecore_Con_Client *obj) { Ecore_Con_Client_Data *cl = eo_data_scope_get(obj, ECORE_CON_CLIENT_CLASS); + Ecore_Con_Server_Data *host_server = eo_data_scope_get(cl->host_server, ECORE_CON_SERVER_CLASS); int ret = -1; switch (cl->ssl_state) { @@ -1880,7 +1876,7 @@ _ecore_con_ssl_client_init_openssl(Ecore_Con_Client *obj) return ECORE_CON_SSL_ERROR_NONE; case ECORE_CON_SSL_STATE_INIT: - SSL_ERROR_CHECK_GOTO_ERROR(!(cl->ssl = SSL_new(cl->host_server->ssl_ctx))); + SSL_ERROR_CHECK_GOTO_ERROR(!(cl->ssl = SSL_new(host_server->ssl_ctx))); SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(cl->ssl, cl->fd)); SSL_set_accept_state(cl->ssl); @@ -1914,7 +1910,7 @@ _ecore_con_ssl_client_init_openssl(Ecore_Con_Client *obj) } _openssl_print_session(cl->ssl); - if (!cl->host_server->verify) + if (!host_server->verify) /* not verifying certificates, so we're done! */ return ECORE_CON_SSL_ERROR_NONE; SSL_set_verify(cl->ssl, SSL_VERIFY_PEER, NULL);