static char* read_custom_path(const char *key) { char *key_path = g_build_filename(fs_get_user_config_dir(), "fs-uae", key, NULL); fs_log("- checking %s\n", key_path); if (fs_path_is_file(key_path)) { FILE * f = fopen(key_path, "rb"); free(key_path); if (f == NULL) { fs_log("- file exists but could not open\n"); return NULL; } char *buffer = (char *) malloc(PATH_MAX + 1); int read_bytes = fread(buffer, 1, PATH_MAX, f); int eof = feof(f); fclose(f); if (!eof) { fs_log("- did not get EOF\n"); free(buffer); return NULL; } buffer[read_bytes] = '\0'; g_strchomp(buffer); fs_log("- read from file: %s\n", buffer); char *result = fs_uae_expand_path(buffer); free(buffer); fs_log("- expanded path: %s\n", result); return result; } return NULL; }
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; }
static void cleanup_old_file(const char *path) { char *p = fs_uae_expand_path(path); if (fs_path_exists(p)) { if (fs_path_is_dir(p)) { fs_log("trying to remove old directory %s\n", p); g_rmdir(p); } else { fs_log("trying to remove old file %s\n", p); g_unlink(p); } } free(p); }
static const char *fs_uae_state_dir_path() { char *free_state_dir_name = NULL; static const char *path; if (!path) { fs_log("fs_uae_state_dir:\n"); path = fs_config_get_const_string("state_dir"); if (path && path[0]) { fs_log("state_dir was explicitly set to: %s\n", path); char *expanded_path = fs_uae_expand_path(path); path = fs_uae_resolve_path(expanded_path, FS_UAE_DIR_PATHS); free(expanded_path); return path; } const char *base = fs_uae_save_states_dir(); fs_log("save_states_dir: %s\n", base); const char *state_dir_name = fs_config_get_const_string( "state_dir_name"); if (!state_dir_name || !state_dir_name[0]) { if (g_fs_uae_config_file_path) { char *n = g_path_get_basename(g_fs_uae_config_file_path); for (int i = strlen(n) - 1; i >= 0; i--) { if (n[i] == '.') { n[i] = '\0'; break; } } free_state_dir_name = g_strdup(n); state_dir_name = free_state_dir_name; g_free(n); } if (!state_dir_name || !state_dir_name[0]) { state_dir_name = "Default"; } fs_log("save_dir_name not set, using %s\n", state_dir_name); } path = g_build_filename(base, state_dir_name, NULL); } if (free_state_dir_name) { g_free(free_state_dir_name); } return path; }
char *fs_uae_expand_path_and_free(char *path) { char *p = fs_uae_expand_path(path); free(path); return p; }