X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fporting.cpp;h=76fd592d6083d81c171a3496156ac40df5535402;hb=8f73ec6c6c18ea5676261064399a650911333da5;hp=b453b7f76d0dbf02338a7d2c926814046bbd758f;hpb=32b68de65a303f0e063cb0d61a79ff7b4837ad7f;p=oweals%2Fminetest.git diff --git a/src/porting.cpp b/src/porting.cpp index b453b7f76..76fd592d6 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include + #include #endif #if !defined(_WIN32) #include @@ -49,6 +50,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "settings.h" #include +#include +#include namespace porting { @@ -59,7 +62,7 @@ namespace porting bool g_killed = false; -bool * signal_handler_killstatus(void) +bool *signal_handler_killstatus() { return &g_killed; } @@ -167,26 +170,32 @@ bool detectMSVCBuildDir(const std::string &path) "bin\\Build", NULL }; - return (removeStringEnd(path, ends) != ""); + return (!removeStringEnd(path, ends).empty()); } std::string get_sysinfo() { #ifdef _WIN32 - OSVERSIONINFO osvi; + std::ostringstream oss; - std::string tmp; - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - tmp = osvi.szCSDVersion; - std::replace(tmp.begin(), tmp.end(), ' ', '_'); - - oss << "Windows/" << osvi.dwMajorVersion << "." - << osvi.dwMinorVersion; - if (osvi.szCSDVersion[0]) - oss << "-" << tmp; - oss << " "; + LPSTR filePath = new char[MAX_PATH]; + UINT blockSize; + VS_FIXEDFILEINFO *fixedFileInfo; + + GetSystemDirectoryA(filePath, MAX_PATH); + PathAppendA(filePath, "kernel32.dll"); + + DWORD dwVersionSize = GetFileVersionInfoSizeA(filePath, NULL); + LPBYTE lpVersionInfo = new BYTE[dwVersionSize]; + + GetFileVersionInfoA(filePath, 0, dwVersionSize, lpVersionInfo); + VerQueryValueA(lpVersionInfo, "\\", (LPVOID *)&fixedFileInfo, &blockSize); + + oss << "Windows/" + << HIWORD(fixedFileInfo->dwProductVersionMS) << '.' // Major + << LOWORD(fixedFileInfo->dwProductVersionMS) << '.' // Minor + << HIWORD(fixedFileInfo->dwProductVersionLS) << ' '; // Build + #ifdef _WIN64 oss << "x86_64"; #else @@ -197,6 +206,9 @@ std::string get_sysinfo() oss << "x86"; #endif + delete[] lpVersionInfo; + delete[] filePath; + return oss.str(); #else struct utsname osinfo; @@ -341,6 +353,21 @@ bool getCurrentExecPath(char *buf, size_t len) #endif +//// Non-Windows +#if !defined(_WIN32) + +const char *getHomeOrFail() +{ + const char *home = getenv("HOME"); + // In rare cases the HOME environment variable may be unset + FATAL_ERROR_IF(!home, + "Required environment variable HOME is not set"); + return home; +} + +#endif + + //// Windows #if defined(_WIN32) @@ -353,20 +380,27 @@ bool setSystemPaths() "Failed to get current executable path"); pathRemoveFile(buf, '\\'); + std::string exepath(buf); + // Use ".\bin\.." - path_share = std::string(buf) + "\\.."; + path_share = exepath + "\\.."; + if (detectMSVCBuildDir(exepath)) { + // The msvc build dir schould normaly not be present if properly installed, + // but its usefull for debugging. + path_share += DIR_DELIM ".."; + } - // Use "C:\Documents and Settings\user\Application Data\" + // Use "C:\Users\\AppData\Roaming\" DWORD len = GetEnvironmentVariable("APPDATA", buf, sizeof(buf)); FATAL_ERROR_IF(len == 0 || len > sizeof(buf), "Failed to get APPDATA"); - path_user = std::string(buf) + DIR_DELIM + PROJECT_NAME; + path_user = std::string(buf) + DIR_DELIM + PROJECT_NAME_C; return true; } //// Linux -#elif defined(__linux__) +#elif defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) bool setSystemPaths() { @@ -388,7 +422,7 @@ bool setSystemPaths() // It is identified by containing the subdirectory "builtin". std::list trylist; std::string static_sharedir = STATIC_SHAREDIR; - if (static_sharedir != "" && static_sharedir != ".") + if (!static_sharedir.empty() && static_sharedir != ".") trylist.push_back(static_sharedir); trylist.push_back(bindir + DIR_DELIM ".." DIR_DELIM "share" @@ -420,7 +454,7 @@ bool setSystemPaths() } #ifndef __ANDROID__ - path_user = std::string(getenv("HOME")) + DIR_DELIM "." + path_user = std::string(getHomeOrFail()) + DIR_DELIM "." + PROJECT_NAME; #endif @@ -444,7 +478,7 @@ bool setSystemPaths() } CFRelease(resources_url); - path_user = std::string(getenv("HOME")) + path_user = std::string(getHomeOrFail()) + "/Library/Application Support/" + PROJECT_NAME; return true; @@ -456,7 +490,7 @@ bool setSystemPaths() bool setSystemPaths() { path_share = STATIC_SHAREDIR; - path_user = std::string(getenv("HOME")) + DIR_DELIM "." + path_user = std::string(getHomeOrFail()) + DIR_DELIM "." + lowercase(PROJECT_NAME); return true; } @@ -534,6 +568,10 @@ void initializePaths() if (!setSystemPaths()) errorstream << "Failed to get one or more system-wide path" << std::endl; + +# ifdef _WIN32 + path_cache = path_user + DIR_DELIM + "cache"; +# else // Initialize path_cache // First try $XDG_CACHE_HOME/PROJECT_NAME const char *cache_dir = getenv("XDG_CACHE_HOME"); @@ -550,7 +588,8 @@ void initializePaths() } // Migrate cache folder to new location if possible migrateCachePath(); -#endif +# endif // _WIN32 +#endif // RUN_IN_PLACE infostream << "Detected share path: " << path_share << std::endl; infostream << "Detected user path: " << path_user << std::endl; @@ -623,7 +662,7 @@ bool secure_rand_fill_buf(void *buf, size_t len) #endif -void attachOrCreateConsole(void) +void attachOrCreateConsole() { #ifdef _WIN32 static bool consoleAllocated = false; @@ -636,6 +675,28 @@ void attachOrCreateConsole(void) #endif } +int mt_snprintf(char *buf, const size_t buf_size, const char *fmt, ...) +{ + // https://msdn.microsoft.com/en-us/library/bt7tawza.aspx + // Many of the MSVC / Windows printf-style functions do not support positional + // arguments (eg. "%1$s"). We just forward the call to vsnprintf for sane + // platforms, but defer to _vsprintf_p on MSVC / Windows. + // https://github.com/FFmpeg/FFmpeg/blob/5ae9fa13f5ac640bec113120d540f70971aa635d/compat/msvcrt/snprintf.c#L46 + // _vsprintf_p has to be shimmed with _vscprintf_p on -1 (for an example see + // above FFmpeg link). + va_list args; + va_start(args, fmt); +#ifndef _MSC_VER + int c = vsnprintf(buf, buf_size, fmt, args); +#else // _MSC_VER + int c = _vsprintf_p(buf, buf_size, fmt, args); + if (c == -1) + c = _vscprintf_p(fmt, args); +#endif // _MSC_VER + va_end(args); + return c; +} + // Load performance counter frequency only once at startup #ifdef _WIN32