lib/ecore_con/efl_net_server.eo \
lib/ecore_con/efl_net_server_simple.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_udp.eo \
lib/ecore_con/efl_net_server_udp_client.eo \
lib/ecore_con/efl_net_server.c \
lib/ecore_con/efl_net_server_simple.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_udp.c \
lib/ecore_con/efl_net_server_udp_client.c \
fprintf(stderr,
"TCP options:\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)
{
" - multicast TTL: %u\n"
" - multicast loopback: %u\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_multicast_time_to_live_get(event->object),
efl_net_server_udp_multicast_loopback_get(event->object));
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_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
{
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_multicast_time_to_live_set(server, udp_mcast_ttl);
fprintf(stderr,
"TCP options:\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)
{
" - multicast TTL: %u\n"
" - multicast loopback: %u\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_multicast_time_to_live_get(event->object),
efl_net_server_udp_multicast_loopback_get(event->object));
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_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
{
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_multicast_time_to_live_set(server, udp_mcast_ttl);
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 */
- 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_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 */
#include "efl_net_socket_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_dialer_tcp.eo.h"
#include "efl_net_server_tcp.eo.h"
if (efl_isa(inner_server, EFL_NET_SERVER_TCP_CLASS))
{
/* 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))
{
/* 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;
}
else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS))
--- /dev/null
+#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"
--- /dev/null
+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;
+ }
+}
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_tcp_ipv6_only_set(pd->server, ipv6_only);
+ efl_net_server_ip_ipv6_only_set(pd->server, ipv6_only);
}
EOLIAN Eina_Bool
_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);
}
typedef struct _Efl_Net_Server_Tcp_Data
{
Ecore_Thread *resolver;
- Eina_Bool ipv6_only;
} 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
_efl_net_server_tcp_efl_object_destructor(Eo *o, Efl_Net_Server_Tcp_Data *pd)
{
/* apply pending value BEFORE bind() */
if (addr->ai_family == AF_INET6)
{
- if (pd->ipv6_only == 0xff)
- efl_net_server_tcp_ipv6_only_get(o); /* fetch & sync */
- else
- efl_net_server_tcp_ipv6_only_set(o, pd->ipv6_only);
+ efl_net_server_ip_ipv6_only_set(o, efl_net_server_ip_ipv6_only_get(o));
}
r = bind(fd, addr->ai_addr, addrlen);
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"
-class Efl.Net.Server.Tcp (Efl.Net.Server.Fd) {
+class Efl.Net.Server.Tcp (Efl.Net.Server.Ip) {
[[A TCP server.
@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 {
- Efl.Object.constructor;
Efl.Object.destructor;
Efl.Net.Server.serve;
Efl.Net.Server.Fd.client_add;
Eina_Bool loopback;
Eina_Bool ttl_set;
} multicast;
- Eina_Bool ipv6_only;
Eina_Bool dont_route;
} Efl_Net_Server_Udp_Data;
EOLIAN Efl_Object *
_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->multicast.ttl = 1;
pd->multicast.ttl_set = EINA_FALSE;
/* apply pending value BEFORE bind() */
if (addr->ai_family == AF_INET6)
{
- if (pd->ipv6_only == 0xff)
- 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_ip_ipv6_only_set(o, efl_net_server_ip_ipv6_only_get(o));
}
efl_net_server_udp_dont_route_set(o, pd->dont_route);
_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
_efl_net_server_udp_dont_route_set(Eo *o, Efl_Net_Server_Udp_Data *pd, Eina_Bool dont_route)
{
-class Efl.Net.Server.Udp (Efl.Net.Server.Fd) {
+class Efl.Net.Server.Udp (Efl.Net.Server.Ip) {
[[A UDP server.
@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]]
- }
- }
-
@property dont_route {
[[Avoids sent UDP packets being routed by a gateway, limiting them to the local network.
if (efl_isa(svr->server, EFL_NET_SERVER_TCP_CLASS))
{
/* 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))
{