static bool find_first_libretro(char *path, size_t size, const char *dir, const char *rom_path) { bool ret = false; const char *ext = path_get_extension(rom_path); if (!ext || !*ext) { RARCH_ERR("Path has no extension. Cannot infer libretro implementation.\n"); return false; } RARCH_LOG("Searching for valid libretro implementation in: \"%s\".\n", dir); struct string_list *list = dir_list_new(dir, DYNAMIC_EXT, false); if (!list) { RARCH_ERR("Couldn't open directory: \"%s\".\n", dir); return false; } for (size_t i = 0; i < list->size && !ret; i++) { RARCH_LOG("Checking library: \"%s\".\n", list->elems[i].data); struct retro_system_info info = {0}; dylib_t lib = libretro_get_system_info_lib(list->elems[i].data, &info, NULL); if (!lib) continue; if (!info.valid_extensions) { dylib_close(lib); continue; } struct string_list *supported_ext = string_split(info.valid_extensions, "|"); if (string_list_find_elem(supported_ext, ext)) { strlcpy(path, list->elems[i].data, size); ret = true; } string_list_free(supported_ext); dylib_close(lib); } dir_list_free(list); return ret; }
bool libretro_get_system_info(const char *path, struct retro_system_info *info, bool *load_no_rom) { struct retro_system_info dummy_info = {0}; dylib_t lib = libretro_get_system_info_lib(path, &dummy_info, load_no_rom); if (!lib) return false; memcpy(info, &dummy_info, sizeof(*info)); info->library_name = strdup(dummy_info.library_name); info->library_version = strdup(dummy_info.library_version); if (dummy_info.valid_extensions) info->valid_extensions = strdup(dummy_info.valid_extensions); dylib_close(lib); return true; }
/** * libretro_get_system_info: * @path : Path to libretro library. * @info : Pointer to system info information. * @load_no_content : If true, core should be able to auto-start * without any content loaded. * * Gets system info from an arbitrary lib. * The struct returned must be freed as strings are allocated dynamically. * * Returns: true (1) if successful, otherwise false (0). **/ bool libretro_get_system_info(const char *path, struct retro_system_info *info, bool *load_no_content) { #ifdef HAVE_DYNAMIC struct retro_system_info dummy_info = {0}; dylib_t lib = libretro_get_system_info_lib(path, &dummy_info, load_no_content); if (!lib) return false; memcpy(info, &dummy_info, sizeof(*info)); info->library_name = strdup(dummy_info.library_name); info->library_version = strdup(dummy_info.library_version); if (dummy_info.valid_extensions) info->valid_extensions = strdup(dummy_info.valid_extensions); dylib_close(lib); #else if (!libretro_get_system_info_static(info, load_no_content)) return false; #endif return true; }