forked from enlightenment/efl
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.
This commit is contained in:
parent
0ced470e39
commit
99d37838f3
|
@ -11,6 +11,9 @@
|
||||||
#include "Ecore_Con.h"
|
#include "Ecore_Con.h"
|
||||||
#include "ecore_con_private.h"
|
#include "ecore_con_private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL
|
||||||
|
# include <fcntl.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
#endif
|
#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 = {};
|
struct sockaddr_storage addr = {};
|
||||||
char *str, *host, *port;
|
char *str, *host, *port;
|
||||||
int r, fd, extra_flags = 0;
|
int r, fd;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
|
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);
|
efl_event_callback_call(o, EFL_NET_DIALER_EVENT_RESOLVED, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (efl_net_socket_fd_close_on_exec_get(o))
|
fd = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
|
||||||
extra_flags |= SOCK_CLOEXEC;
|
|
||||||
|
|
||||||
fd = socket(addr.ss_family, SOCK_STREAM | extra_flags, IPPROTO_TCP);
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
|
ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
|
||||||
addr.ss_family, extra_flags, strerror(errno));
|
addr.ss_family, strerror(errno));
|
||||||
return 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);
|
r = connect(fd, (struct sockaddr *)&addr, addrlen);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,7 +39,7 @@ _efl_net_server_fd_event_read(void *data EINA_UNUSED, const Eo_Event *event)
|
||||||
unsigned int count, limit;
|
unsigned int count, limit;
|
||||||
Eina_Bool reject_excess, do_reject = EINA_FALSE;
|
Eina_Bool reject_excess, do_reject = EINA_FALSE;
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
int client, fd, flags = 0;
|
int client, fd;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
|
|
||||||
count = efl_net_server_clients_count_get(o);
|
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);
|
fd = efl_loop_fd_get(o);
|
||||||
|
|
||||||
if (efl_net_server_fd_close_on_exec_get(o))
|
|
||||||
flags |= SOCK_CLOEXEC;
|
|
||||||
|
|
||||||
addrlen = sizeof(addr);
|
addrlen = sizeof(addr);
|
||||||
#ifdef HAVE_ACCEPT4
|
|
||||||
client = accept4(fd, (struct sockaddr *)&addr, &addrlen, flags);
|
|
||||||
#else
|
|
||||||
client = accept(fd, (struct sockaddr *)&addr, &addrlen);
|
client = accept(fd, (struct sockaddr *)&addr, &addrlen);
|
||||||
#endif
|
|
||||||
if (client < 0)
|
if (client < 0)
|
||||||
{
|
{
|
||||||
Eina_Error err = errno;
|
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);
|
efl_event_callback_call(o, EFL_NET_SERVER_EVENT_ERROR, &err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (efl_net_server_fd_close_on_exec_get(o))
|
||||||
#ifndef HAVE_ACCEPT4
|
{
|
||||||
if (fcntl(fd, F_SETFD, flags) < 0)
|
if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
|
||||||
ERR("fcntl(%d, F_SETFD, %#x): %s", fd, flags, strerror(errno));
|
ERR("fcntl(%d, F_SETFD, FD_CLOEXEC): %s", fd, strerror(errno));
|
||||||
#endif
|
}
|
||||||
|
|
||||||
if (do_reject)
|
if (do_reject)
|
||||||
efl_net_server_fd_client_reject(o, client);
|
efl_net_server_fd_client_reject(o, client);
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
#include "Ecore_Con.h"
|
#include "Ecore_Con.h"
|
||||||
#include "ecore_con_private.h"
|
#include "ecore_con_private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL
|
||||||
|
# include <fcntl.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
#endif
|
#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 = {};
|
struct sockaddr_storage addr = {};
|
||||||
char *str, *host, *port;
|
char *str, *host, *port;
|
||||||
int r, fd, extra_flags = 0;
|
int r, fd;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
|
char buf[INET6_ADDRSTRLEN + sizeof("[]:65536")];
|
||||||
Eina_Error err = 0;
|
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))
|
if (efl_net_ip_port_fmt(buf, sizeof(buf), (struct sockaddr *)&addr))
|
||||||
efl_net_server_address_set(o, buf);
|
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)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
err = errno;
|
err = errno;
|
||||||
ERR("socket(%d, SOCK_STREAM | %#x, IPPROTO_TCP): %s",
|
ERR("socket(%d, SOCK_STREAM, IPPROTO_TCP): %s",
|
||||||
addr.ss_family, extra_flags, strerror(errno));
|
addr.ss_family, strerror(errno));
|
||||||
goto error_socket;
|
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);
|
efl_loop_fd_set(o, fd);
|
||||||
|
|
||||||
r = bind(fd, (struct sockaddr *)&addr, addrlen);
|
r = bind(fd, (struct sockaddr *)&addr, addrlen);
|
||||||
|
|
Loading…
Reference in New Issue