diff options
Diffstat (limited to 'src/porting.cpp')
-rw-r--r-- | src/porting.cpp | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/src/porting.cpp b/src/porting.cpp index 76fd592d6..d902d3737 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -28,27 +28,39 @@ with this program; if not, write to the Free Software Foundation, Inc., #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) #include <sys/types.h> #include <sys/sysctl.h> + extern char **environ; #elif defined(_WIN32) #include <windows.h> #include <wincrypt.h> #include <algorithm> #include <shlwapi.h> + #include <shellapi.h> #endif #if !defined(_WIN32) #include <unistd.h> #include <sys/utsname.h> + #if !defined(__ANDROID__) + #include <spawn.h> + #endif #endif #if defined(__hpux) #define _PSTAT64 #include <sys/pstat.h> #endif +#if defined(__ANDROID__) + #include "porting_android.h" +#endif +#if defined(__APPLE__) + // For _NSGetEnviron() + // Related: https://gitlab.haskell.org/ghc/ghc/issues/2458 + #include <crt_externs.h> +#endif #include "config.h" #include "debug.h" #include "filesys.h" #include "log.h" #include "util/string.h" -#include "settings.h" #include <list> #include <cstdarg> #include <cstdio> @@ -598,18 +610,18 @@ void initializePaths() #if USE_GETTEXT bool found_localedir = false; # ifdef STATIC_LOCALEDIR - if (STATIC_LOCALEDIR[0] && fs::PathExists(STATIC_LOCALEDIR)) { + /* STATIC_LOCALEDIR may be a generalized path such as /usr/share/locale that + * doesn't necessarily contain our locale files, so check data path first. */ + path_locale = getDataPath("locale"); + if (fs::PathExists(path_locale)) { + found_localedir = true; + infostream << "Using in-place locale directory " << path_locale + << " even though a static one was provided." << std::endl; + } else if (STATIC_LOCALEDIR[0] && fs::PathExists(STATIC_LOCALEDIR)) { found_localedir = true; path_locale = STATIC_LOCALEDIR; - infostream << "Using locale directory " << STATIC_LOCALEDIR << std::endl; - } else { - path_locale = getDataPath("locale"); - if (fs::PathExists(path_locale)) { - found_localedir = true; - infostream << "Using in-place locale directory " << path_locale - << " even though a static one was provided " - << "(RUN_IN_PLACE or CUSTOM_LOCALEDIR)." << std::endl; - } + infostream << "Using static locale directory " << STATIC_LOCALEDIR + << std::endl; } # else path_locale = getDataPath("locale"); @@ -697,6 +709,29 @@ int mt_snprintf(char *buf, const size_t buf_size, const char *fmt, ...) return c; } +bool openURL(const std::string &url) +{ + if ((url.substr(0, 7) != "http://" && url.substr(0, 8) != "https://") || + url.find_first_of("\r\n") != std::string::npos) { + errorstream << "Invalid url: " << url << std::endl; + return false; + } + +#if defined(_WIN32) + return (intptr_t)ShellExecuteA(NULL, NULL, url.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32; +#elif defined(__ANDROID__) + openURLAndroid(url); + return true; +#elif defined(__APPLE__) + const char *argv[] = {"open", url.c_str(), NULL}; + return posix_spawnp(NULL, "open", NULL, NULL, (char**)argv, + (*_NSGetEnviron())) == 0; +#else + const char *argv[] = {"xdg-open", url.c_str(), NULL}; + return posix_spawnp(NULL, "xdg-open", NULL, NULL, (char**)argv, environ) == 0; +#endif +} + // Load performance counter frequency only once at startup #ifdef _WIN32 |