You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
5.6 KiB
234 lines
5.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
//----------------------------------------------------------------------------- |
|
// This is just a little redirection tool so I can get all the dlls in bin |
|
//----------------------------------------------------------------------------- |
|
|
|
#ifdef _WIN32 |
|
#include <windows.h> |
|
#include <stdio.h> |
|
#include <assert.h> |
|
#include <direct.h> |
|
#elif POSIX |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <dlfcn.h> |
|
#include <string.h> |
|
#include <limits.h> |
|
#include <errno.h> |
|
#include <unistd.h> |
|
#define MAX_PATH PATH_MAX |
|
#endif |
|
#include "basetypes.h" |
|
|
|
#ifdef _WIN32 |
|
typedef int (*DedicatedMain_t)( HINSTANCE hInstance, HINSTANCE hPrevInstance, |
|
LPSTR lpCmdLine, int nCmdShow ); |
|
#elif POSIX |
|
typedef int (*DedicatedMain_t)( int argc, char *argv[] ); |
|
|
|
#endif |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Return the directory where this .exe is running from |
|
// Output : char |
|
//----------------------------------------------------------------------------- |
|
|
|
static char *GetBaseDir( const char *pszBuffer ) |
|
{ |
|
static char basedir[ MAX_PATH ]; |
|
char szBuffer[ MAX_PATH ]; |
|
size_t j; |
|
char *pBuffer = NULL; |
|
|
|
strcpy( szBuffer, pszBuffer ); |
|
|
|
pBuffer = strrchr( szBuffer,'\\' ); |
|
if ( pBuffer ) |
|
{ |
|
*(pBuffer+1) = '\0'; |
|
} |
|
|
|
strcpy( basedir, szBuffer ); |
|
|
|
j = strlen( basedir ); |
|
if (j > 0) |
|
{ |
|
if ( ( basedir[ j-1 ] == '\\' ) || |
|
( basedir[ j-1 ] == '/' ) ) |
|
{ |
|
basedir[ j-1 ] = 0; |
|
} |
|
} |
|
|
|
return basedir; |
|
} |
|
|
|
#ifdef _WIN32 |
|
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) |
|
{ |
|
// Must add 'bin' to the path.... |
|
char* pPath = getenv("PATH"); |
|
|
|
// Use the .EXE name to determine the root directory |
|
char moduleName[ MAX_PATH ]; |
|
char szBuffer[ 4096 ]; |
|
if ( !GetModuleFileName( hInstance, moduleName, MAX_PATH ) ) |
|
{ |
|
MessageBox( 0, "Failed calling GetModuleFileName", "Launcher Error", MB_OK ); |
|
return 0; |
|
} |
|
|
|
// Get the root directory the .exe is in |
|
char* pRootDir = GetBaseDir( moduleName ); |
|
|
|
#ifdef _DEBUG |
|
int len = |
|
#endif |
|
_snprintf( szBuffer, sizeof( szBuffer ) - 1, "PATH=%s\\bin\\;%s", pRootDir, pPath ); |
|
szBuffer[ ARRAYSIZE(szBuffer) - 1 ] = 0; |
|
assert( len < 4096 ); |
|
_putenv( szBuffer ); |
|
|
|
HINSTANCE launcher = LoadLibrary("bin\\dedicated.dll"); // STEAM OK ... filesystem not mounted yet |
|
if (!launcher) |
|
{ |
|
char *pszError; |
|
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszError, 0, NULL); |
|
|
|
char szBuf[1024]; |
|
_snprintf(szBuf, sizeof( szBuf ) - 1, "Failed to load the launcher DLL:\n\n%s", pszError); |
|
szBuf[ ARRAYSIZE(szBuf) - 1 ] = 0; |
|
MessageBox( 0, szBuf, "Launcher Error", MB_OK ); |
|
|
|
LocalFree(pszError); |
|
return 0; |
|
} |
|
|
|
DedicatedMain_t main = (DedicatedMain_t)GetProcAddress( launcher, "DedicatedMain" ); |
|
return main( hInstance, hPrevInstance, lpCmdLine, nCmdShow ); |
|
} |
|
|
|
#elif POSIX |
|
|
|
#if defined( LINUX ) |
|
|
|
#include <fcntl.h> |
|
|
|
static bool IsDebuggerPresent( int time ) |
|
{ |
|
// Need to get around the __wrap_open() stuff. Just find the open symbol |
|
// directly and use it... |
|
typedef int (open_func_t)( const char *pathname, int flags, mode_t mode ); |
|
open_func_t *open_func = (open_func_t *)dlsym( RTLD_NEXT, "open" ); |
|
|
|
if ( open_func ) |
|
{ |
|
for ( int i = 0; i < time; i++ ) |
|
{ |
|
int tracerpid = -1; |
|
|
|
int fd = (*open_func)( "/proc/self/status", O_RDONLY, S_IRUSR ); |
|
if (fd >= 0) |
|
{ |
|
char buf[ 4096 ]; |
|
static const char tracerpid_str[] = "TracerPid:"; |
|
|
|
const int len = read( fd, buf, sizeof(buf) - 1 ); |
|
if ( len > 0 ) |
|
{ |
|
buf[ len ] = 0; |
|
|
|
const char *str = strstr( buf, tracerpid_str ); |
|
tracerpid = str ? atoi( str + sizeof( tracerpid_str ) ) : -1; |
|
} |
|
|
|
close( fd ); |
|
} |
|
|
|
if ( tracerpid > 0 ) |
|
return true; |
|
|
|
sleep( 1 ); |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
|
|
static void WaitForDebuggerConnect( int argc, char *argv[], int time ) |
|
{ |
|
for ( int i = 1; i < argc; i++ ) |
|
{ |
|
if ( strstr( argv[i], "-wait_for_debugger" ) ) |
|
{ |
|
printf( "\nArg -wait_for_debugger found.\nWaiting %dsec for debugger...\n", time ); |
|
printf( " pid = %d\n", getpid() ); |
|
|
|
if ( IsDebuggerPresent( time ) ) |
|
printf("Debugger connected...\n\n"); |
|
|
|
break; |
|
} |
|
} |
|
} |
|
|
|
#else |
|
|
|
static void WaitForDebuggerConnect( int argc, char *argv[], int time ) |
|
{ |
|
} |
|
|
|
#endif // !LINUX |
|
|
|
int main( int argc, char *argv[] ) |
|
{ |
|
// Must add 'bin' to the path.... |
|
char* pPath = getenv("LD_LIBRARY_PATH"); |
|
char szBuffer[4096]; |
|
char cwd[ MAX_PATH ]; |
|
if ( !getcwd( cwd, sizeof(cwd)) ) |
|
{ |
|
printf( "getcwd failed (%s)", strerror(errno)); |
|
} |
|
|
|
snprintf( szBuffer, sizeof( szBuffer ) - 1, "LD_LIBRARY_PATH=%s/bin:%s", cwd, pPath ); |
|
int ret = putenv( szBuffer ); |
|
if ( ret ) |
|
{ |
|
printf( "%s\n", strerror(errno) ); |
|
} |
|
void *tier0 = dlopen( "libtier0" DLL_EXT_STRING, RTLD_NOW ); |
|
void *vstdlib = dlopen( "libvstdlib" DLL_EXT_STRING, RTLD_NOW ); |
|
|
|
const char *pBinaryName = "dedicated" DLL_EXT_STRING; |
|
|
|
void *dedicated = dlopen( pBinaryName, RTLD_NOW ); |
|
if ( !dedicated ) |
|
dedicated = dlopen( "libdedicated" DLL_EXT_STRING, RTLD_NOW ); |
|
|
|
if ( !dedicated ) |
|
{ |
|
printf( "Failed to open %s (%s)\n", pBinaryName, dlerror()); |
|
return -1; |
|
} |
|
DedicatedMain_t dedicated_main = (DedicatedMain_t)dlsym( dedicated, "DedicatedMain" ); |
|
if ( !dedicated_main ) |
|
{ |
|
printf( "Failed to find dedicated server entry point (%s)\n", dlerror() ); |
|
return -1; |
|
} |
|
|
|
WaitForDebuggerConnect( argc, argv, 30 ); |
|
|
|
ret = dedicated_main( argc,argv ); |
|
dlclose( dedicated ); |
|
dlclose( vstdlib ); |
|
dlclose( tier0 ); |
|
} |
|
#endif
|
|
|