Ecore con server: Migrate to eo.

This commit is contained in:
Tom Hacohen 2014-08-22 16:06:27 +01:00
parent 718a942bde
commit d72f809fb8
12 changed files with 568 additions and 483 deletions

View File

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

View File

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

View File

@ -1,2 +1,3 @@
#include "ecore_con.eo.h"
#include "ecore_con_server.eo.h"
#include "ecore_con_client.eo.h"

View File

@ -1,2 +1,3 @@
#include "ecore_con.eo.legacy.h"
#include "ecore_con_server.eo.legacy.h"
#include "ecore_con_client.eo.legacy.h"

File diff suppressed because it is too large Load Diff

View File

@ -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. */
}
}
}

View File

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

View File

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

View File

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

View File

@ -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 <const(Ecore.Con.Client) *>) *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;
}
}

View File

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

View File

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