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.
973 lines
30 KiB
973 lines
30 KiB
/*++
|
|
|
|
|
|
Copyright (C) Microsoft Corporation
|
|
All rights reserved.
|
|
|
|
Module Name: waitfor.cpp
|
|
|
|
Abstract
|
|
This module is used to send and receive signals.
|
|
|
|
|
|
Author:
|
|
|
|
Microsoft
|
|
|
|
Revision History:
|
|
|
|
Created by Microsoft
|
|
Modified on 29-6-2000 by Wipro Technologies
|
|
|
|
--*/
|
|
|
|
|
|
#include "pch.h"
|
|
#include "resource.h"
|
|
#include "waitfor.h"
|
|
#include <strsafe.h>
|
|
|
|
struct Params
|
|
{
|
|
const WCHAR *szSignalName; // To hold the name of the signal
|
|
BOOL fSignal; // To hold the Boolean
|
|
UINT uiTimeOut; // To hold the Time to wait for.
|
|
};
|
|
|
|
class CWaitFor
|
|
{
|
|
private:
|
|
WCHAR m_szSignal[MAX_STRING_LENGTH] ;
|
|
WCHAR m_szServer[MAX_STRING_LENGTH];
|
|
LPWSTR m_szUserName;
|
|
WCHAR m_szPassword[MAX_STRING_LENGTH] ;
|
|
WCHAR m_szDefault[MAX_STRING_LENGTH] ;
|
|
BOOL m_bNeedPwd ;
|
|
BOOL m_bConnFlag ;
|
|
LONG m_dwTimeOut ;
|
|
BOOL m_bLocalSystem;
|
|
TCMDPARSER2 cmdOptions[MAX_OPTIONS] ;
|
|
Params m_Parameters ;
|
|
|
|
public:
|
|
VOID ShowUsage();
|
|
DWORD ProcessCmdLine();
|
|
CWaitFor();
|
|
~CWaitFor();
|
|
DWORD ProcessOptions( DWORD argc ,LPCWSTR argv[] ) ;
|
|
DWORD PerformOperations();
|
|
DWORD CheckForValidCharacters();
|
|
DWORD ConnectRemoteServer();
|
|
|
|
public:
|
|
BOOL bShowUsage ;
|
|
};
|
|
|
|
CWaitFor ::CWaitFor()
|
|
/*++
|
|
Routine description : Constructor
|
|
|
|
Arguments : none
|
|
|
|
Return Value : None
|
|
|
|
--*/
|
|
{
|
|
//Initialise the variables.
|
|
StringCopy(m_szSignal,NULL_U_STRING, SIZE_OF_ARRAY(m_szSignal));
|
|
StringCopy(m_szServer,NULL_U_STRING, SIZE_OF_ARRAY(m_szPassword));
|
|
StringCopy(m_szPassword,NULL_U_STRING, SIZE_OF_ARRAY(m_szPassword));
|
|
StringCopy(m_szDefault,NULL_U_STRING, SIZE_OF_ARRAY(m_szDefault));
|
|
m_szUserName = NULL;
|
|
m_bNeedPwd = FALSE;
|
|
m_bLocalSystem = FALSE;
|
|
m_dwTimeOut = 0 ;
|
|
m_bConnFlag = TRUE ;
|
|
bShowUsage = FALSE;
|
|
}
|
|
|
|
CWaitFor :: ~CWaitFor()
|
|
/*++
|
|
|
|
Routine description : Destructor. All the memory frreing is being done here
|
|
The connection established to the remote system is also
|
|
being closed here if required.
|
|
|
|
Arguments : None.
|
|
|
|
Return Value : None
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Closing the connection to the remote system
|
|
// if there is no previous connection established
|
|
//
|
|
if(m_bConnFlag == TRUE && !m_bLocalSystem)
|
|
{
|
|
CloseConnection(m_szServer);
|
|
}
|
|
//release all the Global memory allocations.
|
|
FreeMemory( (LPVOID *) &m_szUserName );
|
|
ReleaseGlobals();
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD CWaitFor::ProcessCmdLine()
|
|
/*++
|
|
|
|
Routine description : Function used to process the command line arguments
|
|
specified by the user.
|
|
|
|
Arguments:
|
|
none
|
|
|
|
|
|
Return Value : DWORD
|
|
EXIT_SUCCESS : If the utility successfully performs the specified operation.
|
|
EXIT_FAILURE : If the utility is unsuccessful in performing the specified operation.
|
|
--*/
|
|
{
|
|
|
|
m_Parameters.uiTimeOut = MAILSLOT_WAIT_FOREVER;
|
|
m_Parameters.szSignalName = NULL;
|
|
m_Parameters.fSignal = FALSE;
|
|
|
|
|
|
if( (cmdOptions[OI_TIMEOUT].dwActuals != 0 ) && (cmdOptions[OI_SIGNAL].dwActuals != 0 ) )
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_MUTUAL_EX));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//
|
|
// Display an error message if the user enters Timeout option
|
|
// and does not enter any signal name.
|
|
if( ( StringLengthW(m_szDefault, 0) == 0 ) && (m_dwTimeOut != 0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_SYNTAX));
|
|
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
if(m_dwTimeOut != 0)
|
|
{
|
|
m_Parameters.uiTimeOut = m_dwTimeOut*TIMEOUT_CONST ;
|
|
}
|
|
|
|
|
|
//set the Signal parameter to true
|
|
// if the User enters a signal name to send.
|
|
|
|
if(StringLengthW(m_szSignal, 0) )
|
|
{
|
|
m_Parameters.fSignal = TRUE;
|
|
m_Parameters.szSignalName = m_szSignal ;
|
|
}
|
|
|
|
//
|
|
//set the Signal parameter to true
|
|
//if the User enters a signal name to wait for.
|
|
if(StringLengthW(m_szDefault, 0) != 0 )
|
|
{
|
|
m_Parameters.fSignal = TRUE;
|
|
m_Parameters.szSignalName = m_szDefault ;
|
|
}
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
CWaitFor :: ShowUsage()
|
|
|
|
/*++
|
|
|
|
Routine description : member function to show help.
|
|
Arguments : none.
|
|
Return Value : none
|
|
|
|
--*/
|
|
{
|
|
|
|
|
|
DWORD dwIndex = IDS_WAITFOR_HELP_BEGIN ;
|
|
|
|
for( ; dwIndex <= IDS_WAITFOR_HELP_END ; dwIndex++ )
|
|
{
|
|
ShowMessage( stdout,GetResString( dwIndex ) );
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
|
|
DWORD CWaitFor::PerformOperations()
|
|
/*++
|
|
|
|
Routine description : This routine is used to either send a signal or wait for
|
|
a particular signal for a specified time interval.
|
|
|
|
Arguments:
|
|
none .
|
|
|
|
Return Value : DWORD
|
|
EXIT_FAILURE : If the utility successfully performs the operation.
|
|
EXIT_SUCCESS : If the utility is unsuccessful in performing the specified
|
|
operation.
|
|
--*/
|
|
|
|
{
|
|
HANDLE hMailslot ;
|
|
|
|
WCHAR szComputerName[MAX_STRING_LENGTH] = NULL_U_STRING ;
|
|
DWORD dwNumWritten = 0 ;
|
|
WCHAR szSignalName[MAX_RES_STRING] = NULL_U_STRING ;
|
|
WCHAR szMailSlot[MAX_RES_STRING] = MAILSLOT ;
|
|
WCHAR szHostName[MAX_STRING_LENGTH] = NULL_U_STRING;
|
|
WCHAR szMailSlot2[MAX_RES_STRING] = MAILSLOT2 ;
|
|
DWORD dwBytesRead = 0;
|
|
BOOL fRead = FALSE ;
|
|
BOOL fWrite = FALSE ;
|
|
BOOL bRetVal = FALSE ;
|
|
DWORD dwError = 0 ;
|
|
DWORD dwComputerNameLen = SIZE_OF_ARRAY(szComputerName);
|
|
|
|
bRetVal = GetComputerName(szComputerName, &dwComputerNameLen);
|
|
if ( bRetVal == 0)
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SYSTEM_NAME));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the signal length exceeds 225 characters
|
|
if( StringLengthW(m_Parameters.szSignalName, 0) > 225 )
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SIG_LENGTH));
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if ( EXIT_FAILURE == CheckForValidCharacters() )
|
|
{
|
|
ShowLastErrorEx(stderr,SLE_TYPE_ERROR | SLE_INTERNAL );
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (StringLengthW(m_szServer, 0) > 0 ) )
|
|
{
|
|
//remove of //s infront of server name
|
|
if( IsUNCFormat(m_szServer) )
|
|
{
|
|
StringCopy( szHostName, m_szServer+2, SIZE_OF_ARRAY(szHostName) );
|
|
StringCopy( m_szServer, szHostName, SIZE_OF_ARRAY(m_szServer) );
|
|
}
|
|
|
|
//check if it is ip address or not
|
|
if( IsValidIPAddress(m_szServer) )
|
|
{
|
|
//if it is Ip address but local system like 127.0.0.1 or local ip address
|
|
if( IsLocalSystem( m_szServer ) )
|
|
{
|
|
StringCopy( szHostName, szComputerName, SIZE_OF_ARRAY(szHostName));
|
|
}
|
|
else
|
|
{
|
|
dwComputerNameLen = MAX_STRING_LENGTH+1;
|
|
//not local, get the remote system name
|
|
if (FALSE == GetHostByIPAddr( m_szServer, szHostName, &dwComputerNameLen, FALSE))
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_HOSTNAME));
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//this is not a ip address, so copy server name as host name
|
|
StringCopy(szHostName,m_szServer, SIZE_OF_ARRAY(szHostName) );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//this not a remote system, so copy local host name as host name
|
|
StringCopy(szHostName,szComputerName, SIZE_OF_ARRAY(szHostName));
|
|
}
|
|
|
|
if ( ( m_Parameters.fSignal && ( (m_dwTimeOut ==0) && ( cmdOptions[OI_TIMEOUT].dwActuals != 0 ) ) ) || StringLengthW(m_szSignal, 0) != 0)
|
|
{
|
|
//if the target system is a local system.
|
|
if(StringLengthW(m_szServer, 0)==0)
|
|
{
|
|
StringCchPrintf(szSignalName, SIZE_OF_ARRAY(szSignalName), szMailSlot2,m_Parameters.szSignalName);
|
|
}
|
|
else
|
|
{
|
|
//If the target system is a remote system.
|
|
//form the appropriate path
|
|
//
|
|
StringCopy(szSignalName,BACKSLASH4, SIZE_OF_ARRAY(szSignalName));
|
|
if( IsUNCFormat( szHostName ) )
|
|
StringConcat(szSignalName,szHostName+2, SIZE_OF_ARRAY(szSignalName));
|
|
else
|
|
StringConcat(szSignalName,szHostName, SIZE_OF_ARRAY(szSignalName));
|
|
|
|
StringConcat(szSignalName,BACKSLASH2, SIZE_OF_ARRAY(szSignalName));
|
|
StringConcat(szSignalName,MAILSLOT1, SIZE_OF_ARRAY(szSignalName));
|
|
StringConcat(szSignalName,BACKSLASH2, SIZE_OF_ARRAY(szSignalName));
|
|
StringConcat(szSignalName,m_Parameters.szSignalName, SIZE_OF_ARRAY(szSignalName));
|
|
}
|
|
|
|
|
|
hMailslot = CreateFile(
|
|
szSignalName,
|
|
GENERIC_WRITE,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL
|
|
);
|
|
|
|
//display a error message and exit if unable to create a mailslot.
|
|
if ( INVALID_HANDLE_VALUE == hMailslot )
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SEND_MESSAGE));
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if(StringLengthW(m_szServer, 0) > 0)
|
|
{
|
|
fWrite = WriteFile(hMailslot, szHostName,
|
|
StringLengthW(szHostName, 0)+1, &dwNumWritten, NULL);
|
|
|
|
}
|
|
else
|
|
{
|
|
fWrite = WriteFile(hMailslot, szComputerName,
|
|
StringLengthW(szComputerName, 0)+1, &dwNumWritten, NULL);
|
|
}
|
|
if( !fWrite )
|
|
{
|
|
|
|
switch( GetLastError() )
|
|
{
|
|
case ERROR_NETWORK_UNREACHABLE :
|
|
ShowMessage( stderr, GetResString(IDS_ERROR_SEND_MESSAGE2) );
|
|
CloseHandle(hMailslot);
|
|
return EXIT_FAILURE;
|
|
default :
|
|
ShowMessageEx(stderr, 1, TRUE, GetResString(IDS_ERROR_SEND_SIGNAL),m_Parameters.szSignalName);
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
//close the mail slot handle.
|
|
CloseHandle(hMailslot);
|
|
if (bRetVal == 0)
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_HANDLE));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if (fWrite)
|
|
{
|
|
ShowMessage( stdout, NEWLINE );
|
|
ShowMessage(stdout,GetResString(IDS_SIGNAL_SENT));
|
|
return EXIT_SUCCESS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if(StringLengthW(m_szServer, 0)==0)
|
|
{
|
|
StringCchPrintf(szSignalName, MAX_RES_STRING, szMailSlot,m_Parameters.szSignalName);
|
|
}
|
|
else
|
|
{
|
|
StringCchPrintf( szSignalName, MAX_RES_STRING, L"%s%s%s%s%s%s", BACKSLASH4, szHostName, BACKSLASH2,MAILSLOT1,BACKSLASH2,m_Parameters.szSignalName );
|
|
}
|
|
|
|
//swprintf(szSignalName, szMailSlot, m_Parameters.szSignalName);
|
|
// Create a mail slot
|
|
hMailslot = CreateMailslot(szSignalName,256,m_Parameters.uiTimeOut, NULL);
|
|
|
|
//Display a error message and exit if unable to create a mail slot.
|
|
if (hMailslot == INVALID_HANDLE_VALUE)
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_CREATE_MAILSLOT));
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
//Read the data from the mail slot.
|
|
fRead = ReadFile(hMailslot, szComputerName,MAX_STRING_LENGTH, &dwBytesRead, NULL);
|
|
|
|
//Close the Handle to the mail slot.
|
|
CloseHandle(hMailslot);
|
|
|
|
if (!fRead)
|
|
{
|
|
dwError = GetLastError();
|
|
|
|
if (GetLastError() == ERROR_SEM_TIMEOUT)
|
|
{
|
|
ShowMessageEx(stderr, 1, TRUE, GetResString(IDS_ERROR_TIMEOUT),m_Parameters.szSignalName);
|
|
}
|
|
else
|
|
{
|
|
ShowMessageEx(stderr, 1, TRUE, GetResString(IDS_UNEXPECTED_ERROR),dwError);
|
|
}
|
|
return EXIT_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
ShowMessage( stdout, NEWLINE );
|
|
ShowMessage(stdout,GetResString(IDS_SIGNAL_RECD));
|
|
}
|
|
}
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
DWORD CWaitFor:: ProcessOptions(
|
|
IN DWORD argc ,
|
|
IN LPCWSTR argv[]
|
|
)
|
|
/*++
|
|
|
|
Routine description : This function parses the options specified at the command prompt
|
|
Arguments:
|
|
[ in ] argc : count of elements in argv
|
|
[ in ] argv : command-line parameterd specified by the user
|
|
|
|
|
|
Return Value : DWORD
|
|
EXIT_FAILURE : If the utility successfully performs the operation.
|
|
EXIT_SUCCESS : If the utility is unsuccessful in performing the specified
|
|
operation.
|
|
--*/
|
|
|
|
{
|
|
PTCMDPARSER2 pcmdOption;
|
|
|
|
StringCopy(m_szPassword, L"*", MAX_STRING_LENGTH);
|
|
|
|
//Fill each structure with the appropriate value.
|
|
// help option
|
|
pcmdOption = &cmdOptions[OI_USAGE] ;
|
|
pcmdOption->dwType = CP_TYPE_BOOLEAN;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP_USAGE ;
|
|
pcmdOption->pValue = &bShowUsage;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = 0;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_HELP;
|
|
StringCopyA(cmdOptions[OI_USAGE].szSignature, "PARSER2", 8 );
|
|
|
|
//server
|
|
pcmdOption = &cmdOptions[OI_SERVER] ;
|
|
pcmdOption->dwType = CP_TYPE_TEXT;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP_VALUE_MANDATORY | CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL;
|
|
pcmdOption->pValue = m_szServer ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = MAX_STRING_LENGTH;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_SERVER;
|
|
StringCopyA(cmdOptions[OI_SERVER].szSignature, "PARSER2", 8 );
|
|
|
|
//User
|
|
pcmdOption = &cmdOptions[OI_USER] ;
|
|
pcmdOption->dwType = CP_TYPE_TEXT;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP2_ALLOCMEMORY | CP_VALUE_MANDATORY | CP2_VALUE_TRIMINPUT | CP2_VALUE_NONULL ;
|
|
pcmdOption->pValue = NULL ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = 0;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_USER;
|
|
StringCopyA(cmdOptions[OI_USER].szSignature, "PARSER2", 8 );
|
|
|
|
//password
|
|
pcmdOption = &cmdOptions[OI_PASSWORD] ;
|
|
pcmdOption->dwType = CP_TYPE_TEXT;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP2_VALUE_OPTIONAL ;
|
|
pcmdOption->pValue = m_szPassword ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = MAX_STRING_LENGTH;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_PASSWORD;
|
|
StringCopyA(cmdOptions[OI_PASSWORD].szSignature, "PARSER2", 8 );
|
|
|
|
pcmdOption = &cmdOptions[OI_SIGNAL] ;
|
|
pcmdOption->dwType = CP_TYPE_TEXT;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP_VALUE_MANDATORY; //CP2_VALUE_OPTIONAL ;
|
|
pcmdOption->pValue = m_szSignal ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = MAX_STRING_LENGTH;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_SIGNAL;
|
|
StringCopyA(cmdOptions[OI_SIGNAL].szSignature, "PARSER2", 8 );
|
|
|
|
pcmdOption = &cmdOptions[OI_TIMEOUT] ;
|
|
pcmdOption->dwType = CP_TYPE_NUMERIC;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP_VALUE_MANDATORY ;
|
|
pcmdOption->pValue = &m_dwTimeOut ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = MAX_STRING_LENGTH;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_TIMEOUT;
|
|
StringCopyA(cmdOptions[OI_TIMEOUT].szSignature, "PARSER2", 8 );
|
|
|
|
//default
|
|
pcmdOption = &cmdOptions[OI_DEFAULT] ;
|
|
pcmdOption->dwType = CP_TYPE_TEXT;
|
|
pcmdOption->dwCount = 1 ;
|
|
pcmdOption->dwActuals = 0;
|
|
pcmdOption->dwFlags = CP2_DEFAULT ;
|
|
pcmdOption->pValue = m_szDefault ;
|
|
pcmdOption->pFunction = NULL ;
|
|
pcmdOption->pFunctionData = NULL ;
|
|
pcmdOption->dwLength = MAX_STRING_LENGTH;
|
|
pcmdOption->pwszFriendlyName=NULL;
|
|
pcmdOption->dwReserved = 0;
|
|
pcmdOption->pReserved1 = NULL;
|
|
pcmdOption->pReserved2 = NULL;
|
|
pcmdOption->pReserved3 = NULL;
|
|
pcmdOption->pwszValues=NULL;
|
|
pcmdOption->pwszOptions=OPTION_DEFAULT;
|
|
StringCopyA(cmdOptions[OI_DEFAULT].szSignature, "PARSER2", 8 );
|
|
|
|
//parse the command line arguments
|
|
if ( ! DoParseParam2( argc, argv, -1, SIZE_OF_ARRAY(cmdOptions ), cmdOptions, 0 ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_TAG_ERROR));
|
|
DISPLAY_MESSAGE(stderr,SPACE_CHAR);
|
|
DISPLAY_MESSAGE(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
m_szUserName = (LPWSTR)cmdOptions[OI_USER].pValue;
|
|
|
|
TrimString(m_szSignal, TRIM_ALL);
|
|
TrimString(m_szDefault, TRIM_ALL);
|
|
TrimString(m_szServer, TRIM_ALL);
|
|
TrimString(m_szUserName, TRIM_ALL);
|
|
|
|
//this is to check if both signal to wait and /si are mentioned
|
|
if( StringLengthW( m_szDefault, 0) != 0 && cmdOptions[OI_SIGNAL].dwActuals != 0 )
|
|
{
|
|
ShowMessage( stderr, GetResString(IDS_ERROR_SYNTAX) );
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
//
|
|
// Display an error message if user gives -u with out -s
|
|
//
|
|
if( (cmdOptions[ OI_USER ].dwActuals != 0 ) && ( cmdOptions[ OI_SERVER ].dwActuals == 0 ) )
|
|
{
|
|
ShowMessage( stderr, GetResString(IDS_USER_BUT_NOMACHINE) );
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
//
|
|
// Display an error message if user gives -p with out -u
|
|
//
|
|
if( ( cmdOptions[ OI_USER ].dwActuals == 0 ) && ( 0 != cmdOptions[ OI_PASSWORD ].dwActuals ) )
|
|
{
|
|
ShowMessage( stderr, GetResString(IDS_PASSWD_BUT_NOUSER) );
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
|
|
//check for remote system without specifying /si option and
|
|
if((StringLengthW(m_szServer,0) !=0) && cmdOptions[OI_SIGNAL].dwActuals == 0)
|
|
{
|
|
ShowMessage( stderr, GetResString(IDS_ERROR_SYNTAX) );
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
//check for remote system can't wait for a signal
|
|
if((StringLengthW(m_szServer, 0) !=0) && (cmdOptions[OI_DEFAULT].dwActuals != 0 ) )
|
|
{
|
|
ShowMessage( stderr, GetResString(IDS_ERROR_SYNTAX) );
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
//check for null default value
|
|
if( ( 0 != cmdOptions[OI_DEFAULT].dwActuals ) && ( 0 == StringLengthW(m_szDefault, 0) ) )
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SYNTAX));
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
//check for null /si value
|
|
if( ( 0 != cmdOptions[OI_SIGNAL].dwActuals ) && ( 0 == StringLengthW(m_szSignal, 0) ) )
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SYNTAX));
|
|
return( EXIT_FAILURE );
|
|
}
|
|
|
|
if ( ( (m_dwTimeOut <= 0 ) || (m_dwTimeOut >99999 ) )&&( 0 != cmdOptions[OI_TIMEOUT].dwActuals ) )
|
|
{
|
|
DISPLAY_MESSAGE ( stderr, GetResString ( IDS_INVALID_TIMEOUT_VAL) );
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if( IsUNCFormat(m_szServer) )
|
|
{
|
|
StringCopy(m_szServer, m_szServer+2, SIZE_OF_ARRAY(m_szServer) );
|
|
}
|
|
|
|
//check if password is needed or not
|
|
if(IsLocalSystem( m_szServer ) == FALSE )
|
|
{
|
|
// set the bNeedPassword to True or False .
|
|
if ( cmdOptions[ OI_PASSWORD ].dwActuals != 0 &&
|
|
m_szPassword != NULL && StringCompare( m_szPassword, _T( "*" ), TRUE, 0 ) == 0 )
|
|
{
|
|
// user wants the utility to prompt for the password before trying to connect
|
|
m_bNeedPwd = TRUE;
|
|
}
|
|
else if ( cmdOptions[ OI_PASSWORD ].dwActuals == 0 &&
|
|
( cmdOptions[ OI_SERVER ].dwActuals != 0 || cmdOptions[ OI_USER ].dwActuals != 0 ) )
|
|
{
|
|
// -s, -u is specified without password ...
|
|
// utility needs to try to connect first and if it fails then prompt for the password
|
|
m_bNeedPwd = TRUE;
|
|
if ( m_szPassword != NULL )
|
|
{
|
|
StringCopy( m_szPassword, _T( "" ), MAX_STRING_LENGTH );
|
|
}
|
|
}
|
|
|
|
//allocate memory if /u is not specified
|
|
if( NULL == m_szUserName )
|
|
{
|
|
m_szUserName = (LPWSTR) AllocateMemory( MAX_STRING_LENGTH*sizeof(WCHAR) );
|
|
}
|
|
}
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
DWORD
|
|
CWaitFor::ConnectRemoteServer()
|
|
/*++
|
|
|
|
Routine description : This function connects to the Remote server.
|
|
|
|
Arguments: None
|
|
|
|
|
|
Return Value : DWORD
|
|
EXIT_FAILURE : If the utility successfully performs the operation.
|
|
EXIT_SUCCESS : If the utility is unsuccessful in performing the specified
|
|
operation.
|
|
--*/
|
|
{
|
|
BOOL bResult = FALSE ;
|
|
|
|
//
|
|
//checking for the local system
|
|
//
|
|
|
|
m_bLocalSystem = IsLocalSystem(m_szServer);
|
|
|
|
if( m_bLocalSystem && StringLengthW(m_szUserName, 0) != 0)
|
|
{
|
|
ShowMessage( stderr, NEWLINE );
|
|
ShowMessage( stderr, GetResString( IDS_IGNORE_LOCALCREDENTIALS ) );
|
|
return (EXIT_SUCCESS);
|
|
}
|
|
|
|
if ( ( StringLengthW(m_szServer, 0) != 0 ) && !m_bLocalSystem )
|
|
{
|
|
|
|
//establish a connection to the Remote system specified by the user.
|
|
bResult = EstablishConnection(m_szServer,
|
|
m_szUserName,
|
|
(StringLengthW(m_szUserName,0)!=0?SIZE_OF_ARRAY_IN_CHARS(m_szUserName):MAX_STRING_LENGTH),
|
|
m_szPassword,
|
|
SIZE_OF_ARRAY(m_szPassword),
|
|
m_bNeedPwd);
|
|
|
|
if (bResult == FALSE)
|
|
{
|
|
ShowMessage( stderr,GetResString(IDS_TAG_ERROR ));
|
|
ShowMessage( stderr,SPACE_CHAR );
|
|
ShowMessage( stderr, GetReason());
|
|
SecureZeroMemory( m_szPassword, SIZE_OF_ARRAY(m_szPassword) );
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
switch( GetLastError() )
|
|
{
|
|
case I_NO_CLOSE_CONNECTION:
|
|
m_bConnFlag = FALSE ;
|
|
break;
|
|
|
|
case E_LOCAL_CREDENTIALS:
|
|
case ERROR_SESSION_CREDENTIAL_CONFLICT:
|
|
{
|
|
m_bConnFlag = FALSE ;
|
|
ShowMessage( stderr, GetResString(IDS_TAG_WARNING) );
|
|
ShowMessage( stderr, EMPTY_SPACE );
|
|
ShowMessage( stderr, GetReason() );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
SecureZeroMemory( m_szPassword, SIZE_OF_ARRAY(m_szPassword) );
|
|
}
|
|
|
|
|
|
if( StringLength(m_szServer, 0) != 0 && TRUE == IsLocalSystem(IsUNCFormat(m_szServer)?m_szServer+2:m_szServer) )
|
|
{
|
|
if( StringLength( m_szUserName, 0 ) > 0 )
|
|
{
|
|
ShowMessage( stdout, NEWLINE );
|
|
ShowMessage( stdout, GetResString(IDS_IGNORE_LOCALCREDENTIALS) );
|
|
}
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
DWORD CWaitFor::CheckForValidCharacters()
|
|
{
|
|
// local variables
|
|
char ch;
|
|
unsigned char uch;
|
|
LPSTR pszSignal = NULL;
|
|
DWORD dw = 0, dwLength = 0;
|
|
|
|
// validate the input parameters
|
|
if ( NULL == m_Parameters.szSignalName )
|
|
{
|
|
SetLastError( ERROR_INVALID_NAME );
|
|
SaveLastError();
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
//
|
|
// find the required no. of byte to translate the UNICODE name into ANSI
|
|
//
|
|
dwLength = WideCharToMultiByte( GetConsoleOutputCP(), 0, m_Parameters.szSignalName, -1, NULL, 0, NULL, NULL );
|
|
if ( 0 == dwLength )
|
|
{
|
|
SetLastError( ERROR_INVALID_NAME );
|
|
SaveLastError();
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
//
|
|
// check the signal name for validity
|
|
// here to optimize the checking, we will get the normal length of the string in UNCIDE format and
|
|
// will compare to the length we got for translating it into Multi-byte
|
|
// if we find that the two lengths are different, then, the signal name might have contained the double-byte
|
|
// characters -- which is invalid and not allowed
|
|
// so ...
|
|
//
|
|
if ( StringLength( m_Parameters.szSignalName, 0 ) != dwLength - 1 )
|
|
{
|
|
// yes -- the signal name has double-byte characters
|
|
SetLastError( ERROR_INVALID_NAME );
|
|
SaveLastError();
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
//
|
|
// now, we are sure the signal name doesn't contain double-byte characters
|
|
// the second step to validate the signal is -- making sure that signal name contains
|
|
// only characters a-z, A-Z, 0-9 and upper ASCII characters i.e; ASCII characters in the range of 128-255
|
|
// so, convert the UNICODE string into ANSI format ( multi-byte (or) single-byte )
|
|
// for that
|
|
// #1. Allocate the needed memory
|
|
// #2. Do the conversion
|
|
// #3. do the validation
|
|
//
|
|
|
|
// #1
|
|
pszSignal = (LPSTR) AllocateMemory( dwLength*sizeof( CHAR ) );
|
|
if ( NULL == pszSignal )
|
|
{
|
|
SetLastError((DWORD) E_OUTOFMEMORY );
|
|
SaveLastError();
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// #2 -- assuming no need to for error checking
|
|
WideCharToMultiByte( GetConsoleOutputCP(), 0, m_Parameters.szSignalName, -1, pszSignal, dwLength, NULL, NULL );
|
|
|
|
// #3
|
|
// in this step, traverse thru all the characters in the string one-by-one and validate it
|
|
for( dw = 0; dw < dwLength - 1; dw++ )
|
|
{
|
|
// get the current character in the string into local buffer
|
|
ch = pszSignal[ dw ]; // signed version
|
|
uch = static_cast< unsigned char >( pszSignal[ dw ] );
|
|
|
|
// signed comparision --> a-z, A-Z and 0-9
|
|
if ( ( ch >= 48 && ch <= 57 ) || ( ch >= 65 && ch <= 90 ) || ( ch >= 97 && ch <= 122 ) )
|
|
{
|
|
// this particular character is acceptable in the signal name
|
|
continue;
|
|
}
|
|
|
|
|
|
// unsigned comparision --> ASCII 128 - 255
|
|
if ( uch < 128 || uch > 255 )
|
|
{
|
|
// this character is not acceptable for the signal name
|
|
FreeMemory((LPVOID*) &pszSignal );
|
|
pszSignal = NULL;
|
|
SetReason( GetResString(IDS_ERROR_SIG_CHAR) );
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
}
|
|
|
|
if( pszSignal != NULL )
|
|
{
|
|
FreeMemory((LPVOID*) &pszSignal );
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
DWORD __cdecl wmain(
|
|
IN DWORD argc,
|
|
IN LPCWSTR argv[]
|
|
)
|
|
/*++
|
|
|
|
Routine description : Main function which calls all the other main functions
|
|
depending on the option specified by the user.
|
|
|
|
Arguments:
|
|
[in] argc : argument count specified at the command prompt.
|
|
[in] argv : arguments specified at the command prompt.
|
|
|
|
Return Value : DWORD
|
|
0 : If the utility successfully performs the operation.
|
|
1 : If the utility is unsuccessful in performing the specified
|
|
operation.
|
|
--*/
|
|
|
|
{
|
|
|
|
CWaitFor WaitFor ;
|
|
|
|
//display a syntax error if no arguments are given.
|
|
if(argc==1)
|
|
{
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SYNTAX));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//
|
|
//Process the command line arguments.
|
|
//
|
|
if(WaitFor.ProcessOptions( argc,argv) == EXIT_FAILURE)
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if((WaitFor.bShowUsage ==TRUE) && ( argc > 2 ) )
|
|
{
|
|
|
|
ShowMessage(stderr,GetResString(IDS_ERROR_SYNTAX));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//
|
|
//display the help if the user selects help.
|
|
//
|
|
if (WaitFor.bShowUsage == TRUE )
|
|
{
|
|
WaitFor.ShowUsage();
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
//
|
|
// Perform the validations and
|
|
// display error messages if required.
|
|
//
|
|
if(WaitFor.ProcessCmdLine() == EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( WaitFor.ConnectRemoteServer() == EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE;
|
|
}
|
|
//
|
|
//Sends the signal or waits for the signal depending upon the
|
|
// user specification
|
|
if(WaitFor.PerformOperations() == EXIT_FAILURE)
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|