|
|
//////////////////////////////////////////////////////////////////////////////
// Module : parser_dynamic.cpp
//
// Purpose : All parser dynamic mode functions
//
// Developers Name : N.Surendra Sai / Vunnam Kondal Rao
//
// History :
//
// Date Author Comments
// 27 Aug 2001
//
//////////////////////////////////////////////////////////////////////////////
#include "nshipsec.h"
extern HINSTANCE g_hModule;
//////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicAddSetMMPolicy()
//
// Date of Creation : 3rd oct 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN _TCHAR szListTok[MAX_STR_LEN],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS],
// IN BOOL flag
//
//
// Return : DWORD
//
// Description : This Function called by parser function.
// It will separate the List and Non-List commands
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicAddSetMMPolicy( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS], IN BOOL bOption ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0; DWORD dwIndex = 0; LPTSTR szListTok = NULL; BOOL bMMSECSpecified = FALSE;
szListTok = (LPTSTR)calloc(MAX_STR_LEN,sizeof(_TCHAR)); if(szListTok == NULL) { PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL); dwReturn = RETURN_NO_ERROR; BAIL_OUT; } for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) // If one token invalid dive out from the function
{ case CMD_TOKEN_NAME : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STRING); break; case CMD_TOKEN_DEFRESPONSE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; case CMD_TOKEN_SOFTSAEXPTIME : case CMD_TOKEN_MMLIFETIME : case CMD_TOKEN_QMPERMM : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_DWORD); break; case CMD_TOKEN_MMSECMETHODS : bMMSECSpecified = TRUE; dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_MM_OFFER); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } if( dwReturn == ERROR_SUCCESS ) { if ( (!bMMSECSpecified) && (bOption == ADD_CMD) ) // if its an Add Cmd and no MMSec methods are specified,
// ...then add defaults
{ _tcsncpy(szListTok,DEFAULT_MMSECMETHODS,MAX_STR_LEN-1); dwIndex = MatchEnumTagToTagIndex(CMD_TOKEN_STR_MMSECMETHODS,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } dwReturn = LoadParserOutput(pParser,dwMaxArgs,&dwUsed,szListTok,dwIndex,TYPE_MM_OFFER); } } free(szListTok); error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////
// Function : ParseStaticAddSetQMPolicy()
//
// Date of Creation : 5th oct 2001
//
// Parameters : IN lppwszTok[MAX_ARGS],
// IN szListTok[MAX_STR_LEN],
// IN OUT pParser,
// IN dwCurrentIndex,
// IN dwMaxArgs,
// IN dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicQMPolicy
// (Add/Set)
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicAddSetQMPolicy( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS], IN BOOL bOption ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0; DWORD dwIndex = 0; LPTSTR szListTok = NULL; BOOL bNegotiationSpecified = FALSE;
szListTok = (LPTSTR)calloc(MAX_STR_LEN,sizeof(_TCHAR)); if(szListTok == NULL) { PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL); dwReturn = RETURN_NO_ERROR; BAIL_OUT; } for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { // If one token invalid dive out from the function
switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_NAME : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STRING); break; case CMD_TOKEN_DEFRESPONSE : case CMD_TOKEN_SOFT : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; case CMD_TOKEN_PFSGROUP : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PFSGROUP); break; case CMD_TOKEN_NEGOTIATION : bNegotiationSpecified = TRUE; dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_QM_OFFER); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } if( dwReturn == ERROR_SUCCESS ) { if ( !bNegotiationSpecified && (bOption == ADD_CMD)) { // If its an Add cmd and no QMSec methods are specified, then add defaults
_tcsncpy(szListTok,DEFAULT_QMSECMETHODS,MAX_STR_LEN-1);
dwIndex = MatchEnumTagToTagIndex(CMD_TOKEN_STR_NEGOTIATION,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } dwReturn = LoadParserOutput(pParser,dwMaxArgs,&dwUsed,szListTok,dwIndex,TYPE_QM_OFFER); } } free(szListTok); error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicDelPolicy()
//
// Date of Creation : 1st oct 2001
//
// Parameters : IN LPWSTR *ppwcArguments, // Input stream
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicDelelte
// (QMPolicy/MMPolicy)
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicDelPolFaction( IN LPWSTR *ppwcArguments, // Input stream
IN OUT PARSER_PKT *pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount,dwNum,dwTagIndex = 0,dwIndex = 0,dwUsed = 0; DWORD dwReturn = ERROR_SUCCESS;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_NAME = 0; // Arg Array Index ( Same Index indicates OR'd commands)
const DWORD ARG_ALL = 0; const DWORD INDEX_NAME = 0; // When no tag is present the index reflects the
const DWORD INDEX_ALL = 1; // Commands as in the ValidToken Structure
// with the 'untagged' arg
if ( (dwMaxArgs - dwCurrentIndex) >= 2 ) // Max 1 Args Allowed
{ PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_NEEDED,ERRMSG_NAMEALL); dwReturn = RETURN_NO_ERROR; BAIL_OUT; }
for(dwCount = 0;dwCount < MAX_ARGS;dwCount++) // Initialize
{ bArg[dwCount] = FALSE; }
for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; // Before sending to MatchEnumTag it is needed
MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_NAME : if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_STRING); bArg[ARG_NAME] = TRUE; }else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); dwReturn = RETURN_NO_ERROR; } break; case CMD_TOKEN_ALL : if (!bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_ALL); bArg[ARG_ALL] = TRUE; }else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); dwReturn = RETURN_NO_ERROR; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_ALL : if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; }else { if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_NAME,TYPE_STRING); bArg[ARG_NAME] = TRUE; }else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); dwReturn = RETURN_NO_ERROR; } } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; } else { if (dwReturn == ERROR_SUCCESS) { if (!bArg[ARG_NAME] ) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_NEEDED,ERRMSG_NAMEALL); } } } error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
// Function : ParseDynamicSetConfig()
//
// Date of Creation : 12th oct 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicSetConfig
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicSetConfig( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0/*,dwNum = 0*/;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_PROPERTY : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PROPERTY); break; case CMD_TOKEN_VALUE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STRING); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicAddRule()
//
// Date of Creation : 10th oct 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN LPTSTR ppwcListTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS],
// IN DWORD dwListArgs
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicAddRule
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicAddRule( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_QMPOLICY : case CMD_TOKEN_MMPOLICY : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STRING); break; case CMD_TOKEN_OUTBOUND : case CMD_TOKEN_INBOUND : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOUND); break; case CMD_TOKEN_MIRROR : case CMD_TOKEN_FAILMMIFEXISTS : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; case CMD_TOKEN_SRCMASK : case CMD_TOKEN_DSTMASK : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_MASK); break; case CMD_TOKEN_SRCADDR : case CMD_TOKEN_DSTADDR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_SRCPORT : case CMD_TOKEN_DSTPORT : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PORT); break; case CMD_TOKEN_TUNNELDST : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_PROTO : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PROTOCOL); break; case CMD_TOKEN_CONNTYPE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_CONNTYPE); break; case CMD_TOKEN_KERB : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_KERBAUTH); break; case CMD_TOKEN_PSK : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PSKAUTH); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } }
return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicSetRule()
//
// Date of Creation : 15th oct 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN LPTSTR ppwcListTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS],
// IN DWORD dwListArgs
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicSetRule
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicSetRule( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_QMPOLICY : case CMD_TOKEN_MMPOLICY : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STRING); break; case CMD_TOKEN_OUTBOUND : case CMD_TOKEN_INBOUND : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOUND); break; case CMD_TOKEN_MIRROR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; case CMD_TOKEN_SRCADDR : case CMD_TOKEN_DSTADDR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_SRCMASK : case CMD_TOKEN_DSTMASK : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_MASK); break; case CMD_TOKEN_SRCPORT : case CMD_TOKEN_DSTPORT : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PORT); break; case CMD_TOKEN_TUNNELDST : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_PROTO : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PROTOCOL); break; case CMD_TOKEN_CONNTYPE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_CONNTYPE); break; case CMD_TOKEN_KERB : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_KERBAUTH); break; case CMD_TOKEN_PSK : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PSKAUTH); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } }
return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicDelRule()
//
// Date of Creation : 12th oct 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS],
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicDelRule
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicDelRule( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_MIRROR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; case CMD_TOKEN_SRCADDR : case CMD_TOKEN_DSTADDR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_SRCMASK : case CMD_TOKEN_DSTMASK : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_MASK); break;
case CMD_TOKEN_SRCPORT : case CMD_TOKEN_DSTPORT : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PORT); break; case CMD_TOKEN_TUNNELDST : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_PROTO : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_PROTOCOL); break; case CMD_TOKEN_CONNTYPE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_CONNTYPE); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } return dwReturn; }
//////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowPolicy()
//
// Date of Creation : 29th aug 2001
//
// Parameters : IN LPWSTR *ppwcArguments, // Input stream
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicShowPolicy
// (MMPolicy/QMPolicy)
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowPolFaction( IN LPWSTR *ppwcArguments, IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount,dwNum,dwTagIndex = 0,dwIndex = 0,dwReturn = ERROR_SUCCESS,dwUsed = 0;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_NAME = 0; // Arg Array Index ( Same Index indicates OR'd commands)
const DWORD ARG_ALL = 0;
const DWORD INDEX_NAME = 0; // When no tag is present the index reflects the
const DWORD INDEX_ALL = 1; // Commands as in the ValidToken Structure
if ( (dwMaxArgs - dwCurrentIndex) >= 2) { dwReturn = ERROR_INVALID_SYNTAX; BAIL_OUT; } for(dwCount = 0; dwCount < MAX_ARGS;dwCount++) // Initialize
{ bArg[dwCount] = FALSE; } for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_NAME : if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; case CMD_TOKEN_ALL : if (!bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_ALL : if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_NAME,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; } else if( (dwReturn == ERROR_SUCCESS) && (!bArg[ARG_NAME] ) ) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_NEEDED,ERRMSG_NAMEALL); } error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowQMSAS()
//
// Date of Creation : 19th aug 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicShowQMSAS
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowQMSAS( IN LPTSTR *ppwcArguments, IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount, dwNum,dwTagIndex = 0,dwIndex = 0,dwReturn = ERROR_SUCCESS,dwUsed = 0;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_ALL = 0; // Arg Array Index ( Same Index indicates OR'd commands)
const DWORD ARG_SRC = 1; const DWORD ARG_DST = 2; const DWORD ARG_PROTO = 3; const DWORD ARG_FORMAT = 4; const DWORD ARG_RESOLVEDNS = 5;
const DWORD INDEX_ALL = 0; // When no tag is present the index reflects the
const DWORD INDEX_SRC = 1; const DWORD INDEX_DST = 2; // Commands as in the ValidToken Structure
const DWORD INDEX_PROTO = 3; // Commands as in the ValidToken Structure
const DWORD INDEX_FORMAT = 4; // with the 'untagged' arg
const DWORD INDEX_RESOLVEDNS = 5;
if ( (dwMaxArgs - dwCurrentIndex) >= 6 ) // Max 5 Args Allowed
{ dwReturn = ERROR_INVALID_SYNTAX; BAIL_OUT; } for(dwCount=0;dwCount < MAX_ARGS;dwCount++) // Initialize
{ bArg[dwCount] = FALSE; } for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_ALL : if (!bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOOL); bArg[ARG_ALL] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCADDR : if (!bArg[ARG_SRC]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_SRC] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTADDR : if (!bArg[ARG_DST]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_DST] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_PROTO : if( !bArg[ARG_PROTO] ) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_FORMAT : if (!bArg[ARG_FORMAT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_FORMAT); bArg[ARG_FORMAT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_RESDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_ALL : if (!bArg[ARG_SRC] && !bArg[ARG_ALL] && !bArg[ARG_DST] && !bArg[ARG_PROTO]) { if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_SRC,TYPE_IP); bArg[ARG_SRC] = TRUE; } }else if (bArg[ARG_SRC] && !bArg[ARG_ALL] && !bArg[ARG_DST] ) { if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken);
} else { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_DST,TYPE_IP); bArg[ARG_DST] = TRUE; } }else if (bArg[ARG_SRC] && !bArg[ARG_ALL] && bArg[ARG_DST] && !bArg[ARG_PROTO]) { if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADDR_ALL_INVALID,pParser->ValidTok[dwIndex].pwszToken); } else { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_PROTO,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } }else if (bArg[ARG_SRC] && !bArg[ARG_ALL] && bArg[ARG_DST] && bArg[ARG_PROTO] && !bArg[ARG_FORMAT]) { if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADDR_ALL_INVALID,pParser->ValidTok[dwIndex].pwszToken); } else { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_FORMAT,TYPE_FORMAT); bArg[ARG_FORMAT] = TRUE; } } else { if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else if(bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_FORMAT,TYPE_FORMAT); bArg[ARG_FORMAT] = TRUE; } else { dwReturn = ERROR_SHOW_USAGE; } } break; case ARG_SRC : if (!bArg[ARG_SRC] && !bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_SRC,TYPE_IP); bArg[ARG_SRC] = TRUE; } else if(bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_FORMAT,TYPE_FORMAT); bArg[ARG_FORMAT] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADDR_ALL_INVALID,pParser->ValidTok[dwIndex].pwszToken); } break; case ARG_DST : if (!bArg[ARG_DST] && !bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_DST,TYPE_IP); bArg[ARG_DST] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADDR_ALL_INVALID,pParser->ValidTok[dwIndex].pwszToken); } break; case ARG_PROTO : if ( (!bArg[ARG_PROTO] && !bArg[ARG_ALL]) && (bArg[ARG_SRC] || bArg[ARG_DST]) ) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_PROTO,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADDR_ALL_INVALID,pParser->ValidTok[dwIndex].pwszToken); } break; case ARG_FORMAT : if (!bArg[ARG_FORMAT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_FORMAT,TYPE_FORMAT); bArg[ARG_FORMAT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_RESOLVEDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_RESOLVEDNS,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; }
error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowMMFilter()
//
// Date of Creation : 19th Aug 2001
//
// Parameters : IN LPWSTR *ppwcArguments, // Input stream
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs
//
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicShowMMFilter
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowMMFilter( IN LPWSTR *ppwcArguments, IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount,dwNum = 0,dwTagIndex = 0,dwIndex = 0; DWORD dwReturn = ERROR_SUCCESS,dwUsed = 0;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_NAME = 0; // Arg Array Index ( Same Index indicates OR'd commands)
const DWORD ARG_ALL = 0; const DWORD ARG_FILTERTYPE = 1; const DWORD ARG_SRCADDR = 2; const DWORD ARG_DSTADDR = 3; const DWORD ARG_SRCMASK = 4; const DWORD ARG_DSTMASK = 5; const DWORD ARG_RESOLVEDNS = 6;
const DWORD INDEX_NAME = 0; // When no tag is present the index reflects the
const DWORD INDEX_ALL = 1; // Commands as in the ValidToken Structure
const DWORD INDEX_FILTERTYPE = 2; const DWORD INDEX_SRCADDR = 3; const DWORD INDEX_DSTADDR = 4; const DWORD INDEX_SRCMASK = 5; const DWORD INDEX_DSTMASK = 6; const DWORD INDEX_RESOLVEDNS = 7;
if ( (dwMaxArgs - dwCurrentIndex) >= 8 ) { dwReturn = ERROR_INVALID_SYNTAX; BAIL_OUT; }
for(dwCount=0;dwCount < MAX_ARGS;dwCount++) { bArg[dwCount] = FALSE; }
for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_NAME : if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; case CMD_TOKEN_ALL : if (!bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; case CMD_TOKEN_TYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_FILTER); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_RESDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_ALL : if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_NAME,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } } break; case ARG_FILTERTYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_FILTERTYPE,TYPE_FILTER); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCADDR,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTADDR,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCMASK,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTMASK : if (!bArg[ARG_DSTMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTMASK,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_RESOLVEDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_RESOLVEDNS,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; } else if( (dwReturn == ERROR_SUCCESS) && (!bArg[ARG_NAME] ) ) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_NEEDED,ERRMSG_NAMEALL); } error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowQMFilter()
//
// Date of Creation : 29th Aug 2001
//
// Parameters : IN LPWSTR *ppwcArguments, // Input stream
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs
//
//
// Return : DWORD
//
// Description : Validates the arguments to the contexts DynamicShowQMFilter
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowQMFilter( IN LPWSTR *ppwcArguments, IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount,dwNum = 0,dwTagIndex = 0,dwIndex = 0; DWORD dwReturn = ERROR_SUCCESS,dwUsed = 0;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_NAME = 0; // Arg Array Index ( Same Index indicates OR'd commands)
const DWORD ARG_ALL = 0; const DWORD ARG_FILTERTYPE = 1; const DWORD ARG_SRCADDR = 2; const DWORD ARG_DSTADDR = 3; const DWORD ARG_SRCMASK = 4; const DWORD ARG_DSTMASK = 5; const DWORD ARG_PROTO = 6; const DWORD ARG_SRCPORT = 7; const DWORD ARG_DSTPORT = 8; const DWORD ARG_ACTINBOUND = 9; const DWORD ARG_ACTOUTBOUND = 10; const DWORD ARG_RESOLVEDNS = 11;
const DWORD INDEX_NAME = 0; // When no tag is present the index reflects the
const DWORD INDEX_ALL = 1; // Commands as in the ValidToken Structure
const DWORD INDEX_FILTERTYPE = 2; const DWORD INDEX_SRCADDR = 3; const DWORD INDEX_DSTADDR = 4; const DWORD INDEX_SRCMASK = 5; const DWORD INDEX_DSTMASK = 6; const DWORD INDEX_PROTO = 7; const DWORD INDEX_SRCPORT = 8; const DWORD INDEX_DSTPORT = 9; const DWORD INDEX_ACTINBOUND = 10; const DWORD INDEX_ACTOUTBOUND = 11; const DWORD INDEX_RESOLVEDNS = 12;
if ( (dwMaxArgs - dwCurrentIndex) >= 13 ) { dwReturn = ERROR_INVALID_SYNTAX; BAIL_OUT; }
for(dwCount =0;dwCount < MAX_ARGS;dwCount++) { bArg[dwCount] = FALSE; } for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_NAME : if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; case CMD_TOKEN_ALL : if (!bArg[ARG_ALL]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } break; case CMD_TOKEN_TYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_FILTER); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_PROTO : if (!bArg[ARG_PROTO]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCPORT : if (!bArg[ARG_SRCPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PORT); bArg[ARG_SRCPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTPORT : if (!bArg[ARG_DSTPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PORT); bArg[ARG_DSTPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_INBOUND : if (!bArg[ARG_ACTINBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOUND); bArg[ARG_ACTINBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_OUTBOUND : if (!bArg[ARG_ACTOUTBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOUND); bArg[ARG_ACTOUTBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break;
case CMD_TOKEN_RESDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_ALL : if (_tcsicmp(szTok,ALL_STR) == 0) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ALL,TYPE_ALL); bArg[ARG_ALL] = TRUE; } else { if (!bArg[ARG_NAME]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,INDEX_NAME,TYPE_STRING); bArg[ARG_NAME] = TRUE; } else { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,ERRMSG_NAMEALL); } } break; case ARG_FILTERTYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_FILTERTYPE,TYPE_FILTER); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCADDR,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTADDR,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCMASK,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTMASK : if (!bArg[ARG_DSTMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTMASK,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_PROTO : if (!bArg[ARG_PROTO]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_PROTO,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCPORT : if (!bArg[ARG_SRCPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCPORT,TYPE_PORT); bArg[ARG_SRCPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTPORT : if (!bArg[ARG_DSTPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTPORT,TYPE_PORT); bArg[ARG_DSTPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_ACTINBOUND : if (!bArg[ARG_ACTINBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ACTINBOUND,TYPE_BOUND); bArg[ARG_ACTINBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_ACTOUTBOUND : if (!bArg[ARG_ACTOUTBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ACTOUTBOUND,TYPE_BOUND); bArg[ARG_ACTOUTBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_RESOLVEDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_RESOLVEDNS,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; } else if ( (dwReturn == ERROR_SUCCESS) && (!bArg[ARG_NAME]) ) { dwReturn = RETURN_NO_ERROR; PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_NEEDED,ERRMSG_NAMEALL); } error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowRule()
//
// Date of Creation : 29th aug 2001
//
// Parameters : IN LPWSTR *ppwcArguments, // Input stream
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs
//
//
// Return : DWORD
//
// Description : Validates the arguments to the context DynamicShowRule
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowRule( IN LPWSTR *ppwcArguments, IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs ) { DWORD dwCount,dwNum = 0,dwTagIndex = 0,dwIndex = 0; DWORD dwReturn = ERROR_SUCCESS,dwUsed = 0;
BOOL bTagPresent= FALSE; BOOL bArg[MAX_ARGS];
_TCHAR szCmd[MAX_STR_LEN] = {0}; _TCHAR szTok[MAX_STR_LEN] = {0}; _TCHAR szTemp[MAX_STR_LEN] = {0};
const DWORD ARG_FILTERTYPE = 0; const DWORD ARG_SRCADDR = 1; const DWORD ARG_DSTADDR = 2; const DWORD ARG_SRCMASK = 3; const DWORD ARG_DSTMASK = 4; const DWORD ARG_PROTO = 5; const DWORD ARG_SRCPORT = 6; const DWORD ARG_DSTPORT = 7; const DWORD ARG_ACTINBOUND = 8; const DWORD ARG_ACTOUTBOUND = 9; const DWORD ARG_RESOLVEDNS = 10;
const DWORD INDEX_FILTERTYPE = 0; const DWORD INDEX_SRCADDR = 1; const DWORD INDEX_DSTADDR = 2; const DWORD INDEX_SRCMASK = 3; const DWORD INDEX_DSTMASK = 4; const DWORD INDEX_PROTO = 5; const DWORD INDEX_SRCPORT = 6; const DWORD INDEX_DSTPORT = 7; const DWORD INDEX_ACTINBOUND = 8; const DWORD INDEX_ACTOUTBOUND = 9; const DWORD INDEX_RESOLVEDNS = 10;
if ( (dwMaxArgs - dwCurrentIndex) >= 12 ) { dwReturn = ERROR_INVALID_SYNTAX; BAIL_OUT; }
for(dwCount = 0;dwCount < MAX_ARGS;dwCount++) { bArg[dwCount] = FALSE; }
for(dwCount = dwCurrentIndex;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { if (_tcslen(ppwcArguments[dwCount]) < MAX_STR_LEN) { _tcsncpy(szTemp,ppwcArguments[dwCount],MAX_STR_LEN-1); // temp contains arg
} else { continue; } bTagPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1); // Check for =
if (bTagPresent) // Parameter With Tag Found
{ dwNum = 0; MatchEnumTag(g_hModule,szCmd,pParser->MaxTok,pParser->ValidTok,&dwNum); if (dwNum) // Convert the output of MatchEnumTag into the TagIndex
{ dwIndex = MatchEnumTagToTagIndex(szCmd,pParser); if(dwIndex == PARSE_ERROR) { dwReturn = ERROR_SHOW_USAGE; BAIL_OUT; } switch(pParser->ValidTok[dwIndex].dwValue) { case CMD_TOKEN_TYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MODE); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_PROTO : if (!bArg[ARG_PROTO]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_SRCPORT : if (!bArg[ARG_SRCPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PORT); bArg[ARG_SRCPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_DSTPORT : if (!bArg[ARG_DSTPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_PORT); bArg[ARG_DSTPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_INBOUND : if (!bArg[ARG_ACTINBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOUND); bArg[ARG_ACTINBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case CMD_TOKEN_OUTBOUND : if (!bArg[ARG_ACTOUTBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOUND); bArg[ARG_ACTOUTBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break;
case CMD_TOKEN_RESDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,szTok,dwIndex,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } else { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TAG,szCmd); dwReturn = RETURN_NO_ERROR; } } else // Parameter Without a Tag Found
{ // Find the first free slot to position the untagged arg
for(dwTagIndex=0; dwTagIndex<pParser->MaxTok && (bArg[dwTagIndex] == TRUE) ; dwTagIndex++); switch (dwTagIndex) { case ARG_FILTERTYPE : if (!bArg[ARG_FILTERTYPE]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_FILTERTYPE,TYPE_MODE); bArg[ARG_FILTERTYPE] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCADDR : if (!bArg[ARG_SRCADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCADDR,TYPE_IP); bArg[ARG_SRCADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTADDR : if (!bArg[ARG_DSTADDR]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTADDR,TYPE_IP); bArg[ARG_DSTADDR] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCMASK : if (!bArg[ARG_SRCMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCMASK,TYPE_MASK); bArg[ARG_SRCMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTMASK : if (!bArg[ARG_DSTMASK]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTMASK,TYPE_MASK); bArg[ARG_DSTMASK] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_PROTO : if (!bArg[ARG_PROTO]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_PROTO,TYPE_PROTOCOL); bArg[ARG_PROTO] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_SRCPORT : if (!bArg[ARG_SRCPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_SRCPORT,TYPE_PORT); bArg[ARG_SRCPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_DSTPORT : if (!bArg[ARG_DSTPORT]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_DSTPORT,TYPE_PORT); bArg[ARG_DSTPORT] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_ACTINBOUND : if (!bArg[ARG_ACTINBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ACTINBOUND,TYPE_BOUND); bArg[ARG_ACTINBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_ACTOUTBOUND : if (!bArg[ARG_ACTOUTBOUND]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_ACTOUTBOUND,TYPE_BOUND); bArg[ARG_ACTOUTBOUND] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; case ARG_RESOLVEDNS : if (!bArg[ARG_RESOLVEDNS]) { dwReturn = LoadParserOutput(pParser,dwCount-dwCurrentIndex,&dwUsed,ppwcArguments[dwCount],INDEX_RESOLVEDNS,TYPE_BOOL); bArg[ARG_RESOLVEDNS] = TRUE; } else { dwReturn = ERR_TAG_ALREADY_PRESENT; } break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } } if(dwReturn == ERR_TAG_ALREADY_PRESENT) { PrintErrorMessage(IPSEC_ERR,0,ERRCODE_TAG_ALREADY_PRESENT,pParser->ValidTok[dwIndex].pwszToken); dwReturn = RETURN_NO_ERROR; } error: return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
// Function : ParseDynamicShowStats()
//
// Date of Creation : 29th aug 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : Validates the arguments to the context DynamicShowStats
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowStats( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_TYPE : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_STATS); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } return dwReturn; }
//////////////////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowMMSAS()
//
// Date of Creation : 29th aug 2001
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : Validates the arguments to the context DynamicShowMMSAS
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowMMSAS( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed = 0/*,dwNum = 0*/;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_ALL : break; case CMD_TOKEN_SRCADDR : case CMD_TOKEN_DSTADDR : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_IP); break; case CMD_TOKEN_FORMAT : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_FORMAT); break; case CMD_TOKEN_RESDNS : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; default : dwReturn = ERROR_INVALID_SYNTAX; break; } } return dwReturn; }
//////////////////////////////////////////////////////////////////////////////
//
// Function : ParseDynamicShowAll()
//
// Date of Creation : 31st Jan 2002
//
// Parameters : IN LPTSTR lppwszTok[MAX_ARGS],
// IN OUT PPARSER_PKT pParser,
// IN DWORD dwCurrentIndex,
// IN DWORD dwMaxArgs,
// IN DWORD dwTagType[MAX_ARGS]
//
// Return : DWORD
//
// Description : It will check the valid Arguments for the ParseDynamicShowAll context.
// It loads all valid argument into pParser structure with status for each argument.
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD ParseDynamicShowAll( IN LPTSTR lppwszTok[MAX_ARGS], IN OUT PPARSER_PKT pParser, IN DWORD dwCurrentIndex, IN DWORD dwMaxArgs, IN DWORD dwTagType[MAX_ARGS] ) { DWORD dwReturn = ERROR_SUCCESS,dwCount,dwUsed=0;
for(dwCount = 0;(dwCount < dwMaxArgs) && (dwReturn == ERROR_SUCCESS);dwCount++) { switch(pParser->ValidTok[dwTagType[dwCount]].dwValue) { case CMD_TOKEN_RESDNS : dwReturn = LoadParserOutput(pParser,dwCount,&dwUsed,lppwszTok[dwCount],dwTagType[dwCount],TYPE_BOOL); break; default : dwReturn = ERROR_SHOW_USAGE; break; } } return dwReturn; }
|