/*++ Copyright (c) 1995 Microsoft Corporation Module Name: chkcat.c Abstract: Checks whether a catapult server is up. Author: David Treadwell (davidtr) 17-May-1995 Revision History: Tony Godfrey (tonygod) 9-Oct-1995 --*/ #define UNICODE 1 #include #include #include #include #include #include #include #include #include // For definitions of NET_API* #include // For NetMessageBufferSend #include "gateway.h" // For GatewayEnumUserConnect DWORD CheckInterval = 5; WCHAR AdminList[256][256]; DWORD AdminCount = 0; CHAR HTMLDir[256]; PCHAR CurStatFileOrig = "curstat.htm.real"; CHAR LogFileName[256]; HANDLE LogFileHandle = INVALID_HANDLE_VALUE; CHAR ShortLogFileName[256]; HANDLE ShortLogFileHandle = INVALID_HANDLE_VALUE; CHAR CurStatFileName[256]; CHAR CurStatTmpName[256]; HANDLE CurStatFileHandle = INVALID_HANDLE_VALUE; CHAR DataFileName[256]; HANDLE DataFileHandle = INVALID_HANDLE_VALUE; CHAR CatapultServer[256][256]; CHAR OrigServers[1024]; DWORD OrigValLen; BOOL serverUp[256], Debug = FALSE, DoSessEnum[256]; DWORD NumServers = 0L; CHAR ArgHighTime[20], ArgHighDate[20], HighTime[256]; DWORD TotalActive, TotalUsers; DWORD today, Retries, StopError = 0L; BOOL RunChkUrl = FALSE, NoLogStart = FALSE; struct DataStruct { DWORD Highest; CHAR HighTime[50]; DWORD TodayHighest; CHAR TodayHighTime[50]; }; struct DataStruct Data; #define IDLE_THRESHOLD 60*20 // 20 minutes /************************ No longer used ************************* int GetServerNames( void ); DWORD OpenInternetClientParametersKeyRead( OUT PHKEY InternetClientParametersKey ); DWORD OpenInternetClientParametersKeyWrite( OUT PHKEY InternetClientParametersKey ); DWORD ReadRegistryOemString( IN HKEY Key, IN LPWSTR ParameterName, OUT LPSTR String, IN OUT LPDWORD Length ); DWORD WriteRegistryOemString( IN HKEY Key, IN LPWSTR ParameterName, IN DWORD valueType, IN LPSTR String ); VOID SetOrigServer ( void ); VOID SetServer( DWORD ServerNum ); ***************************************************************/ VOID TellAdmins( LPSTR Message ); VOID ParseCmdLine( PCHAR ArgString ); DWORD CreateLogFile( PCHAR FileName ); DWORD CreateShortLogFile( PCHAR FileName ); DWORD CreateCurStatFile( PCHAR FileName ); DWORD CreateDataFile( PCHAR FileName ); DWORD CreateURLFile( PCHAR FileName ); BOOL WriteLogFile( PCHAR message ); BOOL WriteShortLogFile( PCHAR message ); BOOL WriteCurStatFile( PCHAR message ); BOOL WriteDataFile( PCHAR FileName ); BOOL ReadDataFile( PCHAR FileName ); BOOL WriteURLFile( PCHAR FileName ); VOID SetDebugHTML( DWORD ServerNum ); VOID SetUnDebugHTML( DWORD ServerNum ); VOID SetLogFileName( DWORD ServerNum ); VOID ReadParamFile( PCHAR FileName ); VOID CountUsers( DWORD ServerNum ); void _CRTAPI1 main ( int argc, char *argv[] ) { SYSTEMTIME sysTime; DWORD waitTime; int retval, CheckURL, URLup = 1; DWORD i, ServerCount, t1, t2, attempt[3]; CHAR message[256],str[256]; BOOL ret, Notified; ArgHighTime[0] = 0; ArgHighDate[0] = 0; HTMLDir[0] = 0; NumServers = 0; GetLocalTime( &sysTime ); today = sysTime.wDay; Retries = 3L; for ( i = 1; i < (DWORD)argc != 0; i++ ) { ParseCmdLine(argv[i]); } if ( !HTMLDir[0] ) { printf( "Please specify HTML directory.\n\n" ); printf( "Parameter example: /htmldir:\\\\scratch\\scratch\\catapult\\home\n" ); exit( 0 ); } strcpy( DataFileName, "chkcat.dat" ); if ( ArgHighTime[0] ) { sprintf( Data.HighTime, "%s %s", ArgHighDate, ArgHighTime ); Data.TodayHighest = 0L; Data.TodayHighTime[0] = 0; WriteDataFile( DataFileName ); } else { ArgHighTime[0] = 0; } Data.TodayHighest = 0L; Data.TodayHighTime[0] = 0; ReadDataFile( DataFileName ); printf( "Checking %ld servers at intervals of %ld minutes.\n", NumServers, CheckInterval ); printf( "AllTimeHigh: %ld\nHighTime: %s\n", Data.Highest, Data.HighTime ); printf( "TodayHighest: %ld\nTodayHighTime: %s\n", Data.TodayHighest, Data.TodayHighTime ); GetLocalTime( &sysTime ); sprintf( message, "

