1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
#include "quakedef.h"
# include <time.h>
#ifndef WIN32
# include <unistd.h>
# include <fcntl.h>
# include <dlfcn.h>
#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 (int returnvalue)
{
if (COM_CheckParm("-profilegameonly"))
Sys_AllowProfiling(false);
host_shuttingdown = true;
Host_Shutdown();
exit(returnvalue);
}
#if defined(__linux__) || defined(__FreeBSD__)
#ifdef __cplusplus
extern "C"
#endif
int moncontrol(int);
#endif
void Sys_AllowProfiling(qboolean enable)
{
#if defined(__linux__) || defined(__FreeBSD__)
moncontrol(enable);
#endif
}
/*
===============================================================================
DLL MANAGEMENT
===============================================================================
*/
qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts)
{
const dllfunction_t *func;
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_Printf ("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;
// Try every possible name
Con_Printf ("Trying to load library...");
for (i = 0; dllnames[i] != NULL; i++)
{
Con_Printf (" \"%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_Printf (" \"%s\"", temp);
#ifdef WIN32
dllhandle = LoadLibrary (temp);
#else
dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL);
#endif
if (dllhandle)
break;
}
}
// No DLL found
if (! dllhandle)
{
Con_Printf(" - failed.\n");
return false;
}
Con_Printf(" - 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);
Sys_UnloadLibrary (&dllhandle);
return false;
}
*handle = dllhandle;
return true;
}
void Sys_UnloadLibrary (dllhandle_t* handle)
{
if (handle == NULL || *handle == NULL)
return;
#ifdef WIN32
FreeLibrary (*handle);
#else
dlclose (*handle);
#endif
*handle = NULL;
}
void* Sys_GetProcAddress (dllhandle_t handle, const char* name)
{
#ifdef WIN32
return (void *)GetProcAddress (handle, name);
#else
return (void *)dlsym (handle, name);
#endif
}
|