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;
-
- if (cb_data->cb)
- {
- ret = cb_data->cb(m, cb_data->data);
- }
- if (ret)
- {
- eina_array_push(cb_data->array, m);
- }
- return ret;
+ 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;
}
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;
-
- 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);
- }
+ length = strlen(path) + strlen(name) + 2;
+
+ 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);
+ }
}
static int _eina_module_count = 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;
}
/**
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;
}
/**
*/
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;
}
/**
*/
EAPI Eina_Bool eina_module_free(Eina_Module *m)
{
- 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;
+ 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;
}
/**
*/
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;
}
/**
*/
EAPI Eina_Bool eina_module_unload(Eina_Module *m)
{
- 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;
+ 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;
}
/**
*/
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);
}
/**
*/
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;
-
- 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;
- }
- }
- }
+ Dl_info eina_dl;
+
+ 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;
+ }
+ }
+ }
#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;
-
- EINA_SAFETY_ON_NULL_RETURN_VAL(env, NULL);
-
- 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);
-
- 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 NULL;
+ const char *env_dir;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(env, NULL);
+
+ 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);
+
+ 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 NULL;
}
/**
*/
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;
}
/**
*/
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);
}
/**
*/
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);
}
/**
*/
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);
}
/**