ecore: force initialization of Efl.Io.Closer.Fd.

This will prevent closing magically fd 0 when the object is not
initialized yet.
This commit is contained in:
Cedric Bail 2017-09-22 14:55:55 -07:00
parent 6232fa2a9b
commit 17507bab43
1 changed files with 23 additions and 1 deletions

View File

@ -13,28 +13,43 @@
typedef struct _Efl_Io_Closer_Fd_Data
{
int fd;
Eina_Bool close_on_exec;
Eina_Bool close_on_destructor;
Eina_Bool initialized;
} Efl_Io_Closer_Fd_Data;
static void
_efl_io_closer_initialize(Efl_Io_Closer_Fd_Data *pd)
{
if (pd->initialized) return ;
pd->fd = -1;
pd->initialized = EINA_TRUE;
}
EOLIAN static void
_efl_io_closer_fd_closer_fd_set(Eo *o EINA_UNUSED, Efl_Io_Closer_Fd_Data *pd, int fd)
{
_efl_io_closer_initialize(pd);
pd->fd = fd;
}
EOLIAN static int
_efl_io_closer_fd_closer_fd_get(Eo *o EINA_UNUSED, Efl_Io_Closer_Fd_Data *pd)
{
_efl_io_closer_initialize(pd);
return pd->fd;
}
EOLIAN static Eina_Error
_efl_io_closer_fd_efl_io_closer_close(Eo *o, Efl_Io_Closer_Fd_Data *pd EINA_UNUSED)
{
int fd = efl_io_closer_fd_get(o);
int fd;
Eina_Error err = 0;
_efl_io_closer_initialize(pd);
fd = efl_io_closer_fd_get(o);
EINA_SAFETY_ON_TRUE_RETURN_VAL(fd < 0, EBADF);
efl_io_closer_fd_set(o, -1);
@ -46,12 +61,15 @@ _efl_io_closer_fd_efl_io_closer_close(Eo *o, Efl_Io_Closer_Fd_Data *pd EINA_UNUS
EOLIAN static Eina_Bool
_efl_io_closer_fd_efl_io_closer_closed_get(Eo *o, Efl_Io_Closer_Fd_Data *pd EINA_UNUSED)
{
_efl_io_closer_initialize(pd);
return efl_io_closer_fd_get(o) < 0;
}
EOLIAN static Eina_Bool
_efl_io_closer_fd_efl_io_closer_close_on_exec_set(Eo *o, Efl_Io_Closer_Fd_Data *pd, Eina_Bool close_on_exec)
{
_efl_io_closer_initialize(pd);
#ifdef _WIN32
DBG("close on exec is not supported on windows");
pd->close_on_exec = close_on_exec;
@ -83,6 +101,8 @@ _efl_io_closer_fd_efl_io_closer_close_on_exec_set(Eo *o, Efl_Io_Closer_Fd_Data *
EOLIAN static Eina_Bool
_efl_io_closer_fd_efl_io_closer_close_on_exec_get(Eo *o, Efl_Io_Closer_Fd_Data *pd)
{
_efl_io_closer_initialize(pd);
#ifdef _WIN32
return pd->close_on_exec;
(void)o;
@ -110,12 +130,14 @@ _efl_io_closer_fd_efl_io_closer_close_on_exec_get(Eo *o, Efl_Io_Closer_Fd_Data *
EOLIAN static void
_efl_io_closer_fd_efl_io_closer_close_on_destructor_set(Eo *o EINA_UNUSED, Efl_Io_Closer_Fd_Data *pd, Eina_Bool close_on_destructor)
{
_efl_io_closer_initialize(pd);
pd->close_on_destructor = close_on_destructor;
}
EOLIAN static Eina_Bool
_efl_io_closer_fd_efl_io_closer_close_on_destructor_get(Eo *o EINA_UNUSED, Efl_Io_Closer_Fd_Data *pd)
{
_efl_io_closer_initialize(pd);
return pd->close_on_destructor;
}