forked from enlightenment/efl
ecore_con: add an intermediate Efl.Net.Server.Ip
This commit is contained in:
parent
f73d794132
commit
b7049e8c43
|
@ -16,6 +16,7 @@ ecore_con_eolian_files = \
|
||||||
lib/ecore_con/efl_net_server.eo \
|
lib/ecore_con/efl_net_server.eo \
|
||||||
lib/ecore_con/efl_net_server_simple.eo \
|
lib/ecore_con/efl_net_server_simple.eo \
|
||||||
lib/ecore_con/efl_net_server_fd.eo \
|
lib/ecore_con/efl_net_server_fd.eo \
|
||||||
|
lib/ecore_con/efl_net_server_ip.eo \
|
||||||
lib/ecore_con/efl_net_server_tcp.eo \
|
lib/ecore_con/efl_net_server_tcp.eo \
|
||||||
lib/ecore_con/efl_net_server_udp.eo \
|
lib/ecore_con/efl_net_server_udp.eo \
|
||||||
lib/ecore_con/efl_net_server_udp_client.eo \
|
lib/ecore_con/efl_net_server_udp_client.eo \
|
||||||
|
@ -108,6 +109,7 @@ lib/ecore_con/efl_net_dialer_websocket.c \
|
||||||
lib/ecore_con/efl_net_server.c \
|
lib/ecore_con/efl_net_server.c \
|
||||||
lib/ecore_con/efl_net_server_simple.c \
|
lib/ecore_con/efl_net_server_simple.c \
|
||||||
lib/ecore_con/efl_net_server_fd.c \
|
lib/ecore_con/efl_net_server_fd.c \
|
||||||
|
lib/ecore_con/efl_net_server_ip.c \
|
||||||
lib/ecore_con/efl_net_server_tcp.c \
|
lib/ecore_con/efl_net_server_tcp.c \
|
||||||
lib/ecore_con/efl_net_server_udp.c \
|
lib/ecore_con/efl_net_server_udp.c \
|
||||||
lib/ecore_con/efl_net_server_udp_client.c \
|
lib/ecore_con/efl_net_server_udp_client.c \
|
||||||
|
|
|
@ -425,7 +425,7 @@ _server_serving(void *data EINA_UNUSED, const Efl_Event *event)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"TCP options:\n"
|
"TCP options:\n"
|
||||||
" - IPv6 only: %u\n",
|
" - IPv6 only: %u\n",
|
||||||
efl_net_server_tcp_ipv6_only_get(event->object));
|
efl_net_server_ip_ipv6_only_get(event->object));
|
||||||
}
|
}
|
||||||
else if (efl_class_get(event->object) == EFL_NET_SERVER_UDP_CLASS)
|
else if (efl_class_get(event->object) == EFL_NET_SERVER_UDP_CLASS)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +439,7 @@ _server_serving(void *data EINA_UNUSED, const Efl_Event *event)
|
||||||
" - multicast TTL: %u\n"
|
" - multicast TTL: %u\n"
|
||||||
" - multicast loopback: %u\n"
|
" - multicast loopback: %u\n"
|
||||||
" - multicast groups:\n",
|
" - multicast groups:\n",
|
||||||
efl_net_server_udp_ipv6_only_get(event->object),
|
efl_net_server_ip_ipv6_only_get(event->object),
|
||||||
efl_net_server_udp_dont_route_get(event->object),
|
efl_net_server_udp_dont_route_get(event->object),
|
||||||
efl_net_server_udp_multicast_time_to_live_get(event->object),
|
efl_net_server_udp_multicast_time_to_live_get(event->object),
|
||||||
efl_net_server_udp_multicast_loopback_get(event->object));
|
efl_net_server_udp_multicast_loopback_get(event->object));
|
||||||
|
@ -651,7 +651,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
if (cls == EFL_NET_SERVER_TCP_CLASS)
|
if (cls == EFL_NET_SERVER_TCP_CLASS)
|
||||||
{
|
{
|
||||||
efl_net_server_tcp_ipv6_only_set(server, ipv6_only);
|
efl_net_server_ip_ipv6_only_set(server, ipv6_only);
|
||||||
efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
|
efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
|
||||||
efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
|
efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
|
||||||
|
|
||||||
|
@ -661,7 +661,7 @@ main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const Eina_List *lst;
|
const Eina_List *lst;
|
||||||
|
|
||||||
efl_net_server_udp_ipv6_only_set(server, ipv6_only);
|
efl_net_server_ip_ipv6_only_set(server, ipv6_only);
|
||||||
efl_net_server_udp_dont_route_set(server, udp_dont_route);
|
efl_net_server_udp_dont_route_set(server, udp_dont_route);
|
||||||
|
|
||||||
efl_net_server_udp_multicast_time_to_live_set(server, udp_mcast_ttl);
|
efl_net_server_udp_multicast_time_to_live_set(server, udp_mcast_ttl);
|
||||||
|
|
|
@ -229,7 +229,7 @@ _server_serving(void *data EINA_UNUSED, const Efl_Event *event)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"TCP options:\n"
|
"TCP options:\n"
|
||||||
" - IPv6 only: %u\n",
|
" - IPv6 only: %u\n",
|
||||||
efl_net_server_tcp_ipv6_only_get(event->object));
|
efl_net_server_ip_ipv6_only_get(event->object));
|
||||||
}
|
}
|
||||||
else if (efl_class_get(event->object) == EFL_NET_SERVER_UDP_CLASS)
|
else if (efl_class_get(event->object) == EFL_NET_SERVER_UDP_CLASS)
|
||||||
{
|
{
|
||||||
|
@ -243,7 +243,7 @@ _server_serving(void *data EINA_UNUSED, const Efl_Event *event)
|
||||||
" - multicast TTL: %u\n"
|
" - multicast TTL: %u\n"
|
||||||
" - multicast loopback: %u\n"
|
" - multicast loopback: %u\n"
|
||||||
" - multicast groups:\n",
|
" - multicast groups:\n",
|
||||||
efl_net_server_udp_ipv6_only_get(event->object),
|
efl_net_server_ip_ipv6_only_get(event->object),
|
||||||
efl_net_server_udp_dont_route_get(event->object),
|
efl_net_server_udp_dont_route_get(event->object),
|
||||||
efl_net_server_udp_multicast_time_to_live_get(event->object),
|
efl_net_server_udp_multicast_time_to_live_get(event->object),
|
||||||
efl_net_server_udp_multicast_loopback_get(event->object));
|
efl_net_server_udp_multicast_loopback_get(event->object));
|
||||||
|
@ -459,7 +459,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
if (cls == EFL_NET_SERVER_TCP_CLASS)
|
if (cls == EFL_NET_SERVER_TCP_CLASS)
|
||||||
{
|
{
|
||||||
efl_net_server_tcp_ipv6_only_set(server, ipv6_only);
|
efl_net_server_ip_ipv6_only_set(server, ipv6_only);
|
||||||
efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
|
efl_net_server_fd_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
|
||||||
efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
|
efl_net_server_fd_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const Eina_List *lst;
|
const Eina_List *lst;
|
||||||
|
|
||||||
efl_net_server_udp_ipv6_only_set(server, ipv6_only);
|
efl_net_server_ip_ipv6_only_set(server, ipv6_only);
|
||||||
efl_net_server_udp_dont_route_set(server, udp_dont_route);
|
efl_net_server_udp_dont_route_set(server, udp_dont_route);
|
||||||
|
|
||||||
efl_net_server_udp_multicast_time_to_live_set(server, udp_mcast_ttl);
|
efl_net_server_udp_multicast_time_to_live_set(server, udp_mcast_ttl);
|
||||||
|
|
|
@ -311,7 +311,7 @@ main(int argc, char **argv)
|
||||||
eina_iterator_free(it);
|
eina_iterator_free(it);
|
||||||
|
|
||||||
server = efl_add(EFL_NET_SERVER_TCP_CLASS, ecore_main_loop_get(), /* it's mandatory to use a main loop provider as the server parent */
|
server = efl_add(EFL_NET_SERVER_TCP_CLASS, ecore_main_loop_get(), /* it's mandatory to use a main loop provider as the server parent */
|
||||||
efl_net_server_tcp_ipv6_only_set(efl_added, EINA_FALSE), /* optional, but helps testing IPv4 on IPv6 servers */
|
efl_net_server_ip_ipv6_only_set(efl_added, EINA_FALSE), /* optional, but helps testing IPv4 on IPv6 servers */
|
||||||
efl_net_server_fd_reuse_address_set(efl_added, EINA_TRUE), /* optional, but nice for testing */
|
efl_net_server_fd_reuse_address_set(efl_added, EINA_TRUE), /* optional, but nice for testing */
|
||||||
efl_net_server_fd_reuse_port_set(efl_added, EINA_TRUE), /* optional, but nice for testing... not secure unless you know what you're doing */
|
efl_net_server_fd_reuse_port_set(efl_added, EINA_TRUE), /* optional, but nice for testing... not secure unless you know what you're doing */
|
||||||
efl_event_callback_array_add(efl_added, server_cbs(), NULL)); /* mandatory to have "client,add" in order to be useful */
|
efl_event_callback_array_add(efl_added, server_cbs(), NULL)); /* mandatory to have "client,add" in order to be useful */
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#include "efl_net_socket_fd.eo.h"
|
#include "efl_net_socket_fd.eo.h"
|
||||||
#include "efl_net_server_fd.eo.h"
|
#include "efl_net_server_fd.eo.h"
|
||||||
|
|
||||||
|
#include "efl_net_server_ip.eo.h"
|
||||||
|
|
||||||
#include "efl_net_socket_tcp.eo.h"
|
#include "efl_net_socket_tcp.eo.h"
|
||||||
#include "efl_net_dialer_tcp.eo.h"
|
#include "efl_net_dialer_tcp.eo.h"
|
||||||
#include "efl_net_server_tcp.eo.h"
|
#include "efl_net_server_tcp.eo.h"
|
||||||
|
|
|
@ -1515,12 +1515,12 @@ _ecore_con_server_server_set(Ecore_Con_Server *svr, Eo *server)
|
||||||
if (efl_isa(inner_server, EFL_NET_SERVER_TCP_CLASS))
|
if (efl_isa(inner_server, EFL_NET_SERVER_TCP_CLASS))
|
||||||
{
|
{
|
||||||
/* old ecore_con did not map ipv4 to ipv6... */
|
/* old ecore_con did not map ipv4 to ipv6... */
|
||||||
efl_net_server_tcp_ipv6_only_set(inner_server, EINA_TRUE);
|
efl_net_server_ip_ipv6_only_set(inner_server, EINA_TRUE);
|
||||||
}
|
}
|
||||||
else if (efl_isa(inner_server, EFL_NET_SERVER_UDP_CLASS))
|
else if (efl_isa(inner_server, EFL_NET_SERVER_UDP_CLASS))
|
||||||
{
|
{
|
||||||
/* old ecore_con did not map ipv4 to ipv6... */
|
/* old ecore_con did not map ipv4 to ipv6... */
|
||||||
efl_net_server_udp_ipv6_only_set(inner_server, EINA_TRUE);
|
efl_net_server_ip_ipv6_only_set(inner_server, EINA_TRUE);
|
||||||
svr->want_mcast = type == ECORE_CON_REMOTE_MCAST;
|
svr->want_mcast = type == ECORE_CON_REMOTE_MCAST;
|
||||||
}
|
}
|
||||||
else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS))
|
else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS))
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
#define EFL_NET_SERVER_FD_PROTECTED 1
|
||||||
|
#define EFL_NET_SERVER_PROTECTED 1
|
||||||
|
#define EFL_LOOP_FD_PROTECTED 1
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Ecore.h"
|
||||||
|
#include "Ecore_Con.h"
|
||||||
|
#include "ecore_con_private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
# include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_TCP_H
|
||||||
|
# include <netinet/tcp.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
# include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
# include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <Evil.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MY_CLASS EFL_NET_SERVER_IP_CLASS
|
||||||
|
|
||||||
|
typedef struct _Efl_Net_Server_Ip_Data
|
||||||
|
{
|
||||||
|
Eina_Bool ipv6_only;
|
||||||
|
} Efl_Net_Server_Ip_Data;
|
||||||
|
|
||||||
|
EOLIAN Efl_Object *
|
||||||
|
_efl_net_server_ip_efl_object_constructor(Eo *o, Efl_Net_Server_Ip_Data *pd)
|
||||||
|
{
|
||||||
|
pd->ipv6_only = 0xff;
|
||||||
|
return efl_constructor(efl_super(o, MY_CLASS));
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN void
|
||||||
|
_efl_net_server_ip_ipv6_only_set(Eo *o, Efl_Net_Server_Ip_Data *pd, Eina_Bool ipv6_only)
|
||||||
|
{
|
||||||
|
#ifdef IPV6_V6ONLY
|
||||||
|
SOCKET fd = efl_loop_fd_get(o);
|
||||||
|
#ifdef _WIN32
|
||||||
|
DWORD value = ipv6_only;
|
||||||
|
int valuelen;
|
||||||
|
#else
|
||||||
|
int value = ipv6_only;
|
||||||
|
socklen_t valuelen;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IPV6_V6ONLY
|
||||||
|
if (fd == INVALID_SOCKET) return;
|
||||||
|
if (efl_net_server_fd_family_get(o) != AF_INET6) return;
|
||||||
|
|
||||||
|
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&value, sizeof(value)) != 0)
|
||||||
|
{
|
||||||
|
ERR("could not set socket=" SOCKET_FMT " IPV6_V6ONLY=%d: %s", fd, (int)value, eina_error_msg_get(efl_net_socket_error_get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
valuelen = sizeof(value);
|
||||||
|
if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&value, &valuelen) != 0)
|
||||||
|
{
|
||||||
|
WRN("getsockopt(" SOCKET_FMT ", IPPROTO_IPV6, IPV6_V6ONLY): %s", fd, eina_error_msg_get(efl_net_socket_error_get()));
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
pd->ipv6_only = !!value;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
EOLIAN Eina_Bool
|
||||||
|
_efl_net_server_ip_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ip_Data *pd)
|
||||||
|
{
|
||||||
|
return pd->ipv6_only;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "efl_net_server_ip.eo.c"
|
|
@ -0,0 +1,38 @@
|
||||||
|
class Efl.Net.Server.Ip (Efl.Net.Server.Fd) {
|
||||||
|
[[An IP server.
|
||||||
|
|
||||||
|
@since 1.20
|
||||||
|
]]
|
||||||
|
methods {
|
||||||
|
@property ipv6_only {
|
||||||
|
[[Whenever IPv6 listen address will accept only same-family clients or will allow IPv4 to connect as well.
|
||||||
|
|
||||||
|
Since Linux 2.4.21, Windows Vista and MacOS X these
|
||||||
|
control whenever a server that did bind to an IPv6
|
||||||
|
address will accept only IPv6 clients or will also
|
||||||
|
accept IPv4 by automatically converting them in an IPv6
|
||||||
|
address, allowing a single socket to handle both
|
||||||
|
protocols.
|
||||||
|
|
||||||
|
If an IPv6 address was used in @Efl.Net.Server.address,
|
||||||
|
this property is $false and an IPv4 connects, then an
|
||||||
|
address such as [::ffff:IPv4]:PORT will be used, such as
|
||||||
|
[::ffff:192.168.0.2]:1234, where the IPv4 address can be
|
||||||
|
extracted.
|
||||||
|
|
||||||
|
If an IPv4 address was used in @Efl.Net.Server.address,
|
||||||
|
this has no effect.
|
||||||
|
|
||||||
|
Systems can configure their default value, usually true
|
||||||
|
(allows only IPv6 clients).
|
||||||
|
]]
|
||||||
|
values {
|
||||||
|
ipv6_only: bool; [[If $true the server will only accept IPv6 clients, $false otherwise]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
implements {
|
||||||
|
Efl.Object.constructor;
|
||||||
|
}
|
||||||
|
}
|
|
@ -284,13 +284,13 @@ _efl_net_server_ssl_reuse_port_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *p
|
||||||
EOLIAN void
|
EOLIAN void
|
||||||
_efl_net_server_ssl_ipv6_only_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool ipv6_only)
|
_efl_net_server_ssl_ipv6_only_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool ipv6_only)
|
||||||
{
|
{
|
||||||
efl_net_server_tcp_ipv6_only_set(pd->server, ipv6_only);
|
efl_net_server_ip_ipv6_only_set(pd->server, ipv6_only);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN Eina_Bool
|
EOLIAN Eina_Bool
|
||||||
_efl_net_server_ssl_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
|
_efl_net_server_ssl_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
|
||||||
{
|
{
|
||||||
return efl_net_server_tcp_ipv6_only_get(pd->server);
|
return efl_net_server_ip_ipv6_only_get(pd->server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,16 +32,8 @@
|
||||||
typedef struct _Efl_Net_Server_Tcp_Data
|
typedef struct _Efl_Net_Server_Tcp_Data
|
||||||
{
|
{
|
||||||
Ecore_Thread *resolver;
|
Ecore_Thread *resolver;
|
||||||
Eina_Bool ipv6_only;
|
|
||||||
} Efl_Net_Server_Tcp_Data;
|
} Efl_Net_Server_Tcp_Data;
|
||||||
|
|
||||||
EOLIAN Efl_Object *
|
|
||||||
_efl_net_server_tcp_efl_object_constructor(Eo *o, Efl_Net_Server_Tcp_Data *pd)
|
|
||||||
{
|
|
||||||
pd->ipv6_only = 0xff;
|
|
||||||
return efl_constructor(efl_super(o, MY_CLASS));
|
|
||||||
}
|
|
||||||
|
|
||||||
EOLIAN void
|
EOLIAN void
|
||||||
_efl_net_server_tcp_efl_object_destructor(Eo *o, Efl_Net_Server_Tcp_Data *pd)
|
_efl_net_server_tcp_efl_object_destructor(Eo *o, Efl_Net_Server_Tcp_Data *pd)
|
||||||
{
|
{
|
||||||
|
@ -80,10 +72,7 @@ _efl_net_server_tcp_resolved_bind(Eo *o, Efl_Net_Server_Tcp_Data *pd, const stru
|
||||||
/* apply pending value BEFORE bind() */
|
/* apply pending value BEFORE bind() */
|
||||||
if (addr->ai_family == AF_INET6)
|
if (addr->ai_family == AF_INET6)
|
||||||
{
|
{
|
||||||
if (pd->ipv6_only == 0xff)
|
efl_net_server_ip_ipv6_only_set(o, efl_net_server_ip_ipv6_only_get(o));
|
||||||
efl_net_server_tcp_ipv6_only_get(o); /* fetch & sync */
|
|
||||||
else
|
|
||||||
efl_net_server_tcp_ipv6_only_set(o, pd->ipv6_only);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r = bind(fd, addr->ai_addr, addrlen);
|
r = bind(fd, addr->ai_addr, addrlen);
|
||||||
|
@ -293,61 +282,4 @@ _efl_net_server_tcp_efl_net_server_fd_client_reject(Eo *o, Efl_Net_Server_Tcp_Da
|
||||||
efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, str);
|
efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN void
|
|
||||||
_efl_net_server_tcp_ipv6_only_set(Eo *o, Efl_Net_Server_Tcp_Data *pd, Eina_Bool ipv6_only)
|
|
||||||
{
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
Eina_Bool old = pd->ipv6_only;
|
|
||||||
SOCKET fd = efl_loop_fd_get(o);
|
|
||||||
#ifdef _WIN32
|
|
||||||
DWORD value = ipv6_only;
|
|
||||||
#else
|
|
||||||
int value = ipv6_only;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pd->ipv6_only = ipv6_only;
|
|
||||||
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
if (fd == INVALID_SOCKET) return;
|
|
||||||
if (efl_net_server_fd_family_get(o) != AF_INET6) return;
|
|
||||||
|
|
||||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&value, sizeof(value)) != 0)
|
|
||||||
{
|
|
||||||
ERR("could not set socket=" SOCKET_FMT " IPV6_V6ONLY=%d: %s", fd, (int)value, eina_error_msg_get(efl_net_socket_error_get()));
|
|
||||||
pd->ipv6_only = old;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
EOLIAN Eina_Bool
|
|
||||||
_efl_net_server_tcp_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Tcp_Data *pd)
|
|
||||||
{
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
SOCKET fd = efl_loop_fd_get(o);
|
|
||||||
#ifdef _WIN32
|
|
||||||
DWORD value = 0;
|
|
||||||
int valuelen;
|
|
||||||
#else
|
|
||||||
int value = 0;
|
|
||||||
socklen_t valuelen;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (fd == INVALID_SOCKET) goto end;
|
|
||||||
if (efl_net_server_fd_family_get(o) != AF_INET6) goto end;
|
|
||||||
|
|
||||||
valuelen = sizeof(value);
|
|
||||||
if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&value, &valuelen) != 0)
|
|
||||||
{
|
|
||||||
WRN("getsockopt(" SOCKET_FMT ", IPPROTO_IPV6, IPV6_V6ONLY): %s", fd, eina_error_msg_get(efl_net_socket_error_get()));
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
pd->ipv6_only = !!value;
|
|
||||||
|
|
||||||
end:
|
|
||||||
#endif
|
|
||||||
return pd->ipv6_only;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#include "efl_net_server_tcp.eo.c"
|
#include "efl_net_server_tcp.eo.c"
|
||||||
|
|
|
@ -1,40 +1,10 @@
|
||||||
class Efl.Net.Server.Tcp (Efl.Net.Server.Fd) {
|
class Efl.Net.Server.Tcp (Efl.Net.Server.Ip) {
|
||||||
[[A TCP server.
|
[[A TCP server.
|
||||||
|
|
||||||
@since 1.19
|
@since 1.19
|
||||||
]]
|
]]
|
||||||
|
|
||||||
methods {
|
|
||||||
@property ipv6_only {
|
|
||||||
[[Whenever IPv6 listen address will accept only same-family clients or will allow IPv4 to connect as well.
|
|
||||||
|
|
||||||
Since Linux 2.4.21, Windows Vista and MacOS X these
|
|
||||||
control whenever a server that did bind to an IPv6
|
|
||||||
address will accept only IPv6 clients or will also
|
|
||||||
accept IPv4 by automatically converting them in an IPv6
|
|
||||||
address, allowing a single socket to handle both
|
|
||||||
protocols.
|
|
||||||
|
|
||||||
If an IPv6 address was used in @Efl.Net.Server.address,
|
|
||||||
this property is $false and an IPv4 connects, then an
|
|
||||||
address such as [::ffff:IPv4]:PORT will be used, such as
|
|
||||||
[::ffff:192.168.0.2]:1234, where the IPv4 address can be
|
|
||||||
extracted.
|
|
||||||
|
|
||||||
If an IPv4 address was used in @Efl.Net.Server.address,
|
|
||||||
this has no effect.
|
|
||||||
|
|
||||||
Systems can configure their default value, usually true
|
|
||||||
(allows only IPv6 clients).
|
|
||||||
]]
|
|
||||||
values {
|
|
||||||
ipv6_only: bool; [[If $true the server will only accept IPv6 clients, $false otherwise]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
implements {
|
implements {
|
||||||
Efl.Object.constructor;
|
|
||||||
Efl.Object.destructor;
|
Efl.Object.destructor;
|
||||||
Efl.Net.Server.serve;
|
Efl.Net.Server.serve;
|
||||||
Efl.Net.Server.Fd.client_add;
|
Efl.Net.Server.Fd.client_add;
|
||||||
|
|
|
@ -42,14 +42,12 @@ typedef struct _Efl_Net_Server_Udp_Data
|
||||||
Eina_Bool loopback;
|
Eina_Bool loopback;
|
||||||
Eina_Bool ttl_set;
|
Eina_Bool ttl_set;
|
||||||
} multicast;
|
} multicast;
|
||||||
Eina_Bool ipv6_only;
|
|
||||||
Eina_Bool dont_route;
|
Eina_Bool dont_route;
|
||||||
} Efl_Net_Server_Udp_Data;
|
} Efl_Net_Server_Udp_Data;
|
||||||
|
|
||||||
EOLIAN Efl_Object *
|
EOLIAN Efl_Object *
|
||||||
_efl_net_server_udp_efl_object_constructor(Eo *o, Efl_Net_Server_Udp_Data *pd)
|
_efl_net_server_udp_efl_object_constructor(Eo *o, Efl_Net_Server_Udp_Data *pd)
|
||||||
{
|
{
|
||||||
pd->ipv6_only = 0xff;
|
|
||||||
pd->clients = eina_hash_string_superfast_new(NULL);
|
pd->clients = eina_hash_string_superfast_new(NULL);
|
||||||
pd->multicast.ttl = 1;
|
pd->multicast.ttl = 1;
|
||||||
pd->multicast.ttl_set = EINA_FALSE;
|
pd->multicast.ttl_set = EINA_FALSE;
|
||||||
|
@ -111,10 +109,7 @@ _efl_net_server_udp_resolved_bind(Eo *o, Efl_Net_Server_Udp_Data *pd, const stru
|
||||||
/* apply pending value BEFORE bind() */
|
/* apply pending value BEFORE bind() */
|
||||||
if (addr->ai_family == AF_INET6)
|
if (addr->ai_family == AF_INET6)
|
||||||
{
|
{
|
||||||
if (pd->ipv6_only == 0xff)
|
efl_net_server_ip_ipv6_only_set(o, efl_net_server_ip_ipv6_only_get(o));
|
||||||
efl_net_server_udp_ipv6_only_get(o); /* fetch & sync */
|
|
||||||
else
|
|
||||||
efl_net_server_udp_ipv6_only_set(o, pd->ipv6_only);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
efl_net_server_udp_dont_route_set(o, pd->dont_route);
|
efl_net_server_udp_dont_route_set(o, pd->dont_route);
|
||||||
|
@ -403,62 +398,6 @@ _efl_net_server_udp_efl_net_server_fd_process_incoming_data(Eo *o, Efl_Net_Serve
|
||||||
_efl_net_server_udp_client_feed(client, slice);
|
_efl_net_server_udp_client_feed(client, slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN void
|
|
||||||
_efl_net_server_udp_ipv6_only_set(Eo *o, Efl_Net_Server_Udp_Data *pd, Eina_Bool ipv6_only)
|
|
||||||
{
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
Eina_Bool old = pd->ipv6_only;
|
|
||||||
SOCKET fd = efl_loop_fd_get(o);
|
|
||||||
#ifdef _WIN32
|
|
||||||
DWORD value = ipv6_only;
|
|
||||||
#else
|
|
||||||
int value = ipv6_only;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pd->ipv6_only = ipv6_only;
|
|
||||||
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
if (fd == INVALID_SOCKET) return;
|
|
||||||
if (efl_net_server_fd_family_get(o) != AF_INET6) return;
|
|
||||||
|
|
||||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&value, sizeof(value)) != 0)
|
|
||||||
{
|
|
||||||
ERR("could not set socket=" SOCKET_FMT " IPV6_V6ONLY=%d: %s", fd, (int)value, eina_error_msg_get(efl_net_socket_error_get()));
|
|
||||||
pd->ipv6_only = old;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
EOLIAN Eina_Bool
|
|
||||||
_efl_net_server_udp_ipv6_only_get(Eo *o EINA_UNUSED, Efl_Net_Server_Udp_Data *pd)
|
|
||||||
{
|
|
||||||
#ifdef IPV6_V6ONLY
|
|
||||||
SOCKET fd = efl_loop_fd_get(o);
|
|
||||||
#ifdef _WIN32
|
|
||||||
DWORD value = 0;
|
|
||||||
int valuelen;
|
|
||||||
#else
|
|
||||||
int value = 0;
|
|
||||||
socklen_t valuelen;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (fd == INVALID_SOCKET) goto end;
|
|
||||||
if (efl_net_server_fd_family_get(o) != AF_INET6) goto end;
|
|
||||||
|
|
||||||
valuelen = sizeof(value);
|
|
||||||
if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&value, &valuelen) != 0)
|
|
||||||
{
|
|
||||||
WRN("getsockopt(" SOCKET_FMT ", IPPROTO_IPV6, IPV6_V6ONLY): %s", fd, eina_error_msg_get(efl_net_socket_error_get()));
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
pd->ipv6_only = !!value;
|
|
||||||
|
|
||||||
end:
|
|
||||||
#endif
|
|
||||||
return pd->ipv6_only;
|
|
||||||
}
|
|
||||||
|
|
||||||
EOLIAN static Eina_Bool
|
EOLIAN static Eina_Bool
|
||||||
_efl_net_server_udp_dont_route_set(Eo *o, Efl_Net_Server_Udp_Data *pd, Eina_Bool dont_route)
|
_efl_net_server_udp_dont_route_set(Eo *o, Efl_Net_Server_Udp_Data *pd, Eina_Bool dont_route)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,37 +1,10 @@
|
||||||
class Efl.Net.Server.Udp (Efl.Net.Server.Fd) {
|
class Efl.Net.Server.Udp (Efl.Net.Server.Ip) {
|
||||||
[[A UDP server.
|
[[A UDP server.
|
||||||
|
|
||||||
@since 1.19
|
@since 1.19
|
||||||
]]
|
]]
|
||||||
|
|
||||||
methods {
|
methods {
|
||||||
@property ipv6_only {
|
|
||||||
[[Whenever IPv6 listen address will accept only same-family clients or will allow IPv4 to connect as well.
|
|
||||||
|
|
||||||
Since Linux 2.4.21, Windows Vista and MacOS X these
|
|
||||||
control whenever a server that did bind to an IPv6
|
|
||||||
address will accept only IPv6 clients or will also
|
|
||||||
accept IPv4 by automatically converting them in an IPv6
|
|
||||||
address, allowing a single socket to handle both
|
|
||||||
protocols.
|
|
||||||
|
|
||||||
If an IPv6 address was used in @Efl.Net.Server.address,
|
|
||||||
this property is $false and an IPv4 connects, then an
|
|
||||||
address such as [::ffff:IPv4]:PORT will be used, such as
|
|
||||||
[::ffff:192.168.0.2]:1234, where the IPv4 address can be
|
|
||||||
extracted.
|
|
||||||
|
|
||||||
If an IPv4 address was used in @Efl.Net.Server.address,
|
|
||||||
this has no effect.
|
|
||||||
|
|
||||||
Systems can configure their default value, usually true
|
|
||||||
(allows only IPv6 clients).
|
|
||||||
]]
|
|
||||||
values {
|
|
||||||
ipv6_only: bool; [[If $true the server will only accept IPv6 clients, $false otherwise]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@property dont_route {
|
@property dont_route {
|
||||||
[[Avoids sent UDP packets being routed by a gateway, limiting them to the local network.
|
[[Avoids sent UDP packets being routed by a gateway, limiting them to the local network.
|
||||||
|
|
||||||
|
|
|
@ -488,7 +488,7 @@ ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void
|
||||||
if (efl_isa(svr->server, EFL_NET_SERVER_TCP_CLASS))
|
if (efl_isa(svr->server, EFL_NET_SERVER_TCP_CLASS))
|
||||||
{
|
{
|
||||||
/* old ecore_con did not map ipv4 to ipv6... */
|
/* old ecore_con did not map ipv4 to ipv6... */
|
||||||
efl_net_server_tcp_ipv6_only_set(svr->server, EINA_TRUE);
|
efl_net_server_ip_ipv6_only_set(svr->server, EINA_TRUE);
|
||||||
}
|
}
|
||||||
else if (efl_isa(svr->server, EFL_NET_SERVER_SSL_CLASS))
|
else if (efl_isa(svr->server, EFL_NET_SERVER_SSL_CLASS))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue