static const char* fs_uae_app_dir() { static const char* path = NULL; if (path == NULL) { char *app_dir = (char*) malloc(MAX_PATH); fs_get_application_exe_dir(app_dir, MAX_PATH); char *p = g_strdup(app_dir); g_free(app_dir); path = p; #ifdef MACOSX char *base_name = g_path_get_basename(p); if (strcmp(base_name, "MacOS") == 0) { char *temp; temp = p; p = g_path_get_dirname(p); g_free(temp); temp = p; p = g_path_get_dirname(p); g_free(temp); temp = p; p = g_path_get_dirname(p); g_free(temp); path = p; } free(base_name); #endif fs_log("- using $app directory \"%s\"\n", path); } return path; }
const char* fs_uae_base_dir(void) { static const char* path; if (path) { return path; } path = fs_config_get_const_string("base_dir"); if (path) { fs_log("base specified via base_dir option\n"); path = fs_uae_expand_path(path); } if (path == NULL) { // FIXME: deprecated const char *env_path = getenv("FS_UAE_BASE_DIR"); if (env_path && env_path[0]) { path = env_path; fs_log("base specified via FS_UAE_BASE_DIR\n"); fs_emu_deprecated("FS_UAE_BASE_DIR is deprecated"); } } if (path == NULL) { // check for portable dir char buffer[MAX_PATH]; fs_get_application_exe_dir(buffer, MAX_PATH); char *next = g_strdup(buffer); char *orig = g_strdup(":INVALID;"); while (strcmp(orig, next) != 0) { char *test = g_build_filename(next, "Portable.ini", NULL); fs_log("checking %s\n", test); if (fs_path_exists(test)) { path = next; fs_log("using portable base dir %s\n", path); g_free(orig); break; } g_free(test); g_free(orig); orig = next; next = g_path_get_dirname(next); } } if (path == NULL) { path = read_custom_path("base-dir"); } if (path == NULL) { fs_log("- using base dir $DOCUMENTS/FS-UAE\n"); path = g_build_filename(fs_uae_documents_dir(), "FS-UAE", NULL); } int result = g_mkdir_with_parents(path, 0755); if (result == -1) { fs_emu_warning("Could not create base directory " "at %s", path); path = fs_uae_documents_dir(); } fs_log("- using base ($BASE / $FSUAE) directory \"%s\"\n", path); return path; }
const char* fs_uae_exe_dir() { static const char* path = NULL; if (path == NULL) { char *app_dir = (char*) malloc(MAX_PATH); fs_get_application_exe_dir(app_dir, MAX_PATH); char *p = g_strdup(app_dir); g_free(app_dir); path = p; fs_log("- using $exe directory \"%s\"\n", path); } return path; }
int fs_data_init(const char *app_name, const char *dat_name) { fs_log("fs_data_init %s %s\n", app_name, dat_name); char exe_path[PATH_MAX + 1]; int result = fs_get_application_exe_path(exe_path, PATH_MAX); if (result != 1) { return 1; } g_dat_table = g_hash_table_new(g_str_hash, g_str_equal); /* Check for embedded dat file */ fs_log("checking dat file: %s\n", exe_path); g_dat_file = g_fopen(exe_path, "rb"); int error = read_zip_entries(g_dat_file); if (error == 0) { return 0; } fs_log("no dat file: %s\n", exe_path); fclose(g_dat_file); g_dat_file = NULL; result = fs_get_application_exe_dir(exe_path, PATH_MAX); if (result != 1) { return 1; } /* Check if dat file is placed alongside the executable */ char *dat_path = g_build_filename(exe_path, dat_name, NULL); fs_log("checking dat file: %s\n", dat_path); g_dat_file = g_fopen(dat_path, "rb"); free(dat_path); if (g_dat_file == NULL) { char *dat_path = g_build_filename( exe_path, "..", "share", app_name, dat_name, NULL); fs_log("checking dat file: %s\n", dat_path); g_dat_file = g_fopen(dat_path, "rb"); free(dat_path); } if (g_dat_file == NULL) { error = 10; } else { error = read_zip_entries(g_dat_file); if (error == 0) { return 0; } } return error; }