jayji pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=99d37838f32ef33b805bcefc7dc0320cfda05a0a

commit 99d37838f32ef33b805bcefc7dc0320cfda05a0a
Author: Jean Guyomarc'h <[email protected]>
Date:   Tue Aug 23 13:51:14 2016 +0200

    ecore_con: use F_CLOEXEC instead of SOCK_CLOEXEC
    
    Mac OS X does not provide SOCK_CLOEXEC. Instead, we can use
    fcntl() with F_CLOEXEC.
    Fixes Mac OS X build.
---
 src/lib/ecore_con/efl_net_dialer_tcp.c | 24 ++++++++++++++++++------
 src/lib/ecore_con/efl_net_server_fd.c  | 19 ++++++-------------
 src/lib/ecore_con/efl_net_server_tcp.c | 24 ++++++++++++++++++------
 3 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/src/lib/ecore_con/efl_net_dialer_tcp.c 
b/src/lib/ecore_con/efl_net_dialer_tcp.c
index b835d93..0866bcb 100644
--- a/src/lib/ecore_con/efl_net_dialer_tcp.c
+++ b/src/lib/ecore_con/efl_net_dialer_tcp.c
@@ -11,6 +11,9 @@
 #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
@@ -51,7 +54,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, extra_flags = 0;
+   int r, fd;
    socklen_t addrlen;
    char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
 
@@ -118,17 +121,26 @@ _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);
      }
 
-   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);
+   fd = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
    if (fd < 0)
      {
         ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
-            addr.ss_family, extra_flags, strerror(errno));
+            addr.ss_family, 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)
      {
diff --git a/src/lib/ecore_con/efl_net_server_fd.c 
b/src/lib/ecore_con/efl_net_server_fd.c
index 06af641..fe1e046 100644
--- a/src/lib/ecore_con/efl_net_server_fd.c
+++ b/src/lib/ecore_con/efl_net_server_fd.c
@@ -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, flags = 0;
+   int client, fd;
    socklen_t addrlen;
 
    count = efl_net_server_clients_count_get(o);
@@ -57,15 +57,8 @@ _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;
@@ -73,11 +66,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;
      }
-
-#ifndef HAVE_ACCEPT4
-   if (fcntl(fd, F_SETFD, flags) < 0)
-     ERR("fcntl(%d, F_SETFD, %#x): %s", fd, flags, strerror(errno));
-#endif
+   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));
+     }
 
    if (do_reject)
      efl_net_server_fd_client_reject(o, client);
diff --git a/src/lib/ecore_con/efl_net_server_tcp.c 
b/src/lib/ecore_con/efl_net_server_tcp.c
index 25bfb01..78e3857 100644
--- a/src/lib/ecore_con/efl_net_server_tcp.c
+++ b/src/lib/ecore_con/efl_net_server_tcp.c
@@ -11,6 +11,9 @@
 #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
@@ -34,7 +37,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, extra_flags = 0;
+   int r, fd;
    socklen_t addrlen;
    char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
    Eina_Error err = 0;
@@ -97,18 +100,27 @@ _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 | extra_flags, IPPROTO_TCP);
+   fd = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
    if (fd < 0)
      {
         err = errno;
-        ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
-            addr.ss_family, extra_flags, strerror(errno));
+        ERR("socket(%d, SOCK_STREAM, IPPROTO_TCP): %s",
+            addr.ss_family, 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);

-- 


Reply via email to