Logging started at " "%02ld/%02ld/%ld %02ld:%02ld:%02ld\r\n", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); for (ServerCount = 0; ServerCount < NumServers; ServerCount++) { if (!Debug) { SetLogFileName( ServerCount ); if ( !NoLogStart ) { CreateLogFile( LogFileName ); CreateShortLogFile( ShortLogFileName ); WriteLogFile( message ); WriteShortLogFile( message ); CloseHandle( LogFileHandle ); CloseHandle( ShortLogFileHandle ); } } } while ( TRUE ) { // // Wait until the next interval, rounded to even minutes. // GetLocalTime( &sysTime ); waitTime = (CheckInterval - (sysTime.wMinute % CheckInterval) - 1) * 60*1000; waitTime += (60 - sysTime.wSecond - 1) * 1000; waitTime += 1000 - sysTime.wMilliseconds - 1; if (!Debug) { Sleep( waitTime + 50 ); } GetLocalTime( &sysTime ); printf( "\nCheck at %02ld/%02ld/%ld %02ld:%02ld:%02ld...\n", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); if ( today != sysTime.wDay ) { today = sysTime.wDay; Data.TodayHighest = 0L; Data.TodayHighTime[0] = 0; WriteDataFile( DataFileName ); } if (!Debug) { sprintf( str, "%s\\%s", HTMLDir, CurStatFileOrig ); CopyFileA( str, CurStatTmpName, FALSE ); sprintf( message, "
Last updated: %02ld/%02ld/%ld %02ld:%02ld:%02ld

