summaryrefslogtreecommitdiff
path: root/utils/vmpi/WaitAndRestart
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vmpi/WaitAndRestart
downloadarchived-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.cpp15
-rw-r--r--utils/vmpi/WaitAndRestart/StdAfx.h32
-rw-r--r--utils/vmpi/WaitAndRestart/WaitAndRestart.cpp166
-rw-r--r--utils/vmpi/WaitAndRestart/waitandrestart.vpc32
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"
+ {
+ }
+}