Example #1
0
Eina_Bool
_elm_module_load(Elm_Module *m)
{
   char buf[PATH_MAX];

   if (m->module) return EINA_TRUE;
   if (strchr(m->name, '/')) return EINA_FALSE;

   if (getenv("ELM_RUN_IN_TREE"))
     {
        snprintf(buf, sizeof(buf),
             ELM_TOP_BUILD_DIR "/src/modules/%s/.libs/module"EFL_SHARED_EXTENSION, m->name);
     }
   else
     {
        snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s/module"EFL_SHARED_EXTENSION,
            _elm_lib_dir, m->name, MODULE_ARCH);
     }
   m->module = eina_module_new(buf);
   if ((m->module) && (eina_module_load(m->module) == EINA_TRUE))
     {
        m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init");
        if (m->init_func)
          {
             m->shutdown_func =
               eina_module_symbol_get(m->module, "elm_modapi_shutdown");
             m->so_path = eina_stringshare_add(buf);
             snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s",
                      _elm_lib_dir, m->name, MODULE_ARCH);
             m->bin_dir = eina_stringshare_add(buf);
             snprintf(buf, sizeof(buf), "%s/elementary/modules/%s",
                      _elm_lib_dir, m->name);
             m->data_dir = eina_stringshare_add(buf);
          }
        else
          {
             if (m->module)
               {
                  eina_module_unload(m->module);
                  eina_module_free(m->module);
                  m->module = NULL;
               }
             return EINA_FALSE;
          }
     }
   else if (m->module)
     {
        eina_module_free(m->module);
        m->module = NULL;
     }

   if (!m->module) return EINA_FALSE;
   return EINA_TRUE;
}
EAPI Eina_Bool eina_module_free(Eina_Module *m)
{
   EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);

   DBG("m=%p, handle=%p, file=%s, refs=%d", m, m->handle, m->file, m->ref);

   if (m->handle)
      if (eina_module_unload(m) == EINA_FALSE)
         return EINA_FALSE;

   free(m);
   return EINA_TRUE;
}
Example #3
0
void
_elm_module_unload(Elm_Module *m)
{
   eina_stringshare_del(m->so_path);
   eina_stringshare_del(m->data_dir);
   eina_stringshare_del(m->bin_dir);
   ELM_SAFE_FREE(m->api, free);
   if (m->module)
     {
        if (m->shutdown_func) m->shutdown_func(m);
        eina_module_unload(m->module);
        eina_module_free(m->module);
        m->module = NULL;
     }
   m->shutdown_func = NULL;
   m->init_func = NULL;
}
Example #4
0
Eina_Bool
_elm_module_load(Elm_Module *m)
{
   const char *home;
   char buf[PATH_MAX];

   if (m->module) return EINA_TRUE;

   home = getenv("HOME");
   if (home)
     {
        snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s/module" EFL_SHARED_EXTENSION, home, m->name, MODULE_ARCH);
        m->module = eina_module_new(buf);
        if (m->module && eina_module_load (m->module) == EINA_TRUE)
          {
             m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init");
             if (m->init_func)
               {
                  m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown");
                  m->so_path = eina_stringshare_add(buf);
                  snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s", home, m->name, MODULE_ARCH);
                  m->bin_dir = eina_stringshare_add(buf);
                  snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s", home, m->name);
                  m->data_dir = eina_stringshare_add(buf);
               }
             else
               {
                  if (m->module)
                    {
                       eina_module_unload(m->module);
                       eina_module_free(m->module);
                       m->module = NULL;
                    }
                  return EINA_FALSE;
               }
          }
        else if (m->module)
          {
            eina_module_free(m->module);
            m->module = NULL;
          }
     }

   if (!m->module)
     {
        snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s/module" EFL_SHARED_EXTENSION, _elm_lib_dir, m->name, MODULE_ARCH);
        m->module = eina_module_new(buf);
        if (m->module && eina_module_load (m->module) == EINA_TRUE)
          {
             m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init");
             if (m->init_func)
               {
                  m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown");
                  m->so_path = eina_stringshare_add(buf);
                  snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s", _elm_lib_dir, m->name, MODULE_ARCH);
                  m->bin_dir = eina_stringshare_add(buf);
                  snprintf(buf, sizeof(buf), "%s/elementary/modules/%s", _elm_lib_dir, m->name);
                  m->data_dir = eina_stringshare_add(buf);
               }
             else
               {
                  if (m->module)
                    {
                       eina_module_unload(m->module);
                       eina_module_free(m->module);
                       m->module = NULL;
                    }
                  return EINA_FALSE;
               }
          }
     }
   else if (m->module)
     {
       eina_module_free(m->module);
       m->module = NULL;
     }

   if (!m->module) return EINA_FALSE;
   return EINA_TRUE;
}