Exemple #1
0
static bool
load_update_module(void)
{
#if (SOL_UPDATE_BUILTIN_COUNT > 0)
    update_module = SOL_UPDATE_BUILTINS_ALL[0];
#elif defined ENABLE_DYNAMIC_MODULES
    void *symbol;
    const char *update_module_name = getenv("SOL_UPDATE_MODULE");
    char *name_to_free = NULL;

    if (!update_module_loader) {
        update_module_loader = sol_lib_loader_new_in_rootdir(
            UPDATEMODULESDIR, "SOL_UPDATE", check_module);
        SOL_NULL_CHECK(update_module_loader, false);
    }

    if (!update_module_name || strlen(update_module_name) == 0) {
        name_to_free = get_first_module_on_dir(UPDATEMODULESDIR);
        update_module_name = name_to_free;
    }
    if (!update_module_name) {
        SOL_DBG("No update module to load");
        return true; /* Not having an update module is not an error */
    }

    symbol = sol_lib_load(update_module_loader, update_module_name);
    free(name_to_free);
    if (!symbol) {
        SOL_DBG("No update module found");
        return true; /* Not having an update module is not an error */
    }

    update_module = *(const struct sol_update **)symbol;
    if (!update_module)
        return false;
#endif
    return true;
}
const struct sol_flow_metatype *
get_dynamic_metatype(const struct sol_str_slice name)
{
    const struct sol_flow_metatype *metatype;
    void *symbol;
    char name_str[PATH_MAX] = {};

    SOL_INT_CHECK(name.len, > (PATH_MAX - 1), NULL);
    memcpy(name_str, name.data, name.len);

    if (!metatype_loader) {
        metatype_loader = sol_lib_loader_new_in_rootdir(
            FLOWMETATYPEMODULESDIR, "SOL_FLOW_METATYPE", check_metatype);
        SOL_NULL_CHECK(metatype_loader, NULL);
    }

    symbol = sol_lib_load(metatype_loader, name_str);
    if (!symbol)
        return NULL;

    metatype = *(const struct sol_flow_metatype **)symbol;
    return metatype;
}