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; }