diff --git a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h index 130f0625bb..24a5a9a62e 100644 --- a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h +++ b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h @@ -151,12 +151,14 @@ extern "C" { EAPI int ecore_con_server_connected_get(Ecore_Con_Server *svr); EAPI int ecore_con_server_send(Ecore_Con_Server *svr, void *data, int size); EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char reject_excess_clients); + EAPI char *ecore_con_server_ip_get(Ecore_Con_Server *svr); EAPI int ecore_con_client_send(Ecore_Con_Client *cl, void *data, int size); EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl); EAPI void *ecore_con_client_del(Ecore_Con_Client *cl); EAPI void ecore_con_client_data_set(Ecore_Con_Client *cl, const void *data); EAPI void *ecore_con_client_data_get(Ecore_Con_Client *cl); + EAPI char *ecore_con_client_ip_get(Ecore_Con_Client *cl); EAPI int ecore_con_ssl_available_get(void); diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con.c b/legacy/ecore/src/lib/ecore_con/ecore_con.c index 9461276b03..6378db5e1c 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con.c @@ -338,6 +338,7 @@ ecore_con_server_add(Ecore_Con_Type compl_type, if (svr->fd >= 0) close(svr->fd); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); if (svr->write_buf) free(svr->write_buf); + if (svr->ip) free(svr->ip); #if USE_OPENSSL if (svr->ssl) SSL_free(svr->ssl); if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx); @@ -626,6 +627,28 @@ ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char svr->reject_excess_clients = reject_excess_clients; } +/** + * Gets the IP address of a server that has been connected to. + * + * @param svr The given server. + * @return A pointer to an internal string that contains the IP address of + * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation. + * This string should not be modified or trusted to stay valid after + * deletion for the @p svr object. If no IP is known NULL is returned. + * @ingroup Ecore_Con_Server_Group + */ +EAPI char * +ecore_con_server_ip_get(Ecore_Con_Server *svr) +{ + if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) + { + ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, + "ecore_con_server_ip_get"); + return NULL; + } + return svr->ip; +} + /** * @defgroup Ecore_Con_Client_Group Ecore Connection Client Functions * @@ -760,6 +783,28 @@ ecore_con_client_data_get(Ecore_Con_Client *cl) return cl->data; } +/** + * Gets the IP address of a cleint that has connected. + * + * @param cl The given client. + * @return A pointer to an internal string that contains the IP address of + * the connected client in the form "XXX.YYY.ZZZ.AAA" IP notation. + * This string should not be modified or trusted to stay valid after + * deletion for the @p cl object. If no IP is known NULL is returned. + * @ingroup Ecore_Con_Client_Group + */ +EAPI char * +ecore_con_client_ip_get(Ecore_Con_Client *cl) +{ + if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT)) + { + ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, + "ecore_con_client_ip_get"); + return NULL; + } + return cl->ip; +} + /** * Returns if SSL support is available * @return 1 if SSL is available, 0 if it is not. @@ -796,6 +841,7 @@ _ecore_con_server_free(Ecore_Con_Server *svr) #endif if (svr->name) free(svr->name); if (svr->path) free(svr->path); + if (svr->ip) free(svr->ip); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); free(svr); } @@ -808,6 +854,7 @@ _ecore_con_client_free(Ecore_Con_Client *cl) if (cl->buf) free(cl->buf); if (cl->fd >= 0) close(cl->fd); if (cl->fd_handler) ecore_main_fd_handler_del(cl->fd_handler); + if (cl->ip) free(cl->ip); free(cl); } @@ -831,7 +878,9 @@ _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) if (new_fd >= 0) { Ecore_Con_Client *cl; - + char buf[64]; + uint32_t ip; + if ((svr->client_limit >= 0) && (svr->reject_excess_clients)) { close(new_fd); @@ -854,6 +903,14 @@ _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) cl, NULL, NULL); ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); ecore_list_append(svr->clients, cl); + ip = incoming.sin_addr.s_addr; + snprintf(buf, sizeof(buf), + "%i.%i.%i.%i", + (ip ) & 0xff, + (ip >> 8 ) & 0xff, + (ip >> 16) & 0xff, + (ip >> 24) & 0xff); + cl->ip = strdup(buf); { Ecore_Con_Event_Client_Add *e; @@ -925,6 +982,8 @@ _ecore_con_cb_dns_lookup(void *data, struct hostent *he) Ecore_Con_Server *svr; struct sockaddr_in socket_addr; int curstate = 0; + char buf[64]; + uint32_t ip; svr = data; @@ -955,6 +1014,14 @@ _ecore_con_cb_dns_lookup(void *data, struct hostent *he) NULL, NULL); if (!svr->fd_handler) goto error; + ip = socket_addr.sin_addr.s_addr; + snprintf(buf, sizeof(buf), + "%i.%i.%i.%i", + (ip ) & 0xff, + (ip >> 8 ) & 0xff, + (ip >> 16) & 0xff, + (ip >> 24) & 0xff); + svr->ip = strdup(buf); #if USE_OPENSSL if (svr->type & ECORE_CON_USE_SSL) diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h index 95063b8a50..270361a9db 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h @@ -44,6 +44,7 @@ struct _Ecore_Con_Client int buf_size; int buf_offset; unsigned char *buf; + char *ip; int event_count; char dead : 1; char delete_me : 1; @@ -71,6 +72,7 @@ struct _Ecore_Con_Server SSL_CTX *ssl_ctx; SSL *ssl; #endif + char *ip; char dead : 1; char created : 1; char connecting : 1; diff --git a/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h b/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h index 65bf3a7ab2..dc1088fa43 100644 --- a/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h +++ b/legacy/ecore/src/lib/ecore_ipc/Ecore_Ipc.h @@ -299,7 +299,8 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v); EAPI void ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients); EAPI void ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *srv, int size); EAPI int ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *srv); - + EAPI char *ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr); + /* FIXME: this needs to become an ipc message */ EAPI int ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, void *data, int size); EAPI Ecore_Ipc_Server *ecore_ipc_client_server_get(Ecore_Ipc_Client *cl); @@ -308,6 +309,7 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v); EAPI void *ecore_ipc_client_data_get(Ecore_Ipc_Client *cl); EAPI void ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size); EAPI int ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl); + EAPI char *ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl); EAPI int ecore_ipc_ssl_available_get(void); /* FIXME: need to add a callback to "ok" large ipc messages greater than */ diff --git a/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c b/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c index efedbecb01..d64b2c427d 100644 --- a/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c +++ b/legacy/ecore/src/lib/ecore_ipc/ecore_ipc.c @@ -612,6 +612,13 @@ ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients); } +/** + * Sets the max data payload size for an Ipc message in bytes + * + * @param svr The given server. + * @param size The maximum data payload size in bytes. + * @ingroup Ecore_Ipc_Server_Group + */ EAPI void ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size) { @@ -624,6 +631,13 @@ ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size) svr->max_buf_size = size; } +/** + * Gets the max data payload size for an Ipc message in bytes + * + * @param svr The given server. + * @return The maximum data payload in bytes. + * @ingroup Ecore_Ipc_Server_Group + */ EAPI int ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr) { @@ -636,6 +650,28 @@ ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr) return svr->max_buf_size; } +/** + * Gets the IP address of a server that has been connected to. + * + * @param svr The given server. + * @return A pointer to an internal string that contains the IP address of + * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation. + * This string should not be modified or trusted to stay valid after + * deletion for the @p svr object. If no IP is known NULL is returned. + * @ingroup Ecore_Ipc_Server_Group + */ +EAPI char * +ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr) +{ + if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER)) + { + ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER, + "ecore_con_server_ip_get"); + return NULL; + } + return ecore_con_server_ip_get(svr->server); +} + #define CLENC(_member) \ d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \ @@ -822,6 +858,13 @@ ecore_ipc_client_data_get(Ecore_Ipc_Client *cl) return cl->data; } +/** + * Sets the max data payload size for an Ipc message in bytes + * + * @param client The given client. + * @param size The maximum data payload size in bytes. + * @ingroup Ecore_Ipc_Client_Group + */ EAPI void ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size) { @@ -834,6 +877,13 @@ ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size) cl->max_buf_size = size; } +/** + * Sets the max data payload size for an Ipc message in bytes + * + * @param cl The given client. + * @param size The maximum data payload size in bytes. + * @ingroup Ecore_Ipc_Client_Group + */ EAPI int ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl) { @@ -846,6 +896,28 @@ ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl) return cl->max_buf_size; } +/** + * Gets the IP address of a client that has been connected to. + * + * @param cl The given client. + * @return A pointer to an internal string that contains the IP address of + * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation. + * This string should not be modified or trusted to stay valid after + * deletion for the @p cl object. If no IP is known NULL is returned. + * @ingroup Ecore_Ipc_Client_Group + */ +EAPI char * +ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl) +{ + if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT)) + { + ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT, + "ecore_con_client_ip_get"); + return NULL; + } + return ecore_con_client_ip_get(cl->client); +} + /** * Returns if SSL support is available * @return 1 if SSL is available, 0 if it is not.