X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sys_shared.c;h=b917e60dabc6899d535e35d4d0443f6ba829f9cf;hb=17749474a77e4e07131705134783fcf1c7dbf518;hp=9bebbde3175b270ae217aec611f190061beb93f5;hpb=29779ce432d34c9f0bc8878761d07c194162e6d0;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index 9bebbde3..b917e60d 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,68 +1,55 @@ - #include "quakedef.h" + +#define SUPPORTDLL + # include #ifndef WIN32 # include # include +#ifdef SUPPORTDLL # include #endif - -qboolean sys_nostdout = false; +#endif static char sys_timestring[128]; char *Sys_TimeString(const char *timeformat) { time_t mytime = time(NULL); +#if _MSC_VER >= 1400 + struct tm mytm; + localtime_s(&mytm, &mytime); + strftime(sys_timestring, sizeof(sys_timestring), timeformat, &mytm); +#else strftime(sys_timestring, sizeof(sys_timestring), timeformat, localtime(&mytime)); +#endif return sys_timestring; } extern qboolean host_shuttingdown; -void Sys_Quit (void) +void Sys_Quit (int returnvalue) { + if (COM_CheckParm("-profilegameonly")) + Sys_AllowProfiling(false); host_shuttingdown = true; Host_Shutdown(); - exit(0); + exit(returnvalue); } -char engineversion[128]; +#if defined(__linux__) || defined(__FreeBSD__) +#ifdef __cplusplus +extern "C" +#endif +int moncontrol(int); +#endif -void Sys_Shared_EarlyInit(void) +void Sys_AllowProfiling(qboolean enable) { - const char* os; - - Memory_Init (); - Log_Init (); - - COM_InitArgv(); - COM_InitGameType(); - -#if defined(__linux__) - os = "Linux"; -#elif defined(WIN32) - os = "Windows"; -#elif defined(__FreeBSD__) - os = "FreeBSD"; -#elif defined(__NetBSD__) - os = "NetBSD"; -#elif defined(__OpenBSD__) - os = "OpenBSD"; -#else - os = "Unknown"; +#if defined(__linux__) || defined(__FreeBSD__) + moncontrol(enable); #endif - snprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring); - -// COMMANDLINEOPTION: Console: -nostdout disables text output to the terminal the game was launched from - if (COM_CheckParm("-nostdout")) - sys_nostdout = 1; - else - Con_Printf("%s\n", engineversion); } -void Sys_Shared_LateInit(void) -{ -} /* =============================================================================== @@ -72,46 +59,104 @@ DLL MANAGEMENT =============================================================================== */ -qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts) +qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) { +#ifdef SUPPORTDLL const dllfunction_t *func; - dllhandle_t dllhandle; + dllhandle_t dllhandle = 0; + unsigned int i; if (handle == NULL) return false; +#ifndef WIN32 +#ifdef PREFER_PRELOAD + dllhandle = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); + if(dllhandle) + { + for (func = fcts; func && func->name != NULL; func++) + if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) + { + dlclose(dllhandle); + goto notfound; + } + Con_DPrintf ("All of %s's functions were already linked in! Not loading dynamically...\n", dllnames[0]); + *handle = dllhandle; + return true; + } +notfound: +#endif +#endif + // Initializations for (func = fcts; func && func->name != NULL; func++) *func->funcvariable = NULL; - // Load the DLL + // Try every possible name + Con_DPrintf ("Trying to load library..."); + for (i = 0; dllnames[i] != NULL; i++) + { + Con_DPrintf (" \"%s\"", dllnames[i]); +#ifdef WIN32 + dllhandle = LoadLibrary (dllnames[i]); +#else + dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); +#endif + if (dllhandle) + break; + } + + // see if the names can be loaded relative to the executable path + // (this is for Mac OSX which does not check next to the executable) + if (!dllhandle && strrchr(com_argv[0], '/')) + { + char path[MAX_OSPATH]; + strlcpy(path, com_argv[0], sizeof(path)); + strrchr(path, '/')[1] = 0; + for (i = 0; dllnames[i] != NULL; i++) + { + char temp[MAX_OSPATH]; + strlcpy(temp, path, sizeof(temp)); + strlcat(temp, dllnames[i], sizeof(temp)); + Con_DPrintf (" \"%s\"", temp); #ifdef WIN32 - dllhandle = LoadLibrary (dllname); + dllhandle = LoadLibrary (temp); #else - dllhandle = dlopen (dllname, RTLD_LAZY); + dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL); #endif + if (dllhandle) + break; + } + } + + // No DLL found if (! dllhandle) { - Con_Printf ("Can't load \"%s\".\n", dllname); + Con_DPrintf(" - failed.\n"); return false; } + Con_DPrintf(" - loaded.\n"); + // Get the function adresses for (func = fcts; func && func->name != NULL; func++) if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) { - Con_Printf ("Missing function \"%s\" - broken library!\n", func->name); + Con_DPrintf ("Missing function \"%s\" - broken library!\n", func->name); Sys_UnloadLibrary (&dllhandle); return false; } *handle = dllhandle; - Con_Printf("\"%s\" loaded.\n", dllname); return true; +#else + return false; +#endif } void Sys_UnloadLibrary (dllhandle_t* handle) { +#ifdef SUPPORTDLL if (handle == NULL || *handle == NULL) return; @@ -122,14 +167,19 @@ void Sys_UnloadLibrary (dllhandle_t* handle) #endif *handle = NULL; +#endif } void* Sys_GetProcAddress (dllhandle_t handle, const char* name) { +#ifdef SUPPORTDLL #ifdef WIN32 return (void *)GetProcAddress (handle, name); #else return (void *)dlsym (handle, name); #endif +#else + return NULL; +#endif }