Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

197 lines
4.6 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
// vmpi_ping.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iphelpers.h"
#include "vmpi.h"
#include "tier0/platform.h"
#include "bitbuf.h"
#include <conio.h>
#include <stdlib.h>
const char* FindArg( int argc, char **argv, const char *pName, const char *pDefault = "" )
{
for ( int i=0; i < argc; i++ )
{
if ( stricmp( argv[i], pName ) == 0 )
{
if ( (i+1) < argc )
return argv[i+1];
else
return pDefault;
}
}
return NULL;
}
int main(int argc, char* argv[])
{
CUtlVector<CIPAddr> addrs;
printf( "\n" );
printf( "vmpi_ping <option>\n" );
printf( "option can be:\n" );
printf( " -stop .. stop any VMPI services\n" );
printf( " -kill .. kill any processes being run by VMPI\n" );
printf( " -patch <timeout> .. stops VMPI services for <timeout> seconds\n" );
printf( " -mpi_pw <password> .. only talk to services with the specified password\n" );
printf( " -dns .. enable DNS lookups (slows the listing down)\n" );
printf( " -ShowConsole .. show the console window\n" );
printf( " -HideConsole .. hide the console window\n" );
//Scary to show these to users...
//printf( " -ShowCache .. show the cache directory and its capacity\n" );
//printf( " -FlushCache .. flush the cache of ALL VMPI services\n" );
printf( "\n" );
ISocket *pSocket = CreateIPSocket();
if ( !pSocket->BindToAny( 0 ) )
{
printf( "Error binding to a port!\n" );
return 1;
}
const char *pPassword = FindArg( argc, argv, "-mpi_pw" );
// Figure out which action they want to take.
int timeout = 0;
char cRequest = VMPI_PING_REQUEST;
if ( FindArg( argc, argv, "-Stop" ) )
{
cRequest = VMPI_STOP_SERVICE;
}
else if ( FindArg( argc, argv, "-Kill" ) )
{
cRequest = VMPI_KILL_PROCESS;
}
/*
else if ( FindArg( argc, argv, "-ShowConsole" ) )
{
cRequest = VMPI_SHOW_CONSOLE_WINDOW;
}
else if ( FindArg( argc, argv, "-HideConsole" ) )
{
cRequest = VMPI_HIDE_CONSOLE_WINDOW;
}
*/
else if ( FindArg( argc, argv, "-ShowCache" ) )
{
cRequest = VMPI_GET_CACHE_INFO;
}
else if ( FindArg( argc, argv, "-FlushCache" ) )
{
cRequest = VMPI_FLUSH_CACHE;
}
else
{
const char *pTimeout = FindArg( argc, argv, "-patch", "60" );
if ( pTimeout )
{
if ( isdigit( pTimeout[0] ) )
{
cRequest = VMPI_SERVICE_PATCH;
timeout = atoi( pTimeout );
printf( "Patching with timeout of %d seconds.\n", timeout );
}
else
{
printf( "-patch requires a timeout parameter.\n" );
return 1;
}
}
}
int nMachines = 0;
printf( "Pinging VMPI Services... press a key to stop.\n\n" );
while ( !kbhit() )
{
for ( int i=VMPI_SERVICE_PORT; i <= VMPI_LAST_SERVICE_PORT; i++ )
{
unsigned char data[256];
bf_write buf( data, sizeof( data ) );
buf.WriteByte( VMPI_PROTOCOL_VERSION );
buf.WriteString( pPassword );
buf.WriteByte( cRequest );
if ( cRequest == VMPI_SERVICE_PATCH )
buf.WriteLong( timeout );
pSocket->Broadcast( data, buf.GetNumBytesWritten(), i );
}
while ( 1 )
{
CIPAddr ipFrom;
char in[256];
int len = pSocket->RecvFrom( in, sizeof( in ), &ipFrom );
if ( len == -1 )
break;
if ( len >= 2 &&
in[0] == VMPI_PROTOCOL_VERSION &&
in[1] == VMPI_PING_RESPONSE &&
addrs.Find( ipFrom ) == -1 )
{
char *pStateString = "(unknown)";
if ( len >= 3 )
{
if ( in[2] )
pStateString = "(running)";
else
pStateString = "(idle) ";
}
++nMachines;
char nameStr[256];
if ( FindArg( argc, argv, "-dns" ) && ConvertIPAddrToString( &ipFrom, nameStr, sizeof( nameStr ) ) )
{
printf( "%02d. %s - %s:%d (%d.%d.%d.%d)",
nMachines, pStateString, nameStr, ipFrom.port,
ipFrom.ip[0], ipFrom.ip[1], ipFrom.ip[2], ipFrom.ip[3] );
}
else
{
printf( "%02d. %s - %d.%d.%d.%d:%d",
nMachines, pStateString, ipFrom.ip[0], ipFrom.ip[1], ipFrom.ip[2], ipFrom.ip[3], ipFrom.port );
}
if ( cRequest == VMPI_GET_CACHE_INFO )
{
// Next var is a 64-bit int with the size of the cache.
char *pCur = &in[3];
__int64 cacheSize = *((__int64*)pCur);
pCur += sizeof( __int64 );
char *pCacheDir = pCur;
__int64 nMegs = cacheSize / (1024*1024);
printf( "\n\tCache dir: %s, size: %d megs", pCur, nMegs );
}
printf( "\n" );
addrs.AddToTail( ipFrom );
}
}
Sleep( 1000 );
}
return 0;
}