efl_net_server_ssl_context_set(server, ssl_ctx);
- efl_net_server_ssl_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
- efl_net_server_ssl_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
- if (socket_activated) efl_net_server_ssl_socket_activate(server, address);
+ 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 */
+ if (socket_activated) efl_net_server_fd_socket_activate(server, address);
}
#ifdef EFL_NET_SERVER_UNIX_CLASS
else if (cls == EFL_NET_SERVER_UNIX_CLASS)
efl_net_server_ssl_context_set(server, ssl_ctx);
- efl_net_server_ssl_reuse_address_set(server, EINA_TRUE); /* optional, but nice for testing */
- efl_net_server_ssl_reuse_port_set(server, EINA_TRUE); /* optional, but nice for testing... not secure unless you know what you're doing */
- if (socket_activated) efl_net_server_ssl_socket_activate(server, address);
+ 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 */
+ if (socket_activated) efl_net_server_fd_socket_activate(server, address);
}
#ifdef EFL_NET_SERVER_UNIX_CLASS
else if (cls == EFL_NET_SERVER_UNIX_CLASS)
else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS))
{
/* old ecore_con did not map ipv4 to ipv6... */
- efl_net_server_ssl_ipv6_only_set(inner_server, EINA_TRUE);
- efl_net_server_ssl_reuse_address_set(inner_server, EINA_TRUE);
- efl_net_server_ssl_reuse_port_set(inner_server, EINA_TRUE);
+ efl_net_server_ip_ipv6_only_set(inner_server, EINA_TRUE);
}
#ifdef EFL_NET_SERVER_UNIX_CLASS
else if (efl_isa(inner_server, EFL_NET_SERVER_UNIX_CLASS))
{
if (efl_isa(inner_server, EFL_NET_SERVER_FD_CLASS))
efl_net_server_fd_socket_activate(inner_server, address);
- else if (efl_isa(inner_server, EFL_NET_SERVER_SSL_CLASS))
- efl_net_server_ssl_socket_activate(inner_server, address);
else
{
ERR("svr=%p (%s): not able to socket-activate this type!", svr, efl_class_name_get(inner_server));
}
static void
-_efl_net_server_ssl_tcp_client_add(void *data, const Efl_Event *event)
+_efl_net_server_ssl_efl_net_server_fd_client_add(Eo *o, Efl_Net_Server_Ssl_Data *pd, int client_fd)
{
- Eo *o = data;
- Efl_Net_Server_Ssl_Data *pd = efl_data_scope_get(o, MY_CLASS);
Eo *client_ssl;
- Eo *client_tcp = event->info;
- const char *addr = efl_net_socket_address_remote_get(client_tcp);
+ Eo *client_tcp;
+ const char *addr;
+
+ client_tcp = efl_add(EFL_NET_SOCKET_TCP_CLASS, o,
+ efl_io_closer_close_on_exec_set(efl_added, efl_net_server_fd_close_on_exec_get(o)),
+ efl_io_closer_close_on_destructor_set(efl_added, EINA_TRUE),
+ efl_loop_fd_set(efl_added, client_fd));
+ if (!client_tcp)
+ {
+ ERR("could not create client object fd=" SOCKET_FMT, (SOCKET)client_fd);
+ closesocket(client_fd);
+ return;
+ }
+ addr = efl_net_socket_address_remote_get(client_tcp);
if (!pd->ssl_ctx)
{
ERR("ssl server %p rejecting client %p '%s' since no SSL context was set!", o, client_tcp, addr);
efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, (void *)addr);
+ efl_del(client_tcp);
return;
}
{
ERR("ssl server %p could not wrap client %p '%s' using context=%p", o, client_tcp, addr, pd->ssl_ctx);
efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, (void *)addr);
+ efl_del(client_tcp);
return;
}
efl_net_server_client_announce(o, client_ssl);
}
-static void
-_efl_net_server_ssl_tcp_client_rejected(void *data, const Efl_Event *event)
-{
- Eo *o = data;
- char *client = event->info;
- efl_event_callback_call(o, EFL_NET_SERVER_EVENT_CLIENT_REJECTED, client);
-}
-
-static void
-_efl_net_server_ssl_tcp_error(void *data, const Efl_Event *event)
-{
- Eo *o = data;
- Eina_Error *perr = event->info;
- efl_event_callback_call(o, EFL_NET_SERVER_EVENT_ERROR, perr);
-}
-
-static void
-_efl_net_server_ssl_tcp_serving(void *data, const Efl_Event *event EINA_UNUSED)
-{
- Eo *o = data;
- efl_event_callback_call(o, EFL_NET_SERVER_EVENT_SERVING, NULL);
-}
-
-EFL_CALLBACKS_ARRAY_DEFINE(_efl_net_server_ssl_tcp_cbs,
- { EFL_NET_SERVER_EVENT_CLIENT_ADD, _efl_net_server_ssl_tcp_client_add },
- { EFL_NET_SERVER_EVENT_CLIENT_REJECTED, _efl_net_server_ssl_tcp_client_rejected },
- { EFL_NET_SERVER_EVENT_ERROR, _efl_net_server_ssl_tcp_error },
- { EFL_NET_SERVER_EVENT_SERVING, _efl_net_server_ssl_tcp_serving });
-
EOLIAN Efl_Object *
_efl_net_server_ssl_efl_object_constructor(Eo *o, Efl_Net_Server_Ssl_Data *pd)
{
o = efl_constructor(efl_super(o, MY_CLASS));
if (!o) return NULL;
- pd->server = efl_add(EFL_NET_SERVER_TCP_CLASS, o,
- efl_event_callback_array_add(efl_added, _efl_net_server_ssl_tcp_cbs(), o));
+ pd->server = efl_add(EFL_NET_SERVER_TCP_CLASS, o);
EINA_SAFETY_ON_NULL_RETURN_VAL(pd->server, NULL);
+ if (!efl_composite_attach(o, pd->server))
+ goto on_error;
return o;
+
+ on_error:
+ ERR("Failed to composite the object\n");
+ efl_del(pd->server);
+ efl_del(o);
+ return NULL;
}
static void
return pd->ssl_ctx;
}
-EOLIAN static Eina_Error
-_efl_net_server_ssl_socket_activate(Eo *o, Efl_Net_Server_Ssl_Data *pd, const char *address)
-{
- EINA_SAFETY_ON_TRUE_RETURN_VAL(efl_net_server_serving_get(o), EALREADY);
- EINA_SAFETY_ON_NULL_RETURN_VAL(address, EINVAL);
- return efl_net_server_fd_socket_activate(pd->server, address);
-}
-
-EOLIAN static Eina_Error
-_efl_net_server_ssl_efl_net_server_serve(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, const char *address)
-{
- return efl_net_server_serve(pd->server, address);
-}
-
-EOLIAN static const char *
-_efl_net_server_ssl_efl_net_server_address_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_address_get(pd->server);
-}
-
-EOLIAN static unsigned int
-_efl_net_server_ssl_efl_net_server_clients_count_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_clients_count_get(pd->server);
-}
-
-EOLIAN static void
-_efl_net_server_ssl_efl_net_server_clients_limit_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, unsigned int limit, Eina_Bool reject_excess)
-{
- efl_net_server_clients_limit_set(pd->server, limit, reject_excess);
-}
-
-EOLIAN static void
-_efl_net_server_ssl_efl_net_server_clients_limit_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, unsigned int *limit, Eina_Bool *reject_excess)
-{
- efl_net_server_clients_limit_get(pd->server, limit, reject_excess);
-}
-
-EOLIAN static Eina_Bool
-_efl_net_server_ssl_efl_net_server_serving_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_serving_get(pd->server);
-}
-
-EOLIAN int
-_efl_net_server_ssl_family_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_fd_family_get(pd->server);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_close_on_exec_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool close_on_exec)
-{
- return efl_net_server_fd_close_on_exec_set(pd->server, close_on_exec);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_close_on_exec_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_fd_close_on_exec_get(pd->server);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_reuse_address_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool reuse_address)
-{
- return efl_net_server_fd_reuse_address_set(pd->server, reuse_address);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_reuse_address_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_fd_reuse_address_get(pd->server);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_reuse_port_set(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd, Eina_Bool reuse_port)
-{
- return efl_net_server_fd_reuse_port_set(pd->server, reuse_port);
-}
-
-EOLIAN Eina_Bool
-_efl_net_server_ssl_reuse_port_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *pd)
-{
- return efl_net_server_fd_reuse_port_get(pd->server);
-}
-
-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_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_ip_ipv6_only_get(pd->server);
-}
-
-
#include "efl_net_server_ssl.eo.c"
-class Efl.Net.Server.Ssl (Efl.Loop_User, Efl.Net.Server) {
+class Efl.Net.Server.Ssl (Efl.Net.Server.Tcp) {
[[A SSL server over TCP.
@since 1.19
ssl_context: Efl.Net.Ssl.Context; [[SSL context]]
}
}
-
- socket_activate {
- [[If this method is called use an already activated socket.
-
- This method allows a server to use an existing socket
- received from systemd or similar system.
-
- It will replace @Efl.Net.Server.serve, thus if this is
- used, that method will return EALREADY.
-
- \@note The parameter 'address' given to this function is
- only used to validate the next socket available, it
- doesn't search for a socket with the given address. Thus
- the socket to be used is the next unused and orders
- matter is using multiple servers!
-
- Errors:
-
- - EALREADY: already have a socket, either from
- previous @.socket_activate or
- @Efl.Net.Server.serve. Usually represents a
- programming error.
-
- - ENOENT: no sockets received from process manager
- (ie: systemd). Usually this is not a fatal error,
- just proceed by calling @Efl.Net.Server.serve
-
- - EINVAL: the socket received is not of the correct
- family, type or protocol. Usually this means a
- configuration mismatch with the order of server
- creation and calls to socket_activate. The
- systemd.socket entries must match the order in your
- application.
- ]]
- params {
- address: string; [[The address to validate the next available socket. It doesn't serve as search, only as validation!]]
- }
- return: Eina.Error; [[0 on success, ENOENT if no socket is available or EALREADY if already have a socket]]
- }
-
- @property family {
- [[The address family (AF_*) family of this socket.
-
- It will be one of AF_INET (IPv4) or AF_INET6 (IPv6).
- ]]
- get { }
- values {
- family: int; [[Socket address family]]
- }
- }
-
- @property close_on_exec {
- [[Controls Close-on-Exec() using FD_CLOEXEC.
-
- Children socket will inherit the server's setting by
- default. One can change the behavior using each instance
- @Efl.Io.Closer.close_on_exec.set. Defaults to $true.
- ]]
- get { }
- set {
- return: bool (false); [[$true on success]]
- }
- values {
- close_on_exec: bool; [[If $true close on exec will be used, $false otherwise]]
- }
- }
-
- @property reuse_address {
- [[Controls address reuse() using SO_REUSEADDR]]
- get { }
- set {
- return: bool (false); [[$true on success]]
- }
- values {
- reuse_address: bool; [[If $true the server will reuse the address, $false otherwise]]
- }
- }
-
- @property reuse_port {
- [[Controls port reuse() using SO_REUSEPORT (since linux 3.9)]]
- get { }
- set {
- return: bool (false); [[$true on success]]
- }
- values {
- reuse_port: bool; [[If $true the server will reuse the port, $false otherwise]]
- }
- }
-
- @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.client_announce;
- Efl.Net.Server.address { get; }
- Efl.Net.Server.clients_count { get; }
- Efl.Net.Server.clients_limit { get; set; }
- Efl.Net.Server.serving { get; }
+ Efl.Net.Server.Fd.client_add;
}
}
/* old ecore_con did not map ipv4 to ipv6... */
efl_net_server_ip_ipv6_only_set(svr->server, EINA_TRUE);
}
- else if (efl_isa(svr->server, EFL_NET_SERVER_SSL_CLASS))
- {
- /* old ecore_con did not map ipv4 to ipv6... */
- efl_net_server_ssl_ipv6_only_set(svr->server, EINA_TRUE);
- efl_net_server_ssl_reuse_address_set(svr->server, EINA_TRUE);
- efl_net_server_ssl_reuse_port_set(svr->server, EINA_TRUE);
- }
#ifdef EFL_NET_SERVER_UNIX_CLASS
if (efl_isa(svr->server, EFL_NET_SERVER_UNIX_CLASS))