X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fporting.cpp;h=92615d77a2b9a21a77313f8b412bbd0b821e9623;hb=d24c56fd4b382e0117783a33278cc255b742c03b;hp=bff865c53f3bbcdcfde8389ef17f824a295dee6f;hpb=6b6c2d37ea1f9075c4fbf0d7e2d52e527e1f86aa;p=oweals%2Fminetest.git diff --git a/src/porting.cpp b/src/porting.cpp index bff865c53..92615d77a 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -24,12 +24,112 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "porting.h" +#include "config.h" +#include "debug.h" +#include "filesys.h" +#include "log.h" + +#ifdef __APPLE__ + #include "CoreFoundation/CoreFoundation.h" +#endif namespace porting { -std::string path_data = "../data"; -std::string path_userdata = "../"; +/* + Signal handler (grabs Ctrl-C on POSIX systems) +*/ + +bool g_killed = false; + +bool * signal_handler_killstatus(void) +{ + return &g_killed; +} + +#if !defined(_WIN32) // POSIX + #include + +void sigint_handler(int sig) +{ + if(g_killed == false) + { + dstream< + #include + + BOOL WINAPI event_handler(DWORD sig) + { + switch(sig) + { + case CTRL_C_EVENT: + case CTRL_CLOSE_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + + if(g_killed == false) + { + dstream< char buf[BUFSIZ]; + memset(buf, 0, BUFSIZ); // Get path to executable - readlink("/proc/self/exe", buf, BUFSIZ); + assert(readlink("/proc/self/exe", buf, BUFSIZ-1) != -1); pathRemoveFile(buf, '/'); - // Use "./bin/../data" - path_data = std::string(buf) + "/../data"; - - // Use "./bin/../" - path_userdata = std::string(buf) + "/../"; + path_share = std::string(buf) + "/../share"; + path_user = std::string(buf) + "/../user"; /* OS X */ - #elif defined(__APPLE__) + #elif defined(__APPLE__) || defined(__FreeBSD__) //TODO: Get path of executable. This assumes working directory is bin/ - dstream<<"WARNING: Relative path not properly supported on OS X" + dstream<<"WARNING: Relative path not properly supported on OS X and FreeBSD" <" + // Use "C:\Documents and Settings\user\Application Data\" len = GetEnvironmentVariable("APPDATA", buf, buflen); assert(len < buflen); - path_userdata = std::string(buf) + "/" + APPNAME; + path_user = std::string(buf) + DIR_DELIM + PROJECT_NAME; /* Linux */ #elif defined(linux) + #include + + char buf[BUFSIZ]; + memset(buf, 0, BUFSIZ); + // Get path to executable + assert(readlink("/proc/self/exe", buf, BUFSIZ-1) != -1); - path_userdata = std::string("~/.") + APPNAME; - path_data = std::string("/usr/share/") + APPNAME; + pathRemoveFile(buf, '/'); + + path_share = std::string(buf) + "/../share/" + PROJECT_NAME; + //path_share = std::string(INSTALL_PREFIX) + "/share/" + PROJECT_NAME; + if (!fs::PathExists(path_share)) { + dstream<<"WARNING: system-wide share not found at \""< - path_userdata = std::string("~/Library/Application Support/") + APPNAME; - path_data = std::string("minetest-mac.app/Contents/Resources/data/"); + // Code based on + // http://stackoverflow.com/questions/516200/relative-paths-not-working-in-xcode-c + CFBundleRef main_bundle = CFBundleGetMainBundle(); + CFURLRef resources_url = CFBundleCopyResourcesDirectoryURL(main_bundle); + char path[PATH_MAX]; + if(CFURLGetFileSystemRepresentation(resources_url, TRUE, (UInt8 *)path, PATH_MAX)) + { + dstream<<"Bundle resource path: "<