diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vmpi/WaitAndRestart | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/vmpi/WaitAndRestart')
| -rw-r--r-- | utils/vmpi/WaitAndRestart/StdAfx.cpp | 15 | ||||
| -rw-r--r-- | utils/vmpi/WaitAndRestart/StdAfx.h | 32 | ||||
| -rw-r--r-- | utils/vmpi/WaitAndRestart/WaitAndRestart.cpp | 166 | ||||
| -rw-r--r-- | utils/vmpi/WaitAndRestart/waitandrestart.vpc | 32 |
4 files changed, 245 insertions, 0 deletions
diff --git a/utils/vmpi/WaitAndRestart/StdAfx.cpp b/utils/vmpi/WaitAndRestart/StdAfx.cpp new file mode 100644 index 0000000..bac634d --- /dev/null +++ b/utils/vmpi/WaitAndRestart/StdAfx.cpp @@ -0,0 +1,15 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// stdafx.cpp : source file that includes just the standard includes +// WaitAndRestart.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/utils/vmpi/WaitAndRestart/StdAfx.h b/utils/vmpi/WaitAndRestart/StdAfx.h new file mode 100644 index 0000000..954e1f8 --- /dev/null +++ b/utils/vmpi/WaitAndRestart/StdAfx.h @@ -0,0 +1,32 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__6E874DA8_5D18_47D5_B557_3E07B6171907__INCLUDED_) +#define AFX_STDAFX_H__6E874DA8_5D18_47D5_B557_3E07B6171907__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include <windows.h> +#include <stdio.h> +#include <stdlib.h> +#include <conio.h> + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__6E874DA8_5D18_47D5_B557_3E07B6171907__INCLUDED_) diff --git a/utils/vmpi/WaitAndRestart/WaitAndRestart.cpp b/utils/vmpi/WaitAndRestart/WaitAndRestart.cpp new file mode 100644 index 0000000..c9ef1e0 --- /dev/null +++ b/utils/vmpi/WaitAndRestart/WaitAndRestart.cpp @@ -0,0 +1,166 @@ +//========= 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; +} + diff --git a/utils/vmpi/WaitAndRestart/waitandrestart.vpc b/utils/vmpi/WaitAndRestart/waitandrestart.vpc new file mode 100644 index 0000000..8bf43ba --- /dev/null +++ b/utils/vmpi/WaitAndRestart/waitandrestart.vpc @@ -0,0 +1,32 @@ +//----------------------------------------------------------------------------- +// WAITANDRESTART.VPC +// +// Project Script +//----------------------------------------------------------------------------- + +$Macro SRCDIR "..\..\.." +$Macro OUTBINDIR "$SRCDIR\..\game\bin" +$Macro OUTBINNAME "WaitAndRestart" + +$Include "$SRCDIR\vpc_scripts\source_exe_con_win32_base.vpc" + +$Configuration +{ + $Compiler + { + $AdditionalIncludeDirectories "$BASE,..\" + $PreprocessorDefinitions "$BASE;PROTECTED_THINGS_DISABLE" + } +} + +$Project "WaitAndRestart" +{ + $Folder "Source Files" + { + $File "WaitAndRestart.cpp" + } + + $Folder "Header Files" + { + } +} |