bool fill_pathname_application_data(char *s, size_t len) { #if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) #ifdef LEGACY_WIN32 const char *appdata = getenv("APPDATA"); if (appdata) { strlcpy(s, appdata, len); return true; } #else const wchar_t *appdataW = _wgetenv(L"APPDATA"); if (appdataW) { char *appdata = utf16_to_utf8_string_alloc(appdataW); if (appdata) { strlcpy(s, appdata, len); free(appdata); return true; } } #endif #elif defined(OSX) const char *appdata = getenv("HOME"); if (appdata) { fill_pathname_join(s, appdata, "Library/Application Support/RetroArch", len); return true; } #elif !defined(RARCH_CONSOLE) const char *xdg = getenv("XDG_CONFIG_HOME"); const char *appdata = getenv("HOME"); /* XDG_CONFIG_HOME falls back to $HOME/.config with most Unix systems */ /* On Haiku, it is set by default to /home/user/config/settings */ if (xdg) { fill_pathname_join(s, xdg, "retroarch/", len); return true; } if (appdata) { #ifdef __HAIKU__ /* in theory never used as Haiku has XDG_CONFIG_HOME set by default */ fill_pathname_join(s, appdata, "config/settings/retroarch/", len); #else fill_pathname_join(s, appdata, ".config/retroarch/", len); #endif return true; } #endif return false; }
void fill_pathname_application_path(char *s, size_t len) { size_t i; #ifdef __APPLE__ CFBundleRef bundle = CFBundleGetMainBundle(); #endif #ifdef _WIN32 DWORD ret; wchar_t wstr[PATH_MAX_LENGTH] = {0}; #endif #ifdef __HAIKU__ image_info info; int32_t cookie = 0; #endif (void)i; if (!len) return; #ifdef _WIN32 #ifdef LEGACY_WIN32 ret = GetModuleFileNameA(GetModuleHandle(NULL), s, len); #else ret = GetModuleFileNameW(GetModuleHandle(NULL), wstr, ARRAY_SIZE(wstr)); if (*wstr) { char *str = utf16_to_utf8_string_alloc(wstr); if (str) { strlcpy(s, str, len); free(str); } } #endif s[ret] = '\0'; #elif defined(__APPLE__) if (bundle) { CFURLRef bundle_url = CFBundleCopyBundleURL(bundle); CFStringRef bundle_path = CFURLCopyPath(bundle_url); CFStringGetCString(bundle_path, s, len, kCFStringEncodingUTF8); CFRelease(bundle_path); CFRelease(bundle_url); retro_assert(strlcat(s, "nobin", len) < len); return; } #elif defined(__HAIKU__) while (get_next_image_info(0, &cookie, &info) == B_OK) { if (info.type == B_APP_IMAGE) { strlcpy(s, info.name, len); return; } } #elif defined(__QNX__) char *buff = malloc(len); if(_cmdname(buff)) strlcpy(s, buff, len); free(buff); #else { pid_t pid; static const char *exts[] = { "exe", "file", "path/a.out" }; char link_path[255]; link_path[0] = *s = '\0'; pid = getpid(); /* Linux, BSD and Solaris paths. Not standardized. */ for (i = 0; i < ARRAY_SIZE(exts); i++) { ssize_t ret; snprintf(link_path, sizeof(link_path), "/proc/%u/%s", (unsigned)pid, exts[i]); ret = readlink(link_path, s, len - 1); if (ret >= 0) { s[ret] = '\0'; return; } } } #endif }