Revert "ecore_con: use F_CLOEXEC instead of SOCK_CLOEXEC"
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Wed, 24 Aug 2016 15:02:17 +0000 (12:02 -0300)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Wed, 24 Aug 2016 15:02:17 +0000 (12:02 -0300)
This reverts commit 99d37838f32ef33b805bcefc7dc0320cfda05a0a.

will be fixed in a better way with the following commit.

src/lib/ecore_con/efl_net_dialer_tcp.c
src/lib/ecore_con/efl_net_server_fd.c
src/lib/ecore_con/efl_net_server_tcp.c

index 0866bcb..b835d93 100644 (file)
@@ -11,9 +11,6 @@
 #include "Ecore_Con.h"
 #include "ecore_con_private.h"
 
-#ifdef HAVE_FCNTL
-# include <fcntl.h>
-#endif
 #ifdef HAVE_SYS_SOCKET_H
 # include <sys/socket.h>
 #endif
@@ -54,7 +51,7 @@ _efl_net_dialer_tcp_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Tcp_Data *pd EINA_
 {
    struct sockaddr_storage addr = {};
    char *str, *host, *port;
-   int r, fd;
+   int r, fd, extra_flags = 0;
    socklen_t addrlen;
    char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
 
@@ -121,26 +118,17 @@ _efl_net_dialer_tcp_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Tcp_Data *pd EINA_
         efl_event_callback_call(o, EFL_NET_DIALER_EVENT_RESOLVED, NULL);
      }
 
-   fd = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
+   if (efl_net_socket_fd_close_on_exec_get(o))
+     extra_flags |= SOCK_CLOEXEC;
+
+   fd = socket(addr.ss_family, SOCK_STREAM | extra_flags, IPPROTO_TCP);
    if (fd < 0)
      {
         ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
-            addr.ss_family, strerror(errno));
+            addr.ss_family, extra_flags, strerror(errno));
         return errno;
      }
 
-   if (efl_net_socket_fd_close_on_exec_get(o))
-     {
-        r = fcntl(fd, F_SETFD, FD_CLOEXEC);
-        if (EINA_UNLIKELY(r < 0))
-          {
-             const int err = errno;
-             ERR("fcntl(F_SETFD, FD_CLOEXEC): %s", strerror(err));
-             close(fd);
-             return err;
-          }
-     }
-
    r = connect(fd, (struct sockaddr *)&addr, addrlen);
    if (r < 0)
      {
index fe1e046..06af641 100644 (file)
@@ -39,7 +39,7 @@ _efl_net_server_fd_event_read(void *data EINA_UNUSED, const Eo_Event *event)
    unsigned int count, limit;
    Eina_Bool reject_excess, do_reject = EINA_FALSE;
    struct sockaddr_storage addr;
-   int client, fd;
+   int client, fd, flags = 0;
    socklen_t addrlen;
 
    count = efl_net_server_clients_count_get(o);
@@ -57,8 +57,15 @@ _efl_net_server_fd_event_read(void *data EINA_UNUSED, const Eo_Event *event)
 
    fd = efl_loop_fd_get(o);
 
+   if (efl_net_server_fd_close_on_exec_get(o))
+     flags |= SOCK_CLOEXEC;
+
    addrlen = sizeof(addr);
+#ifdef HAVE_ACCEPT4
+   client = accept4(fd, (struct sockaddr *)&addr, &addrlen, flags);
+#else
    client = accept(fd, (struct sockaddr *)&addr, &addrlen);
+#endif
    if (client < 0)
      {
         Eina_Error err = errno;
@@ -66,11 +73,11 @@ _efl_net_server_fd_event_read(void *data EINA_UNUSED, const Eo_Event *event)
         efl_event_callback_call(o, EFL_NET_SERVER_EVENT_ERROR, &err);
         return;
      }
-   if (efl_net_server_fd_close_on_exec_get(o))
-     {
-        if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
-          ERR("fcntl(%d, F_SETFD, FD_CLOEXEC): %s", fd, strerror(errno));
-     }
+
+#ifndef HAVE_ACCEPT4
+   if (fcntl(fd, F_SETFD, flags) < 0)
+     ERR("fcntl(%d, F_SETFD, %#x): %s", fd, flags, strerror(errno));
+#endif
 
    if (do_reject)
      efl_net_server_fd_client_reject(o, client);
index 78e3857..25bfb01 100644 (file)
@@ -11,9 +11,6 @@
 #include "Ecore_Con.h"
 #include "ecore_con_private.h"
 
-#ifdef HAVE_FCNTL
-# include <fcntl.h>
-#endif
 #ifdef HAVE_SYS_SOCKET_H
 # include <sys/socket.h>
 #endif
@@ -37,7 +34,7 @@ _efl_net_server_tcp_efl_net_server_serve(Eo *o, void *pd EINA_UNUSED, const char
 {
    struct sockaddr_storage addr = {};
    char *str, *host, *port;
-   int r, fd;
+   int r, fd, extra_flags = 0;
    socklen_t addrlen;
    char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
    Eina_Error err = 0;
@@ -100,27 +97,18 @@ _efl_net_server_tcp_efl_net_server_serve(Eo *o, void *pd EINA_UNUSED, const char
    if (efl_net_ip_port_fmt(buf, sizeof(buf), (struct sockaddr *)&addr))
      efl_net_server_address_set(o, buf);
 
+   if (efl_net_server_fd_close_on_exec_get(o))
+     extra_flags |= SOCK_CLOEXEC;
 
-   fd = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
+   fd = socket(addr.ss_family, SOCK_STREAM | extra_flags, IPPROTO_TCP);
    if (fd < 0)
      {
         err = errno;
-        ERR("socket(%d, SOCK_STREAM, IPPROTO_TCP): %s",
-            addr.ss_family, strerror(errno));
+        ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
+            addr.ss_family, extra_flags, strerror(errno));
         goto error_socket;
      }
 
-   if (efl_net_server_fd_close_on_exec_get(o))
-     {
-        r = fcntl(fd, F_SETFD, FD_CLOEXEC);
-        if (EINA_UNLIKELY(r < 0))
-          {
-             const int err = errno;
-             ERR("fcntl(F_SETFD, FD_CLOEXEC): %s", strerror(err));
-             goto error_listen;
-          }
-     }
-
    efl_loop_fd_set(o, fd);
 
    r = bind(fd, (struct sockaddr *)&addr, addrlen);