std::string I_GetUserFileName (const char *file) { #if defined(UNIX) && !defined(GEKKO) // return absolute or explicitly relative pathnames unmodified, // so launchers or CLI/console users have control over netdemo placement if (file && (file[0] == PATHSEPCHAR || // /path/to/file (file[0] == '.' && file[1] == PATHSEPCHAR) || // ./file (file[0] == '.' && file[1] == '.' && file[2] == PATHSEPCHAR))) // ../file return std::string (file); std::string path = I_GetHomeDir(); if(path[path.length() - 1] != PATHSEPCHAR) path += PATHSEP; path += ".odamex"; struct stat info; if (stat (path.c_str(), &info) == -1) { if (mkdir (path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR) == -1) { I_FatalError ("Failed to create %s directory:\n%s", path.c_str(), strerror (errno)); } } else { if (!S_ISDIR(info.st_mode)) { I_FatalError ("%s must be a directory", path.c_str()); } } path += PATHSEP; path += file; #elif defined(_XBOX) std::string path = "T:"; path += PATHSEP; path += file; #else if (!PathIsRelative(file)) return std::string (file); std::string path = I_GetBinaryDir(); if(path[path.length() - 1] != PATHSEPCHAR) path += PATHSEP; path += file; #endif FixPathSeparator(path); return path; }
std::string I_GetUserFileName (const char *file) { #if defined(UNIX) && !defined(GEKKO) std::string path = I_GetHomeDir(); if(path[path.length() - 1] != PATHSEPCHAR) path += PATHSEP; path += ".odamex"; struct stat info; if (stat (path.c_str(), &info) == -1) { if (mkdir (path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR) == -1) { I_FatalError ("Failed to create %s directory:\n%s", path.c_str(), strerror (errno)); } } else { if (!S_ISDIR(info.st_mode)) { I_FatalError ("%s must be a directory", path.c_str()); } } path += PATHSEP; path += file; #elif defined(_XBOX) std::string path = "T:"; path += PATHSEP; path += file; #else std::string path = I_GetBinaryDir(); if(path[path.length() - 1] != PATHSEPCHAR) path += PATHSEP; path += file; #endif FixPathSeparator(path); return path; }
std::string I_GetUserFileName (const char *file) { #ifdef UNIX std::string path = I_GetHomeDir(); if(path[path.length() - 1] != '/') path += "/"; path += ".odamex"; struct stat info; if (stat (path.c_str(), &info) == -1) { if (mkdir (path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR) == -1) { I_FatalError ("Failed to create %s directory:\n%s", path.c_str(), strerror (errno)); } } else { if (!S_ISDIR(info.st_mode)) { I_FatalError ("%s must be a directory", path.c_str()); } } path += "/"; path += file; #endif #ifdef WIN32 std::string path = I_GetBinaryDir(); if(path[path.length() - 1] != '/') path += "/"; path += file; #endif return path; }
int main(int argc, char *argv[]) #endif { try { #if defined(UNIX) && !defined(GEKKO) if(!getuid() || !geteuid()) I_FatalError("root user detected, quitting odamex immediately"); #endif // [ML] 2007/9/3: From Eternity (originally chocolate Doom) Thanks SoM & fraggle! Args.SetArgs (argc, argv); const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // denis - if argv[1] starts with "odamex://" if(argc == 2 && argv && argv[1]) { const char *protocol = "odamex://"; const char *uri = argv[1]; if(strncmp(uri, protocol, strlen(protocol)) == 0) { std::string location = uri + strlen(protocol); size_t term = location.find_first_of('/'); if(term == std::string::npos) term = location.length(); Args.AppendArg("-connect"); Args.AppendArg(location.substr(0, term).c_str()); } } // [Russell] - No more double-tapping of capslock to enable autorun putenv("SDL_DISABLE_LOCK_KEYS=1"); #if defined WIN32 && !defined _XBOX // From the SDL 1.2.10 release notes: // // > The "windib" video driver is the default now, to prevent // > problems with certain laptops, 64-bit Windows, and Windows // > Vista. // // The hell with that. // SoM: the gdi interface is much faster for windowed modes which are more // commonly used. Thus, GDI is default. // // GDI mouse issues fill many users with great sadness. We are going back // to directx as defulat for now and the people will rejoice. --Hyper_Eye if (Args.CheckParm ("-gdi")) putenv("SDL_VIDEODRIVER=windib"); else if (getenv("SDL_VIDEODRIVER") == NULL || Args.CheckParm ("-directx") > 0) putenv("SDL_VIDEODRIVER=directx"); // Set the process affinity mask to 1 on Windows, so that all threads // run on the same processor. This is a workaround for a bug in // SDL_mixer that causes occasional crashes. Thanks to entryway and fraggle for this. // // [ML] 8/6/10: Updated to match prboom+'s I_SetAffinityMask. We don't do everything // you might find in there but we do enough for now. HMODULE kernel32_dll = LoadLibrary("kernel32.dll"); if (kernel32_dll) { SetAffinityFunc SetAffinity = (SetAffinityFunc)GetProcAddress(kernel32_dll, "SetProcessAffinityMask"); if (SetAffinity) { if (!SetAffinity(GetCurrentProcess(), 1)) LOG << "Failed to set process affinity mask: " << GetLastError() << std::endl; } } #endif if (SDL_Init (SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) I_FatalError("Could not initialize SDL:\n%s\n", SDL_GetError()); atterm (SDL_Quit); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. */ atexit (call_terms); Z_Init (); // 1/18/98 killough: start up memory stuff first atterm (R_Shutdown); atterm (I_Quit); atterm (DObject::StaticShutdown); // Figure out what directory the program resides in. progdir = I_GetBinaryDir(); startdir = I_GetCWD(); // init console C_InitConsole (80 * 8, 25 * 8, false); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; LOG << std::endl; } #ifndef WIN32 fprintf(stderr, "%s\n", error.GetMessage().c_str()); #elif _XBOX // Use future Xbox error message handling. -- Hyper_Eye #else MessageBox(NULL, error.GetMessage().c_str(), "Odamex Error", MB_OK); #endif exit (-1); } #ifndef _DEBUG catch (...) { // If an exception is thrown, be sure to do a proper shutdown. // This is especially important if we are in fullscreen mode, // because the OS will only show the alert box if we are in // windowed mode. Graphics gets shut down first in case something // goes wrong calling the cleanup functions. call_terms (); // Now let somebody who understands the exception deal with it. throw; } #endif return 0; }
int main(int argc, char *argv[]) { try { #ifdef UNIX if(!getuid() || !geteuid()) I_FatalError("root user detected, quitting odamex immediately"); #endif // [ML] 2007/9/3: From Eternity (originally chocolate Doom) Thanks SoM & fraggle! Args.SetArgs (argc, argv); LOG_FILE = Args.CheckValue("-logfile"); if(!LOG_FILE)LOG_FILE = "odamex.log"; LOG.open(LOG_FILE, std::ios::out); if (!LOG.is_open()) std::cerr << "Unable to create logfile: %s\n" << std::endl; const char *CON_FILE = Args.CheckValue("-confile"); if(CON_FILE)CON.open(CON_FILE, std::ios::in); // denis - if argv[1] starts with "odamex://" if(argc == 2 && argv && argv[1]) { const char *protocol = "odamex://"; const char *uri = argv[1]; if(strncmp(uri, protocol, strlen(protocol)) == 0) { std::string location = uri + strlen(protocol); size_t term = location.find_first_of('/'); if(term == std::string::npos) term = location.length(); Args.AppendArg("-connect"); Args.AppendArg(location.substr(0, term).c_str()); } } #ifdef WIN32 // From the SDL 1.2.10 release notes: // // > The "windib" video driver is the default now, to prevent // > problems with certain laptops, 64-bit Windows, and Windows // > Vista. // // The hell with that. // SoM: the gdi interface is much faster for windowed modes which are more // commonly used. Thus, GDI is default. if (Args.CheckParm ("-directx")) putenv("SDL_VIDEODRIVER=directx"); else if (getenv("SDL_VIDEODRIVER") == NULL || Args.CheckParm ("-gdi") > 0) putenv("SDL_VIDEODRIVER=windib"); // Set the process affinity mask to 1 on Windows, so that all threads // run on the same processor. This is a workaround for a bug in // SDL_mixer that causes occasional crashes. // Thanks to entryway and fraggle for this. if (!SetProcessAffinityMask(GetCurrentProcess(), 1)) LOG << "Failed to set process affinity mask: " << GetLastError() << std::endl; #endif if (SDL_Init (SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) I_FatalError("Could not initialize SDL:\n%s\n", SDL_GetError()); atterm (SDL_Quit); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. */ atexit (call_terms); Z_Init (); // 1/18/98 killough: start up memory stuff first atterm (I_Quit); atterm (DObject::StaticShutdown); // Figure out what directory the program resides in. progdir = I_GetBinaryDir(); startdir = I_GetCWD(); // init console C_InitConsole (80 * 8, 25 * 8, false); Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); D_DoomMain (); } catch (CDoomError &error) { if (LOG.is_open()) { LOG << error.GetMessage() << std::endl; } #ifndef WIN32 fprintf(stderr, "%s\n", error.GetMessage().c_str()); #else MessageBox(NULL, error.GetMessage().c_str(), "Odamex Error", MB_OK); #endif exit (-1); } #ifndef _DEBUG catch (...) { // If an exception is thrown, be sure to do a proper shutdown. // This is especially important if we are in fullscreen mode, // because the OS will only show the alert box if we are in // windowed mode. Graphics gets shut down first in case something // goes wrong calling the cleanup functions. call_terms (); // Now let somebody who understands the exception deal with it. throw; } #endif return 0; }