ecore_con: simplify Efl.Net.Server.Ssl by inheriting from Efl.Net.Server.Tcp.
authorCedric BAIL <cedric@osg.samsung.com>
Fri, 29 Sep 2017 23:01:02 +0000 (16:01 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Fri, 29 Sep 2017 23:01:02 +0000 (16:01 -0700)
src/examples/ecore/efl_net_server_example.c
src/examples/ecore/efl_net_server_simple_example.c
src/lib/ecore_con/ecore_con_legacy.c
src/lib/ecore_con/efl_net_server_ssl.c
src/lib/ecore_con/efl_net_server_ssl.eo
src/lib/ecore_ipc/ecore_ipc.c

index 1129f02..943bf41 100644 (file)
@@ -702,9 +702,9 @@ main(int argc, char **argv)
 
         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)
index d3b0b93..d0d3c9d 100644 (file)
@@ -509,9 +509,9 @@ main(int argc, char **argv)
 
         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)
index 9fb417e..1e04ae6 100644 (file)
@@ -1526,9 +1526,7 @@ _ecore_con_server_server_set(Ecore_Con_Server *svr, Eo *server)
    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))
@@ -1542,8 +1540,6 @@ _ecore_con_server_server_set(Ecore_Con_Server *svr, Eo *server)
      {
         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));
index 551980d..d9b8953 100644 (file)
@@ -81,18 +81,29 @@ _efl_net_server_ssl_efl_net_server_client_announce(Eo *o, Efl_Net_Server_Ssl_Dat
 }
 
 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;
      }
 
@@ -102,52 +113,31 @@ _efl_net_server_ssl_tcp_client_add(void *data, const Efl_Event *event)
      {
         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
@@ -195,103 +185,4 @@ _efl_net_server_ssl_ssl_context_get(Eo *o EINA_UNUSED, Efl_Net_Server_Ssl_Data *
    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"
index 52f8bcf..b906b04 100644 (file)
@@ -1,4 +1,4 @@
-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
@@ -17,131 +17,12 @@ class Efl.Net.Server.Ssl (Efl.Loop_User, Efl.Net.Server) {
                 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;
     }
 }
index 4b092a1..913ad3a 100644 (file)
@@ -490,13 +490,6 @@ ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void
         /* 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))