\r\n", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); CreateCurStatFile( CurStatTmpName ); WriteCurStatFile( message ); CloseHandle( CurStatFileHandle ); } TotalUsers = 0L; TotalActive = 0L; if ( RunChkUrl ) { CheckURL = 0; } else { CheckURL = 1; } for (ServerCount = 0; ServerCount < NumServers; ServerCount++) { printf( "Checking %s...", CatapultServer[ServerCount] ); SetLogFileName( ServerCount ); CreateLogFile( LogFileName ); CreateShortLogFile( ShortLogFileName ); CreateCurStatFile( CurStatTmpName ); // // Open an Internet session handle. This will fail if the // catapult server is down. // i = 0L; retval = 1L; Notified = FALSE; attempt[0] = 0L; attempt[1] = 0L; attempt[2] = 0L; while ( (i < Retries) && (retval != 0) ) { sprintf( str, "inetopen %s > NUL:", CatapultServer[ServerCount] ); t1 = (DWORD)time( NULL ); retval = system( str ); t2 = (DWORD)time( NULL ); attempt[i] = retval; i++; if ( (retval != 0 ) && (serverUp[ServerCount]) ) { sprintf( message, "%s attempt %ld returned %ld", CatapultServer[ServerCount], i, retval ); if ( !Notified ) { TellAdmins( message ); Notified = TRUE; } } printf( "." ); } retval = 0L; for ( i = 0L; i < Retries; i++ ) { retval += attempt[i]; } if ( retval != 0L ) { sprintf( message, "
%s: Attempts: ", CatapultServer[ServerCount] ); for ( i = 0L; i < Retries; i++ ) { sprintf( str, "%ld ", attempt[i] ); strcat( message, str ); } strcat( message, "\r\n" ); WriteLogFile( message ); retval = attempt[Retries - 1]; } if ( retval != 0L ) { printf( "InternetOpen failed: %ld\n", retval ); if ( serverUp[ServerCount] ) { SetDebugHTML( ServerCount ); if (!Debug) { sprintf( message, "%s DOWN at %02ld/%02ld/%ld %02ld:%02ld:%02ld (%ld)", CatapultServer[ServerCount], sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, retval ); if ( !Notified ) { TellAdmins( message ); Notified = TRUE; } sprintf( str, "
%s\r\n", message ); WriteLogFile( str ); WriteShortLogFile( str ); if ( DoSessEnum[ServerCount] ) { sprintf( str, "
%s: DOWN (%ld) ", CatapultServer[ServerCount], retval ); WriteCurStatFile( str ); } } } else { if (!Debug) { sprintf( message, "
Still DOWN at " "%02ld/%02ld/%ld %02ld:%02ld:%02ld, error %ld ", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, retval ); WriteLogFile( message ); if ( DoSessEnum[ServerCount] ) { sprintf( str, "
%s: DOWN (%ld)\r\n", CatapultServer[ServerCount], retval ); WriteCurStatFile( str ); } } } if ( DoSessEnum[ServerCount] ) { CountUsers( ServerCount ); } } else { printf( "Running\n" ); if ( !serverUp[ServerCount] ) { serverUp[ServerCount] = TRUE; if (!Debug) { sprintf( message, "%s back up at " "%02ld/%02ld/%ld %02ld:%02ld:%02ld", CatapultServer[ServerCount], sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); if ( !Notified ) { TellAdmins( message ); Notified = TRUE; } sprintf( str, "
%s (ResponseTime: %ld) \r\n", message, t2 - t1 ); WriteLogFile( str ); WriteShortLogFile( str ); } SetUnDebugHTML( ServerCount ); } else { if (!Debug) { sprintf( message, "
Still up at " "%02ld/%02ld/%ld %02ld:%02ld:%02ld (ResponseTime: %ld) ", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, t2 - t1 ); WriteLogFile( message ); } } if ( DoSessEnum[ServerCount] ) { CountUsers( ServerCount ); } if ( !CheckURL ) { sprintf( str, "chkurl %s /now /param:chkurl.prm /server:%s", URLup ? "" : "/down", CatapultServer[ServerCount] ); URLup = system( str ); CheckURL = 1; } } if (!Debug) { CloseHandle( LogFileHandle ); CloseHandle( ShortLogFileHandle ); CloseHandle( CurStatFileHandle ); } } if ( TotalActive > Data.TodayHighest ) { Data.TodayHighest = TotalActive; sprintf( HighTime, "%02ld/%02ld/%ld %02ld:%02ld:%02ld", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); strcpy( Data.TodayHighTime, HighTime ); WriteDataFile( DataFileName ); } if ( TotalActive > Data.Highest ) { Data.Highest = TotalActive; sprintf( HighTime, "%02ld/%02ld/%ld %02ld:%02ld:%02ld", sysTime.wMonth, sysTime.wDay, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond ); strcpy( Data.HighTime, HighTime ); WriteDataFile( DataFileName ); } if (!Debug) { CreateCurStatFile( CurStatTmpName ); sprintf( str, "

\r\nTotals: %ld total users, %ld active

\r\n", TotalUsers, TotalActive ); WriteCurStatFile( str ); sprintf( str, "Today's High: %ld active users at %s

\r\n", Data.TodayHighest, Data.TodayHighTime ); WriteCurStatFile( str ); sprintf( str, "Highest Usage: %ld active users at %s\r\n", Data.Highest, Data.HighTime ); WriteCurStatFile( str ); strcpy( str, "\r\n" ); WriteCurStatFile( str ); CloseHandle( CurStatFileHandle ); if ( CopyFileA( CurStatTmpName, CurStatFileName, FALSE ) == FALSE ) { printf( "CopyFileA(%s,%s) failed: %ld\n", CurStatTmpName, CurStatFileName, GetLastError() ); } else { DeleteFileA( CurStatTmpName ); } } } } // main VOID TellAdmins( LPSTR Message ) { DWORD i; DWORD bytesWritten; NET_API_STATUS netStatus; int retval; WCHAR unicodeMessage[256]; BOOL ret; retval = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, Message, strlen(Message) + 1, unicodeMessage, sizeof(unicodeMessage) ); if ( retval <= 0 ) { printf( "MultiByteToWideChar failed: %ld\n", GetLastError( ) ); return; } for ( i = 0; i < AdminCount; i++ ) { netStatus = NetMessageBufferSend( NULL, AdminList[i], NULL, (LPBYTE)unicodeMessage, retval * 2 ); if ( netStatus != NO_ERROR ) { printf( "NetMessageBufferSend( %S ): %ld\n", AdminList[i], netStatus ); } } return; } // TellAdmins /********************* This code is no longer used ************************** int GetServerNames( void ) { HKEY hKeyHnd; DWORD err; int i, j, k; CHAR str1[256]; int buflen = sizeof(OrigServers); err = OpenInternetClientParametersKeyRead( &hKeyHnd ); if ( err != ERROR_SUCCESS ) { printf( "OpenInternetClientParametersKeyRead() failed: %ld\n", GetLastError( ) ); exit(1); } err = ReadRegistryOemString( hKeyHnd, L"GatewayServers", OrigServers, &buflen ); if ( err != ERROR_SUCCESS ) { printf( "ReadRegistryOemString() failed: %ld\n", GetLastError( ) ); RegCloseKey( hKeyHnd ); exit(1); } RegCloseKey( hKeyHnd ); OrigValLen = buflen; j = 0; k = 0; for ( i = 0; i < buflen; i++ ) { if ( OrigServers[i] == ' ' ) { CatapultServer[k][j] = 0; j = 0; k++; } else { if ( OrigServers[i] != 0 ) { CatapultServer[k][j++] = OrigServers[i]; } } } k++; return( k ); } #define MAKE_PARAMETERS_KEY(key) "SYSTEM\\CurrentControlSet\\Services\\" key "\\Parameters" DWORD OpenInternetClientParametersKeyRead( OUT PHKEY InternetClientParametersKey ) { DWORD err; err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\InternetClient\\Parameters", 0L, KEY_QUERY_VALUE, InternetClientParametersKey ); return err; } DWORD OpenInternetClientParametersKeyWrite( OUT PHKEY InternetClientParametersKey ) { DWORD err; err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\InternetClient\\Parameters", 0L, KEY_WRITE, InternetClientParametersKey ); return err; } DWORD WriteRegistryOemString( IN HKEY Key, IN LPWSTR ParameterName, IN DWORD valueType, IN LPSTR String ) { LONG err; WCHAR str[256]; DWORD valueLength; DWORD i; // String[strlen(String) + 1] = '\0'; valueLength = MultiByteToWideChar( CP_ACP, 0L, String, -1, str, sizeof(str) ); err = RegSetValueEx( Key, ParameterName, 0, // reserved valueType, (LPSTR)str, valueLength * 2 + 1 ); return( err ); } DWORD ReadRegistryOemString( IN HKEY Key, IN LPWSTR ParameterName, OUT LPSTR String, IN OUT LPDWORD Length ) { LONG err; DWORD valueType; WCHAR str[256]; CHAR str1[256]; DWORD valueLength; DWORD i; // // first, get the length of the string // *String = '\0'; valueLength = *Length; err = RegQueryValueEx(Key, ParameterName, NULL, // reserved &valueType, String, &valueLength ); if ( err != ERROR_SUCCESS ) { return err; } if ( valueType != REG_SZ ) { return ERROR_INTERNET_INTERNAL_ERROR; } // // if 1 or 0 chars returned then the string is empty // if (valueLength <= sizeof(char)) { return ERROR_PATH_NOT_FOUND; } // // return the length as if returned from strlen() (i.e. drop the '\0') // *Length = valueLength - sizeof(char); return err; } VOID SetServer ( DWORD ServerNum ) { HKEY hKeyHnd; DWORD retval, i; CHAR str1[256],str2[256]; retval = OpenInternetClientParametersKeyWrite( &hKeyHnd ); if ( retval != ERROR_SUCCESS ) { printf( "Unable to open registry.\n" ); exit(1); } WriteRegistryOemString( hKeyHnd, L"GatewayServers", REG_SZ, CatapultServer[ServerNum] ); RegCloseKey( hKeyHnd ); } VOID SetOrigServer ( void ) { HKEY hKeyHnd; DWORD retval, i, j; CHAR str1[256],str2[256]; retval = OpenInternetClientParametersKeyWrite( &hKeyHnd ); if ( retval != ERROR_SUCCESS ) { printf( "Unable to open registry.\n" ); exit(1); } retval = RegSetValueEx( hKeyHnd, L"GatewayServers", 0, // reserved REG_SZ, OrigServers, OrigValLen + 1 ); RegCloseKey( hKeyHnd ); } ************************ End This code is no longer used ********************/ VOID ParseCmdLine( PCHAR ArgString ) { int retval; DWORD i; CHAR s1[81],s2[81]; if ( _strnicmp( ArgString, "/interval:", 10 ) == 0 ) { CheckInterval = atoi( ArgString + 10 ); if ( CheckInterval < 1 || CheckInterval > 60*24 ) { printf( "CheckInterval == %ld, out of range.\n", CheckInterval ); exit(1); } } else if ( _strnicmp( ArgString, "/admin:", 7 ) == 0 ) { retval = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, ArgString + 7, strlen(ArgString + 7) + 1, AdminList[AdminCount], sizeof(AdminList[AdminCount]) ); if ( retval <= 0 ) { printf( "MultiByteToWideChar failed on %s: %ld; ignoring.\n", ArgString + 7, GetLastError( ) ); } else { AdminCount++; } } else if ( strcmp( ArgString, "/debug" ) == 0 ) { Debug = TRUE; } else if ( _strnicmp( ArgString, "/highest:", 9 ) == 0 ) { Data.Highest = (DWORD)atoi( ArgString + 9 ); } else if ( _strnicmp( ArgString, "/hightime:", 10 ) == 0 ) { strcpy( ArgHighTime, ArgString + 10 ); } else if ( _strnicmp( ArgString, "/highdate:", 10 ) == 0 ) { strcpy( ArgHighDate, ArgString + 10 ); } else if ( _strnicmp( ArgString, "/param:", 7 ) == 0 ) { ReadParamFile( ArgString + 7 ); } else if ( _strnicmp( ArgString, "/htmldir:", 9 ) == 0 ) { strcpy( HTMLDir, ArgString + 9 ); } else if ( _strnicmp( ArgString, "/down:", 6 ) == 0 ) { strcpy( s2, ArgString + 6 ); _strupr( s2 ); for ( i = 0; i < NumServers; i++ ) { strcpy( s1, CatapultServer[i] ); _strupr( s1 ); if ( strcmp( s1, s2 ) == 0 ) { serverUp[i] = FALSE; } } } else if ( _strnicmp( ArgString, "/mask:", 6 ) == 0 ) { strcpy( s2, ArgString + 6 ); _strupr( s2 ); for ( i = 0; i < NumServers; i++ ) { strcpy( s1, CatapultServer[i] ); _strupr( s1 ); if ( strcmp( s1, s2 ) == 0 ) { DoSessEnum[i] = FALSE; } } } else if ( _strnicmp( ArgString, "/server:", 8 ) == 0 ) { strcpy( CatapultServer[NumServers], ArgString + 8 ); _strupr( CatapultServer[NumServers] ); serverUp[NumServers] = TRUE; DoSessEnum[NumServers] = TRUE; NumServers++; } else if ( strcmp( ArgString, "/chkurl" ) == 0 ) { RunChkUrl = TRUE; } else if ( strcmp( ArgString, "/nologstart" ) == 0 ) { NoLogStart = TRUE; } else if ( strcmp( ArgString, "/newday" ) == 0 ) { today = 0L; } else if ( _strnicmp( ArgString, "/retry:", 7 ) == 0 ) { Retries = atol ( ArgString + 7 ); } else if ( _strnicmp( ArgString, "/stop:", 6 ) == 0 ) { StopError = atol ( ArgString + 6 ); } else { printf( "Ignoring illegal argument \"%s\"\n", ArgString ); } } DWORD CreateLogFile( PCHAR FileName ) { DWORD bytesWritten; strcpy( LogFileName, FileName ); LogFileHandle = CreateFileA( LogFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( LogFileHandle == INVALID_HANDLE_VALUE ) { printf( "CreateFile(%s) for log file failed: %ld\n", LogFileName, GetLastError( ) ); return( GetLastError ( ) ); } bytesWritten = SetFilePointer( LogFileHandle, 0, NULL, FILE_END ); if ( bytesWritten == 0xffffffff ) { printf( "SetFilePointer failed: %ld\n", GetLastError( ) ); return( GetLastError( ) ); } return( ERROR_SUCCESS ); } DWORD CreateShortLogFile( PCHAR FileName ) { DWORD bytesWritten; strcpy( ShortLogFileName, FileName); ShortLogFileHandle = CreateFileA( ShortLogFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( ShortLogFileHandle == INVALID_HANDLE_VALUE ) { printf( "CreateFile(%s) for log file failed: %ld\n", ShortLogFileName, GetLastError( ) ); return( GetLastError( ) ); } bytesWritten = SetFilePointer( ShortLogFileHandle, 0, NULL, FILE_END ); if ( bytesWritten == 0xffffffff ) { printf( "SetFilePointer failed: %ld\n", GetLastError( ) ); return( GetLastError( ) ); } return( ERROR_SUCCESS ); } DWORD CreateCurStatFile( PCHAR FileName ) { DWORD bytesWritten; CurStatFileHandle = CreateFileA( FileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( CurStatFileHandle == INVALID_HANDLE_VALUE ) { printf( "CreateFile(%s) for log file failed: %ld\n", FileName, GetLastError( ) ); return( GetLastError( ) ); } bytesWritten = SetFilePointer( CurStatFileHandle, 0, NULL, FILE_END ); if ( bytesWritten == 0xffffffff ) { printf( "SetFilePointer failed: %ld\n", GetLastError( ) ); return( GetLastError( ) ); } return( ERROR_SUCCESS ); } DWORD CreateDataFile( PCHAR FileName ) { DWORD bytesWritten; DeleteFileA( FileName ); DataFileHandle = CreateFileA( FileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( DataFileHandle == INVALID_HANDLE_VALUE ) { printf( "CreateFile(%s) for data file failed: %ld\n", FileName, GetLastError( ) ); return( GetLastError ( ) ); } return( ERROR_SUCCESS ); } BOOL WriteDataFile( PCHAR FileName ) { DWORD bytesWritten, bytesToWrite; BOOL ret; bytesToWrite = sizeof( Data ); CreateDataFile( FileName ); ret = WriteFile( DataFileHandle, &Data, bytesToWrite, &bytesWritten, NULL ); CloseHandle( DataFileHandle ); return( ret ); } BOOL ReadDataFile( PCHAR FileName ) { DWORD bytesRead, bytesToRead; BOOL ret; bytesToRead = sizeof( Data ); DataFileHandle = CreateFileA( FileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( DataFileHandle == INVALID_HANDLE_VALUE ) { printf( "OpenFile(%s) for data file failed: %ld\n", FileName, GetLastError( ) ); return( GetLastError ( ) ); } ret = ReadFile( DataFileHandle, &Data, bytesToRead, &bytesRead, NULL ); CloseHandle( DataFileHandle ); return( ret ); } BOOL WriteLogFile( PCHAR message ) { DWORD bytesWritten, bytesToWrite; BOOL ret; bytesToWrite = strlen( message ); if ( LogFileHandle == INVALID_HANDLE_VALUE ) { CreateLogFile( LogFileName ); } ret = WriteFile( LogFileHandle, message, bytesToWrite, &bytesWritten, NULL ); return ( ret ); } BOOL WriteShortLogFile ( PCHAR message ) { DWORD bytesWritten, bytesToWrite; BOOL ret; bytesToWrite = strlen( message ); if ( ShortLogFileHandle == INVALID_HANDLE_VALUE ) { CreateShortLogFile( ShortLogFileName ); } ret = WriteFile( ShortLogFileHandle, message, bytesToWrite, &bytesWritten, NULL ); return ( ret ); } BOOL WriteCurStatFile ( PCHAR message ) { DWORD bytesWritten, bytesToWrite; BOOL ret; bytesToWrite = strlen( message ); if ( CurStatFileHandle == INVALID_HANDLE_VALUE ) { CreateCurStatFile( CurStatTmpName ); } ret = WriteFile( CurStatFileHandle, message, bytesToWrite, &bytesWritten, NULL ); return ( ret ); } VOID SetDebugHTML( DWORD ServerNum ) { DWORD chksum, i; CHAR str1[256], str2[256]; chksum = 0L; serverUp[ServerNum] = FALSE; if ( DoSessEnum[ServerNum] ) { for ( i = 0; i < NumServers; i++ ) { if ( DoSessEnum[i] ) { chksum += (LONG)(serverUp[i] ? 0L : pow( 2L, (double)i )); } } sprintf( str1, "%s\\initial.htm.debug%ld", HTMLDir, chksum ); sprintf( str2, "%s\\initial.htm", HTMLDir ); if (!Debug) { if ( CopyFileA( str1, str2, FALSE ) ) { printf( "Copied %s\n", str1 ); } else { printf( "CopyFileA(%s, %s) failed: %ld\n", str1, str2, GetLastError( ) ); } } } } VOID SetUnDebugHTML( DWORD ServerNum ) { DWORD chksum, i; CHAR str1[256], str2[256]; chksum = 0L; serverUp[ServerNum] = TRUE; if ( DoSessEnum[ServerNum] ) { for ( i = 0; i < NumServers; i++ ) { if ( DoSessEnum[i] ) { chksum += (LONG)(serverUp[i] ? 0L : pow( 2L, (double)i )); } } sprintf( str1, "%s\\initial.htm.debug%ld", HTMLDir, chksum ); sprintf( str2, "%s\\initial.htm", HTMLDir ); if ( CopyFileA( str1, str2, FALSE ) ) { printf( "Copied %s\n", str1 ); } else { printf( "CopyFileA(%s, %s ) failed: %ld\n", str1, str2, GetLastError( ) ); } } } VOID SetLogFileName( DWORD ServerNum ) { sprintf( LogFileName, "%s\\%s\\lcatlog.htm", HTMLDir, CatapultServer[ServerNum] + 2 ); sprintf( ShortLogFileName, "%s\\%s\\catlog.htm", HTMLDir, CatapultServer[ServerNum] + 2 ); sprintf( CurStatFileName, "%s\\curstat.htm", HTMLDir ); sprintf( CurStatTmpName, "%s\\curstat.tmp", HTMLDir ); } VOID ReadParamFile( PCHAR FileName ) { FILE *fptr; CHAR s[256]; fptr = fopen( FileName, "r" ); if ( fptr == NULL ) { printf("Unable to open parameter file %s\n", FileName ); return; } while ( fgets(s, sizeof(s), fptr) != NULL ) { if ( s[strlen(s) - 1] == 10 ) { s[strlen(s) - 1] = 0; } if ( s[0] ) { ParseCmdLine( s ); } } fclose( fptr ); } VOID CountUsers( DWORD ServerNum ) { // PSESSION_INFO_1 netSessInfo; DWORD totalEntries, entriesRead; NET_API_STATUS netStatus; DWORD activeUsers, i, err; WCHAR CatapultServerName[256]; CHAR message[256], str[256]; LPGATEWAY_USER_ENUM_LIST UserList = NULL; i = MultiByteToWideChar( CP_ACP, 0L, CatapultServer[ServerNum], strlen( CatapultServer[ServerNum] ) + 1, CatapultServerName, (int)sizeof( CatapultServerName ) ); if ( i <= 0 ) { printf( "MultiByteToWideChar failed: %ld\n", GetLastError( ) ); return; } err = GatewayEnumUserConnect( CatapultServerName, &UserList ); if ( err != ERROR_SUCCESS ) { printf( "GatewayEnumUserConnect( %S ) failed: %ld\n", CatapultServerName, err ); if ( DoSessEnum[ServerNum] ) { if ( !serverUp[ServerNum] ) { strcpy( str, "? total users, ? active\r\n" ); } else { sprintf( str, "
%s: ? total users, ? active\r\n", CatapultServer[ServerNum] ); } WriteCurStatFile( str ); } sprintf( message, "? total users, ? active.\r\n" ); WriteLogFile( message ); } else { activeUsers = 0L; /**************************************************************** for ( i = 0L; i < UserList->dwEntriesRead; i++ ) { if ( (netSessInfo+i)->sesi1_idle_time < IDLE_THRESHOLD ) { activeUsers++; } } ****************************************************************/ TotalUsers += UserList->dwEntriesRead; TotalActive += UserList->dwEntriesRead; if (!Debug) { sprintf( message, "%ld total users, %ld active.\r\n", UserList->dwEntriesRead, UserList->dwEntriesRead ); WriteLogFile( message ); if ( DoSessEnum[ServerNum] ) { if ( !serverUp[ServerNum] ) { sprintf( str, "%ld total users, %ld active\r\n", UserList->dwEntriesRead, UserList->dwEntriesRead ); } else { sprintf( str, "
%s: %ld total users, %ld active\r\n", CatapultServer[ServerNum], UserList->dwEntriesRead, UserList->dwEntriesRead ); } WriteCurStatFile( str ); } } } }