#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
{
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")];
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)
{
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);
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;
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);
#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
{
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;
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);