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.
166 lines
3.7 KiB
166 lines
3.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
// WaitAndRestart.cpp : Defines the entry point for the console application. |
|
// |
|
|
|
#include "stdafx.h" |
|
#include "tier1/strtools.h" |
|
#include "vmpi_defs.h" |
|
|
|
|
|
void PrintLog( const char *pMsg, ... ) |
|
{ |
|
#ifdef VMPI_SERVICE_LOGS |
|
char str[4096]; |
|
va_list marker; |
|
|
|
va_start( marker, pMsg ); |
|
_vsnprintf( str, sizeof( str ), pMsg, marker ); |
|
va_end( marker ); |
|
|
|
printf( "%s", str ); |
|
|
|
static FILE *fp = fopen( "c:\\vmpi_WaitAndRestart.log", "wt" ); |
|
if ( fp ) |
|
{ |
|
fprintf( fp, "%s", str ); |
|
fflush( fp ); |
|
} |
|
#endif |
|
} |
|
|
|
|
|
char* GetLastErrorString() |
|
{ |
|
static char err[2048]; |
|
|
|
LPVOID lpMsgBuf; |
|
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); |
|
strncpy( err, (char*)lpMsgBuf, sizeof( err ) ); |
|
LocalFree( lpMsgBuf ); |
|
|
|
err[ sizeof( err ) - 1 ] = 0; |
|
return err; |
|
} |
|
|
|
|
|
int main( int argc, char* argv[] ) |
|
{ |
|
Sleep(5000); |
|
if ( argc < 4 ) |
|
{ |
|
PrintLog( "WaitAndRestart <seconds to wait> <working directory> command line...\n" ); |
|
return 1; |
|
} |
|
|
|
PrintLog( "WaitAndRestart <seconds to wait> <working directory> command line...\n" ); |
|
|
|
|
|
const char *pTimeToWait = argv[1]; |
|
const char *pWorkingDir = argv[2]; |
|
|
|
// If a * precedes the time-to-wait arg, then it's a process ID and we wait for that process to exit. |
|
if ( pTimeToWait[0] == '*' ) |
|
{ |
|
++pTimeToWait; |
|
DWORD dwProcessId; |
|
sscanf( pTimeToWait, "%lu", &dwProcessId ); |
|
|
|
PrintLog( "Waiting for process %lu to exit. Press a key to cancel...\n", dwProcessId ); |
|
|
|
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | SYNCHRONIZE, false, dwProcessId ); |
|
if ( hProcess ) |
|
{ |
|
while ( 1 ) |
|
{ |
|
DWORD val = WaitForSingleObject( hProcess, 100 ); |
|
if ( val == WAIT_OBJECT_0 ) |
|
{ |
|
break; |
|
} |
|
else if ( val == WAIT_ABANDONED ) |
|
{ |
|
PrintLog( "Got WAIT_ABANDONED (error). Waiting 5 seconds, then continuing.\n" ); |
|
Sleep( 5000 ); |
|
break; |
|
} |
|
|
|
if ( kbhit() ) |
|
return 2; |
|
} |
|
PrintLog( "Process %lu terminated. Continuing.\n", dwProcessId ); |
|
} |
|
else |
|
{ |
|
PrintLog( "Process %lu not running. Continuing.\n", dwProcessId ); |
|
} |
|
|
|
CloseHandle( hProcess ); |
|
} |
|
else |
|
{ |
|
DWORD timeToWait = (DWORD)atoi( argv[1] ); |
|
|
|
PrintLog( "\n\nWaiting for %d seconds to launch ' ", timeToWait ); |
|
PrintLog( "%s> ", pWorkingDir ); |
|
for ( int i=3; i < argc; i++ ) |
|
{ |
|
PrintLog( "%s ", argv[i] ); |
|
} |
|
PrintLog( "'\n\nPress a key to cancel... " ); |
|
|
|
DWORD startTime = GetTickCount(); |
|
while ( GetTickCount() - startTime < (timeToWait*1000) ) |
|
{ |
|
if ( kbhit() ) |
|
return 2; |
|
|
|
Sleep( 100 ); |
|
} |
|
} |
|
|
|
// Ok, launch it! |
|
char commandLine[1024] = {0}; |
|
for ( int i=3; i < argc; i++ ) |
|
{ |
|
Q_strncat( commandLine, "\"", sizeof( commandLine ), COPY_ALL_CHARACTERS ); |
|
Q_strncat( commandLine, argv[i], sizeof( commandLine ), COPY_ALL_CHARACTERS ); |
|
Q_strncat( commandLine, "\" ", sizeof( commandLine ), COPY_ALL_CHARACTERS ); |
|
} |
|
|
|
STARTUPINFO si; |
|
memset( &si, 0, sizeof( si ) ); |
|
si.cb = sizeof( si ); |
|
|
|
PROCESS_INFORMATION pi; |
|
memset( &pi, 0, sizeof( pi ) ); |
|
|
|
if ( CreateProcess( |
|
NULL, |
|
commandLine, |
|
NULL, // security |
|
NULL, |
|
FALSE, |
|
0, // flags |
|
NULL, // environment |
|
pWorkingDir, // current directory |
|
&si, |
|
&pi ) ) |
|
{ |
|
PrintLog( "Process started.\n" ); |
|
CloseHandle( pi.hThread ); // We don't care what the process does. |
|
CloseHandle( pi.hProcess ); |
|
} |
|
else |
|
{ |
|
PrintLog( "CreateProcess error!\n%s", GetLastErrorString() ); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|