forked from enlightenment/efl
parent
d00a91f70d
commit
c1e2a300e4
|
@ -78,68 +78,68 @@ void *alloca (size_t);
|
|||
|
||||
struct _Eina_Module
|
||||
{
|
||||
char *file;
|
||||
void *handle;
|
||||
int ref;
|
||||
char *file;
|
||||
void *handle;
|
||||
int ref;
|
||||
};
|
||||
|
||||
typedef struct _Dir_List_Get_Cb_Data
|
||||
{
|
||||
Eina_Module_Cb cb;
|
||||
void *data;
|
||||
Eina_Array *array;
|
||||
Eina_Module_Cb cb;
|
||||
void *data;
|
||||
Eina_Array *array;
|
||||
} Dir_List_Get_Cb_Data;
|
||||
|
||||
typedef struct _Dir_List_Cb_Data
|
||||
{
|
||||
Eina_Module_Cb cb;
|
||||
void *data;
|
||||
Eina_Module_Cb cb;
|
||||
void *data;
|
||||
} Dir_List_Cb_Data;
|
||||
|
||||
static Eina_Bool _dir_list_get_cb(Eina_Module *m, void *data)
|
||||
{
|
||||
Dir_List_Get_Cb_Data *cb_data = data;
|
||||
Eina_Bool ret = EINA_TRUE;
|
||||
Dir_List_Get_Cb_Data *cb_data = data;
|
||||
Eina_Bool ret = EINA_TRUE;
|
||||
|
||||
if (cb_data->cb)
|
||||
{
|
||||
ret = cb_data->cb(m, cb_data->data);
|
||||
}
|
||||
if (ret)
|
||||
{
|
||||
eina_array_push(cb_data->array, m);
|
||||
}
|
||||
return ret;
|
||||
if (cb_data->cb)
|
||||
{
|
||||
ret = cb_data->cb(m, cb_data->data);
|
||||
}
|
||||
if (ret)
|
||||
{
|
||||
eina_array_push(cb_data->array, m);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void _dir_list_cb(const char *name, const char *path, void *data)
|
||||
{
|
||||
Dir_List_Cb_Data *cb_data = data;
|
||||
Dir_List_Cb_Data *cb_data = data;
|
||||
size_t length;
|
||||
|
||||
length = strlen(name);
|
||||
if (length < strlen(MODULE_EXTENSION) + 1) /* x.so */
|
||||
return;
|
||||
if (!strcmp(name + length - strlen(MODULE_EXTENSION),
|
||||
MODULE_EXTENSION))
|
||||
{
|
||||
char *file;
|
||||
Eina_Module *m;
|
||||
size_t length;
|
||||
|
||||
length = strlen(name);
|
||||
if (length < strlen(MODULE_EXTENSION) + 1) /* x.so */
|
||||
return;
|
||||
if (!strcmp(name + length - strlen(MODULE_EXTENSION),
|
||||
MODULE_EXTENSION))
|
||||
{
|
||||
char *file;
|
||||
Eina_Module *m;
|
||||
size_t length;
|
||||
length = strlen(path) + strlen(name) + 2;
|
||||
|
||||
length = strlen(path) + strlen(name) + 2;
|
||||
file = alloca(sizeof (char) * length);
|
||||
if (!file) return ;
|
||||
|
||||
file = alloca(sizeof (char) * length);
|
||||
if (!file) return ;
|
||||
|
||||
snprintf(file, length, "%s/%s", path, name);
|
||||
m = eina_module_new(file);
|
||||
if (!m)
|
||||
return;
|
||||
/* call the user provided cb on this module */
|
||||
if (!cb_data->cb(m, cb_data->data))
|
||||
eina_module_free(m);
|
||||
}
|
||||
snprintf(file, length, "%s/%s", path, name);
|
||||
m = eina_module_new(file);
|
||||
if (!m)
|
||||
return;
|
||||
/* call the user provided cb on this module */
|
||||
if (!cb_data->cb(m, cb_data->data))
|
||||
eina_module_free(m);
|
||||
}
|
||||
}
|
||||
static int _eina_module_count = 0;
|
||||
|
||||
|
@ -198,22 +198,22 @@ EAPI Eina_Error EINA_ERROR_MODULE_INIT_FAILED = 0;
|
|||
EAPI int
|
||||
eina_module_init(void)
|
||||
{
|
||||
_eina_module_count++;
|
||||
_eina_module_count++;
|
||||
|
||||
if (_eina_module_count != 1)
|
||||
goto end_init;
|
||||
if (_eina_module_count != 1)
|
||||
goto end_init;
|
||||
|
||||
if (!eina_error_init())
|
||||
{
|
||||
fprintf(stderr, "Could not initialize eina error module.\n");
|
||||
return 0;
|
||||
}
|
||||
if (!eina_error_init())
|
||||
{
|
||||
fprintf(stderr, "Could not initialize eina error module.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
EINA_ERROR_WRONG_MODULE = eina_error_msg_register("Wrong file format or no file module found");
|
||||
EINA_ERROR_MODULE_INIT_FAILED = eina_error_msg_register("Module initialisation function failed");
|
||||
EINA_ERROR_WRONG_MODULE = eina_error_msg_register("Wrong file format or no file module found");
|
||||
EINA_ERROR_MODULE_INIT_FAILED = eina_error_msg_register("Module initialisation function failed");
|
||||
|
||||
end_init:
|
||||
return _eina_module_count;
|
||||
end_init:
|
||||
return _eina_module_count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -233,18 +233,18 @@ end_init:
|
|||
EAPI int
|
||||
eina_module_shutdown(void)
|
||||
{
|
||||
_eina_module_count--;
|
||||
if (_eina_module_count != 0)
|
||||
goto end_shutdown;
|
||||
_eina_module_count--;
|
||||
if (_eina_module_count != 0)
|
||||
goto end_shutdown;
|
||||
|
||||
eina_error_shutdown();
|
||||
eina_error_shutdown();
|
||||
|
||||
/* TODO should we store every module when "new" is called and
|
||||
* delete the list of modules here
|
||||
*/
|
||||
/* TODO should we store every module when "new" is called and
|
||||
* delete the list of modules here
|
||||
*/
|
||||
|
||||
end_shutdown:
|
||||
return _eina_module_count;
|
||||
end_shutdown:
|
||||
return _eina_module_count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -264,18 +264,18 @@ end_shutdown:
|
|||
*/
|
||||
EAPI Eina_Module *eina_module_new(const char *file)
|
||||
{
|
||||
Eina_Module *m;
|
||||
Eina_Module *m;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
|
||||
/* TODO check that the file exists. Update doc too */
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
|
||||
/* TODO check that the file exists. Update doc too */
|
||||
|
||||
m = malloc(sizeof(Eina_Module));
|
||||
/* TODO add the magic */
|
||||
m->file = strdup(file);
|
||||
m->ref = 0;
|
||||
m->handle = NULL;
|
||||
m = malloc(sizeof(Eina_Module));
|
||||
/* TODO add the magic */
|
||||
m->file = strdup(file);
|
||||
m->ref = 0;
|
||||
m->handle = NULL;
|
||||
|
||||
return m;
|
||||
return m;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -291,16 +291,16 @@ EAPI Eina_Module *eina_module_new(const char *file)
|
|||
*/
|
||||
EAPI Eina_Bool eina_module_free(Eina_Module *m)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
|
||||
if (m->handle)
|
||||
{
|
||||
if (eina_module_unload(m) == EINA_FALSE)
|
||||
return EINA_FALSE;
|
||||
}
|
||||
free(m->file);
|
||||
free(m);
|
||||
return EINA_TRUE;
|
||||
if (m->handle)
|
||||
{
|
||||
if (eina_module_unload(m) == EINA_FALSE)
|
||||
return EINA_FALSE;
|
||||
}
|
||||
free(m->file);
|
||||
free(m);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -325,38 +325,38 @@ EAPI Eina_Bool eina_module_free(Eina_Module *m)
|
|||
*/
|
||||
EAPI Eina_Bool eina_module_load(Eina_Module *m)
|
||||
{
|
||||
void *dl_handle;
|
||||
Eina_Module_Init *initcall;
|
||||
void *dl_handle;
|
||||
Eina_Module_Init *initcall;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
|
||||
if (m->handle) goto loaded;
|
||||
if (m->handle) goto loaded;
|
||||
|
||||
dl_handle = dlopen(m->file, RTLD_NOW);
|
||||
if (!dl_handle)
|
||||
{
|
||||
EINA_ERROR_PDBG("could not dlopen(\"%s\", RTLD_NOW): %s\n",
|
||||
m->file, dlerror());
|
||||
eina_error_set(EINA_ERROR_WRONG_MODULE);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
initcall = dlsym(dl_handle, EINA_MODULE_SYMBOL_INIT);
|
||||
if ((!initcall) || (!(*initcall)))
|
||||
goto ok;
|
||||
if ((*initcall)() == EINA_TRUE)
|
||||
goto ok;
|
||||
|
||||
eina_error_set(EINA_ERROR_MODULE_INIT_FAILED);
|
||||
dlclose(dl_handle);
|
||||
dl_handle = dlopen(m->file, RTLD_NOW);
|
||||
if (!dl_handle)
|
||||
{
|
||||
EINA_ERROR_PDBG("could not dlopen(\"%s\", RTLD_NOW): %s\n",
|
||||
m->file, dlerror());
|
||||
eina_error_set(EINA_ERROR_WRONG_MODULE);
|
||||
return EINA_FALSE;
|
||||
ok:
|
||||
m->handle = dl_handle;
|
||||
loaded:
|
||||
m->ref++;
|
||||
}
|
||||
|
||||
eina_error_set(0);
|
||||
return EINA_TRUE;
|
||||
initcall = dlsym(dl_handle, EINA_MODULE_SYMBOL_INIT);
|
||||
if ((!initcall) || (!(*initcall)))
|
||||
goto ok;
|
||||
if ((*initcall)() == EINA_TRUE)
|
||||
goto ok;
|
||||
|
||||
eina_error_set(EINA_ERROR_MODULE_INIT_FAILED);
|
||||
dlclose(dl_handle);
|
||||
return EINA_FALSE;
|
||||
ok:
|
||||
m->handle = dl_handle;
|
||||
loaded:
|
||||
m->ref++;
|
||||
|
||||
eina_error_set(0);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -375,20 +375,20 @@ loaded:
|
|||
*/
|
||||
EAPI Eina_Bool eina_module_unload(Eina_Module *m)
|
||||
{
|
||||
Eina_Module_Shutdown *shut;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
Eina_Module_Shutdown *shut;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
|
||||
|
||||
m->ref--;
|
||||
if (!m->ref)
|
||||
{
|
||||
shut = dlsym(m->handle, EINA_MODULE_SYMBOL_SHUTDOWN);
|
||||
if ((shut) && (*shut))
|
||||
(*shut)();
|
||||
dlclose(m->handle);
|
||||
m->handle = NULL;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
return EINA_FALSE;
|
||||
m->ref--;
|
||||
if (!m->ref)
|
||||
{
|
||||
shut = dlsym(m->handle, EINA_MODULE_SYMBOL_SHUTDOWN);
|
||||
if ((shut) && (*shut))
|
||||
(*shut)();
|
||||
dlclose(m->handle);
|
||||
m->handle = NULL;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -405,9 +405,9 @@ EAPI Eina_Bool eina_module_unload(Eina_Module *m)
|
|||
*/
|
||||
EAPI void * eina_module_symbol_get(Eina_Module *m, const char *symbol)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m->handle, NULL);
|
||||
return dlsym(m->handle, symbol);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m->handle, NULL);
|
||||
return dlsym(m->handle, symbol);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -422,76 +422,76 @@ EAPI void * eina_module_symbol_get(Eina_Module *m, const char *symbol)
|
|||
*/
|
||||
EAPI const char * eina_module_file_get(Eina_Module *m)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
|
||||
return m->file;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
|
||||
return m->file;
|
||||
}
|
||||
|
||||
EAPI char *eina_module_symbol_path_get(const void *symbol, const char *sub_dir)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(symbol, NULL);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(symbol, NULL);
|
||||
|
||||
#ifdef HAVE_DLADDR
|
||||
Dl_info eina_dl;
|
||||
Dl_info eina_dl;
|
||||
|
||||
if (dladdr(symbol, &eina_dl))
|
||||
{
|
||||
if (strrchr(eina_dl.dli_fname, '/'))
|
||||
{
|
||||
char *path;
|
||||
int l0;
|
||||
int l1;
|
||||
int l2 = 0;
|
||||
if (dladdr(symbol, &eina_dl))
|
||||
{
|
||||
if (strrchr(eina_dl.dli_fname, '/'))
|
||||
{
|
||||
char *path;
|
||||
int l0;
|
||||
int l1;
|
||||
int l2 = 0;
|
||||
|
||||
l0 = strlen(eina_dl.dli_fname);
|
||||
l1 = strlen(strrchr(eina_dl.dli_fname, '/'));
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
l2 = strlen(sub_dir);
|
||||
path = malloc(l0 - l1 + l2 + 1);
|
||||
if (path)
|
||||
{
|
||||
memcpy(path, eina_dl.dli_fname, l0 - l1);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
memcpy(path + l0 - l1, sub_dir, l2);
|
||||
path[l0 - l1 + l2] = '\0';
|
||||
return path;
|
||||
}
|
||||
}
|
||||
}
|
||||
l0 = strlen(eina_dl.dli_fname);
|
||||
l1 = strlen(strrchr(eina_dl.dli_fname, '/'));
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
l2 = strlen(sub_dir);
|
||||
path = malloc(l0 - l1 + l2 + 1);
|
||||
if (path)
|
||||
{
|
||||
memcpy(path, eina_dl.dli_fname, l0 - l1);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
memcpy(path + l0 - l1, sub_dir, l2);
|
||||
path[l0 - l1 + l2] = '\0';
|
||||
return path;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* ! HAVE_DLADDR */
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EAPI char *eina_module_environment_path_get(const char *env, const char *sub_dir)
|
||||
{
|
||||
const char *env_dir;
|
||||
const char *env_dir;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(env, NULL);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(env, NULL);
|
||||
|
||||
env_dir = getenv(env);
|
||||
if (env_dir)
|
||||
{
|
||||
char *path;
|
||||
size_t l1;
|
||||
size_t l2 = 0;
|
||||
env_dir = getenv(env);
|
||||
if (env_dir)
|
||||
{
|
||||
char *path;
|
||||
size_t l1;
|
||||
size_t l2 = 0;
|
||||
|
||||
l1 = strlen(env_dir);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
l2 = strlen(sub_dir);
|
||||
l1 = strlen(env_dir);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
l2 = strlen(sub_dir);
|
||||
|
||||
path = (char *)malloc(l1 + l2 + 1);
|
||||
if (path)
|
||||
{
|
||||
memcpy(path, env_dir, l1);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
memcpy(path + l1, sub_dir, l2);
|
||||
path[l1 + l2] = '\0';
|
||||
path = (char *)malloc(l1 + l2 + 1);
|
||||
if (path)
|
||||
{
|
||||
memcpy(path, env_dir, l1);
|
||||
if (sub_dir && (*sub_dir != '\0'))
|
||||
memcpy(path + l1, sub_dir, l2);
|
||||
path[l1 + l2] = '\0';
|
||||
|
||||
return path;
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -506,21 +506,21 @@ EAPI char *eina_module_environment_path_get(const char *env, const char *sub_dir
|
|||
*/
|
||||
EAPI Eina_Array * eina_module_list_get(Eina_Array *array, const char *path, unsigned int recursive, Eina_Module_Cb cb, void *data)
|
||||
{
|
||||
Dir_List_Get_Cb_Data list_get_cb_data;
|
||||
Dir_List_Cb_Data list_cb_data;
|
||||
Dir_List_Get_Cb_Data list_get_cb_data;
|
||||
Dir_List_Cb_Data list_cb_data;
|
||||
|
||||
if (!path) return array;
|
||||
if (!path) return array;
|
||||
|
||||
list_get_cb_data.array = array ? array : eina_array_new(4);
|
||||
list_get_cb_data.cb = cb;
|
||||
list_get_cb_data.data = data;
|
||||
list_get_cb_data.array = array ? array : eina_array_new(4);
|
||||
list_get_cb_data.cb = cb;
|
||||
list_get_cb_data.data = data;
|
||||
|
||||
list_cb_data.cb = &_dir_list_get_cb;
|
||||
list_cb_data.data = &list_get_cb_data;
|
||||
list_cb_data.cb = &_dir_list_get_cb;
|
||||
list_cb_data.data = &list_get_cb_data;
|
||||
|
||||
eina_file_dir_list(path, recursive, &_dir_list_cb, &list_cb_data);
|
||||
eina_file_dir_list(path, recursive, &_dir_list_cb, &list_cb_data);
|
||||
|
||||
return list_get_cb_data.array;
|
||||
return list_get_cb_data.array;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -529,14 +529,14 @@ EAPI Eina_Array * eina_module_list_get(Eina_Array *array, const char *path, unsi
|
|||
*/
|
||||
EAPI void eina_module_list_load(Eina_Array *array)
|
||||
{
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_load(m);
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_load(m);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -545,14 +545,14 @@ EAPI void eina_module_list_load(Eina_Array *array)
|
|||
*/
|
||||
EAPI void eina_module_list_unload(Eina_Array *array)
|
||||
{
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_unload(m);
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_unload(m);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -561,16 +561,16 @@ EAPI void eina_module_list_unload(Eina_Array *array)
|
|||
*/
|
||||
EAPI void eina_module_list_flush(Eina_Array *array)
|
||||
{
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
Eina_Array_Iterator iterator;
|
||||
Eina_Module *m;
|
||||
unsigned int i;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
EINA_SAFETY_ON_NULL_RETURN(array);
|
||||
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_free(m);
|
||||
EINA_ARRAY_ITER_NEXT(array, i, m, iterator)
|
||||
eina_module_free(m);
|
||||
|
||||
eina_array_flush(array);
|
||||
eina_array_flush(array);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue