|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name : main.c
Abstract: main program to test the working of RPC APIs
Author:
Murali R. Krishnan ( MuraliK ) 22-Nov-1994
Project:
Gopher Server Admin Test Program
Functions Exported:
Revision History:
21-Apr-1995 Updated configuration to remove Admin Name and Email.
--*/
/************************************************************
* Include Headers ************************************************************/
# include <windows.h>
# include <lm.h>
# include <stdio.h>
# include <stdlib.h>
# include "inetinfo.h"
# include "apiutil.h"
//
// size of half dword in bits
//
# define HALF_DWORD_SIZE ( sizeof(DWORD) * 8 / 2)
//
// To Avoid overflows I multiply using two parts
//
# define LargeIntegerToDouble( li) \
( ( 1 << HALF_DWORD_SIZE) * \ (( double) (li).HighPart) * ( 1 << HALF_DWORD_SIZE) + \ ((li).LowPart) \ )
static LPWSTR g_lpszServerAddress = NULL;
//
// Prototypes of Functions
//
BOOL GenUsageMessage( int argc, char * argv[]);
BOOL TestGetStatistics( int argc, char * argv[]);
BOOL TestClearStatistics( int argc, char * argv[]);
BOOL TestGetAdminInfo( int argc, char * argv[]);
BOOL TestSetAdminInfo( int argc, char * argv[]);
BOOL TestInetGetAdminInfo( int argc, char * argv[]);
BOOL TestInetSetAdminInfo( int argc, char * argv[]);
//
// The following DefineAllCommands() defines a template for all commands.
// Format: CmdCodeName CommandName Function Pointer Comments
//
// To add addditional test commands, add just another line to the
// given list
// Dont touch any macros below, they are all automatically generated.
// Always the first entry should be usage function.
//
#define DefineAllCommands() \
Cmd( CmdUsage, "usage", GenUsageMessage, \ " Commands Available" ) \ Cmd( CmdGetStatistics, "getstatistics", TestGetStatistics, \ " Get Statistics From Gopher Server" ) \ Cmd( CmdClearStatistics, "clearstatistics", TestClearStatistics,\ " Clear Gopher Server Statistics" ) \ Cmd( CmdGetAdminInfo, "getadmininfo", TestGetAdminInfo, \ " Get Administrative Information" ) \ Cmd( CmdSetAdminInfo, "setadmininfo", TestSetAdminInfo, \ " Set Administrative Information for Gopher Server" ) \ Cmd( CmdInetGetAdminInfo, "igetadmininfo", TestInetGetAdminInfo, \ " Get Gopher's common Internet Administrative Information" ) \ Cmd( CmdInetSetAdminInfo, "isetadmininfo", TestInetSetAdminInfo, \ " Set Gopher's common Internet Administrative Information" ) \ Cmd( CmdDebugFlags, "debug", NULL, \ " isetadmininfo: Set Debugging flags for the server" ) \ Cmd( CmdPortNumber, "port", NULL, \ " isetadmininfo: Set the port number for server") \ Cmd( CmdMaxConnections, "maxconn", NULL, \ " isetadmininfo: Set the max connections allowed in server") \ Cmd( CmdConnectionTimeout, "timeout", NULL, \ " isetadmininfo: Set the Connection Timeout interval( in seconds)") \ Cmd( CmdLogAnonymous, "loganon", NULL, \ " isetadmininfo: Set the LogAnonymous Flag") \ Cmd( CmdLogNonAnonymous, "lognonanon", NULL, \ " isetadmininfo: Set the LogNonAnonymous Flag") \ Cmd( CmdAnonUserName, "anonuser", NULL, \ " isetadmininfo: Set the Anonymous User Name ") \ /* following are string data */ \ \ Cmd( CmdSite, "site", NULL, \ " setadmininfo: Set the Site of the server ") \ Cmd( CmdOrganization, "organization", NULL, \ " setadmininfo: Set the Organization ") \ Cmd( CmdLocation, "location", NULL, \ " setadmininfo: Set the Location of the server ") \ Cmd( CmdGeography, "geography", NULL, \ " setadmininfo: Set the Geography Data for server location ") \ Cmd( CmdLanguage, "language", NULL, \ " setadmininfo: Set the Language for server location ") \ Cmd( CmdCheckForWaisDb, "checkforwaisdb", NULL, \ " setadmininfo: Sets the checkfor WaisDb flag to given value ") \
// Define command codes
# define Cmd( CmdCode, CmdName, CmdFunc, CmdComments) CmdCode,
typedef enum _CmdCodes { DefineAllCommands() maxCmdCode } CmdCodes;
#undef Cmd
// Define the functions and array of mappings
// General command function type
typedef BOOL ( * CMDFUNC)( int argc, char * argv[]);
typedef struct _CmdStruct { CmdCodes cmdCode; char * pszCmdName; CMDFUNC cmdFunc; char * pszCmdComments; } CmdStruct;
// Define Prototypes of command functions
# define Cmd( CmdCode, CmdName, CmdFunc, CmdComments) \
BOOL CmdFunc(int argc, char * argv[]);
// Cause an expansion to generate prototypes
// DefineAllCommands()
// Automatic generation causes a problem when we have NULL in Function ptrs :(
// Let the user explicitly define the prototypes
#undef Cmd
//
// Define the global array of commands
//
# define Cmd( CmdCode, CmdName, CmdFunc, CmdComments) \
{ CmdCode, CmdName, CmdFunc, CmdComments},
static CmdStruct g_cmds[] = {
DefineAllCommands() { maxCmdCode, NULL, NULL} // sentinel command
};
#undef Cmd
/************************************************************
* Functions ************************************************************/
BOOL GenUsageMessage( int argc, char * argv[]) { CmdStruct * pCmd;
printf( " Usage:\n %s <server-name/address> <cmd name> <cmd arguments>\n", argv[0]); for( pCmd = g_cmds; pCmd != NULL && pCmd->cmdCode != maxCmdCode; pCmd++) { printf( "\t%s\t%s\n", pCmd->pszCmdName, pCmd->pszCmdComments); }
return ( TRUE); } // GenUsageMessage()
static CmdStruct * DecodeCommand( char * pszCmd) { CmdStruct * pCmd; if ( pszCmd != NULL) {
for( pCmd = g_cmds; pCmd != NULL && pCmd->cmdCode != maxCmdCode; pCmd++) {
if ( _stricmp( pszCmd, pCmd->pszCmdName) == 0) { return ( pCmd); } } // for
}
return ( &g_cmds[0]); // No match found, return usage message
} // DecodeCommand()
static LPWSTR ConvertToUnicode( char * psz) /*++
Converts a given string into unicode string (after allocating buffer space) Returns NULL on failure. Use GetLastError() for details. --*/ { LPWSTR pszUnicode; int cch;
cch = strlen( psz) + 1; pszUnicode = ( LPWSTR ) malloc( cch * sizeof( WCHAR));
if ( pszUnicode != NULL) {
// Success. Copy the string now
int iRet;
iRet = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, psz, cch, pszUnicode, cch);
if ( iRet == 0 || iRet != cch) {
free( pszUnicode); // failure so free the block
pszUnicode = NULL; } } else { SetLastError( ERROR_NOT_ENOUGH_MEMORY); }
return ( pszUnicode); } // ConvertToUnicode()
static VOID PrintStatisticsInfo( IN LPGOPHERD_STATISTICS_INFO pStat) { if ( pStat == NULL) {
return ; }
printf( " Printing Statistics Information: \n"); printf( "%20s = %4.3g\n", "Bytes Sent", LargeIntegerToDouble( pStat->TotalBytesSent)); printf( "%20s = %4.3g\n", "Bytes Received", LargeIntegerToDouble(pStat->TotalBytesRecvd)); printf( "%20s = %ld\n", "Files Sent ", pStat->TotalFilesSent); printf( "%20s = %ld\n", "Directory Listings", pStat->TotalDirectoryListings); printf( "%20s = %ld\n", "Searches Done ", pStat->TotalSearches); printf( "%20s = %ld\n", "Current Anon Users", pStat->CurrentAnonymousUsers); printf( "%20s = %ld\n", "Current NonAnon Users", pStat->CurrentNonAnonymousUsers); printf( "%20s = %ld\n", "Total Anon Users", pStat->TotalAnonymousUsers); printf( "%20s = %ld\n", "Total NonAnon Users", pStat->TotalNonAnonymousUsers); printf( "%20s = %ld\n", "Max Anon Users", pStat->MaxAnonymousUsers); printf( "%20s = %ld\n", "Max NonAnon Users", pStat->MaxNonAnonymousUsers); printf( "%20s = %ld\n", "Current Connections", pStat->CurrentConnections); printf( "%20s = %ld\n", "Total Connections", pStat->TotalConnections); printf( "%20s = %ld\n", "Max Connections", pStat->MaxConnections); printf( "%20s = %ld\n", "Connection Attempts", pStat->ConnectionAttempts); printf( "%20s = %ld\n", "Logon Attempts", pStat->LogonAttempts); printf( "%20s = %ld\n", "Aborted Attempts", pStat->AbortedAttempts); printf( "%20s = %ld\n", "Errored Connections", pStat->ErroredConnections); printf( "%20s = %ld\n", "Gopher+ Requests", pStat->GopherPlusRequests);
return;
} // PrintStatisticsInfo()
static VOID PrintStatsForTime( IN LPGOPHERD_STATISTICS_INFO pStatStart, IN LPGOPHERD_STATISTICS_INFO pStatEnd, IN DWORD sInterval) /*++
Print the statistics information over a time interval sInterval seconds. Arguments: pStatStart pointer to statistics information for starting sample pStatEnd pointer to statistics information for ending sample sInterval Time interval in seconds for the sample
Returns: None
--*/ { LARGE_INTEGER liDiff;
if ( pStatStart == NULL || pStatEnd == NULL ) {
return ; }
printf( "Gopher Stats. Time: %u seconds\n", sInterval); printf( "%20s\t %10s\t%10s\t%10s\n\n", "Item", "Start Sample", "End Sample", "Difference");
liDiff.QuadPart = ( pStatEnd->TotalBytesSent.QuadPart - pStatStart->TotalBytesSent.QuadPart);
printf( "%20s\t %10.3g\t %10.3g\t %10.3g\n", "Bytes Sent", LargeIntegerToDouble( pStatStart->TotalBytesSent), LargeIntegerToDouble( pStatStart->TotalBytesSent), LargeIntegerToDouble( liDiff) );
liDiff.QuadPart = ( pStatEnd->TotalBytesRecvd.QuadPart - pStatStart->TotalBytesRecvd.QuadPart);
printf( "%20s\t %10.3g\t %10.3g\t %10.3g\n", "Bytes Received", LargeIntegerToDouble(pStatStart->TotalBytesRecvd), LargeIntegerToDouble(pStatEnd->TotalBytesRecvd), LargeIntegerToDouble(liDiff) );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Files Sent ", pStatStart->TotalFilesSent, pStatEnd->TotalFilesSent, pStatEnd->TotalFilesSent - pStatStart->TotalFilesSent );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Directory Listings", pStatStart->TotalDirectoryListings, pStatEnd->TotalDirectoryListings, pStatEnd->TotalDirectoryListings - pStatStart->TotalDirectoryListings );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Searches Done ", pStatStart->TotalSearches, pStatEnd->TotalSearches, pStatEnd->TotalSearches - pStatStart->TotalSearches );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Current Anon Users", pStatStart->CurrentAnonymousUsers, pStatEnd->CurrentAnonymousUsers, pStatEnd->CurrentAnonymousUsers - pStatStart->CurrentAnonymousUsers );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Current NonAnon Users", pStatStart->CurrentNonAnonymousUsers, pStatEnd->CurrentNonAnonymousUsers, pStatStart->CurrentNonAnonymousUsers - pStatEnd->CurrentNonAnonymousUsers );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Total Anon Users", pStatStart->TotalAnonymousUsers, pStatEnd->TotalAnonymousUsers, pStatEnd->TotalAnonymousUsers - pStatStart->TotalAnonymousUsers );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Total NonAnon Users", pStatStart->TotalNonAnonymousUsers, pStatEnd->TotalNonAnonymousUsers, pStatEnd->TotalNonAnonymousUsers -pStatStart->TotalNonAnonymousUsers );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Max Anon Users", pStatStart->MaxAnonymousUsers, pStatEnd->MaxAnonymousUsers, pStatEnd->MaxAnonymousUsers - pStatStart->MaxAnonymousUsers ); printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Max NonAnon Users", pStatStart->MaxNonAnonymousUsers, pStatEnd->MaxNonAnonymousUsers, pStatEnd->MaxNonAnonymousUsers - pStatStart->MaxNonAnonymousUsers );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Current Connections", pStatStart->CurrentConnections, pStatEnd->CurrentConnections, pStatEnd->CurrentConnections - pStatStart->CurrentConnections );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Total Connections", pStatStart->TotalConnections, pStatEnd->TotalConnections, pStatEnd->TotalConnections - pStatStart->TotalConnections );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Max Connections", pStatStart->MaxConnections, pStatEnd->MaxConnections, pStatEnd->MaxConnections - pStatStart->MaxConnections );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Connection Attempts", pStatStart->ConnectionAttempts, pStatEnd->ConnectionAttempts, pStatEnd->ConnectionAttempts - pStatStart->ConnectionAttempts );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Logon Attempts", pStatStart->LogonAttempts, pStatEnd->LogonAttempts, pStatEnd->LogonAttempts - pStatStart->LogonAttempts );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Aborted Attempts", pStatStart->AbortedAttempts, pStatEnd->AbortedAttempts, pStatEnd->AbortedAttempts - pStatStart->AbortedAttempts );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Errored Connections", pStatStart->ErroredConnections, pStatEnd->ErroredConnections, pStatEnd->ErroredConnections - pStatStart->ErroredConnections );
printf( "%20s\t %10ld\t %10ld\t %10ld\n", "Gopher+ Requests", pStatStart->GopherPlusRequests, pStatEnd->GopherPlusRequests, pStatEnd->GopherPlusRequests - pStatStart->GopherPlusRequests );
return;
} // PrintStatisticsInfo()
BOOL TestGetStatistics( int argc, char * argv[] ) /*++
Gets Gopher Statistics from server and prints it. If the optional time information is given, then this function obtains the statistics, sleeps for specified time interval and then again obtains new statistics and prints the difference, neatly formatted.
Arguments: argc = count of arguments argv array of strings for command argv[0] = stats argv[1] = time interval if specified in seconds --*/ { DWORD err; DWORD timeToSleep = 0; GOPHERD_STATISTICS_INFO stat1; GOPHERD_STATISTICS_INFO * pStat1 = &stat1;
if ( argc > 1 && argv[1] != NULL) {
timeToSleep = atoi( argv[1]); }
err = GdGetStatistics( g_lpszServerAddress, (LPBYTE ) pStat1);
if ( err == NO_ERROR) {
if ( timeToSleep <= 0) {
PrintStatisticsInfo( pStat1); } else {
GOPHERD_STATISTICS_INFO stat2; GOPHERD_STATISTICS_INFO * pStat2 = &stat2;
printf( "\nGopher Statistics For Time Interval %u seconds\n\n", timeToSleep);
Sleep( timeToSleep * 1000); // sleep for the interval
err = GdGetStatistics( g_lpszServerAddress, (LPBYTE ) pStat2);
if ( err == NO_ERROR) {
PrintStatsForTime( pStat1, pStat2, timeToSleep); } } }
SetLastError( err); return ( err == NO_ERROR); } // TestGetStatistics()
BOOL TestClearStatistics( int argc, char * argv[]) { DWORD err;
printf( " GdClearStatistics called at: Time = %d\n", GetTickCount()); err = GdClearStatistics( g_lpszServerAddress);
printf( " Time = %d\n", GetTickCount()); printf( "Cleared the statistics Err = %d\n", err);
SetLastError( err); return ( err == NO_ERROR); } // TestClearStatistics()
static VOID PrintAdminInformation( IN LPGOPHERD_CONFIG_INFO pConfigInfo) { if ( pConfigInfo == NULL) return;
printf( "\n Printing Config Information in %08x\n", pConfigInfo); printf( "%20s= %S\n", "Site Name", pConfigInfo->lpszSite); printf( "%20s= %S\n", "Organization", pConfigInfo->lpszOrganization); printf( "%20s= %S\n", "Location", pConfigInfo->lpszLocation); printf( "%20s= %S\n", "Geography", pConfigInfo->lpszGeography); printf( "%20s= %S\n", "Language", pConfigInfo->lpszLanguage); printf( "%20s= %d\n", "CheckForWaisDb", pConfigInfo->fCheckForWaisDb); printf( "%20s= %x\n", "Debugging Flags", pConfigInfo->dwDebugFlags);
return; } // PrintAdminInformation()
static BOOL TestGetAdminInfo( int argc, char * argv[] ) { DWORD err; LPGOPHERD_CONFIG_INFO pConfig = NULL;
printf( " GdGetAdminInformation() called at: Time = %d\n", GetTickCount());
err = GdGetAdminInformation( g_lpszServerAddress, &pConfig);
printf( " Time = %d\n", GetTickCount());
printf( "GdGetAdminInformation returned Error Code = %d\n", err);
if ( err == NO_ERROR) { PrintAdminInformation( pConfig); MIDL_user_free( ( LPVOID) pConfig); }
SetLastError( err); return ( err == NO_ERROR); } // TestGetAdminInfo()
DWORD SetAdminField( IN LPGOPHERD_CONFIG_INFO pConfigIn, IN char * pszSubCmd, IN char * pszValue) { DWORD err = NO_ERROR; CmdStruct * pCmd = DecodeCommand( pszSubCmd); // get command struct
if ( pCmd == NULL) { // ignore invalid commands
printf( " Invalid SubCommand for set admin info %s. Ignoring...\n", pszSubCmd); return ( ERROR_INVALID_PARAMETER); }
switch ( pCmd->cmdCode) {
# if DBG
case CmdDebugFlags: SetField( pConfigIn->FieldControl, GDA_DEBUG_FLAGS); pConfigIn->dwDebugFlags = atoi( pszValue); break;
# endif // DBG
case CmdSite: SetField( pConfigIn->FieldControl, GDA_SITE); pConfigIn->lpszSite = ConvertToUnicode( pszValue); if ( pConfigIn->lpszSite == NULL) {
err = GetLastError(); } break;
case CmdOrganization: SetField( pConfigIn->FieldControl, GDA_ORGANIZATION); pConfigIn->lpszOrganization = ConvertToUnicode( pszValue); if ( pConfigIn->lpszOrganization == NULL) { err = GetLastError(); } break;
case CmdLocation: SetField( pConfigIn->FieldControl, GDA_LOCATION); pConfigIn->lpszLocation = ConvertToUnicode( pszValue); if ( pConfigIn->lpszLocation == NULL) { err = GetLastError(); } break;
case CmdGeography: SetField( pConfigIn->FieldControl, GDA_GEOGRAPHY); pConfigIn->lpszGeography = ConvertToUnicode( pszValue); if ( pConfigIn->lpszGeography == NULL) { err = GetLastError(); } break;
case CmdLanguage: SetField( pConfigIn->FieldControl, GDA_LANGUAGE); pConfigIn->lpszLanguage = ConvertToUnicode( pszValue); if ( pConfigIn->lpszLanguage == NULL) {
err = GetLastError(); } break;
case CmdCheckForWaisDb: SetField( pConfigIn->FieldControl, GDA_CHECK_FOR_WAISDB); pConfigIn->fCheckForWaisDb = (atoi(pszValue) != 0) ? TRUE: FALSE; break;
default: printf( " Invalid Sub command %s for SetConfigInfo(). Ignoring.\n", pszSubCmd); err = ERROR_INVALID_PARAMETER; break;
} // switch
return ( err); } // SetAdminField()
static VOID FreeBuffer( IN PVOID * ppBuffer) { if ( *ppBuffer != NULL) { free( * ppBuffer); *ppBuffer = NULL; // reset the old value
} return; } // FreeBuffer()
VOID FreeStringsInAdminInfo( IN OUT LPGOPHERD_CONFIG_INFO pConfigInfo) { FreeBuffer( (PVOID *) & pConfigInfo->lpszSite); FreeBuffer( (PVOID *) & pConfigInfo->lpszOrganization); FreeBuffer( (PVOID *) & pConfigInfo->lpszLocation); FreeBuffer( (PVOID *) & pConfigInfo->lpszGeography); FreeBuffer( (PVOID *) & pConfigInfo->lpszLanguage); } // FreeStringsInAdminInfo()
BOOL TestSetAdminInfo( int argc, char * argv[]) /*++
Arguments: argc = count of arguments argv array of strings for command argv[0] = setadmininfo argv[1] = sub function within set info for testing argv[2] = value for sub function for all information to be set, give <sub command name> <value> --*/ { DWORD err = ERROR_CALL_NOT_IMPLEMENTED; LPGOPHERD_CONFIG_INFO * ppConfigOut = NULL; // config value obtained from server
GOPHERD_CONFIG_INFO configIn; // config values that are set
if ( argc < 1 || ( (argc & 0x1) != 0x1 ) ) { // argc should be > 1 and odd
printf( "Invalid Number of arguments for %s\n", argv[0]); SetLastError( ERROR_INVALID_PARAMETER); return ( FALSE); }
//
// form the admin info block to set the information
//
memset( ( LPVOID) &configIn, 0, sizeof( configIn)); // init to Zeros
// extract each field and value to set in configIn
for( ; --argc > 1; argc -= 2) {
if ( SetAdminField( &configIn, argv[argc - 1], argv[argc]) != NO_ERROR) {
break; }
} // for() to extract and set all fields
if ( err != NO_ERROR) { // Now make RPC call to set the fields
err = GdSetAdminInformation( g_lpszServerAddress, &configIn); }
// Need to free all the buffers allocated for the strings
FreeStringsInAdminInfo( &configIn);
SetLastError( err ); return ( err == NO_ERROR ); } // TestSetAdminInfo()
static VOID PrintInetAdminInformation( IN LPINET_INFO_CONFIG_INFO pConfigInfo) { if ( pConfigInfo == NULL) return;
printf( "\n Printing InetA Config Information in %08x\n", pConfigInfo); printf( "%20s= %d\n", "LogAnonymous", pConfigInfo->fLogAnonymous); printf( "%20s= %d\n", "LogNonAnonymous",pConfigInfo->fLogNonAnonymous); printf( "%20s= %08x\n", "Authentication Flags", pConfigInfo->dwAuthentication); printf( "%20s= %d\n", "Port", pConfigInfo->sPort); printf( "%20s= %d\n", "Connection Timeout", pConfigInfo->dwConnectionTimeout); printf( "%20s= %d\n", "Max Connections", pConfigInfo->dwMaxConnections); printf( "%20s= %S\n", "AnonUserName", pConfigInfo->lpszAnonUserName); printf( "%20s= %S\n", "AnonPassword", pConfigInfo->szAnonPassword);
//
// IP lists and Grant lists not included now. Later.
//
return; } // PrintInetAdminInformation()
static BOOL TestInetGetAdminInfo( int argc, char * argv[] ) /*++
Gets the configuration information using InetInfoGetAdminInformation()
--*/ { DWORD err; LPINET_INFO_CONFIG_INFO pConfig = NULL;
printf( " InetInfoGetAdminInformation() called at: Time = %d\n", GetTickCount());
err = InetInfoGetAdminInformation( g_lpszServerAddress, INET_GOPHER, &pConfig);
printf( "Finished at Time = %d\n", GetTickCount()); printf( "InetInfoGetAdminInformation returned Error Code = %d\n", err);
if ( err == NO_ERROR) { PrintInetAdminInformation( pConfig); MIDL_user_free( ( LPVOID) pConfig); }
SetLastError( err); return ( err == NO_ERROR); } // TestInetGetAdminInfo()
DWORD SetInetAdminField( IN LPINET_INFO_CONFIG_INFO pConfigIn, IN char * pszSubCmd, IN char * pszValue) { DWORD err = NO_ERROR; CmdStruct * pCmd = DecodeCommand( pszSubCmd); // get command struct
if ( pCmd == NULL) { // ignore invalid commands
printf( " Invalid SubCommand for set admin info %s. Ignoring...\n", pszSubCmd); return ( ERROR_INVALID_PARAMETER); }
switch ( pCmd->cmdCode) {
case CmdPortNumber: SetField( pConfigIn->FieldControl, FC_INET_INFO_PORT_NUMBER); pConfigIn->sPort = atoi( pszValue); break;
case CmdConnectionTimeout: SetField( pConfigIn->FieldControl, FC_INET_INFO_CONNECTION_TIMEOUT); pConfigIn->dwConnectionTimeout = atoi( pszValue); break;
case CmdMaxConnections: SetField( pConfigIn->FieldControl, FC_INET_INFO_MAX_CONNECTIONS); pConfigIn->dwMaxConnections = atoi( pszValue); break;
case CmdLogAnonymous: SetField( pConfigIn->FieldControl, FC_INET_INFO_LOG_ANONYMOUS); pConfigIn->fLogAnonymous = atoi( pszValue); break;
case CmdLogNonAnonymous: SetField( pConfigIn->FieldControl, FC_INET_INFO_LOG_NONANONYMOUS); pConfigIn->fLogNonAnonymous = atoi( pszValue); break;
case CmdAnonUserName: SetField( pConfigIn->FieldControl, FC_INET_INFO_ANON_USER_NAME); pConfigIn->lpszAnonUserName = ConvertToUnicode( pszValue); if ( pConfigIn->lpszAnonUserName == NULL) { err = GetLastError(); } break;
default: printf( " Invalid Sub command %s for SetConfigInfo(). Ignoring.\n", pszSubCmd); err = ERROR_INVALID_PARAMETER; break;
} // switch
return ( err); } // SetAdminField()
VOID FreeStringsInInetConfigInfo( IN OUT LPINET_INFO_CONFIG_INFO pConfigInfo) { FreeBuffer( (PVOID *) & pConfigInfo->lpszAnonUserName);
} // FreeStringsInInetConfigInfo()
BOOL TestInetSetAdminInfo( int argc, char * argv[]) /*++
Arguments: argc = count of arguments argv array of strings for command argv[0] = setadmininfo argv[1] = sub function within set info for testing argv[2] = value for sub function for all information to be set, give <sub command name> <value> --*/ { DWORD err = ERROR_CALL_NOT_IMPLEMENTED; LPINET_INFO_CONFIG_INFO * ppConfigOut = NULL; INET_INFO_CONFIG_INFO configIn; // config values that are set
if ( argc < 1 || ( (argc & 0x1) != 0x1 ) ) { // argc should be > 1 and odd
printf( "Invalid Number of arguments for %s\n", argv[0]); SetLastError( ERROR_INVALID_PARAMETER); return ( FALSE); }
//
// form the admin info block to set the information
//
memset( ( LPVOID) &configIn, 0, sizeof( configIn)); // init to Zeros
// extract each field and value to set in configIn
for( ; --argc > 1; argc -= 2) {
if ( SetInetAdminField( &configIn, argv[argc - 1], argv[argc]) != NO_ERROR) {
break; }
} // for() to extract and set all fields
if ( err != NO_ERROR) { // Now make RPC call to set the fields
err = InetInfoSetAdminInformation( g_lpszServerAddress, INET_GOPHER, &configIn); }
// Need to free all the buffers allocated for the strings
FreeStringsInInetConfigInfo( &configIn);
SetLastError( err ); return ( err == NO_ERROR ); } // TestSetInetAdminInfo()
int __cdecl main( int argc, char * argv[]) { DWORD err = NO_ERROR; char ** ppszArgv; // arguments for command functions
int cArgs; // arg count for command functions
char * pszCmdName; CmdStruct * pCmd; CMDFUNC pCmdFunc = NULL;
if ( argc < 3 || argv[1] == NULL ) {
// Insufficient arguments
GenUsageMessage( argc, argv); return ( 1); }
pszCmdName = argv[2]; if (( pCmd = DecodeCommand( pszCmdName)) == NULL || pCmd->cmdFunc == NULL) { printf( "Internal Error: Invalid Command %s\n", pszCmdName); GenUsageMessage( argc, argv); return ( 1); }
g_lpszServerAddress = ConvertToUnicode( argv[1]); // get server address
cArgs = argc - 2; ppszArgv = argv + 2; // position at the start of the command name
if ( !(*pCmd->cmdFunc)( cArgs, ppszArgv)) { // call the test function
// Test function failed.
printf( "Command %s failed. Error = %d\n", pszCmdName, GetLastError()); return ( 1); }
printf( " Command %s succeeded\n", pszCmdName); return ( 0); // success
} // main()
/************************ End of File ***********************/
|