diff --git a/src/lib/ecore_con/efl_net_dialer_tcp.c b/src/lib/ecore_con/efl_net_dialer_tcp.c index 0866bcbb08..b835d93f02 100644 --- a/src/lib/ecore_con/efl_net_dialer_tcp.c +++ b/src/lib/ecore_con/efl_net_dialer_tcp.c @@ -11,9 +11,6 @@ #include "Ecore_Con.h" #include "ecore_con_private.h" -#ifdef HAVE_FCNTL -# include -#endif #ifdef HAVE_SYS_SOCKET_H # include #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) { diff --git a/src/lib/ecore_con/efl_net_server_fd.c b/src/lib/ecore_con/efl_net_server_fd.c index fe1e046f6c..06af641fb7 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; + 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); diff --git a/src/lib/ecore_con/efl_net_server_tcp.c b/src/lib/ecore_con/efl_net_server_tcp.c index 78e38575c5..25bfb01aef 100644 --- a/src/lib/ecore_con/efl_net_server_tcp.c +++ b/src/lib/ecore_con/efl_net_server_tcp.c @@ -11,9 +11,6 @@ #include "Ecore_Con.h" #include "ecore_con_private.h" -#ifdef HAVE_FCNTL -# include -#endif #ifdef HAVE_SYS_SOCKET_H # include #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);