forked from enlightenment/efl
ecore_con: fix compiling on OSX and BSD
TCP_CORK is Linux only. TCP_NOPUSH is supposed to do the same thing than TCP_CORK, but on BSD (including Mac OS X). We now check for the existance of TCP_CORK or TCP_NOPUSH, and use the right option. If none exist, cork_{set,get} will just fail.
This commit is contained in:
parent
6de774455b
commit
0ced470e39
|
@ -452,6 +452,11 @@ netinet/in.h \
|
||||||
|
|
||||||
EFL_CHECK_PATH_MAX
|
EFL_CHECK_PATH_MAX
|
||||||
|
|
||||||
|
#### Checks for defines in headers
|
||||||
|
|
||||||
|
EFL_CHECK_DEFINE(TCP_CORK, netinet/tcp.h)
|
||||||
|
EFL_CHECK_DEFINE(TCP_NOPUSH, netinet/tcp.h)
|
||||||
|
|
||||||
#### Checks for types
|
#### Checks for types
|
||||||
|
|
||||||
# wchar_t
|
# wchar_t
|
||||||
|
|
|
@ -177,22 +177,41 @@ _efl_net_socket_tcp_no_delay_get(Eo *o, Efl_Net_Socket_Tcp_Data *pd)
|
||||||
return pd->no_delay;
|
return pd->no_delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
_cork_option_get(void)
|
||||||
|
{
|
||||||
|
#if defined(HAVE_TCP_CORK)
|
||||||
|
return TCP_CORK;
|
||||||
|
#elif defined(HAVE_TCP_NOPUSH)
|
||||||
|
return TCP_NOPUSH;
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
EOLIAN static Eina_Bool
|
EOLIAN static Eina_Bool
|
||||||
_efl_net_socket_tcp_cork_set(Eo *o, Efl_Net_Socket_Tcp_Data *pd, Eina_Bool cork)
|
_efl_net_socket_tcp_cork_set(Eo *o, Efl_Net_Socket_Tcp_Data *pd, Eina_Bool cork)
|
||||||
{
|
{
|
||||||
int value, fd;
|
int value, fd, option;
|
||||||
Eina_Bool old = pd->cork;
|
Eina_Bool old = pd->cork;
|
||||||
|
|
||||||
|
option = _cork_option_get();
|
||||||
|
if (EINA_UNLIKELY(option < 0))
|
||||||
|
{
|
||||||
|
ERR("Could not find a TCP_CORK equivalent on your system");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
pd->cork = cork;
|
pd->cork = cork;
|
||||||
|
|
||||||
fd = efl_loop_fd_get(o);
|
fd = efl_loop_fd_get(o);
|
||||||
if (fd < 0) return EINA_TRUE; /* postpone until fd_set() */
|
if (fd < 0) return EINA_TRUE; /* postpone until fd_set() */
|
||||||
|
|
||||||
value = cork;
|
value = cork;
|
||||||
if (setsockopt(fd, IPPROTO_TCP, TCP_CORK, &value, sizeof(value)) < 0)
|
if (setsockopt(fd, IPPROTO_TCP, option, &value, sizeof(value)) < 0)
|
||||||
{
|
{
|
||||||
ERR("setsockopt(%d, IPPROTO_TCP, TCP_CORK, %d): %s",
|
ERR("setsockopt(%d, IPPROTO_TCP, 0x%x, %d): %s",
|
||||||
fd, value, strerror(errno));
|
fd, option, value, strerror(errno));
|
||||||
pd->cork = old;
|
pd->cork = old;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -205,6 +224,14 @@ _efl_net_socket_tcp_cork_get(Eo *o, Efl_Net_Socket_Tcp_Data *pd)
|
||||||
{
|
{
|
||||||
int value = 0, fd;
|
int value = 0, fd;
|
||||||
socklen_t valuelen;
|
socklen_t valuelen;
|
||||||
|
int option;
|
||||||
|
|
||||||
|
option = _cork_option_get();
|
||||||
|
if (EINA_UNLIKELY(option < 0))
|
||||||
|
{
|
||||||
|
ERR("Could not find a TCP_CORK equivalent on your system");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
fd = efl_loop_fd_get(o);
|
fd = efl_loop_fd_get(o);
|
||||||
if (fd < 0) return pd->cork;
|
if (fd < 0) return pd->cork;
|
||||||
|
@ -213,10 +240,10 @@ _efl_net_socket_tcp_cork_get(Eo *o, Efl_Net_Socket_Tcp_Data *pd)
|
||||||
* elsewhere by nasty users.
|
* elsewhere by nasty users.
|
||||||
*/
|
*/
|
||||||
valuelen = sizeof(value);
|
valuelen = sizeof(value);
|
||||||
if (getsockopt(fd, IPPROTO_TCP, TCP_CORK, &value, &valuelen) < 0)
|
if (getsockopt(fd, IPPROTO_TCP, option, &value, &valuelen) < 0)
|
||||||
{
|
{
|
||||||
ERR("getsockopt(%d, IPPROTO_TCP, TCP_CORK): %s",
|
ERR("getsockopt(%d, IPPROTO_TCP, 0x%x): %s",
|
||||||
fd, strerror(errno));
|
fd, option, strerror(errno));
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue