Leaked source code of windows server 2003
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.

3898 lines
96 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. // Module : parser.cpp
  3. //
  4. // Purpose : Netsh Ipsec Context Parser
  5. //
  6. // Developers Name : N.Surendra Sai / Vunnam Kondal Rao
  7. //
  8. // History :
  9. //
  10. // Date Author Comments
  11. // 1 Aug 2001 NSS/VKR
  12. //
  13. //////////////////////////////////////////////////////////////////////////////
  14. #include "nshipsec.h"
  15. #include "parser_util.h"
  16. extern HINSTANCE g_hModule;
  17. extern PVOID g_AllocPtr[MAX_ARGS];
  18. extern PSTA_MM_AUTH_METHODS g_paRootca[MAX_ARGS];
  19. extern PIPSEC_QM_OFFER g_pQmsec[IPSEC_MAX_QM_OFFERS];
  20. extern PIPSEC_MM_OFFER g_pMmsec[IPSEC_MAX_MM_OFFERS];
  21. //////////////////////////////////////////////////////////////////////////////
  22. //
  23. // Function : Parser()
  24. //
  25. // Date of Creation : 21st Aug 2001
  26. //
  27. // Parameters : IN LPCWSTR pwszMachine,
  28. // IN LPWSTR *ppwcArguments,
  29. // IN DWORD dwCurrentIndex,
  30. // IN DWORD dwArgCount,
  31. // IN OUT PARSER_PKT *pParser
  32. //
  33. // Return : ERROR_SUCCESS
  34. // ERROR_SHOW_USAGE
  35. // RETURN_NO_ERROR
  36. // ERROR_INVALID_ARG
  37. // Description : This is called by any Sub-Context of IPSec whenever
  38. // there is a Parsing requirement
  39. // History :
  40. //
  41. // Date Author Comments
  42. //
  43. //////////////////////////////////////////////////////////////////////////////
  44. DWORD
  45. Parser(
  46. IN LPCWSTR pwszMachine,
  47. IN LPWSTR *ppwcArguments,
  48. IN DWORD dwCurrentIndex,
  49. IN DWORD dwArgCount,
  50. IN OUT PPARSER_PKT pParser
  51. )
  52. {
  53. const TOKEN_VALUE vtokGroupCmd[] = // Valid Groups Considered by the Parser
  54. { // For determining group context
  55. { GROUP_STATIC_STR, GROUP_STATIC },
  56. { GROUP_DYNAMIC_STR, GROUP_DYNAMIC }
  57. };
  58. const TOKEN_VALUE vtokPriCmd[] = // Valid Groups Considered by the Parser
  59. { // For determining primary context
  60. { PRI_ADD_STR, PRI_ADD },
  61. { PRI_SET_STR, PRI_SET },
  62. { PRI_DELETE_STR, PRI_DELETE },
  63. { PRI_SHOW_STR, PRI_SHOW },
  64. { PRI_EXPORTPOLICY_STR, PRI_EXPORTPOLICY },
  65. { PRI_IMPORTPOLICY_STR, PRI_IMPORTPOLICY },
  66. { PRI_RESTOREDEFAULTS_STR, PRI_RESTOREDEFAULTS }
  67. };
  68. const TOKEN_VALUE vtokSecCmd[] = // Valid Groups Considered by the Parser
  69. { // For determining secondary context
  70. { SEC_POLICY_STR, SEC_POLICY },
  71. { SEC_FILTER_STR, SEC_FILTER },
  72. { SEC_FILTERLIST_STR, SEC_FILTERLIST },
  73. { SEC_FILTERACTION_STR, SEC_FILTERACTION },
  74. { SEC_RULE_STR, SEC_RULE },
  75. { SEC_ALL_STR, SEC_ALL },
  76. { SEC_STORE_STR, SEC_STORE },
  77. { SEC_DEFAULTRULE_STR, SEC_DEFAULTRULE },
  78. { SEC_ASSIGNEDPOLICY_STR, SEC_ASSIGNEDPOLICY },
  79. { SEC_INTERACTIVE_STR, SEC_INTERACTIVE },
  80. { SEC_MMPOLICY_STR, SEC_MMPOLICY },
  81. { SEC_QMPOLICY_STR, SEC_QMPOLICY },
  82. { SEC_STATS_STR, SEC_STATS },
  83. { SEC_MMSAS_STR, SEC_MMSAS },
  84. { SEC_QMSAS_STR, SEC_QMSAS },
  85. { SEC_MMFILTER_STR, SEC_MMFILTER },
  86. { SEC_QMFILTER_STR, SEC_QMFILTER },
  87. { SEC_CONFIG_STR, SEC_CONFIG },
  88. { SEC_BATCH_STR, SEC_BATCH }
  89. };
  90. const DWORD GROUP_MAX = SIZEOF_TOKEN_VALUE(vtokGroupCmd);
  91. const DWORD PRI_MAX = SIZEOF_TOKEN_VALUE(vtokPriCmd);
  92. const DWORD SEC_MAX = SIZEOF_TOKEN_VALUE(vtokSecCmd);
  93. _TCHAR szListTok[MAX_STR_LEN] = {0}; // wide string
  94. LPTSTR *ppwcTok = NULL; // pointer to array of pointers to wstr
  95. LPTSTR ppwcFirstTok[MAX_ARGS] = {0}; // pointer to array of pointers to wstr
  96. DWORD dwCount = pParser->MaxCmd; // Num of Args after removing List Tokens
  97. DWORD dwCommand = 0; // command determines the context
  98. DWORD dwNumRootca = 0;
  99. DWORD dwMaxArgs = 0; // for loop index
  100. DWORD dwPreProcessCurrentIndex = 0; // Current Index for Preprocess Command after RemoveList
  101. DWORD dwPreProcessArgCount = 0; // Num of args input to Preprocess Command after RemoveList
  102. DWORD dwTagType[MAX_ARGS] = {0}; // Return array of Preprocess Command
  103. DWORD dwReturn = ERROR_SUCCESS; // Default Return Value implies Error Message
  104. DWORD dwGroupCmd,dwPriCmd,dwSecCmd; // Context
  105. PTAG_TYPE pValidCmds = NULL; // pointer to array of TAG_TYPE commands
  106. PTOKEN_VALUE pValidTokens = NULL; // pointer to array of TOKEN_VALUE tokens
  107. BOOL bOption = ADD_CMD; // default is add only.
  108. BOOL bPreProcessCommand = FALSE; // default use PreProcessCommand
  109. BOOL bIsRootcaRule = FALSE;
  110. UpdateGetLastError(NULL); // Error Success
  111. InitializeGlobalPointers();
  112. for(dwMaxArgs=0;dwMaxArgs<MAX_ARGS;dwMaxArgs++) // allocate storage for list commands
  113. {
  114. g_paRootca[dwMaxArgs] = NULL;
  115. }
  116. ZeroMemory(szListTok, MAX_STR_LEN*sizeof(_TCHAR));
  117. pValidCmds = (PTAG_TYPE)pParser->ValidCmd; // Input Valid Command Table
  118. pValidTokens = (PTOKEN_VALUE)pParser->ValidTok; // Input Valid Non-List Commands Table
  119. for(dwMaxArgs = 0;dwMaxArgs <(pParser->MaxCmd);dwMaxArgs++) // Packet Init
  120. {
  121. (pParser->Cmd)[dwMaxArgs].dwCmdToken = dwMaxArgs+1; // Enum Starts at 1
  122. (pParser->Cmd)[dwMaxArgs].pArg = NULL; // All ptrs
  123. (pParser->Cmd)[dwMaxArgs].dwStatus = INVALID_TOKEN; // Status set
  124. }
  125. dwGroupCmd = dwPriCmd = dwSecCmd = 0; // Initialize the context variables
  126. switch (dwCurrentIndex) // CurrentIndex determines Context
  127. {
  128. case SEC_CMD :
  129. MatchEnumTag(g_hModule,ppwcArguments[2],SEC_MAX, vtokSecCmd,&dwSecCmd);
  130. // Fall Through
  131. case PRI_CMD :
  132. // if present
  133. MatchEnumTag(g_hModule,ppwcArguments[1],PRI_MAX, vtokPriCmd,&dwPriCmd);
  134. // Fall Through
  135. case GROUP_CMD :
  136. // Should be present
  137. MatchEnumTag(g_hModule,ppwcArguments[0],GROUP_MAX,vtokGroupCmd,&dwGroupCmd);
  138. break;
  139. default :
  140. // Should Never Come Here
  141. break;
  142. }
  143. dwCommand = INDEX(dwGroupCmd,dwPriCmd,dwSecCmd); // Macro to Compute Index
  144. switch(dwCommand)
  145. { // Based on the context
  146. case DYNAMIC_SET_RULE :
  147. case DYNAMIC_ADD_RULE :
  148. case STATIC_ADD_RULE : // Load the List Commands
  149. case STATIC_SET_RULE :
  150. case STATIC_SET_DEFAULTRULE : // Load the List Commands
  151. bIsRootcaRule = TRUE;
  152. bPreProcessCommand = TRUE;
  153. break;
  154. case STATIC_SET_POLICY :
  155. dwReturn = ParseStaticSetPolicy((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  156. break;
  157. case STATIC_SET_FILTERACTION :
  158. dwReturn = ParseStaticSetFilterAction((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  159. break;
  160. case STATIC_SET_FILTERLIST :
  161. dwReturn = ParseStaticSetFilterList((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  162. break;
  163. case STATIC_SHOW_POLICY :
  164. dwReturn = ParseStaticShowPolicy((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  165. break;
  166. case STATIC_SHOW_FILTERLIST :
  167. dwReturn = ParseStaticShowFilterList((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  168. break;
  169. case STATIC_SHOW_FILTERACTION :
  170. dwReturn = ParseStaticShowFilterAction((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  171. break;
  172. case STATIC_SHOW_RULE :
  173. dwReturn = ParseStaticShowRule((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  174. break;
  175. case STATIC_SHOW_ASSIGNEDPOLICY :
  176. dwReturn = ParseStaticShowAssignedPolicy((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  177. break;
  178. case STATIC_SET_STORE :
  179. dwReturn = ParseStaticSetStore((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  180. break;
  181. case STATIC_DELETE_FILTERLIST :
  182. case STATIC_DELETE_FILTERACTION :
  183. case STATIC_DELETE_POLICY :
  184. dwReturn = ParseStaticDelPolFlistFaction((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  185. break;
  186. case STATIC_DELETE_RULE :
  187. dwReturn = ParseStaticDelRule((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  188. break;
  189. case DYNAMIC_SHOW_MMPOLICY :
  190. case DYNAMIC_SHOW_FILTERACTION :
  191. dwReturn = ParseDynamicShowPolFaction((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  192. break;
  193. case DYNAMIC_SHOW_QMFILTER :
  194. dwReturn = ParseDynamicShowQMFilter((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  195. break;
  196. case DYNAMIC_SHOW_MMFILTER :
  197. dwReturn = ParseDynamicShowMMFilter((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  198. break;
  199. case DYNAMIC_DELETE_FILTERACTION:
  200. case DYNAMIC_DELETE_MMPOLICY :
  201. dwReturn = ParseDynamicDelPolFaction((LPTSTR * )ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  202. break;
  203. case DYNAMIC_SHOW_QMSAS :
  204. dwReturn = ParseDynamicShowQMSAS((LPTSTR *)ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  205. break;
  206. case DYNAMIC_SHOW_RULE :
  207. dwReturn = ParseDynamicShowRule((LPTSTR *)ppwcArguments,pParser,dwCurrentIndex,dwArgCount);
  208. break;
  209. default :
  210. bPreProcessCommand = TRUE;
  211. break;
  212. }
  213. if ( bPreProcessCommand == FALSE ) // It was done every thing for all 'or' commands..
  214. { // So back to called context
  215. BAIL_OUT;
  216. }
  217. if (bIsRootcaRule)
  218. {
  219. dwReturn = RemoveRootcaAuthMethods(ppwcArguments,dwArgCount,dwCurrentIndex,pParser,NULL,g_paRootca,ppwcFirstTok,&dwNumRootca,MAX_STR_LEN, &dwCount);
  220. if(dwReturn != ERROR_SUCCESS)
  221. {
  222. dwReturn = RETURN_NO_ERROR;
  223. BAIL_OUT;
  224. }
  225. }
  226. else
  227. { // Normalize the ppcwTok to 0 Base 'for sake of consistency
  228. dwCount = RemoveList(ppwcArguments,dwArgCount,dwCurrentIndex,pParser,_TEXT(""),NULL,szListTok,ppwcFirstTok,MAX_STR_LEN);
  229. }
  230. ppwcTok = (LPTSTR [MAX_ARGS])ppwcFirstTok;
  231. if(dwCommand == STATIC_SET_RULE)
  232. {
  233. dwReturn = ParseStaticSetRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  234. }
  235. else
  236. {
  237. // Initialize the output array of PreProcess Command
  238. for(dwMaxArgs = 0;dwMaxArgs < MAX_ARGS;dwMaxArgs++)
  239. {
  240. dwTagType[dwMaxArgs] = 0;
  241. }
  242. dwPreProcessCurrentIndex = 0; // Current Index for Preprocess Command after RemoveList
  243. dwPreProcessArgCount = dwCount; // Num of args input to Preprocess Command after RemoveList
  244. if(dwCount > MAX_ARGS) // pParser->MaxCmd
  245. // Check For Max Args in the Non-List Commands
  246. {
  247. dwPreProcessArgCount = MAX_ARGS; // pParser->MaxCmd;
  248. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_MAXARGS_CROSSED); // Should Never Come Here
  249. } // If More Truncate...
  250. else
  251. {
  252. dwPreProcessArgCount = dwCount;
  253. }
  254. dwReturn = PreprocessCommand(
  255. g_hModule, // This argument is not used; should be 0.
  256. ppwcTok, // Argv style array (netsh passed us this.)
  257. dwPreProcessCurrentIndex, // Means ppwcArguments[dwCurrentIndex] is the first argument of interest.
  258. // PpwcArguments[0] is going to be the context,
  259. // PpwcArguments[1] is the first command
  260. // So ppwcARguments[2] is the first argument of interest.
  261. dwPreProcessArgCount, // Total count of all the args in ppwcArguments.
  262. (PTAG_TYPE)pParser->ValidCmd,
  263. pParser->MaxCmd, // Number of entries in the ValidCommands array.
  264. 1, // Minimum number of arguments needed to be a valid command.
  265. MAX_ARGS, // Maximum number of arguments allowed to be a valid command.
  266. dwTagType); // Array of DWORD's used to indicate which command in ValidCommands.
  267. // The token in the command line referred to.
  268. if (dwReturn != ERROR_SUCCESS)
  269. {
  270. UpdateGetLastError(ERRMSG_GETLASTERROR);
  271. BAIL_OUT;
  272. }
  273. switch(dwCommand)
  274. {
  275. case STATIC_IMPORTPOLICY :
  276. dwReturn = ParseStaticImportPolicy(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  277. break;
  278. case STATIC_EXPORTPOLICY :
  279. dwReturn = ParseStaticExportPolicy(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  280. break;
  281. case STATIC_SET_INTERACTIVE : // Interactive & Batch have the same args..
  282. case STATIC_SET_BATCH :
  283. dwReturn = ParseStaticSetInteractive(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  284. break;
  285. case STATIC_ADD_POLICY :
  286. dwReturn = ParseStaticAddPolicy(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  287. break;
  288. case STATIC_SET_RULE :
  289. // handled above
  290. break;
  291. case STATIC_ADD_RULE :
  292. dwReturn = ParseStaticAddRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  293. break;
  294. case STATIC_ADD_FILTERLIST :
  295. dwReturn = ParseStaticAddFilterList(ppwcTok,szListTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  296. break;
  297. case STATIC_ADD_FILTERACTION :
  298. dwReturn = ParseStaticAddFilterAction(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  299. break;
  300. case STATIC_SET_DEFAULTRULE :
  301. dwReturn = ParseStaticSetDefaultRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  302. break;
  303. case STATIC_ADD_FILTER :
  304. dwReturn = ParseStaticAddFilter(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  305. break;
  306. case STATIC_DELETE_FILTER :
  307. dwReturn = ParseStaticDelFilter(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  308. break;
  309. case STATIC_RESTOREDEFAULTS :
  310. dwReturn = ParseStaticRestoreDefaults(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  311. break;
  312. case DYNAMIC_SET_MMPOLICY : // Set means no need to fill default MMSec methods
  313. bOption = SET_CMD;
  314. case DYNAMIC_ADD_MMPOLICY :
  315. dwReturn = ParseDynamicAddSetMMPolicy(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType,bOption);
  316. break;
  317. case DYNAMIC_SET_FILTERACTION : // Set means no need to fill default QMSec methods
  318. bOption = SET_CMD;
  319. case DYNAMIC_ADD_FILTERACTION :
  320. dwReturn = ParseDynamicAddSetQMPolicy(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType,bOption);
  321. break;
  322. case DYNAMIC_SET_CONFIG :
  323. dwReturn = ParseDynamicSetConfig(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  324. break;
  325. case DYNAMIC_SHOW_STATS :
  326. dwReturn = ParseDynamicShowStats(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  327. break;
  328. case DYNAMIC_SHOW_ALL :
  329. dwReturn = ParseDynamicShowAll(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  330. break;
  331. case STATIC_SHOW_ALL :
  332. dwReturn = ParseStaticAll(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  333. break;
  334. case DYNAMIC_ADD_RULE :
  335. dwReturn = ParseDynamicAddRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  336. break;
  337. case DYNAMIC_SET_RULE :
  338. dwReturn = ParseDynamicSetRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  339. break;
  340. case DYNAMIC_DELETE_RULE :
  341. dwReturn = ParseDynamicDelRule(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  342. break;
  343. case DYNAMIC_SHOW_MMSAS :
  344. dwReturn = ParseDynamicShowMMSAS(ppwcTok,pParser,dwCurrentIndex,dwCount,dwTagType);
  345. break;
  346. case STATIC_DELETE_ALL :
  347. break;
  348. default :
  349. dwReturn = ERROR_SHOW_USAGE;
  350. break;
  351. }
  352. }
  353. if (bIsRootcaRule)
  354. {
  355. pParser->Cmd[pParser->MaxTok].dwCmdToken = CMD_TOKEN_ROOTCA;
  356. pParser->Cmd[pParser->MaxTok].dwStatus = dwNumRootca;
  357. pParser->Cmd[pParser->MaxTok].pArg = (void *)g_paRootca;
  358. }
  359. error:
  360. return dwReturn;
  361. }
  362. //////////////////////////////////////////////////////////////////////////////
  363. //
  364. // Function : CleanUp()
  365. //
  366. // Date of Creation : 12 Aug 2001
  367. //
  368. // Parameters : NONE
  369. //
  370. // Return : NONE
  371. //
  372. // Description : Free's the all Globally allocated memory.
  373. //
  374. // History :
  375. //
  376. // Date Author Comments
  377. //
  378. //////////////////////////////////////////////////////////////////////////////
  379. VOID
  380. CleanUp(VOID)
  381. {
  382. DWORD dwCount;
  383. DWORD dwMaxArgs;
  384. for(dwCount=0;dwCount<MAX_ARGS;dwCount++)
  385. {
  386. if (g_AllocPtr[dwCount])
  387. {
  388. free(g_AllocPtr[dwCount]);
  389. g_AllocPtr[dwCount] = NULL;
  390. }
  391. }
  392. if (g_paRootca)
  393. {
  394. for(dwMaxArgs=0;dwMaxArgs<MAX_ARGS;dwMaxArgs++)
  395. {
  396. CleanupMMAuthMethod(&(g_paRootca[dwMaxArgs]), FALSE);
  397. }
  398. }
  399. }
  400. //////////////////////////////////////////////////////////////////////////////
  401. //
  402. // Function : RemoveList()
  403. //
  404. // Date of Creation : 10th Aug 2001
  405. //
  406. // Parameters : IN ppwcArguments, // Input stream
  407. // IN dwArgCount, // Input arg count
  408. // IN dwCurrentIndex, // Input current arg index
  409. // IN pParser, // contains the MaxTok
  410. // IN pwcListCmd, // Compare ListCmd with this string
  411. // OUT pwcListArgs, // string containing the list args
  412. // OUT ppwcTok // i/p stream stripped of list cmds
  413. // IN dwInputAllocLen // Max alloc len of pwcListArgs
  414. //
  415. // Return : DWORD (No.of Non list commands)
  416. //
  417. // Description : This Function called by parser function.
  418. // It will separate the List and Non-List commands
  419. //
  420. // History :
  421. //
  422. // Date Author Comments
  423. //
  424. //////////////////////////////////////////////////////////////////////////////
  425. DWORD
  426. RemoveList(
  427. IN LPTSTR *ppwcArguments, // Input stream
  428. IN DWORD dwArgCount, // Input arg count
  429. IN DWORD dwCurrentIndex, // Input current arg index
  430. IN PPARSER_PKT pParser, // contains the MaxTok
  431. IN LPTSTR pwcListCmd, // Compare ListCmd with this string
  432. IN LPTSTR szAnotherList, // Another ListCmd also present ...
  433. OUT LPTSTR pwcListArgs, // string containing the list args // Memory need to be pre allocated
  434. OUT LPTSTR *ppwcTok, // i/p stream stripped of list cmds // No Memory has been allocated...
  435. // Only pointer copy operation
  436. IN DWORD dwInputAllocLen // Max alloc len of pwcListArgs
  437. )
  438. {
  439. DWORD dwLoopCount,dwNum = 0,dwCount = 0; // Count of the number of tokens input to PP
  440. BOOL bWithinList = FALSE; // track if within list command
  441. BOOL bFoundList = FALSE; // track if list command found in stream
  442. BOOL bFoundAnotherList = FALSE;
  443. BOOL bEqualPresent = FALSE;
  444. _TCHAR szCmd[MAX_STR_LEN] = {0};
  445. _TCHAR szTok[MAX_STR_LEN] = {0};
  446. _TCHAR szTemp[MAX_STR_LEN] = {0};
  447. for(dwLoopCount = dwCurrentIndex;dwLoopCount < dwArgCount;dwLoopCount++)
  448. {
  449. if (_tcslen(ppwcArguments[dwLoopCount]) < MAX_STR_LEN)
  450. {
  451. _tcsncpy(szTemp,ppwcArguments[dwLoopCount],MAX_STR_LEN-1);
  452. // szTemp contains the cmd=arg
  453. }
  454. else
  455. {
  456. continue;
  457. }
  458. // szCmd = cmd, szTok = arg
  459. bEqualPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1);
  460. if (bWithinList)
  461. {
  462. dwNum = 0;
  463. MatchEnumTag(g_hModule,szTemp,pParser->MaxTok,pParser->ValidTok,&dwNum);
  464. if (szAnotherList)
  465. {
  466. bFoundAnotherList = MatchToken(szTemp,szAnotherList) && bEqualPresent;
  467. }
  468. if ( dwNum || bFoundAnotherList ) // Normal command
  469. {
  470. bWithinList = 0;
  471. ppwcTok[dwCount] = ppwcArguments[dwLoopCount]; // Pointer Cpy, Unallocated Mem
  472. dwCount++;
  473. continue;
  474. }
  475. else
  476. { // Searching for list inside list
  477. bFoundList = MatchToken(szCmd,pwcListCmd) && bEqualPresent;
  478. if (bFoundList)
  479. {
  480. bWithinList = 1;
  481. _tcsncat(pwcListArgs,szTok,dwInputAllocLen-_tcslen(pwcListArgs)-1); // Pre Allocated Mem
  482. _tcsncat(pwcListArgs,TEXT(" "),dwInputAllocLen-_tcslen(pwcListArgs)-1);
  483. continue;
  484. }
  485. _tcsncat(pwcListArgs,szTemp,dwInputAllocLen-_tcslen(pwcListArgs)-1); // List token
  486. _tcsncat(pwcListArgs,TEXT(" "),dwInputAllocLen-_tcslen(pwcListArgs)-1); // Pre Allocated Mem
  487. continue;
  488. }
  489. }
  490. bFoundList = MatchToken(szCmd,pwcListCmd) && bEqualPresent;
  491. if (bFoundList)
  492. {
  493. bWithinList = 1;
  494. _tcsncat(pwcListArgs,szTok,dwInputAllocLen-_tcslen(pwcListArgs)-1); // Pre Allocated Mem
  495. _tcsncat(pwcListArgs,TEXT(" "),dwInputAllocLen-_tcslen(pwcListArgs)-1); // space delimited tokens
  496. continue;
  497. }
  498. ppwcTok[dwCount] = ppwcArguments[dwLoopCount]; // Pointer Copy operation only
  499. dwCount++;
  500. }
  501. return dwCount;
  502. }
  503. //////////////////////////////////////////////////////////////////////////////
  504. //
  505. // Function : LoadParserOutput()
  506. //
  507. // Date of Creation : 16th Aug 2001
  508. //
  509. // Parameters : OUT PPARSER_PKT pParser,
  510. // IN DWORD dwCount,
  511. // OUT PDWORD pdwUsed,
  512. // IN LPTSTR str,
  513. // IN DWORD dwTagType,
  514. // IN DWORD dwConversionType
  515. //
  516. // Return : ERROR_SUCESS
  517. // RETURN_NO_ERROR
  518. //
  519. // Description : Validates the argument and fill's with relevant info
  520. // in the Parser_Pkt Structure.
  521. //
  522. // History :
  523. //
  524. // Date Author Comments
  525. //
  526. //////////////////////////////////////////////////////////////////////////////
  527. DWORD
  528. LoadParserOutput(
  529. OUT PPARSER_PKT pParser,
  530. IN DWORD dwCount,
  531. OUT PDWORD pdwUsed,
  532. IN LPTSTR szArg,
  533. IN DWORD dwTagType,
  534. IN DWORD dwConversionType
  535. )
  536. {
  537. DWORD dwReturn = ERROR_SUCCESS;
  538. BOOL bTunnel = FALSE;
  539. LPTSTR szIpsec = NULL;
  540. pParser->Cmd[dwCount].dwCmdToken = dwTagType;
  541. pParser->Cmd[dwCount].dwStatus = INVALID_TOKEN;
  542. switch(dwConversionType)
  543. {
  544. case TYPE_STRING :
  545. //
  546. // Loads the normal string.
  547. //
  548. dwReturn = LoadParserString(szArg,pParser,dwTagType,pdwUsed,dwCount,FALSE,NULL);
  549. break;
  550. case TYPE_BOOL :
  551. //
  552. // Validates the yes(y) or no(n)
  553. //
  554. dwReturn = LoadBoolWithOption(szArg,pParser,dwTagType,pdwUsed,dwCount,FALSE,NULL);
  555. break;
  556. case TYPE_DWORD :
  557. //
  558. // Loads DWORD
  559. //
  560. dwReturn = LoadDword(szArg,pParser,dwTagType,pdwUsed,dwCount);
  561. break;
  562. case TYPE_ALL :
  563. //
  564. // First check for the boolean (yes/y/No/n)
  565. //
  566. dwReturn = LoadBoolWithOption(szArg,pParser,dwTagType,pdwUsed,dwCount,TRUE,ALL_STR);
  567. break;
  568. case TYPE_VERBOSE :
  569. //
  570. // Check for arg 'normal' or 'verbose'
  571. //
  572. dwReturn = LoadLevel(szArg,pParser,dwTagType,pdwUsed,dwCount);
  573. break;
  574. case TYPE_CONNTYPE :
  575. //
  576. // Validates the connection types (all/lan/dialup)
  577. //
  578. dwReturn = LoadConnectionType(szArg,pParser,dwTagType,pdwUsed,dwCount);
  579. break;
  580. case TYPE_PROTOCOL :
  581. //
  582. // Protocol (TCP/UDP...) validation done here
  583. //
  584. dwReturn = LoadProtocol(szArg,pParser,dwTagType,pdwUsed,dwCount);
  585. break;
  586. case TYPE_PFSGROUP :
  587. //
  588. // Validate and Load PFSGroup(grpmm/grp1/grp2/grp3/nopfs)
  589. //
  590. dwReturn = LoadPFSGroup(szArg,pParser,dwTagType,pdwUsed,dwCount);
  591. break;
  592. case TYPE_BOUND :
  593. //
  594. // Check for valid arg(permit/block/negotiate)
  595. //
  596. dwReturn = LoadQMAction(szArg,pParser,dwTagType,pdwUsed,dwCount);
  597. break;
  598. case TYPE_FORMAT :
  599. //
  600. // Validate user show o/p format. (list/table)
  601. //
  602. dwReturn = LoadFormat(szArg,pParser,dwTagType,pdwUsed,dwCount);
  603. break;
  604. case TYPE_MODE :
  605. //
  606. // Validate the filtermodes..(Transport/Tunnel)
  607. //
  608. dwReturn = LoadFilterMode(szArg,pParser,dwTagType,pdwUsed,dwCount);
  609. break;
  610. case TYPE_RELEASE :
  611. //
  612. // Check for the release of OS type(win2k/.net)
  613. //
  614. dwReturn = LoadOSType(szArg,pParser,dwTagType,pdwUsed,dwCount);
  615. break;
  616. case TYPE_PROPERTY :
  617. //
  618. //Registry key name
  619. //
  620. dwReturn = LoadProperty(szArg,pParser,dwTagType,pdwUsed,dwCount);
  621. break;
  622. case TYPE_PORT :
  623. //
  624. //Port valid form 0 to 65535
  625. //
  626. dwReturn = LoadPort(szArg,pParser,dwTagType,pdwUsed,dwCount);
  627. break;
  628. case TYPE_FILTER :
  629. //
  630. // Validate filter (Generic/specific)
  631. //
  632. dwReturn = LoadFilterType(szArg,pParser,dwTagType,pdwUsed,dwCount);
  633. break;
  634. case TYPE_STATS :
  635. //
  636. //Ipsec or Ike
  637. //
  638. dwReturn = LoadStats(szArg,pParser,dwTagType,pdwUsed,dwCount);
  639. break;
  640. case TYPE_TUNNEL :
  641. //
  642. // Validate and convert the string into Tunnel IP
  643. //
  644. bTunnel = TRUE;
  645. case TYPE_IP :
  646. //
  647. // Validate and convert the string into IP, DNS name resolves to first IP only
  648. //
  649. dwReturn = LoadIPAddrTunnel(szArg,pParser,dwTagType,pdwUsed,dwCount,bTunnel);
  650. break;
  651. case TYPE_MASK :
  652. //
  653. // Converts the user i/p Mask (also allows prefix )
  654. //
  655. dwReturn = LoadIPMask(szArg,pParser,dwTagType,pdwUsed,dwCount);
  656. break;
  657. case TYPE_QM_OFFER :
  658. //
  659. // Validate Quick Mode offers here
  660. //
  661. dwReturn = LoadQMOffers(szArg,pParser,dwTagType,pdwUsed,dwCount);
  662. break;
  663. case TYPE_MM_OFFER :
  664. //
  665. //Loads MMOffer
  666. //
  667. dwReturn = LoadMMOffers(szArg,pParser,dwTagType,pdwUsed,dwCount);
  668. break;
  669. case TYPE_DNSIP :
  670. //
  671. //Accepts DNS name, validates IP
  672. //
  673. dwReturn = LoadDNSIPAddr(szArg,pParser,dwTagType,pdwUsed,dwCount);
  674. break;
  675. case TYPE_LOCATION :
  676. //
  677. // Accepts enumeration: [local | persistent | domain]
  678. //
  679. dwReturn = LoadLocationType(szArg,pParser,dwTagType,pdwUsed,dwCount);
  680. break;
  681. case TYPE_EXPORT :
  682. //
  683. // Checks the file name extension,if not available appends .ipsec
  684. //
  685. szIpsec = _tcsstr(szArg,EXPORT_IPSEC);
  686. if(szIpsec == NULL)
  687. {
  688. dwReturn = LoadParserString(szArg,pParser,dwTagType,pdwUsed,dwCount,TRUE,EXPORT_IPSEC);
  689. }
  690. else
  691. {
  692. dwReturn = LoadParserString(szArg,pParser,dwTagType,pdwUsed,dwCount,FALSE,NULL);
  693. }
  694. break;
  695. case TYPE_KERBAUTH:
  696. dwReturn = LoadKerbAuthInfo(szArg, pParser, dwTagType, pdwUsed, dwCount);
  697. break;
  698. case TYPE_PSKAUTH:
  699. dwReturn = LoadPskAuthInfo(szArg, pParser, dwTagType, pdwUsed, dwCount);
  700. break;
  701. case TYPE_ROOTCA:
  702. // do nothing... this is handled a different way
  703. break;
  704. default :
  705. break;
  706. }
  707. if ( dwReturn == ERRCODE_ARG_INVALID )
  708. {
  709. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ARG_INVALID,szArg,pParser->ValidTok[dwTagType].pwszToken);
  710. dwReturn = RETURN_NO_ERROR;
  711. }
  712. else if( dwReturn == ERROR_OUTOFMEMORY )
  713. {
  714. PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
  715. dwReturn = RETURN_NO_ERROR;
  716. }
  717. else if( dwReturn == ERROR_OUT_OF_STRUCTURES )
  718. {
  719. PrintErrorMessage(WIN32_ERR,ERROR_OUT_OF_STRUCTURES,NULL);
  720. dwReturn = RETURN_NO_ERROR;
  721. }
  722. else if(( dwReturn != ERROR_SUCCESS ) && ( dwReturn != RETURN_NO_ERROR))
  723. {
  724. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_ARG,pParser->ValidTok[dwTagType].pwszToken);
  725. dwReturn = RETURN_NO_ERROR;
  726. }
  727. return dwReturn;
  728. }
  729. //////////////////////////////////////////////////////////////////////////////
  730. //
  731. // Function : SplitCmdTok()
  732. //
  733. // Date of Creation : 8th Aug 2001
  734. //
  735. // Parameters : IN LPTSTR szStr
  736. // OUT LPTSTR szCmd
  737. // OUT LPTSTR szTok
  738. // IN DWORD dwCmdLen
  739. // IN DWORD dwTokLen
  740. //
  741. // Return : BOOL
  742. //
  743. // Description : This splitter assumes
  744. // 1. inputs are of the type cmd = tok
  745. // 2. cmd & tok are allocated ptrs
  746. //
  747. // History :
  748. //
  749. // Date Author Comments
  750. //
  751. //////////////////////////////////////////////////////////////////////////////
  752. BOOL
  753. SplitCmdTok(
  754. LPTSTR szStr,
  755. LPTSTR szCmd,
  756. LPTSTR szTok,
  757. DWORD dwCmdLen,
  758. DWORD dwTokLen
  759. )
  760. {
  761. LPTSTR found = NULL;
  762. BOOL bTest = FALSE;
  763. found = _tcschr(szStr,_TEXT('=')); // detect =
  764. if ( found != NULL) // if = found strip =
  765. {
  766. *(found) = _TEXT('\0'); // replace = with null
  767. _tcsncpy(szCmd,szStr,dwCmdLen); // First part is cmd
  768. _tcsncpy(szTok,found+1,dwTokLen); // Second part if tok
  769. }
  770. else
  771. {
  772. _tcsncpy(szTok,szStr,dwTokLen);
  773. _tcsncpy(szCmd,szStr,dwCmdLen);
  774. }
  775. if (found)
  776. {
  777. bTest = TRUE;
  778. }
  779. return bTest;
  780. }
  781. //////////////////////////////////////////////////////////////////////////////
  782. //
  783. // Function : ValidateBool()
  784. //
  785. // Date of Creation : 20th Aug 2001
  786. //
  787. // Parameters : IN LPTSTR ppwcTok
  788. //
  789. // Return : BOOL
  790. //
  791. // Description : Validates the user input (Yes/y/no/n)
  792. //
  793. // History :
  794. //
  795. // Date Author Comments
  796. //
  797. //////////////////////////////////////////////////////////////////////////////
  798. DWORD
  799. ValidateBool(LPTSTR szStr)
  800. {
  801. DWORD dwReturn = ERROR_SUCCESS;
  802. if ((_tcsicmp(szStr,YES_STR) == 0) || (_tcsicmp(szStr,Y_STR) == 0))
  803. {
  804. dwReturn = ARG_YES;
  805. }
  806. else if ((_tcsicmp(szStr,NO_STR) == 0) ||(_tcsicmp(szStr,N_STR) == 0))
  807. {
  808. dwReturn = ARG_NO;
  809. }
  810. return dwReturn;
  811. }
  812. //////////////////////////////////////////////////////////////////////////////
  813. //
  814. // Function : IsDnsName()
  815. //
  816. // Date of Creation : 30th Aug 2001
  817. //
  818. // Parameters : IN szText // string to check for DNS name
  819. //
  820. // Return : DWORD
  821. //
  822. // Description : If there is an alpha character in the string,
  823. // then we consider it as a DNS name.
  824. //
  825. // History :
  826. //
  827. // Date Author Comments
  828. //
  829. //////////////////////////////////////////////////////////////////////////////
  830. DWORD
  831. IsDnsName(LPTSTR szStr)
  832. {
  833. BOOL bTest = FALSE;
  834. if ( szStr )
  835. {
  836. for (DWORD dwCount = 0; dwCount < _tcslen(szStr); ++dwCount)
  837. {
  838. if ( _istalpha(szStr[dwCount]) )
  839. {
  840. bTest = TRUE;
  841. }
  842. }
  843. }
  844. return bTest;
  845. }
  846. //////////////////////////////////////////////////////////////////////////////
  847. //
  848. // Function : CheckIFType()
  849. //
  850. // Date of Creation : 30th Aug 3001
  851. //
  852. // Parameters : IN szText // String to be compared
  853. //
  854. // Return : DWORD
  855. // INTERFACE_TYPE_ALL
  856. // INTERFACE_TYPE_LAN
  857. // INTERFACE_TYPE_DIALUP
  858. // Description : Validates the User Input for connection types
  859. // (ALL/LAN/DIALUP)
  860. //
  861. // History :
  862. //
  863. // Date Author Comments
  864. //
  865. //////////////////////////////////////////////////////////////////////////////
  866. DWORD
  867. CheckIFType ( LPTSTR SzText)
  868. {
  869. DWORD dwReturn = PARSE_ERROR;
  870. if( _tcsicmp(SzText,IF_TYPE_ALL) == 0 )
  871. {
  872. dwReturn = INTERFACE_TYPE_ALL; // Interface Type 'all'
  873. }
  874. else if( _tcsicmp(SzText,IF_TYPE_LAN) == 0 )
  875. {
  876. dwReturn = INTERFACE_TYPE_LAN; // Interface Type 'lan'
  877. }
  878. else if( _tcsicmp(SzText,IF_TYPE_DIALUP) == 0)
  879. {
  880. dwReturn = INTERFACE_TYPE_DIALUP; // Interface Type 'dialup'
  881. }
  882. return dwReturn;
  883. }
  884. //////////////////////////////////////////////////////////////////////////////
  885. //
  886. // Function : CheckLocationType()
  887. //
  888. // Date of Creation : 30th Aug 3001
  889. //
  890. // Parameters : IN szText // String to be compared
  891. //
  892. // Return : the polstore provider id
  893. //
  894. // Description : Validates the User Input for connection types
  895. // (local,persistent,domain)
  896. //
  897. // History :
  898. //
  899. // Date Author Comments
  900. //
  901. //////////////////////////////////////////////////////////////////////////////
  902. DWORD
  903. CheckLocationType ( LPTSTR SzText)
  904. {
  905. DWORD dwReturn = PARSE_ERROR;
  906. if( _tcsicmp(SzText,LOC_TYPE_PERSISTENT) == 0 )
  907. {
  908. dwReturn = IPSEC_PERSISTENT_PROVIDER;
  909. }
  910. else if( _tcsicmp(SzText,LOC_TYPE_LOCAL) == 0 )
  911. {
  912. dwReturn = IPSEC_REGISTRY_PROVIDER;
  913. }
  914. else if( _tcsicmp(SzText,LOC_TYPE_DOMAIN) == 0)
  915. {
  916. dwReturn = IPSEC_DIRECTORY_PROVIDER;
  917. }
  918. return dwReturn;
  919. }
  920. //////////////////////////////////////////////////////////////////////////////
  921. //
  922. // Function : CheckPFSGroup()
  923. //
  924. // Date of Creation : 10th Sept 2001
  925. //
  926. // Parameters : IN szText // String to be compared
  927. //
  928. // Return : DWORD
  929. // PFSGROUP_TYPE_P1 // 1
  930. // PFSGROUP_TYPE_P2 // 2
  931. // PFSGROUP_TYPE_MM // 3
  932. //
  933. // Description : Validates the user input for PFS Groups
  934. // (grp1/grp2/grp3/grpmm/nopfs)
  935. //
  936. // History :
  937. //
  938. // Date Author Comments
  939. //
  940. //////////////////////////////////////////////////////////////////////////////
  941. DWORD
  942. CheckPFSGroup ( LPTSTR SzText)
  943. {
  944. DWORD dwReturn = PARSE_ERROR;
  945. if( _tcsicmp(SzText,PFS_TYPE_P1) == 0 )
  946. {
  947. dwReturn = PFSGROUP_TYPE_P1;
  948. }
  949. else if( _tcsicmp(SzText,PFS_TYPE_P2) == 0 )
  950. {
  951. dwReturn = PFSGROUP_TYPE_P2;
  952. }
  953. else if( _tcsicmp(SzText,PFS_TYPE_P3) == 0)
  954. {
  955. dwReturn = PFSGROUP_TYPE_2048; // PFS Group is GRP3
  956. }
  957. else if( _tcsicmp(SzText,PFS_TYPE_MM) == 0)
  958. {
  959. dwReturn = PFSGROUP_TYPE_MM;
  960. }
  961. else if(_tcsicmp(SzText,PFS_TYPE_NOPFS) == 0)
  962. {
  963. dwReturn = PFSGROUP_TYPE_NOPFS;
  964. }
  965. return dwReturn;
  966. }
  967. //////////////////////////////////////////////////////////////////////////////
  968. //
  969. // Function : GetIpAddress()
  970. //
  971. // Date of Creation : 10th Sept 2001
  972. //
  973. // Parameters : IN ppwcArg // String to be converted
  974. // OUT pipAddress // Target to be filled
  975. //
  976. // Return : ERROR_SUCCESS
  977. // IP_DECODE_ERROR
  978. // IP_MASK_ERROR
  979. //
  980. // Description : Gets the ip address from the string.
  981. //
  982. // History :
  983. //
  984. // Date Author Comments
  985. //
  986. //////////////////////////////////////////////////////////////////////////////
  987. DWORD
  988. GetIpAddress(
  989. IN LPTSTR ppwcArg,
  990. OUT IPAddr *pipAddress
  991. )
  992. {
  993. CHAR pszIpAddr[24+1] = {0}; // ADDR_LENGTH =24
  994. DWORD dwStatus = 0;
  995. DWORD dwReturn = ERROR_SUCCESS;
  996. DWORD i = 0;
  997. LPTSTR pszTmpPtr = NULL;
  998. // Make sure all characters are legal
  999. if (ppwcArg[ _tcsspn(ppwcArg, VALID_HEXIP) ])
  1000. {
  1001. dwReturn = IP_DECODE_ERROR;
  1002. BAIL_OUT;
  1003. }
  1004. // make sure there are 3 and only "." (periods)
  1005. for (i=0,pszTmpPtr=ppwcArg; ;i++)
  1006. {
  1007. pszTmpPtr = _tcschr(pszTmpPtr, _TEXT('.'));
  1008. if(pszTmpPtr)
  1009. {
  1010. pszTmpPtr++;
  1011. }
  1012. else
  1013. break;
  1014. }
  1015. if(i!=3) // Invalid IPAddress is specified
  1016. {
  1017. dwReturn = IP_DECODE_ERROR;
  1018. BAIL_OUT;
  1019. }
  1020. dwStatus = WideCharToMultiByte(CP_THREAD_ACP,0,ppwcArg,-1,pszIpAddr,24,NULL,NULL);
  1021. if (!dwStatus)
  1022. {
  1023. dwReturn = IP_DECODE_ERROR;
  1024. BAIL_OUT;
  1025. }
  1026. pszIpAddr[24] = '\0';
  1027. *pipAddress = (DWORD)inet_addr(pszIpAddr);
  1028. error:
  1029. return dwReturn;
  1030. }
  1031. //////////////////////////////////////////////////////////////////////////////
  1032. //
  1033. // Function : TokenToIPAddr()
  1034. //
  1035. // Date of Creation : 20th Sept 2001
  1036. //
  1037. // Parameters : IN szText // String to be converted
  1038. // IN OUT Address // Target to be filled
  1039. //
  1040. // Return : T2P_OK on Success
  1041. // T2P_NULL_STRING on Error
  1042. // T2P_INVALID_ADDR
  1043. // T2P_DNSLOOKUP_FAILED
  1044. //
  1045. // Description : Converts the user input string to Valid IPAddress.
  1046. //
  1047. // History :
  1048. //
  1049. // Date Author Comments
  1050. //
  1051. //////////////////////////////////////////////////////////////////////////////
  1052. DWORD
  1053. TokenToIPAddr(
  1054. IN LPTSTR szText,
  1055. IN OUT IPAddr *pAddress,
  1056. IN BOOL bTunnel,
  1057. IN BOOL bMask
  1058. )
  1059. {
  1060. DWORD dwReturn = T2P_OK;
  1061. DWORD dwAddr , dwCount;
  1062. LPTSTR pszTmpPtr =NULL;
  1063. int iReturn=ERROR_SUCCESS;
  1064. char szDNSName[MAX_STR_LEN] = {0};
  1065. struct addrinfo *pAddrInfo = NULL,*pNext=NULL;
  1066. DWORD dwBufferSize = MAX_STR_LEN;
  1067. if (szText != NULL)
  1068. {
  1069. if (!_tcscmp(szText,POTF_ME_TUNNEL))
  1070. {
  1071. *pAddress = 0;
  1072. }
  1073. else if(bTunnel)
  1074. {
  1075. dwAddr = GetIpAddress(szText,pAddress);
  1076. if( (dwAddr == IP_DECODE_ERROR) || (dwAddr == IP_MASK_ERROR) )
  1077. {
  1078. dwReturn = T2P_INVALID_ADDR;
  1079. }
  1080. ADDR addr;
  1081. addr.uIpAddr = ntohl(*pAddress);
  1082. if (!IsValidTunnelEndpointAddress(&addr))
  1083. {
  1084. dwReturn = T2P_INVALID_ADDR;
  1085. }
  1086. }
  1087. else if(bMask)
  1088. {
  1089. dwAddr = GetIpAddress(szText,pAddress);
  1090. if(dwAddr == IP_DECODE_ERROR)
  1091. {
  1092. dwReturn = T2P_INVALID_ADDR;
  1093. }
  1094. }
  1095. else
  1096. {
  1097. if (IsDnsName(szText))
  1098. {
  1099. for ( dwCount=0,pszTmpPtr=szText; ;dwCount++)
  1100. {
  1101. pszTmpPtr = _tcschr(pszTmpPtr, _TEXT('x'));
  1102. if(pszTmpPtr)
  1103. {
  1104. pszTmpPtr++;
  1105. }
  1106. else
  1107. {
  1108. break;
  1109. }
  1110. }
  1111. if (dwCount==4) // Old .... ip addressing format..
  1112. {
  1113. dwAddr = GetIpAddress(szText,pAddress);
  1114. if (dwAddr == IP_DECODE_ERROR)
  1115. {
  1116. dwReturn = T2P_INVALID_ADDR;
  1117. }
  1118. else if (dwAddr == IP_MASK_ERROR)
  1119. {
  1120. dwReturn = T2P_INVALID_MASKADDR;
  1121. }
  1122. }
  1123. else // DNS name is specified
  1124. {
  1125. iReturn = WideCharToMultiByte(CP_THREAD_ACP, 0, szText, -1,
  1126. szDNSName,dwBufferSize,NULL,NULL);
  1127. if(iReturn == 0)
  1128. {
  1129. //conversion failed due to some error. dont proceed . dive out of the function
  1130. dwReturn = T2P_INVALID_ADDR;
  1131. BAIL_OUT;
  1132. }
  1133. iReturn = getaddrinfo((const char*)szDNSName,NULL,NULL,&pAddrInfo);
  1134. if (iReturn == ERROR_SUCCESS)
  1135. {
  1136. pNext = pAddrInfo;
  1137. for(DWORD i=0;i< 1;i++)
  1138. {
  1139. memcpy(pAddress,(ULONG *) &(((sockaddr_in *)(pNext->ai_addr))->sin_addr.S_un.S_addr), sizeof(ULONG));
  1140. pNext=pNext->ai_next;
  1141. }
  1142. // free pAddrInfo after usage
  1143. if (pAddrInfo)
  1144. {
  1145. freeaddrinfo(pAddrInfo);
  1146. }
  1147. }
  1148. else
  1149. {
  1150. dwReturn = T2P_DNSLOOKUP_FAILED;
  1151. }
  1152. }
  1153. }
  1154. else // good old dotted notation
  1155. {
  1156. dwAddr = GetIpAddress(szText,pAddress);
  1157. if (dwAddr == IP_DECODE_ERROR)
  1158. {
  1159. dwReturn = T2P_INVALID_ADDR;
  1160. }
  1161. else if (dwAddr == IP_MASK_ERROR)
  1162. {
  1163. dwReturn = T2P_INVALID_MASKADDR;
  1164. }
  1165. }
  1166. }
  1167. }
  1168. else
  1169. {
  1170. dwReturn = T2P_NULL_STRING;
  1171. }
  1172. error:
  1173. return dwReturn;
  1174. }
  1175. //////////////////////////////////////////////////////////////////////////////
  1176. //
  1177. // Function : TokenToProperty()
  1178. //
  1179. // Date of Creation : 28th Sept 2001
  1180. //
  1181. // Parameters : IN szText
  1182. //
  1183. // Return : DWORD
  1184. // Description : Validates the arguments for logging
  1185. // (ipsecdiagnostics/ikelogging/strongcrlcheck
  1186. // /ipsecloginterval/ipsecexempt)
  1187. //
  1188. // History :
  1189. //
  1190. // Date Author Comments
  1191. //
  1192. //////////////////////////////////////////////////////////////////////////////
  1193. DWORD
  1194. TokenToProperty( LPTSTR SzText)
  1195. {
  1196. DWORD dwReturn = PARSE_ERROR;
  1197. if( _tcsicmp(SzText,PROPERTY_TYPE_ENABLEDIGNO) == 0)
  1198. {
  1199. dwReturn = PROPERTY_ENABLEDIGNO;
  1200. }
  1201. else if( _tcsicmp(SzText,PROPERTY_TYPE_IKELOG) == 0)
  1202. {
  1203. dwReturn = PROPERTY_IKELOG;
  1204. }
  1205. else if( _tcsicmp(SzText,PROPERTY_TYPE_CRLCHK) == 0)
  1206. {
  1207. dwReturn = PROPERTY_CRLCHK; // It is Strongcrlchk
  1208. }
  1209. else if( _tcsicmp(SzText,PROPERTY_TYPE_LOGINTER) == 0)
  1210. {
  1211. dwReturn = PROPERTY_LOGINTER;
  1212. }
  1213. else if( _tcsicmp(SzText,PROPERTY_TYPE_EXEMPT) == 0)
  1214. {
  1215. dwReturn = PROPERTY_EXEMPT;
  1216. }
  1217. else if( _tcsicmp(SzText,PROPERTY_TYPE_BOOTMODE) == 0)
  1218. {
  1219. dwReturn = PROPERTY_BOOTMODE;
  1220. }
  1221. else if( _tcsicmp(SzText,PROPERTY_TYPE_BOOTEXEMP) == 0)
  1222. {
  1223. dwReturn = PROPERTY_BOOTEXEMP;
  1224. }
  1225. return dwReturn;
  1226. }
  1227. //////////////////////////////////////////////////////////////////////////////
  1228. //
  1229. // Function : CheckProtoType()
  1230. //
  1231. // Date of Creation : 20th Sept 2001
  1232. //
  1233. // Parameters : IN szText
  1234. //
  1235. // Return : DWORD
  1236. //
  1237. // Description : Validates the Argument for the token Protocol.
  1238. // (ANY|ICMP|TCP|UDP|RAW)
  1239. //
  1240. // History :
  1241. //
  1242. // Date Author Comments
  1243. //
  1244. //////////////////////////////////////////////////////////////////////////////
  1245. DWORD
  1246. CheckProtoType(
  1247. LPWSTR SzText,
  1248. PDWORD pdwProto
  1249. )
  1250. {
  1251. DWORD dwReturn = PARSE_ERROR;
  1252. DWORD dwProto = 0;
  1253. if( _tcsicmp(SzText,IF_TYPE_ANY) == 0) // Do protocol type validation here
  1254. {
  1255. dwProto = PROT_ID_ANY;
  1256. dwReturn = ERROR_SUCCESS;
  1257. }
  1258. else if( _tcsicmp(SzText,IF_TYPE_ICMP) == 0)
  1259. {
  1260. dwProto = PROT_ID_ICMP;
  1261. dwReturn = ERROR_SUCCESS;
  1262. }
  1263. else if( _tcsicmp(SzText,IF_TYPE_TCP) == 0)
  1264. {
  1265. dwProto = PROT_ID_TCP;
  1266. dwReturn = ERROR_SUCCESS;
  1267. }
  1268. else if( _tcsicmp(SzText,IF_TYPE_UDP) == 0)
  1269. {
  1270. dwProto = PROT_ID_UDP;
  1271. dwReturn = ERROR_SUCCESS;
  1272. }
  1273. else if( _tcsicmp(SzText,IF_TYPE_RAW) == 0)
  1274. {
  1275. dwProto = PROT_ID_RAW;
  1276. dwReturn = ERROR_SUCCESS;
  1277. }
  1278. else
  1279. {
  1280. dwReturn = ConvertStringToDword(SzText, &dwProto);
  1281. }
  1282. if ((dwReturn == ERROR_SUCCESS) && (dwProto < 256))
  1283. {
  1284. *pdwProto = dwProto;
  1285. }
  1286. else
  1287. {
  1288. dwReturn = PARSE_ERROR;
  1289. }
  1290. return dwReturn;
  1291. }
  1292. //////////////////////////////////////////////////////////////////////////////
  1293. //
  1294. // Function : MatchEnumTagToTagIndex()
  1295. //
  1296. // Date of Creation : 26th Sept 2001
  1297. //
  1298. // Parameters : IN szText
  1299. // IN *pParser
  1300. //
  1301. // Return : DWORD ( TagIndex)
  1302. //
  1303. // Description : Based on Tag, Returns TagIndex (string to dword)
  1304. //
  1305. // History :
  1306. //
  1307. // Date Author Comments
  1308. //
  1309. //////////////////////////////////////////////////////////////////////////////
  1310. DWORD
  1311. MatchEnumTagToTagIndex(
  1312. IN LPWSTR szToken, // Input Token
  1313. IN PPARSER_PKT pParser
  1314. )
  1315. {
  1316. DWORD dwNum = 0;
  1317. DWORD dwIndex = PARSE_ERROR;
  1318. DWORD dwCount;
  1319. MatchEnumTag(g_hModule,szToken,pParser->MaxTok,pParser->ValidTok,&dwNum);
  1320. if (dwNum)
  1321. { // Convert the output of MatchEnumTag into the TagIndex
  1322. for (dwCount =0;dwCount < pParser->MaxTok;dwCount++)
  1323. {
  1324. if (dwNum == pParser->ValidTok[dwCount].dwValue)
  1325. {
  1326. dwIndex = dwCount;
  1327. break;
  1328. }
  1329. }
  1330. }
  1331. return dwIndex;
  1332. }
  1333. //////////////////////////////////////////////////////////////////////////////
  1334. //
  1335. // Function : CheckBound()
  1336. //
  1337. // Date of Creation : 04th Sept 2001
  1338. //
  1339. // Parameters : IN szText // String to be compared
  1340. //
  1341. // Return : DWORD
  1342. // BOUND_TYPE_PERMIT // 1
  1343. // BOUND_TYPE_BLOCK // 2
  1344. // BOUND_TYPE_NEGOTIATE // 3
  1345. // Description : Validates the argument for the token action
  1346. // (permit|block|negotiate)
  1347. //
  1348. // History :
  1349. //
  1350. // Date Author Comments
  1351. //
  1352. //////////////////////////////////////////////////////////////////////////////
  1353. DWORD
  1354. CheckBound ( LPTSTR SzText)
  1355. {
  1356. DWORD dwReturn = PARSE_ERROR;
  1357. if( _tcsicmp(SzText,QMSEC_PERMIT_STR) == 0 )
  1358. {
  1359. dwReturn = TOKEN_QMSEC_PERMIT;
  1360. }
  1361. else if( _tcsicmp(SzText,QMSEC_BLOCK_STR) == 0 )
  1362. {
  1363. dwReturn = TOKEN_QMSEC_BLOCK;
  1364. }
  1365. else if( _tcsicmp(SzText,QMSEC_NEGOTIATE_STR) == 0)
  1366. {
  1367. dwReturn = TOKEN_QMSEC_NEGOTIATE;
  1368. }
  1369. return dwReturn;
  1370. }
  1371. //////////////////////////////////////////////////////////////////////////////
  1372. //
  1373. // Function : IsWithinLimit()
  1374. //
  1375. // Date of Creation : 29th Sept 2001
  1376. //
  1377. // Parameters : IN DWORD data
  1378. // IN DWORD min
  1379. // IN DWORD max
  1380. //
  1381. // Return : DWORD
  1382. // return 1 if success
  1383. // return 0 if fail
  1384. //
  1385. // Description : Checks for limits
  1386. //
  1387. // History :
  1388. //
  1389. // Date Author Comments
  1390. //
  1391. //////////////////////////////////////////////////////////////////////////////
  1392. BOOL
  1393. IsWithinLimit(
  1394. DWORD dwData,
  1395. DWORD dwMin,
  1396. DWORD dwMax
  1397. )
  1398. {
  1399. return ( (dwData >= dwMin ) && ( dwData <= dwMax ) ) ? TRUE : FALSE ;
  1400. }
  1401. //////////////////////////////////////////////////////////////////////////////
  1402. //
  1403. // Function : TokenToDNSIPAddr()
  1404. //
  1405. // Date of Creation : 29th Sept 2001
  1406. //
  1407. // Parameters : IN szText // String to be converted
  1408. // IN OUT Address // Target to be filled
  1409. //
  1410. // Return : DWORD
  1411. //
  1412. // Description : Validates i/p String and resolves to valid IPAddress(s)
  1413. //
  1414. // History :
  1415. //
  1416. // Date Author Comments
  1417. //
  1418. //////////////////////////////////////////////////////////////////////////////
  1419. DWORD
  1420. TokenToDNSIPAddr(
  1421. IN LPTSTR szText,
  1422. IN OUT PDNSIPADDR pDNSAddress,
  1423. IN OUT PDWORD *ppdwUsed
  1424. )
  1425. {
  1426. DWORD dwReturn = T2P_OK;
  1427. DWORD dwCount,dwStatus,i=0,n;
  1428. IPAddr address;
  1429. int iReturn=ERROR_SUCCESS;
  1430. char szDNSName[MAX_STR_LEN] = {0};
  1431. struct addrinfo *pAddrInfo = NULL,*pNext=NULL;
  1432. DWORD dwBufferSize = MAX_STR_LEN;
  1433. if (szText == NULL)
  1434. {
  1435. dwReturn = T2P_NULL_STRING;
  1436. BAIL_OUT;
  1437. }
  1438. if (IsDnsName(szText)) // Any Alpha ==> DNS name provided not (0x)
  1439. {
  1440. dwCount = CheckCharForOccurances(szText,_TEXT('x'));
  1441. if (dwCount==4)
  1442. {
  1443. i = CheckCharForOccurances(szText,_TEXT('.'));
  1444. if (i!=3)
  1445. {
  1446. dwReturn = T2P_INVALID_ADDR;
  1447. BAIL_OUT;
  1448. }
  1449. dwStatus = WideCharToMultiByte(CP_THREAD_ACP,0,szText,-1,szDNSName,dwBufferSize,NULL,NULL);
  1450. if (!dwStatus)
  1451. {
  1452. dwReturn = T2P_INVALID_ADDR;
  1453. BAIL_OUT;
  1454. }
  1455. address = (ULONG)inet_addr(szDNSName);
  1456. if(address == INADDR_NONE)
  1457. {
  1458. dwReturn = T2P_INVALID_ADDR;
  1459. BAIL_OUT;
  1460. }
  1461. pDNSAddress->pszDomainName = NULL; // Old IPAddrs notation so dns name fill with zero
  1462. pDNSAddress->puIpAddr = NULL;
  1463. pDNSAddress->puIpAddr = (ULONG *) malloc(sizeof(ULONG));
  1464. if(pDNSAddress->puIpAddr == NULL)
  1465. {
  1466. dwReturn = ERROR_OUTOFMEMORY;
  1467. BAIL_OUT;
  1468. }
  1469. if (**ppdwUsed > MAX_ARGS_LIMIT)
  1470. {
  1471. free(pDNSAddress->puIpAddr);
  1472. dwReturn = ERROR_OUT_OF_STRUCTURES;
  1473. BAIL_OUT;
  1474. }
  1475. g_AllocPtr[**ppdwUsed] = pDNSAddress->puIpAddr ;
  1476. (**ppdwUsed)++;
  1477. memcpy(&(pDNSAddress->puIpAddr[0]),(ULONG *)&address, sizeof(ULONG));
  1478. pDNSAddress->dwNumIpAddresses = 1; // only one IP sent
  1479. }
  1480. else
  1481. {
  1482. iReturn = WideCharToMultiByte(CP_THREAD_ACP, 0, szText, -1,
  1483. szDNSName,dwBufferSize,NULL,NULL);
  1484. if(iReturn == 0)
  1485. {
  1486. //conversion failed due to some error. don't proceed, dive out of the function
  1487. dwReturn = T2P_INVALID_ADDR;
  1488. BAIL_OUT;
  1489. }
  1490. iReturn = getaddrinfo((const char*)szDNSName,NULL,NULL,&pAddrInfo);
  1491. if (iReturn == ERROR_SUCCESS)
  1492. {
  1493. pDNSAddress->pszDomainName = NULL;
  1494. pDNSAddress->pszDomainName = (TCHAR *)calloc(1,(_tcslen(szText) + 1)*sizeof(TCHAR));
  1495. if(pDNSAddress->pszDomainName == NULL)
  1496. {
  1497. dwReturn = ERROR_OUTOFMEMORY;
  1498. BAIL_OUT;
  1499. }
  1500. _tcsncpy(pDNSAddress->pszDomainName,szText,_tcslen(szText));
  1501. if (**ppdwUsed > MAX_ARGS_LIMIT)
  1502. {
  1503. free(pDNSAddress->pszDomainName);
  1504. dwReturn = ERROR_OUT_OF_STRUCTURES;
  1505. BAIL_OUT;
  1506. }
  1507. g_AllocPtr[**ppdwUsed] = pDNSAddress->pszDomainName;
  1508. (**ppdwUsed)++;
  1509. pNext = pAddrInfo;
  1510. for(n=1;pNext = pNext->ai_next; n++); // First count no. of IP's resolved..
  1511. pDNSAddress->dwNumIpAddresses = n; // n starts from zero
  1512. pDNSAddress->puIpAddr = NULL;
  1513. pDNSAddress->puIpAddr = (ULONG *) malloc(sizeof(ULONG)* pDNSAddress->dwNumIpAddresses);
  1514. if(pDNSAddress->puIpAddr == NULL)
  1515. {
  1516. dwReturn = ERROR_OUTOFMEMORY;
  1517. BAIL_OUT;
  1518. }
  1519. if (**ppdwUsed > MAX_ARGS_LIMIT)
  1520. {
  1521. free(pDNSAddress->puIpAddr);
  1522. dwReturn = ERROR_OUT_OF_STRUCTURES;
  1523. BAIL_OUT;
  1524. }
  1525. g_AllocPtr[**ppdwUsed] = pDNSAddress->puIpAddr ;
  1526. (**ppdwUsed)++;
  1527. pNext = pAddrInfo;
  1528. for(DWORD j=0;j< n;j++)
  1529. {
  1530. memcpy(&(pDNSAddress->puIpAddr[j]),(ULONG *) &(((sockaddr_in *)(pNext->ai_addr))->sin_addr.S_un.S_addr), sizeof(ULONG));
  1531. pNext=pNext->ai_next;
  1532. }
  1533. // free pAddrInfo after usage
  1534. if (pAddrInfo)
  1535. {
  1536. freeaddrinfo(pAddrInfo);
  1537. }
  1538. }
  1539. else
  1540. {
  1541. dwReturn = T2P_DNSLOOKUP_FAILED;
  1542. pDNSAddress->pszDomainName = NULL;
  1543. }
  1544. }
  1545. }
  1546. else // OLD .... notation
  1547. {
  1548. i = CheckCharForOccurances(szText,_TEXT('.'));
  1549. if (i!=3)
  1550. {
  1551. dwReturn = T2P_INVALID_ADDR;
  1552. BAIL_OUT;
  1553. }
  1554. iReturn = WideCharToMultiByte(CP_THREAD_ACP,0,szText,-1,szDNSName,dwBufferSize,NULL,NULL);
  1555. if(iReturn == 0)
  1556. {
  1557. dwReturn = T2P_INVALID_ADDR;
  1558. BAIL_OUT;
  1559. }
  1560. address = (ULONG)inet_addr(szDNSName);
  1561. pDNSAddress->pszDomainName = NULL;
  1562. pDNSAddress->puIpAddr = NULL;
  1563. pDNSAddress->puIpAddr = (ULONG *) malloc(sizeof(ULONG));
  1564. if(pDNSAddress->puIpAddr == NULL)
  1565. {
  1566. dwReturn = ERROR_OUTOFMEMORY;
  1567. BAIL_OUT;
  1568. }
  1569. if (**ppdwUsed > MAX_ARGS_LIMIT)
  1570. {
  1571. free(pDNSAddress->puIpAddr);
  1572. dwReturn = ERROR_OUT_OF_STRUCTURES;
  1573. BAIL_OUT;
  1574. }
  1575. g_AllocPtr[**ppdwUsed] = pDNSAddress->puIpAddr ;
  1576. (**ppdwUsed)++;
  1577. memcpy(&(pDNSAddress->puIpAddr[0]),(ULONG *)&address, sizeof(ULONG));
  1578. pDNSAddress->dwNumIpAddresses = 1; // only one IP sent
  1579. }
  1580. error:
  1581. return dwReturn;
  1582. }
  1583. //////////////////////////////////////////////////////////////////////////////
  1584. //
  1585. // Function : RemoveRootcaAuthMethods()
  1586. //
  1587. // Date of Creation : 22nd Aug 2001
  1588. //
  1589. // Parameters : IN LPWSTR *ppwcArguments, // Input stream
  1590. // IN DWORD dwArgCount, // Input arg count
  1591. // IN DWORD dwCurrentIndex, // Input current arg index
  1592. // IN PPARSER_PKT pParser, // contains the MaxTok
  1593. // IN LPTSTR szAnotherList, // Another ListCmd also present ...
  1594. // OUT PSTA_MM_AUTH_METHODS *paRootcaAuthMethods, // o/p array of auth methods
  1595. // OUT LPTSTR *ppwcTok, // i/p stream stripped of list cmds
  1596. // OUT PDWORD pdwNumRootcaAuthMethods // Number of the list Tokens
  1597. // IN DWORD dwInputAllocLen // The max allocation for ppwcListArgs
  1598. //
  1599. // Return : DWORD
  1600. //
  1601. // Description : Separates the list and non list commands..
  1602. //
  1603. // History :
  1604. //
  1605. // Date Author Comments
  1606. //
  1607. //////////////////////////////////////////////////////////////////////////////
  1608. DWORD
  1609. RemoveRootcaAuthMethods
  1610. (
  1611. IN LPTSTR *ppwcArguments, // Input stream
  1612. IN DWORD dwArgCount, // Input arg count
  1613. IN DWORD dwCurrentIndex, // Input current arg index
  1614. IN PPARSER_PKT pParser, // contains the MaxTok
  1615. IN LPTSTR szAnotherList, // Another ListCmd also present ...
  1616. OUT PSTA_MM_AUTH_METHODS *paRootcaAuthMethods, // o/p stream containing the list args // Needs Pre Allocated Mem
  1617. OUT LPTSTR *ppwcTok, // i/p stream stripped of list cmds // No Mem allocation needed...
  1618. // only pointer copy
  1619. OUT PDWORD pdwNumRootcaAuthMethods, // Number of the List Tokens
  1620. IN DWORD dwInputAllocLen,
  1621. OUT PDWORD pdwCount
  1622. )
  1623. {
  1624. DWORD dwReturn = ERROR_SUCCESS;
  1625. DWORD dwLoopCount = 0;
  1626. DWORD dwCount = 0;
  1627. DWORD dwRootcaCount = 0;
  1628. DWORD dwNum = 0;
  1629. _TCHAR szCmd[MAX_STR_LEN] = {0};
  1630. _TCHAR szTok[MAX_STR_LEN] = {0};
  1631. _TCHAR szTemp[MAX_STR_LEN] = {0};
  1632. BOOL bEqualPresent;
  1633. BOOL bFoundRootca;
  1634. for(dwLoopCount = dwCurrentIndex;dwLoopCount < dwArgCount;dwLoopCount++)
  1635. {
  1636. bFoundRootca = FALSE;
  1637. if (_tcslen(ppwcArguments[dwLoopCount]) < MAX_STR_LEN)
  1638. {
  1639. _tcsncpy(szTemp,ppwcArguments[dwLoopCount],MAX_STR_LEN-1);
  1640. // szTemp contains the cmd=arg
  1641. bEqualPresent = SplitCmdTok(szTemp,szCmd,szTok,MAX_STR_LEN-1,MAX_STR_LEN-1);
  1642. if (bEqualPresent)
  1643. {
  1644. dwNum = 0;
  1645. MatchEnumTag(g_hModule,szTemp,pParser->MaxTok,pParser->ValidTok,&dwNum);
  1646. if (!dwNum && (_tcsnicmp(szCmd, POTF_OAKAUTH_CERT, _tcslen(POTF_OAKAUTH_CERT)-1) == 0))
  1647. {
  1648. PSTA_MM_AUTH_METHODS pRootcaInfo = NULL;
  1649. bFoundRootca = TRUE;
  1650. if (ProcessEscapedCharacters(szTok) != ERROR_SUCCESS)
  1651. {
  1652. dwReturn = ERROR_INVALID_PARAMETER;
  1653. BAIL_OUT;
  1654. }
  1655. dwReturn = GenerateRootcaAuthInfo(&pRootcaInfo, szTok);
  1656. if (dwReturn != ERROR_SUCCESS)
  1657. {
  1658. BAIL_OUT;
  1659. }
  1660. pRootcaInfo->dwSequence = dwCount;
  1661. paRootcaAuthMethods[dwRootcaCount++] = pRootcaInfo;
  1662. }
  1663. }
  1664. }
  1665. if (!bFoundRootca)
  1666. {
  1667. ppwcTok[dwCount++] = ppwcArguments[dwLoopCount];
  1668. }
  1669. }
  1670. *pdwNumRootcaAuthMethods = dwRootcaCount;
  1671. error:
  1672. *pdwCount = dwCount;
  1673. return dwReturn;
  1674. }
  1675. //////////////////////////////////////////////////////////////////////////////
  1676. //
  1677. // Function : TokenToType()
  1678. //
  1679. // Date of Creation : 20th Aug 2001
  1680. //
  1681. // Parameters : IN szText
  1682. //
  1683. // Return : DWORD
  1684. //
  1685. // Description : Validates the argument for filtertype (generic/specific)
  1686. //
  1687. // History :
  1688. //
  1689. // Date Author Comments
  1690. //
  1691. //////////////////////////////////////////////////////////////////////////////
  1692. DWORD
  1693. TokenToType( LPTSTR pszText)
  1694. {
  1695. DWORD dwReturn = PARSE_ERROR;
  1696. if( _tcsicmp(pszText,FILTER_TYPE_GENERIC_STR) == 0)
  1697. {
  1698. dwReturn = FILTER_GENERIC;
  1699. }
  1700. else if( _tcsicmp(pszText,FILTER_TYPE_SPECIFIC_STR) == 0)
  1701. {
  1702. dwReturn = FILTER_SPECIFIC;
  1703. }
  1704. return dwReturn;
  1705. }
  1706. //////////////////////////////////////////////////////////////////////////////
  1707. //
  1708. // Function : TokenToStats()
  1709. //
  1710. // Date of Creation : 29th Aug 2001
  1711. //
  1712. // Parameters : IN szText
  1713. //
  1714. // Return : DWORD
  1715. //
  1716. // Description : Validates the argument to the token statistics. (all/ike/ipsec)
  1717. //
  1718. // History :
  1719. //
  1720. // Date Author Comments
  1721. //
  1722. //////////////////////////////////////////////////////////////////////////////
  1723. DWORD
  1724. TokenToStats( LPTSTR pszText)
  1725. {
  1726. DWORD dwReturn = PARSE_ERROR;
  1727. if( _tcsicmp(pszText,STATS_ALL_STR) == 0)
  1728. {
  1729. dwReturn = STATS_ALL;
  1730. }
  1731. else if( _tcsicmp(pszText,STATS_IKE_STR) == 0)
  1732. {
  1733. dwReturn = STATS_IKE;
  1734. }
  1735. else if( _tcsicmp(pszText,STATS_IPSEC_STR) == 0)
  1736. {
  1737. dwReturn = STATS_IPSEC;
  1738. }
  1739. return dwReturn;
  1740. }
  1741. //////////////////////////////////////////////////////////////////////////////
  1742. //
  1743. // Function : PrintQMOfferError()
  1744. //
  1745. // Date of Creation : 20th dec 2001
  1746. //
  1747. // Parameters : IN dwStatus
  1748. // IN pPArser
  1749. // IN dwTagType // String to be compared
  1750. //
  1751. // Return : NONE
  1752. //
  1753. // Description : Prints the QMOffer error messages
  1754. //
  1755. //
  1756. // History :
  1757. //
  1758. // Date Author Comments
  1759. //
  1760. //////////////////////////////////////////////////////////////////////////////
  1761. VOID
  1762. PrintQMOfferError(
  1763. IN DWORD dwStatus,
  1764. IN PPARSER_PKT pParser,
  1765. IN DWORD dwTagType
  1766. )
  1767. {
  1768. switch(dwStatus) // Print the specified QMOffer error messages.
  1769. {
  1770. case T2P_NULL_STRING :
  1771. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NULL_STRING);
  1772. break;
  1773. case T2P_P2_SECLIFE_INVALID :
  1774. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SECLIFE_INVALID,P2_Sec_LIFE_MIN,P2_Sec_LIFE_MAX);
  1775. break;
  1776. case T2P_P2_KBLIFE_INVALID :
  1777. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_KBLIFE_INVALID,P2_Kb_LIFE_MIN,P2_Kb_LIFE_MAX);
  1778. break;
  1779. case T2P_INVALID_P2REKEY_UNIT :
  1780. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_P2REKEY_INVALID);
  1781. break;
  1782. case T2P_INVALID_HASH_ALG :
  1783. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_HASH_INVALID);
  1784. break;
  1785. case T2P_INCOMPLETE_ESPALGS :
  1786. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ESP_INCOMPLETE);
  1787. break;
  1788. case T2P_GENERAL_PARSE_ERROR :
  1789. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_QMOFFER_INVALID);
  1790. break;
  1791. case T2P_DUP_ALGS :
  1792. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DUPALG_INVALID,pParser->ValidTok[dwTagType].pwszToken);
  1793. break;
  1794. case T2P_NONE_NONE :
  1795. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NONE_INVALID);
  1796. break;
  1797. case T2P_INVALID_IPSECPROT :
  1798. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_IPSECPROT_INVALID);
  1799. break;
  1800. case T2P_P2_KS_INVALID :
  1801. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_KS_INVALID);
  1802. break;
  1803. case T2P_AHESP_INVALID :
  1804. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_AHESP_INVALID);
  1805. break;
  1806. default :
  1807. break;
  1808. }
  1809. }
  1810. //////////////////////////////////////////////////////////////////////////////
  1811. //
  1812. // Function : ValidateSplServer()
  1813. //
  1814. // Date of Creation : 2nd Jan 2002
  1815. //
  1816. // Parameters : IN szText // String to be compared
  1817. //
  1818. // Return : DWORD
  1819. // SERVER_WINS
  1820. // SERVER_DHCP
  1821. // SERVER_DNS
  1822. // SERVER_GATEWAY
  1823. // IP_ME
  1824. // IP_ANY
  1825. //
  1826. // Description : Checks for the Spl server types
  1827. //
  1828. //
  1829. // History :
  1830. //
  1831. // Date Author Comments
  1832. //
  1833. //////////////////////////////////////////////////////////////////////////////
  1834. DWORD
  1835. ValidateSplServer(IN LPTSTR pszText)
  1836. {
  1837. DWORD dwReturn = NOT_SPLSERVER;
  1838. if(_tcsicmp(pszText,SERVER_WINS_STR)==0)
  1839. { // Allow spl servers here
  1840. dwReturn = SERVER_WINS;
  1841. }
  1842. else if(_tcsicmp(pszText,SERVER_DHCP_STR)==0)
  1843. {
  1844. dwReturn = SERVER_DHCP;
  1845. }
  1846. else if(_tcsicmp(pszText,SERVER_DNS_STR)==0)
  1847. {
  1848. dwReturn = SERVER_DNS;
  1849. }
  1850. else if(_tcsicmp(pszText,SERVER_GATEWAY_STR)==0)
  1851. {
  1852. dwReturn = SERVER_GATEWAY;
  1853. }
  1854. else if(_tcsicmp(pszText,IP_ME_STR)==0) // Take care about 'me' and 'any' tokens here
  1855. {
  1856. dwReturn = IP_ME;
  1857. }
  1858. else if(_tcsicmp(pszText,IP_ANY_STR)==0)
  1859. {
  1860. dwReturn = IP_ANY;
  1861. }
  1862. return dwReturn;
  1863. }
  1864. //////////////////////////////////////////////////////////////////////////////
  1865. //
  1866. // Function : PrintIPError()
  1867. //
  1868. // Date of Creation : 20th dec 2001
  1869. //
  1870. // Parameters : IN dwStatus
  1871. // IN szText // String to be compared
  1872. //
  1873. // Return : NONE
  1874. //
  1875. // Description : Prints the IP validation errors
  1876. //
  1877. //
  1878. // History :
  1879. //
  1880. // Date Author Comments
  1881. //
  1882. //////////////////////////////////////////////////////////////////////////////
  1883. VOID
  1884. PrintIPError(IN DWORD dwStatus, IN LPTSTR pszText)
  1885. {
  1886. switch(dwStatus) // Print error message for IPAddress
  1887. {
  1888. case T2P_DNSLOOKUP_FAILED :
  1889. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DNSLOOKUP_FAILED,pszText);
  1890. break;
  1891. case T2P_INVALID_MASKADDR :
  1892. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_MASK,pszText);
  1893. break;
  1894. case T2P_INVALID_ADDR :
  1895. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_ADDR,pszText);
  1896. break;
  1897. case T2P_NULL_STRING :
  1898. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_ARG);
  1899. break;
  1900. case ERROR_OUTOFMEMORY :
  1901. PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
  1902. break;
  1903. case ERROR_OUT_OF_STRUCTURES :
  1904. PrintErrorMessage(WIN32_ERR,ERROR_OUT_OF_STRUCTURES,NULL);
  1905. break;
  1906. default :
  1907. PrintErrorMessage(WIN32_ERR,dwStatus,NULL);
  1908. break;
  1909. }
  1910. }
  1911. //////////////////////////////////////////////////////////////////////////////
  1912. //
  1913. // Function : InitializeGlobalPointers()
  1914. //
  1915. // Date of Creation : 9th Jan 2002
  1916. //
  1917. // Parameters :
  1918. //
  1919. // Return : NONE
  1920. //
  1921. // Description : Initialize Global pointers to NULL
  1922. //
  1923. //
  1924. // History :
  1925. //
  1926. // Date Author Comments
  1927. //
  1928. //////////////////////////////////////////////////////////////////////////////
  1929. VOID
  1930. InitializeGlobalPointers(
  1931. VOID
  1932. )
  1933. {
  1934. DWORD dwMaxArgs = 0;
  1935. for(dwMaxArgs=0;dwMaxArgs<IPSEC_MAX_QM_OFFERS;dwMaxArgs++)
  1936. {
  1937. g_pQmsec[dwMaxArgs] = NULL; // Initialize all global pointers to NULL
  1938. }
  1939. for(dwMaxArgs=0;dwMaxArgs<IPSEC_MAX_MM_OFFERS;dwMaxArgs++)
  1940. {
  1941. g_pMmsec[dwMaxArgs] = NULL;
  1942. }
  1943. for(dwMaxArgs=0;dwMaxArgs<MAX_ARGS;dwMaxArgs++)
  1944. {
  1945. g_AllocPtr[dwMaxArgs] = NULL;
  1946. g_paRootca[dwMaxArgs] = NULL;
  1947. }
  1948. }
  1949. //////////////////////////////////////////////////////////////////////////////
  1950. //
  1951. // Function : LoadParserString()
  1952. //
  1953. // Date of Creation : 8th Jan 2002
  1954. //
  1955. // Parameters : IN LPTSTR szInput,
  1956. // OUT PPARSER_PKT pParser,
  1957. // IN DWORD dwTagType,
  1958. // IN PDWORD pdwUsed,
  1959. // IN DWORD dwCount,
  1960. // IN BOOL bAppend,
  1961. // IN LPTSTR szAppend
  1962. //
  1963. // Return : ERROR_SUCESS
  1964. // RETURN_NO_ERROR
  1965. // ERROR_OUTOFMEMORY
  1966. //
  1967. // Description : Validates the strings, If specified appends the given string
  1968. //
  1969. //
  1970. // History :
  1971. //
  1972. // Date Author Comments
  1973. //
  1974. //////////////////////////////////////////////////////////////////////////////
  1975. DWORD
  1976. LoadParserString(
  1977. IN LPTSTR pszInput,
  1978. OUT PPARSER_PKT pParser,
  1979. IN DWORD dwTagType,
  1980. IN PDWORD pdwUsed,
  1981. IN DWORD dwCount,
  1982. IN BOOL bAppend,
  1983. IN LPTSTR pszAppend
  1984. )
  1985. {
  1986. LPTSTR pszArg = NULL;
  1987. DWORD dwReturn = ERROR_SUCCESS;
  1988. DWORD dwInputLen = 0;
  1989. if(_tcsicmp(pszInput,_TEXT("")) == 0)
  1990. {
  1991. dwReturn = ERROR_SHOW_USAGE;
  1992. }
  1993. else
  1994. {
  1995. if(!bAppend) // Just called for load string. do it
  1996. {
  1997. dwInputLen = _tcslen(pszInput);
  1998. pszArg = (LPTSTR)calloc(dwInputLen+1 ,sizeof(_TCHAR));
  1999. if(pszArg == NULL)
  2000. {
  2001. dwReturn = ERROR_OUTOFMEMORY;
  2002. BAIL_OUT;
  2003. }
  2004. if (*pdwUsed > MAX_ARGS_LIMIT)
  2005. {
  2006. free(pszArg);
  2007. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2008. BAIL_OUT;
  2009. }
  2010. g_AllocPtr[(*pdwUsed)++] = pszArg;
  2011. _tcsncpy((LPTSTR)pszArg,pszInput,dwInputLen);
  2012. }
  2013. else // Here load the string and also do some appending operation
  2014. {
  2015. if(_tcsicmp(pszAppend,_TEXT("")) == 0)
  2016. {
  2017. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_ARG,pParser->ValidTok[dwTagType].pwszToken);
  2018. dwReturn = RETURN_NO_ERROR;
  2019. }
  2020. else
  2021. {
  2022. dwInputLen = _tcslen(pszInput)+_tcslen(pszAppend);
  2023. pszArg = (LPTSTR)calloc(dwInputLen+1,sizeof(_TCHAR));
  2024. if(pszArg == NULL)
  2025. {
  2026. dwReturn = ERROR_OUTOFMEMORY;
  2027. BAIL_OUT;
  2028. }
  2029. if (*pdwUsed > MAX_ARGS_LIMIT)
  2030. {
  2031. free(pszArg);
  2032. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2033. BAIL_OUT;
  2034. }
  2035. g_AllocPtr[(*pdwUsed)++] = pszArg;
  2036. _tcsncpy((LPTSTR)pszArg,pszInput,dwInputLen);
  2037. _tcsncat((LPTSTR)pszArg,pszAppend,dwInputLen-_tcslen(pszArg));
  2038. }
  2039. }
  2040. pParser->Cmd[dwCount].pArg = (PVOID)pszArg;
  2041. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2042. }
  2043. error:
  2044. return dwReturn;
  2045. }
  2046. //////////////////////////////////////////////////////////////////////////////
  2047. //
  2048. // Function : LoadDword()
  2049. //
  2050. // Date of Creation : 08th Jan 2002
  2051. //
  2052. // Parameters : IN LPTSTR szInput,
  2053. // OUT PPARSER_PKT pParser,
  2054. // IN DWORD dwTagType,
  2055. // IN PDWORD pdwUsed,
  2056. // IN DWORD dwCount,
  2057. //
  2058. // Return : ERROR_SUCESS
  2059. // ERROR_INVALID_OPTION_VALUE
  2060. // ERROR_OUTOFMEMORY
  2061. //
  2062. // Description : Validates the input string and converts into DWORD
  2063. //
  2064. //
  2065. // History :
  2066. //
  2067. // Date Author Comments
  2068. //
  2069. //////////////////////////////////////////////////////////////////////////////
  2070. DWORD
  2071. LoadDword(
  2072. IN LPTSTR pszInput,
  2073. OUT PPARSER_PKT pParser,
  2074. IN DWORD dwTagType,
  2075. IN PDWORD pdwUsed,
  2076. IN DWORD dwCount
  2077. )
  2078. {
  2079. DWORD dwReturn = ERROR_SUCCESS;
  2080. DWORD dwStatus = 0;
  2081. PDWORD pdwArg = NULL;
  2082. pdwArg = (PDWORD)malloc(sizeof(DWORD));
  2083. if(pdwArg == NULL)
  2084. {
  2085. dwReturn = ERROR_OUTOFMEMORY;
  2086. }
  2087. else // Convert string to into DWORD and load it.
  2088. {
  2089. if (*pdwUsed > MAX_ARGS_LIMIT)
  2090. {
  2091. free(pdwArg);
  2092. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2093. BAIL_OUT;
  2094. }
  2095. g_AllocPtr[(*pdwUsed)++] = pdwArg;
  2096. dwStatus = _stscanf(pszInput,_TEXT("%u"),pdwArg);
  2097. if (dwStatus)
  2098. {
  2099. pParser->Cmd[dwCount].pArg = pdwArg;
  2100. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2101. }
  2102. else
  2103. {
  2104. dwReturn = ERROR_INVALID_OPTION_VALUE;
  2105. }
  2106. }
  2107. error:
  2108. return dwReturn;
  2109. }
  2110. //////////////////////////////////////////////////////////////////////////////
  2111. //
  2112. // Function : LoadBoolWithOption()
  2113. //
  2114. // Date of Creation : 08th Jan 2002
  2115. //
  2116. // Parameters : IN LPTSTR pszInput,
  2117. // OUT PPARSER_PKT pParser,
  2118. // IN DWORD dwTagType,
  2119. // IN PDWORD pdwUsed,
  2120. // IN DWORD dwCount,
  2121. //
  2122. // Return : ERROR_SUCESS
  2123. // ERROR_INVALID_OPTION_VALUE
  2124. // ERROR_OUTOFMEMORY
  2125. //
  2126. // Description : Validates Yes/No, And all checks for Keyword 'all'
  2127. //
  2128. //
  2129. // History :
  2130. //
  2131. // Date Author Comments
  2132. //
  2133. //////////////////////////////////////////////////////////////////////////////
  2134. DWORD
  2135. LoadBoolWithOption(
  2136. IN LPTSTR pszInput,
  2137. OUT PPARSER_PKT pParser,
  2138. IN DWORD dwTagType,
  2139. IN PDWORD pdwUsed,
  2140. IN DWORD dwCount,
  2141. IN BOOL bOption,
  2142. IN LPTSTR pszCheckKeyWord
  2143. )
  2144. {
  2145. DWORD dwReturn = ERROR_SUCCESS;
  2146. DWORD dwStatus = 0;
  2147. BOOL *pbArg = NULL;
  2148. pbArg = (BOOL *)malloc(sizeof(BOOL));
  2149. if(pbArg == NULL)
  2150. {
  2151. dwReturn = ERROR_OUTOFMEMORY;
  2152. }
  2153. else
  2154. {// Just check for a boolean (Yes/No)
  2155. if (*pdwUsed > MAX_ARGS_LIMIT)
  2156. {
  2157. free(pbArg);
  2158. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2159. BAIL_OUT;
  2160. }
  2161. g_AllocPtr[(*pdwUsed)++] = pbArg;
  2162. dwStatus = ValidateBool(pszInput);
  2163. if(dwStatus == ARG_NO)
  2164. {
  2165. *pbArg = FALSE;
  2166. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2167. }
  2168. else if(dwStatus == ARG_YES)
  2169. {
  2170. *pbArg = TRUE;
  2171. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2172. }
  2173. else
  2174. {
  2175. if(!bOption)
  2176. {
  2177. dwReturn = ERROR_SHOW_USAGE;
  2178. BAIL_OUT;
  2179. }
  2180. }
  2181. if(bOption) // Not only boolean and also check for keywords like 'all'
  2182. {
  2183. if(_tcsicmp(pszCheckKeyWord,_TEXT("")) != 0)
  2184. {
  2185. if(_tcsicmp(pszCheckKeyWord,ALL_STR) == 0) // Check for 'all' key word
  2186. { // If it is all then fill yes
  2187. *pbArg = TRUE;
  2188. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2189. }
  2190. else
  2191. {
  2192. dwReturn = ERROR_SHOW_USAGE;
  2193. }
  2194. }
  2195. else
  2196. {
  2197. }
  2198. }
  2199. pParser->Cmd[dwCount].pArg = (PVOID)pbArg;
  2200. }
  2201. error:
  2202. return dwReturn;
  2203. }
  2204. //////////////////////////////////////////////////////////////////////////////
  2205. //
  2206. // Function : LoadLevel()
  2207. //
  2208. // Date of Creation : 08th Jan 2002
  2209. //
  2210. // Parameters : IN LPTSTR szInput,
  2211. // OUT PPARSER_PKT pParser,
  2212. // IN DWORD dwTagType,
  2213. // IN PDWORD pdwUsed,
  2214. // IN DWORD dwCount
  2215. //
  2216. // Return : ERROR_SUCESS
  2217. // ERROR_INVALID_OPTION_VALUE
  2218. // ERROR_OUTOFMEMORY
  2219. //
  2220. // Description : Validates the argument for token level
  2221. // (verbose/normal)
  2222. //
  2223. // History :
  2224. //
  2225. // Date Author Comments
  2226. //
  2227. //////////////////////////////////////////////////////////////////////////////
  2228. DWORD
  2229. LoadLevel(
  2230. IN LPTSTR pszInput,
  2231. OUT PPARSER_PKT pParser,
  2232. IN DWORD dwTagType,
  2233. IN PDWORD pdwUsed,
  2234. IN DWORD dwCount
  2235. )
  2236. {
  2237. DWORD dwReturn = ERROR_SUCCESS;
  2238. PBOOL pbLevel = NULL;
  2239. pbLevel = (BOOL *)malloc(sizeof(BOOL));
  2240. if(pbLevel == NULL)
  2241. {
  2242. dwReturn = ERROR_OUTOFMEMORY;
  2243. }
  2244. else
  2245. {
  2246. // Validate and load level=verbose/normal
  2247. if (*pdwUsed > MAX_ARGS_LIMIT)
  2248. {
  2249. free(pbLevel);
  2250. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2251. BAIL_OUT;
  2252. }
  2253. g_AllocPtr[(*pdwUsed)++] = pbLevel;
  2254. if (MatchToken(pszInput,ARG_TOKEN_STR_VERBOSE) )
  2255. {
  2256. *pbLevel = TRUE;
  2257. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2258. }
  2259. else if (MatchToken(pszInput,ARG_TOKEN_STR_NORMAL))
  2260. {
  2261. *pbLevel = FALSE;
  2262. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2263. }
  2264. else
  2265. {
  2266. dwReturn = ERROR_SHOW_USAGE;
  2267. }
  2268. pParser->Cmd[dwCount].pArg = (PVOID)pbLevel;
  2269. }
  2270. error:
  2271. return dwReturn;
  2272. }
  2273. //////////////////////////////////////////////////////////////////////////////
  2274. //
  2275. // Function : LoadConnectionType()
  2276. //
  2277. // Date of Creation : 08th Aug 2002
  2278. //
  2279. // Parameters : IN LPTSTR pszInput,
  2280. // OUT PPARSER_PKT pParser,
  2281. // IN DWORD dwTagType,
  2282. // IN PDWORD pdwUsed,
  2283. // IN DWORD dwCount,
  2284. //
  2285. // Return : ERROR_SUCESS
  2286. // ERRCODE_ARG_INVALID
  2287. // ERROR_OUTOFMEMORY
  2288. //
  2289. // Description : Validates the argument for token 'connection type'
  2290. // (lan/dialup/all)
  2291. //
  2292. // History :
  2293. //
  2294. // Date Author Comments
  2295. //
  2296. //////////////////////////////////////////////////////////////////////////////
  2297. DWORD
  2298. LoadConnectionType(
  2299. IN LPTSTR pszInput,
  2300. OUT PPARSER_PKT pParser,
  2301. IN DWORD dwTagType,
  2302. IN PDWORD pdwUsed,
  2303. IN DWORD dwCount
  2304. )
  2305. {
  2306. DWORD dwReturn = ERROR_SUCCESS;
  2307. DWORD dwStatus = 0;
  2308. PDWORD pdwConnType = NULL;
  2309. pdwConnType = (PDWORD)malloc(sizeof(DWORD));
  2310. if(pdwConnType == NULL)
  2311. {
  2312. dwReturn = ERROR_OUTOFMEMORY;
  2313. }
  2314. else
  2315. {
  2316. if (*pdwUsed > MAX_ARGS_LIMIT)
  2317. {
  2318. free(pdwConnType);
  2319. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2320. BAIL_OUT;
  2321. }
  2322. g_AllocPtr[(*pdwUsed)++] = pdwConnType;
  2323. dwStatus = CheckIFType (pszInput); // Check for connection type (all/lan/dialup)
  2324. if (dwStatus == PARSE_ERROR)
  2325. {
  2326. dwReturn = ERRCODE_ARG_INVALID;
  2327. }
  2328. else
  2329. {
  2330. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2331. *pdwConnType = dwStatus;
  2332. pParser->Cmd[dwCount].pArg = (PVOID)pdwConnType;
  2333. }
  2334. }
  2335. error:
  2336. return dwReturn;
  2337. }
  2338. //////////////////////////////////////////////////////////////////////////////
  2339. //
  2340. // Function : LoadLocationType()
  2341. //
  2342. // Date of Creation : 08th Aug 2002
  2343. //
  2344. // Parameters : IN LPTSTR pszInput,
  2345. // OUT PPARSER_PKT pParser,
  2346. // IN DWORD dwTagType,
  2347. // IN PDWORD pdwUsed,
  2348. // IN DWORD dwCount,
  2349. //
  2350. // Return : ERROR_SUCESS
  2351. // ERRCODE_ARG_INVALID
  2352. // ERROR_OUTOFMEMORY
  2353. //
  2354. // Description : Validates the argument for token 'location type'
  2355. // (boot/local/domain)
  2356. //
  2357. // History :
  2358. //
  2359. // Date Author Comments
  2360. //
  2361. //////////////////////////////////////////////////////////////////////////////
  2362. DWORD
  2363. LoadLocationType(
  2364. IN LPTSTR pszInput,
  2365. OUT PPARSER_PKT pParser,
  2366. IN DWORD dwTagType,
  2367. IN PDWORD pdwUsed,
  2368. IN DWORD dwCount
  2369. )
  2370. {
  2371. DWORD dwReturn = ERROR_SUCCESS;
  2372. DWORD dwStatus = 0;
  2373. PDWORD pdwLocType = NULL;
  2374. pdwLocType = (PDWORD)malloc(sizeof(DWORD));
  2375. if(pdwLocType == NULL)
  2376. {
  2377. dwReturn = ERROR_OUTOFMEMORY;
  2378. }
  2379. else
  2380. {
  2381. if (*pdwUsed > MAX_ARGS_LIMIT)
  2382. {
  2383. free(pdwLocType);
  2384. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2385. BAIL_OUT;
  2386. }
  2387. g_AllocPtr[(*pdwUsed)++] = pdwLocType;
  2388. dwStatus = CheckLocationType (pszInput);
  2389. if (dwStatus == PARSE_ERROR)
  2390. {
  2391. dwReturn = ERRCODE_ARG_INVALID;
  2392. }
  2393. else
  2394. {
  2395. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2396. *pdwLocType = dwStatus;
  2397. pParser->Cmd[dwCount].pArg = (PVOID)pdwLocType;
  2398. }
  2399. }
  2400. error:
  2401. return dwReturn;
  2402. }
  2403. //////////////////////////////////////////////////////////////////////////////
  2404. //
  2405. // Function : LoadProtocol()
  2406. //
  2407. // Date of Creation : 08th Jan 2002
  2408. //
  2409. // Parameters : IN LPTSTR pszInput,
  2410. // OUT PPARSER_PKT pParser,
  2411. // IN DWORD dwTagType,
  2412. // IN PDWORD pdwUsed,
  2413. // IN DWORD dwCount,
  2414. //
  2415. // Return : ERROR_SUCESS
  2416. // ERRCODE_ARG_INVALID
  2417. // ERROR_OUTOFMEMORY
  2418. //
  2419. // Description : Validates the argument for protocol
  2420. // (TCP/UDP...)
  2421. //
  2422. // History :
  2423. //
  2424. // Date Author Comments
  2425. //
  2426. //////////////////////////////////////////////////////////////////////////////
  2427. DWORD
  2428. LoadProtocol(
  2429. IN LPTSTR pszInput,
  2430. OUT PPARSER_PKT pParser,
  2431. IN DWORD dwTagType,
  2432. IN PDWORD pdwUsed,
  2433. IN DWORD dwCount
  2434. )
  2435. {
  2436. DWORD dwReturn = ERROR_SUCCESS;
  2437. DWORD dwStatus = 0;
  2438. PDWORD pdwProto = NULL;
  2439. pdwProto = (PDWORD)malloc(sizeof(DWORD));
  2440. if(pdwProto == NULL )
  2441. {
  2442. dwReturn = ERROR_OUTOFMEMORY;
  2443. }
  2444. else
  2445. {
  2446. if (*pdwUsed > MAX_ARGS_LIMIT)
  2447. {
  2448. free(pdwProto);
  2449. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2450. BAIL_OUT;
  2451. }
  2452. g_AllocPtr[(*pdwUsed)++] = pdwProto;
  2453. DWORD dwProto = 0;
  2454. dwStatus = CheckProtoType (pszInput, &dwProto); // Check for all valid protocols
  2455. if (dwStatus == PARSE_ERROR)
  2456. {
  2457. dwReturn = ERRCODE_ARG_INVALID;
  2458. }
  2459. else
  2460. {
  2461. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2462. *pdwProto = dwProto;
  2463. pParser->Cmd[dwCount].pArg = (PVOID)pdwProto;
  2464. }
  2465. }
  2466. error:
  2467. return dwReturn;
  2468. }
  2469. //////////////////////////////////////////////////////////////////////////////
  2470. //
  2471. // Function : LoadPFSGroup()
  2472. //
  2473. // Date of Creation : 08th Jan 2002
  2474. //
  2475. // Parameters : IN LPTSTR pszInput,
  2476. // OUT PPARSER_PKT pParser,
  2477. // IN DWORD dwTagType,
  2478. // IN PDWORD pdwUsed,
  2479. // IN DWORD dwCount,
  2480. //
  2481. // Return : ERROR_SUCESS
  2482. // ERRCODE_ARG_INVALID
  2483. // ERROR_OUTOFMEMORY
  2484. //
  2485. // Description : Validates the argument for pfs group
  2486. // (grp1/grp2/grp3/grpmm/nopfs)
  2487. //
  2488. // History :
  2489. //
  2490. // Date Author Comments
  2491. //
  2492. //////////////////////////////////////////////////////////////////////////////
  2493. DWORD
  2494. LoadPFSGroup(
  2495. IN LPTSTR pszInput,
  2496. OUT PPARSER_PKT pParser,
  2497. IN DWORD dwTagType,
  2498. IN PDWORD pdwUsed,
  2499. IN DWORD dwCount
  2500. )
  2501. {
  2502. DWORD dwReturn = ERROR_SUCCESS;
  2503. DWORD dwStatus = 0;
  2504. PDWORD pdwPFSGroup = NULL;
  2505. pdwPFSGroup = (PDWORD)malloc(sizeof(DWORD));
  2506. if(pdwPFSGroup == NULL)
  2507. {
  2508. dwReturn = ERROR_OUTOFMEMORY;
  2509. }
  2510. else
  2511. {
  2512. if (*pdwUsed > MAX_ARGS_LIMIT)
  2513. {
  2514. free(pdwPFSGroup);
  2515. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2516. BAIL_OUT;
  2517. }
  2518. g_AllocPtr[(*pdwUsed)++] = pdwPFSGroup;
  2519. dwStatus = CheckPFSGroup(pszInput);
  2520. if (dwStatus == PARSE_ERROR)
  2521. {
  2522. dwReturn = ERRCODE_ARG_INVALID;
  2523. }
  2524. else // It is not valid PFSGroup
  2525. {
  2526. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2527. *pdwPFSGroup = dwStatus;
  2528. pParser->Cmd[dwCount].pArg = (PVOID)pdwPFSGroup;
  2529. }
  2530. }
  2531. error:
  2532. return dwReturn;
  2533. }
  2534. //////////////////////////////////////////////////////////////////////////////
  2535. //
  2536. // Function : LoadQMAction()
  2537. //
  2538. // Date of Creation : 08th Jan 2002
  2539. //
  2540. // Parameters : IN LPTSTR pszInput,
  2541. // OUT PPARSER_PKT pParser,
  2542. // IN DWORD dwTagType,
  2543. // IN PDWORD pdwUsed,
  2544. // IN DWORD dwCount,
  2545. //
  2546. // Return : ERROR_SUCESS
  2547. // ERROR_INVALID_OPTION_VALUE
  2548. // ERROR_OUTOFMEMORY
  2549. //
  2550. // Description : Validates the action types.
  2551. // (Permit/Block/Negotiate)
  2552. //
  2553. // History :
  2554. //
  2555. // Date Author Comments
  2556. //
  2557. //////////////////////////////////////////////////////////////////////////////
  2558. DWORD
  2559. LoadQMAction(
  2560. IN LPTSTR pszInput,
  2561. OUT PPARSER_PKT pParser,
  2562. IN DWORD dwTagType,
  2563. IN PDWORD pdwUsed,
  2564. IN DWORD dwCount
  2565. )
  2566. {
  2567. DWORD dwReturn = ERROR_SUCCESS;
  2568. DWORD dwStatus = 0;
  2569. PDWORD pdwAction = NULL;
  2570. pdwAction = (PDWORD )malloc(sizeof(DWORD));
  2571. if(pdwAction == NULL)
  2572. {
  2573. dwReturn = ERROR_OUTOFMEMORY;
  2574. }
  2575. else
  2576. {
  2577. if (*pdwUsed > MAX_ARGS_LIMIT)
  2578. {
  2579. free(pdwAction);
  2580. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2581. BAIL_OUT;
  2582. }
  2583. g_AllocPtr[(*pdwUsed)++] = pdwAction;
  2584. dwStatus = CheckBound(pszInput);
  2585. if (dwStatus == PARSE_ERROR)
  2586. {
  2587. dwReturn = ERRCODE_ARG_INVALID; // permit/block/negotiate
  2588. }
  2589. else
  2590. {
  2591. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2592. *pdwAction = dwStatus;
  2593. pParser->Cmd[dwCount].pArg = (PVOID)pdwAction;
  2594. }
  2595. }
  2596. error:
  2597. return dwReturn;
  2598. }
  2599. //////////////////////////////////////////////////////////////////////////////
  2600. //
  2601. // Function : LoadFormat()
  2602. //
  2603. // Date of Creation : 08th Jan 2002
  2604. //
  2605. // Parameters : IN LPTSTR pszInput,
  2606. // OUT PPARSER_PKT pParser,
  2607. // IN DWORD dwTagType,
  2608. // IN PDWORD pdwUsed,
  2609. // IN DWORD dwCount,
  2610. //
  2611. // Return : ERROR_SUCESS
  2612. // ERRCODE_ARG_INVALID
  2613. // ERROR_OUTOFMEMORY
  2614. //
  2615. // Description : Validates the argument for format. (List/Table)
  2616. //
  2617. //
  2618. // History :
  2619. //
  2620. // Date Author Comments
  2621. //
  2622. //////////////////////////////////////////////////////////////////////////////
  2623. DWORD
  2624. LoadFormat(
  2625. IN LPTSTR pszInput,
  2626. OUT PPARSER_PKT pParser,
  2627. IN DWORD dwTagType,
  2628. IN PDWORD pdwUsed,
  2629. IN DWORD dwCount
  2630. )
  2631. {
  2632. DWORD dwReturn = ERROR_SUCCESS;
  2633. PBOOL pbFormat = NULL;
  2634. pbFormat = (PBOOL)malloc(sizeof(BOOL));
  2635. if(pbFormat == NULL)
  2636. {
  2637. dwReturn = ERROR_OUTOFMEMORY;
  2638. }
  2639. else
  2640. {
  2641. if (*pdwUsed > MAX_ARGS_LIMIT)
  2642. {
  2643. free(pbFormat);
  2644. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2645. BAIL_OUT;
  2646. }
  2647. g_AllocPtr[(*pdwUsed)++] = pbFormat;
  2648. if( _tcsicmp(pszInput,TYPE_STR_LIST) == 0 )
  2649. {
  2650. *pbFormat = FALSE;
  2651. pParser->Cmd[dwCount].pArg = (PVOID)pbFormat;
  2652. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2653. }
  2654. else if( _tcsicmp(pszInput,TYPE_STR_TABLE) == 0 )
  2655. {
  2656. *pbFormat = TRUE;
  2657. pParser->Cmd[dwCount].pArg = (PVOID)pbFormat;
  2658. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2659. }
  2660. else // It is not a valid arg for format
  2661. {
  2662. dwReturn = ERRCODE_ARG_INVALID;
  2663. }
  2664. }
  2665. error:
  2666. return dwReturn;
  2667. }
  2668. //////////////////////////////////////////////////////////////////////////////
  2669. //
  2670. // Function : LoadFilterMode()
  2671. //
  2672. // Date of Creation : 08th Jan 2002
  2673. //
  2674. // Parameters : IN LPTSTR pszInput,
  2675. // OUT PPARSER_PKT pParser,
  2676. // IN DWORD dwTagType,
  2677. // IN PDWORD pdwUsed,
  2678. // IN DWORD dwCount,
  2679. //
  2680. // Return : ERROR_SUCESS
  2681. // ERRCODE_ARG_INVALID
  2682. // ERROR_OUTOFMEMORY
  2683. //
  2684. // Description : Validates the argument and fill's with relevant info
  2685. // in the Parser_Pkt Struct.
  2686. //
  2687. // History :
  2688. //
  2689. // Date Author Comments
  2690. //
  2691. //////////////////////////////////////////////////////////////////////////////
  2692. DWORD
  2693. LoadFilterMode(
  2694. IN LPTSTR pszInput,
  2695. OUT PPARSER_PKT pParser,
  2696. IN DWORD dwTagType,
  2697. IN PDWORD pdwUsed,
  2698. IN DWORD dwCount
  2699. )
  2700. {
  2701. DWORD dwReturn = ERROR_SUCCESS;
  2702. PDWORD pdwFilterMode = NULL;
  2703. pdwFilterMode = (PDWORD)malloc(sizeof(DWORD));
  2704. if(pdwFilterMode == NULL)
  2705. {
  2706. dwReturn = ERROR_OUTOFMEMORY;
  2707. }
  2708. else
  2709. {
  2710. if (*pdwUsed > MAX_ARGS_LIMIT)
  2711. {
  2712. free(pdwFilterMode);
  2713. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2714. BAIL_OUT;
  2715. }
  2716. g_AllocPtr[(*pdwUsed)++] = pdwFilterMode;
  2717. if( _tcsicmp(pszInput,TYPE_STR_TRANSPORT) == 0 ) // Is it Transport filter
  2718. {
  2719. *pdwFilterMode = TYPE_TRANSPORT_FILTER;
  2720. pParser->Cmd[dwCount].pArg = (PVOID)pdwFilterMode;
  2721. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2722. }
  2723. else if ( _tcsicmp(pszInput,TYPE_STR_TUNNEL) == 0 ) // Is it Tunnel filter
  2724. {
  2725. *pdwFilterMode = TYPE_TUNNEL_FILTER;
  2726. pParser->Cmd[dwCount].pArg = (PVOID)pdwFilterMode;
  2727. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2728. }
  2729. else
  2730. {
  2731. dwReturn = ERRCODE_ARG_INVALID;
  2732. }
  2733. }
  2734. error:
  2735. return dwReturn;
  2736. }
  2737. //////////////////////////////////////////////////////////////////////////////
  2738. //
  2739. // Function : LoadOSType()
  2740. //
  2741. // Date of Creation : 08th Jan 2002
  2742. //
  2743. // Parameters : IN LPTSTR szInput,
  2744. // OUT PPARSER_PKT pParser,
  2745. // IN DWORD dwTagType,
  2746. // IN PDWORD pdwUsed,
  2747. // IN DWORD dwCount,
  2748. //
  2749. // Return : ERROR_SUCESS
  2750. // ERRCODE_ARG_INVALID
  2751. // ERROR_OUTOFMEMORY
  2752. //
  2753. // Description : Validates the argument.(.net/win2k)
  2754. //
  2755. //
  2756. // History :
  2757. //
  2758. // Date Author Comments
  2759. //
  2760. //////////////////////////////////////////////////////////////////////////////
  2761. DWORD
  2762. LoadOSType(
  2763. IN LPTSTR pszInput,
  2764. OUT PPARSER_PKT pParser,
  2765. IN DWORD dwTagType,
  2766. IN PDWORD pdwUsed,
  2767. IN DWORD dwCount
  2768. )
  2769. {
  2770. DWORD dwReturn = ERROR_SUCCESS;
  2771. PDWORD pdwOSType = NULL;
  2772. pdwOSType = (PDWORD)malloc(sizeof(DWORD));
  2773. if(pdwOSType == NULL)
  2774. {
  2775. dwReturn = ERROR_OUTOFMEMORY;
  2776. }
  2777. else
  2778. {
  2779. if (*pdwUsed > MAX_ARGS_LIMIT)
  2780. {
  2781. free(pdwOSType);
  2782. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2783. BAIL_OUT;
  2784. }
  2785. g_AllocPtr[(*pdwUsed)++] = pdwOSType;
  2786. if((_tcsicmp(pszInput,RELEASE_WIN2K_STR) == 0)) // Is OS is WIN2K
  2787. {
  2788. *pdwOSType = TOKEN_RELEASE_WIN2K;
  2789. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2790. pParser->Cmd[dwCount].pArg = pdwOSType;
  2791. }
  2792. else if((_tcsicmp(pszInput,RELEASE_DOTNET_STR) == 0)) // Is OS is .NET
  2793. {
  2794. *pdwOSType = TOKEN_RELEASE_DOTNET;
  2795. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  2796. pParser->Cmd[dwCount].pArg = pdwOSType;
  2797. }
  2798. else
  2799. {
  2800. pParser->Cmd[dwCount].pArg = NULL;
  2801. dwReturn = ERRCODE_ARG_INVALID;
  2802. }
  2803. }
  2804. error:
  2805. return dwReturn;
  2806. }
  2807. //////////////////////////////////////////////////////////////////////////////
  2808. //
  2809. // Function : LoadProperty()
  2810. //
  2811. // Date of Creation : 08th Jan 2002
  2812. //
  2813. // Parameters : IN LPTSTR szInput,
  2814. // OUT PPARSER_PKT pParser,
  2815. // IN DWORD dwTagType,
  2816. // IN PDWORD pdwUsed,
  2817. // IN DWORD dwCount,
  2818. //
  2819. // Return : ERROR_SUCESS
  2820. // ERRCODE_ARG_INVALID
  2821. // ERROR_OUTOFMEMORY
  2822. //
  2823. // Description : Validates the argument property.
  2824. // (ipsecdiagnostics/ikelogging/strongcrlcheck
  2825. // /ipsecloginterval/ipsecexempt)
  2826. //
  2827. //
  2828. // History :
  2829. //
  2830. // Date Author Comments
  2831. //
  2832. //////////////////////////////////////////////////////////////////////////////
  2833. DWORD
  2834. LoadProperty(
  2835. IN LPTSTR pszInput,
  2836. OUT PPARSER_PKT pParser,
  2837. IN DWORD dwTagType,
  2838. IN PDWORD pdwUsed,
  2839. IN DWORD dwCount
  2840. )
  2841. {
  2842. DWORD dwReturn = ERROR_SUCCESS;
  2843. DWORD dwStatus = 0;
  2844. PDWORD pdwProperty = NULL;
  2845. pdwProperty = (PDWORD)malloc(sizeof(DWORD));
  2846. if(pdwProperty == NULL)
  2847. {
  2848. dwReturn = ERROR_OUTOFMEMORY;
  2849. }
  2850. else
  2851. {
  2852. if (*pdwUsed > MAX_ARGS_LIMIT)
  2853. {
  2854. free(pdwProperty);
  2855. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2856. BAIL_OUT;
  2857. }
  2858. g_AllocPtr[(*pdwUsed)++] = pdwProperty;
  2859. dwStatus = TokenToProperty(pszInput);
  2860. if (dwStatus == PARSE_ERROR)
  2861. {
  2862. dwReturn = ERRCODE_ARG_INVALID;
  2863. }
  2864. else
  2865. {
  2866. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2867. *pdwProperty = dwStatus;
  2868. pParser->Cmd[dwCount].pArg = (PVOID)pdwProperty;
  2869. }
  2870. }
  2871. error:
  2872. return dwReturn;
  2873. }
  2874. //////////////////////////////////////////////////////////////////////////////
  2875. //
  2876. // Function : LoadPort()
  2877. //
  2878. // Date of Creation : 08th Jan 2002
  2879. //
  2880. // Parameters : IN LPTSTR szInput,
  2881. // OUT PPARSER_PKT pParser,
  2882. // IN DWORD dwTagType,
  2883. // IN PDWORD pdwUsed,
  2884. // IN DWORD dwCount,
  2885. //
  2886. // Return : ERROR_SUCESS
  2887. // ERROR_INVALID_OPTION_VALUE
  2888. // ERROR_OUTOFMEMORY
  2889. //
  2890. // Description : Validates the port (Should be less than 64535).
  2891. //
  2892. //
  2893. // History :
  2894. //
  2895. // Date Author Comments
  2896. //
  2897. //////////////////////////////////////////////////////////////////////////////
  2898. DWORD
  2899. LoadPort(
  2900. IN LPTSTR pszInput,
  2901. OUT PPARSER_PKT pParser,
  2902. IN DWORD dwTagType,
  2903. IN PDWORD pdwUsed,
  2904. IN DWORD dwCount
  2905. )
  2906. {
  2907. DWORD dwReturn = ERROR_SUCCESS;
  2908. DWORD dwStatus = 0;
  2909. PDWORD pdwPort = NULL;
  2910. pdwPort = (PDWORD)malloc(sizeof(DWORD));
  2911. if(pdwPort == NULL)
  2912. {
  2913. dwReturn = ERROR_OUTOFMEMORY;
  2914. }
  2915. else
  2916. {
  2917. if (*pdwUsed > MAX_ARGS_LIMIT)
  2918. {
  2919. free(pdwPort);
  2920. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2921. BAIL_OUT;
  2922. }
  2923. g_AllocPtr[(*pdwUsed)++] = pdwPort;
  2924. dwStatus = _stscanf(pszInput,_TEXT("%u"),pdwPort);
  2925. if (dwStatus) // Port should be less than 64535
  2926. {
  2927. if((*pdwPort) < MAX_PORT)
  2928. {
  2929. pParser->Cmd[dwCount].pArg = (PVOID)pdwPort;
  2930. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  2931. }
  2932. else
  2933. {
  2934. dwReturn = RETURN_NO_ERROR;
  2935. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_PORT_INVALID,MAX_PORT);
  2936. }
  2937. }
  2938. else
  2939. {
  2940. dwReturn = ERROR_INVALID_OPTION_VALUE;
  2941. }
  2942. }
  2943. error:
  2944. return dwReturn;
  2945. }
  2946. //////////////////////////////////////////////////////////////////////////////
  2947. //
  2948. // Function : LoadFilterType()
  2949. //
  2950. // Date of Creation : 08th JAn 2002
  2951. //
  2952. // Parameters : IN LPTSTR szInput,
  2953. // OUT PPARSER_PKT pParser,
  2954. // IN DWORD dwTagType,
  2955. // IN PDWORD pdwUsed,
  2956. // IN DWORD dwCount,
  2957. //
  2958. // Return : ERROR_SUCESS
  2959. // ERRCODE_ARG_INVALID
  2960. // ERROR_OUTOFMEMORY
  2961. //
  2962. // Description : Validates the argument for filtertype.
  2963. // (Generic/Specific)
  2964. //
  2965. // History :
  2966. //
  2967. // Date Author Comments
  2968. //
  2969. //////////////////////////////////////////////////////////////////////////////
  2970. DWORD
  2971. LoadFilterType(
  2972. IN LPTSTR pszInput,
  2973. OUT PPARSER_PKT pParser,
  2974. IN DWORD dwTagType,
  2975. IN PDWORD pdwUsed,
  2976. IN DWORD dwCount
  2977. )
  2978. {
  2979. DWORD dwReturn = ERROR_SUCCESS;
  2980. DWORD dwStatus = 0;
  2981. PDWORD pdwFilterType = NULL;
  2982. pdwFilterType = (PDWORD)malloc(sizeof(DWORD));
  2983. if(pdwFilterType == NULL )
  2984. {
  2985. dwReturn = ERROR_OUTOFMEMORY;
  2986. }
  2987. else
  2988. {
  2989. if (*pdwUsed > MAX_ARGS_LIMIT)
  2990. {
  2991. free(pdwFilterType);
  2992. dwReturn = ERROR_OUT_OF_STRUCTURES;
  2993. BAIL_OUT;
  2994. }
  2995. g_AllocPtr[(*pdwUsed)++] = pdwFilterType;
  2996. dwStatus = TokenToType(pszInput);
  2997. if (dwStatus == PARSE_ERROR)
  2998. {
  2999. dwReturn = ERRCODE_ARG_INVALID;
  3000. }
  3001. else
  3002. {
  3003. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  3004. *pdwFilterType = dwStatus;
  3005. pParser->Cmd[dwCount].pArg = (PVOID)pdwFilterType;
  3006. }
  3007. }
  3008. error:
  3009. return dwReturn;
  3010. }
  3011. //////////////////////////////////////////////////////////////////////////////
  3012. //
  3013. // Function : LoadStats()
  3014. //
  3015. // Date of Creation : 16th Aug 2001
  3016. //
  3017. // Parameters : IN LPTSTR szInput,
  3018. // OUT PPARSER_PKT pParser,
  3019. // IN DWORD dwTagType,
  3020. // IN PDWORD pdwUsed,
  3021. // IN DWORD dwCount,
  3022. //
  3023. // Return : ERROR_SUCESS
  3024. // ERRCODE_ARG_INVALID
  3025. // ERROR_OUTOFMEMORY
  3026. //
  3027. // Description : Validates the argument ike/ipsec/all
  3028. //
  3029. //
  3030. // History :
  3031. //
  3032. // Date Author Comments
  3033. //
  3034. //////////////////////////////////////////////////////////////////////////////
  3035. DWORD
  3036. LoadStats(
  3037. IN LPTSTR pszInput,
  3038. OUT PPARSER_PKT pParser,
  3039. IN DWORD dwTagType,
  3040. IN PDWORD pdwUsed,
  3041. IN DWORD dwCount
  3042. )
  3043. {
  3044. DWORD dwReturn = ERROR_SUCCESS;
  3045. DWORD dwStatus = 0;
  3046. PDWORD pdwStats = NULL;
  3047. pdwStats = (PDWORD)malloc(sizeof(DWORD));
  3048. if(pdwStats == NULL)
  3049. {
  3050. dwReturn = ERROR_OUTOFMEMORY;
  3051. }
  3052. else
  3053. {
  3054. if (*pdwUsed > MAX_ARGS_LIMIT)
  3055. {
  3056. free(pdwStats);
  3057. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3058. BAIL_OUT;
  3059. }
  3060. g_AllocPtr[(*pdwUsed)++] = pdwStats;
  3061. dwStatus = TokenToStats(pszInput);
  3062. if (dwStatus == PARSE_ERROR)
  3063. {
  3064. dwReturn = ERRCODE_ARG_INVALID;
  3065. }
  3066. else
  3067. {
  3068. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN ;
  3069. *pdwStats = dwStatus;
  3070. pParser->Cmd[dwCount].pArg = (PVOID)pdwStats;
  3071. }
  3072. }
  3073. error:
  3074. return dwReturn;
  3075. }
  3076. //////////////////////////////////////////////////////////////////////////////
  3077. //
  3078. // Function : LoadIPAddrTunnel()
  3079. //
  3080. // Date of Creation : 08th Jan 2002
  3081. //
  3082. // Parameters : IN LPTSTR pszInput,
  3083. // OUT PPARSER_PKT pParser,
  3084. // IN DWORD dwTagType,
  3085. // IN PDWORD pdwUsed,
  3086. // IN DWORD dwCount
  3087. //
  3088. // Return : ERROR_SUCESS
  3089. // ERROR_OUTOFMEMORY
  3090. // RETURN_NO_ERROR
  3091. //
  3092. // Description : IPAddress validation done here. DNS Resolves to first IP only
  3093. //
  3094. //
  3095. // History :
  3096. //
  3097. // Date Author Comments
  3098. //
  3099. //////////////////////////////////////////////////////////////////////////////
  3100. DWORD
  3101. LoadIPAddrTunnel(
  3102. IN LPTSTR pszInput,
  3103. OUT PPARSER_PKT pParser,
  3104. IN DWORD dwTagType,
  3105. IN PDWORD pdwUsed,
  3106. IN DWORD dwCount,
  3107. IN BOOL bTunnel
  3108. )
  3109. {
  3110. DWORD dwReturn = ERROR_SUCCESS;
  3111. DWORD dwStatus = 0;
  3112. IPAddr * pIPAddr = NULL;
  3113. IPAddr Address;
  3114. BOOL bMask = FALSE; // DNS name resolves to first IP only
  3115. pIPAddr = (IPAddr *)malloc(sizeof(IPAddr));
  3116. if(pIPAddr == NULL)
  3117. {
  3118. dwReturn = ERROR_OUTOFMEMORY;
  3119. }
  3120. else
  3121. {
  3122. if (*pdwUsed > MAX_ARGS_LIMIT)
  3123. {
  3124. free(pIPAddr);
  3125. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3126. BAIL_OUT;
  3127. }
  3128. g_AllocPtr[(*pdwUsed)++] = pIPAddr;
  3129. dwStatus = ValidateSplServer(pszInput);
  3130. if (dwStatus == NOT_SPLSERVER)
  3131. {
  3132. dwStatus = TokenToIPAddr(pszInput,&Address,bTunnel,bMask);
  3133. if( dwStatus == T2P_OK )
  3134. {
  3135. *pIPAddr = Address;
  3136. pParser->Cmd[dwCount].pArg = (PVOID)pIPAddr;
  3137. pParser->Cmd[dwCount].dwStatus = NOT_SPLSERVER;
  3138. }
  3139. else
  3140. {
  3141. if(bTunnel)
  3142. {
  3143. switch(dwStatus)
  3144. {
  3145. case T2P_INVALID_ADDR :
  3146. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_TUNNEL,pszInput);
  3147. break;
  3148. case T2P_NULL_STRING :
  3149. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_ARG);
  3150. break;
  3151. default :
  3152. break;
  3153. }
  3154. }
  3155. else
  3156. {
  3157. PrintIPError(dwStatus,pszInput);
  3158. }
  3159. dwReturn = RETURN_NO_ERROR;
  3160. }
  3161. }
  3162. else
  3163. {
  3164. pParser->Cmd[dwCount].pArg = NULL;
  3165. pParser->Cmd[dwCount].dwStatus = dwStatus;
  3166. }
  3167. }
  3168. error:
  3169. return dwReturn;
  3170. }
  3171. //////////////////////////////////////////////////////////////////////////////
  3172. //
  3173. // Function : LoadIPMask()
  3174. //
  3175. // Date of Creation : 08th Jan 2002
  3176. //
  3177. // Parameters : IN LPTSTR szInput,
  3178. // OUT PPARSER_PKT pParser,
  3179. // IN DWORD dwTagType,
  3180. // IN PDWORD pdwUsed,
  3181. // IN DWORD dwCount,
  3182. //
  3183. // Return : ERROR_SUCESS
  3184. // RETURN_NO_ERROR
  3185. // ERROR_OUTOFMEMORY
  3186. //
  3187. // Description : Validates the IPMask. Also allows prefix format.
  3188. //
  3189. //
  3190. // History :
  3191. //
  3192. // Date Author Comments
  3193. //
  3194. //////////////////////////////////////////////////////////////////////////////
  3195. DWORD
  3196. LoadIPMask(
  3197. IN LPTSTR pszInput,
  3198. OUT PPARSER_PKT pParser,
  3199. IN DWORD dwTagType,
  3200. IN PDWORD pdwUsed,
  3201. IN DWORD dwCount
  3202. )
  3203. {
  3204. DWORD dwReturn = ERROR_SUCCESS;
  3205. DWORD dwStatus = 0;
  3206. DWORD dwPrefix = 0;
  3207. IPAddr * pIPAddr = NULL;
  3208. IPAddr Address;
  3209. BOOL bMask = TRUE;
  3210. BOOL bTunnel = FALSE;
  3211. LPTSTR szPrefix = NULL;
  3212. pIPAddr = (IPAddr *)malloc(sizeof(IPAddr));
  3213. if(pIPAddr == NULL)
  3214. {
  3215. dwReturn = ERROR_OUTOFMEMORY;
  3216. }
  3217. else
  3218. {
  3219. if (*pdwUsed > MAX_ARGS_LIMIT)
  3220. {
  3221. free(pIPAddr);
  3222. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3223. BAIL_OUT;
  3224. }
  3225. g_AllocPtr[(*pdwUsed)++] = pIPAddr;
  3226. szPrefix = _tcschr(pszInput,_TEXT('.'));
  3227. if(szPrefix != NULL)
  3228. {
  3229. dwStatus = TokenToIPAddr(pszInput,&Address,bTunnel,bMask);
  3230. if( (dwStatus == T2P_OK ) || (dwStatus == T2P_INVALID_MASKADDR ) )
  3231. {
  3232. *pIPAddr = Address;
  3233. pParser->Cmd[dwCount].pArg = (PVOID)pIPAddr;
  3234. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  3235. }
  3236. else
  3237. {
  3238. PrintIPError(dwStatus,pszInput);
  3239. dwReturn = RETURN_NO_ERROR;
  3240. }
  3241. }
  3242. else // It is Prefix
  3243. {
  3244. dwPrefix = 0;
  3245. dwStatus = _stscanf(pszInput,_TEXT("%u"),&dwPrefix);
  3246. if(dwStatus)
  3247. {
  3248. if( (dwPrefix > 0 ) && ( dwPrefix <33 ) ) // Construct MASK using prefix
  3249. {
  3250. Address = (IPAddr)( (ULONG)(pow( 2.0 ,(double)dwPrefix ) - 1) << (32-dwPrefix));
  3251. *pIPAddr = htonl(Address);
  3252. pParser->Cmd[dwCount].pArg = (PVOID)pIPAddr;
  3253. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  3254. }
  3255. else
  3256. {
  3257. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_PREFIX_INVALID);
  3258. dwReturn = RETURN_NO_ERROR;
  3259. }
  3260. }
  3261. else
  3262. {
  3263. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_MASK_INVALID,pszInput);
  3264. dwReturn = RETURN_NO_ERROR;
  3265. }
  3266. }
  3267. }
  3268. error:
  3269. return dwReturn;
  3270. }
  3271. //////////////////////////////////////////////////////////////////////////////
  3272. //
  3273. // Function : LoadQMOffers()
  3274. //
  3275. // Date of Creation : 08th Jan 2002
  3276. //
  3277. // Parameters : IN LPTSTR pszInput,
  3278. // OUT PPARSER_PKT pParser,
  3279. // IN DWORD dwTagType,
  3280. // IN PDWORD pdwUsed,
  3281. // IN DWORD dwCount
  3282. //
  3283. // Return : ERROR_SUCESS
  3284. // RETURN_NO_ERROR
  3285. // ERROR_OUTOFMEMORY
  3286. //
  3287. // Description : Validates the argument for QMSecmethods
  3288. // (No.of offers are ' ' delimited)
  3289. //
  3290. // History :
  3291. //
  3292. // Date Author Comments
  3293. //
  3294. //////////////////////////////////////////////////////////////////////////////
  3295. DWORD
  3296. LoadQMOffers(
  3297. IN LPTSTR pszInput,
  3298. OUT PPARSER_PKT pParser,
  3299. IN DWORD dwTagType,
  3300. IN PDWORD pdwUsed,
  3301. IN DWORD dwCount
  3302. )
  3303. {
  3304. DWORD dwReturn = ERROR_SUCCESS;
  3305. DWORD dwStatus = 0;
  3306. DWORD dwNum = 0;
  3307. DWORD i=0;
  3308. PIPSEC_QM_OFFER pIPSecQMOffer = NULL;
  3309. LPTSTR Token = NULL;
  3310. if (_tcscmp(pszInput,_TEXT("")) != 0) // First Validate I/P
  3311. {
  3312. for(i=0;i<IPSEC_MAX_QM_OFFERS;i++)
  3313. {
  3314. g_pQmsec[i] = NULL;
  3315. };
  3316. Token = _tcstok(pszInput,OFFER_SEPARATOR); // Offers are ' ' delimited process them separately
  3317. while( ( Token != NULL ) && (dwNum < IPSEC_MAX_QM_OFFERS) )
  3318. {
  3319. pIPSecQMOffer = (IPSEC_QM_OFFER *)calloc(1,sizeof(IPSEC_QM_OFFER));
  3320. if(pIPSecQMOffer == NULL)
  3321. {
  3322. dwReturn = ERROR_OUTOFMEMORY;
  3323. BAIL_OUT;
  3324. }
  3325. LoadQMOfferDefaults(*pIPSecQMOffer);
  3326. dwStatus = ListToOffer(Token,*pIPSecQMOffer);
  3327. if(dwStatus == T2P_OK)
  3328. {
  3329. if (*pdwUsed > MAX_ARGS_LIMIT)
  3330. {
  3331. free(pIPSecQMOffer);
  3332. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3333. BAIL_OUT;
  3334. }
  3335. g_AllocPtr[*pdwUsed] = g_pQmsec[dwNum] = pIPSecQMOffer;
  3336. dwNum++;
  3337. (*pdwUsed)++;
  3338. dwReturn = ERROR_SUCCESS;
  3339. }
  3340. else
  3341. {
  3342. if (pIPSecQMOffer)
  3343. {
  3344. free(pIPSecQMOffer);
  3345. pIPSecQMOffer = NULL;
  3346. }
  3347. PrintQMOfferError(dwStatus,pParser,dwTagType);
  3348. dwReturn = RETURN_NO_ERROR;
  3349. BAIL_OUT;
  3350. }
  3351. Token = _tcstok(NULL,OFFER_SEPARATOR); // Separate offers
  3352. }
  3353. if(dwNum > IPSEC_MAX_QM_OFFERS)
  3354. {
  3355. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_MAX_OFFERS,IPSEC_MAX_QM_OFFERS);
  3356. dwReturn = RETURN_NO_ERROR;
  3357. pParser->Cmd[dwCount].pArg = NULL;
  3358. pParser->Cmd[dwCount].dwStatus = 0;
  3359. }
  3360. else if((dwNum > 0) && (dwNum <= IPSEC_MAX_QM_OFFERS))
  3361. {
  3362. pParser->Cmd[dwCount].pArg = (PVOID)g_pQmsec;
  3363. pParser->Cmd[dwCount].dwStatus = dwNum;
  3364. }
  3365. }
  3366. else
  3367. {
  3368. dwReturn = ERROR_SHOW_USAGE;
  3369. }
  3370. error:
  3371. return dwReturn;
  3372. }
  3373. //////////////////////////////////////////////////////////////////////////////
  3374. //
  3375. // Function : LoadMMOffers()
  3376. //
  3377. // Date of Creation : 08th Jan 2002
  3378. //
  3379. // Parameters : IN LPTSTR pszInput,
  3380. // OUT PPARSER_PKT pParser,
  3381. // IN DWORD dwTagType,
  3382. // IN PDWORD pdwUsed,
  3383. // IN DWORD dwCount
  3384. //
  3385. // Return : ERROR_SUCESS
  3386. // ERROR_OUTOFMEMORY
  3387. // RETURN_NO_ERROR
  3388. //
  3389. // Description : Validates the argument for MMSecMethods.
  3390. // (No .of Offers are ' ' delimited)
  3391. //
  3392. // History :
  3393. //
  3394. // Date Author Comments
  3395. //
  3396. //////////////////////////////////////////////////////////////////////////////
  3397. DWORD
  3398. LoadMMOffers(
  3399. IN LPTSTR pszInput,
  3400. OUT PPARSER_PKT pParser,
  3401. IN DWORD dwTagType,
  3402. IN PDWORD pdwUsed,
  3403. IN DWORD dwCount
  3404. )
  3405. {
  3406. DWORD dwReturn = ERROR_SUCCESS;
  3407. DWORD dwStatus = 0;
  3408. DWORD dwNum = 0;
  3409. DWORD i=0;
  3410. PIPSEC_MM_OFFER pIPSecMMOffer = NULL;
  3411. LPTSTR Token = NULL;
  3412. if (_tcsicmp(pszInput,_TEXT("\0")) != 0)
  3413. {
  3414. Token = _tcstok(pszInput,OFFER_SEPARATOR); // Offers are ' ' delimited process them separately
  3415. for(i=0;i<IPSEC_MAX_MM_OFFERS;i++)
  3416. {
  3417. g_pMmsec[i]=NULL;
  3418. };
  3419. while( ( Token != NULL ) && (dwNum < IPSEC_MAX_MM_OFFERS) )
  3420. {
  3421. pIPSecMMOffer = (IPSEC_MM_OFFER *)calloc(1,sizeof(IPSEC_MM_OFFER));
  3422. if(pIPSecMMOffer == NULL)
  3423. {
  3424. dwReturn = ERROR_OUTOFMEMORY;
  3425. BAIL_OUT;
  3426. }
  3427. LoadSecMethodDefaults(*pIPSecMMOffer) ;
  3428. dwStatus = ListToSecMethod(Token,*pIPSecMMOffer);
  3429. if(dwStatus == T2P_OK)
  3430. {
  3431. if (*pdwUsed > MAX_ARGS_LIMIT)
  3432. {
  3433. free(pIPSecMMOffer);
  3434. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3435. BAIL_OUT;
  3436. }
  3437. g_AllocPtr[*pdwUsed] = g_pMmsec[dwNum] = pIPSecMMOffer;
  3438. (*pdwUsed)++;
  3439. dwNum++;
  3440. dwReturn = ERROR_SUCCESS;
  3441. }
  3442. else
  3443. {
  3444. switch(dwStatus)
  3445. {
  3446. case T2P_INVALID_P1GROUP :
  3447. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_INVALID_P1GROUP);
  3448. break;
  3449. case T2P_NULL_STRING :
  3450. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NULL_STRING);
  3451. break;
  3452. case T2P_GENERAL_PARSE_ERROR :
  3453. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_MMOFFER_INVALID);
  3454. break;
  3455. case T2P_DUP_ALGS :
  3456. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DUPALG_INVALID,pParser->ValidTok[dwTagType].pwszToken);
  3457. break;
  3458. case T2P_P1GROUP_MISSING :
  3459. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_P1GROUP_MISSING);
  3460. break;
  3461. default :
  3462. break;
  3463. }
  3464. if (pIPSecMMOffer)
  3465. {
  3466. free(pIPSecMMOffer);
  3467. pIPSecMMOffer = NULL;
  3468. }
  3469. dwReturn = RETURN_NO_ERROR;
  3470. BAIL_OUT;
  3471. }
  3472. Token = _tcstok(NULL,OFFER_SEPARATOR); // Separate offers..
  3473. }
  3474. if(dwNum > IPSEC_MAX_MM_OFFERS)
  3475. {
  3476. PrintErrorMessage(IPSEC_ERR,0,ERRCODE_MAX_OFFERS,IPSEC_MAX_MM_OFFERS);
  3477. dwReturn = RETURN_NO_ERROR;
  3478. BAIL_OUT;
  3479. }
  3480. if (dwNum)
  3481. {
  3482. pParser->Cmd[dwCount].pArg = (PVOID)g_pMmsec;
  3483. pParser->Cmd[dwCount].dwStatus = dwNum;
  3484. }
  3485. else
  3486. {
  3487. pParser->Cmd[dwCount].pArg = NULL;
  3488. pParser->Cmd[dwCount].dwStatus = 0;
  3489. }
  3490. }
  3491. else
  3492. {
  3493. dwReturn = ERROR_SHOW_USAGE;
  3494. }
  3495. error:
  3496. return dwReturn;
  3497. }
  3498. //////////////////////////////////////////////////////////////////////////////
  3499. //
  3500. // Function : LoadDNSIPAddr()
  3501. //
  3502. // Date of Creation : 08th JAn 2002
  3503. //
  3504. // Parameters : IN LPTSTR pszInput,
  3505. // OUT PPARSER_PKT pParser,
  3506. // IN DWORD dwTagType,
  3507. // IN PDWORD pdwUsed,
  3508. // IN DWORD dwCount,
  3509. //
  3510. // Return : ERROR_SUCESS
  3511. // ERROR_OUTOFMEMORY
  3512. // RETURN_NO_ERROR
  3513. //
  3514. // Description : Validates the IPAddress. DNS name resolves to all IP's
  3515. //
  3516. // History :
  3517. //
  3518. // Date Author Comments
  3519. //
  3520. //////////////////////////////////////////////////////////////////////////////
  3521. DWORD
  3522. LoadDNSIPAddr(
  3523. IN LPTSTR pszInput,
  3524. OUT PPARSER_PKT pParser,
  3525. IN DWORD dwTagType,
  3526. IN PDWORD pdwUsed,
  3527. IN DWORD dwCount
  3528. )
  3529. {
  3530. DWORD dwReturn = ERROR_SUCCESS;
  3531. DWORD dwStatus = 0;
  3532. PDNSIPADDR pDNSIPAddr = NULL;
  3533. pDNSIPAddr = (DNSIPADDR *)calloc(1,sizeof(DNSIPADDR));
  3534. if(pDNSIPAddr == NULL)
  3535. {
  3536. dwReturn = ERROR_OUTOFMEMORY;
  3537. }
  3538. else
  3539. {
  3540. if (*pdwUsed > MAX_ARGS_LIMIT)
  3541. {
  3542. free(pDNSIPAddr);
  3543. dwReturn = ERROR_OUT_OF_STRUCTURES;
  3544. BAIL_OUT;
  3545. }
  3546. g_AllocPtr[(*pdwUsed)++] = pDNSIPAddr;
  3547. dwStatus = ValidateSplServer(pszInput); // allow spl servers..
  3548. if (dwStatus == NOT_SPLSERVER)
  3549. {
  3550. dwStatus = TokenToDNSIPAddr(pszInput,pDNSIPAddr,&pdwUsed);
  3551. if( dwStatus == T2P_OK )
  3552. {
  3553. pParser->Cmd[dwCount].pArg = (PVOID)pDNSIPAddr;
  3554. pParser->Cmd[dwCount].dwStatus = VALID_TOKEN;
  3555. }
  3556. else
  3557. {
  3558. PrintIPError(dwStatus,pszInput);
  3559. dwReturn = RETURN_NO_ERROR;
  3560. }
  3561. }
  3562. else
  3563. {
  3564. pParser->Cmd[dwCount].pArg = NULL;
  3565. pParser->Cmd[dwCount].dwStatus = dwStatus;
  3566. }
  3567. }
  3568. error:
  3569. return dwReturn;
  3570. }
  3571. //////////////////////////////////////////////////////////////////////////////
  3572. //
  3573. // Function : CheckCharForOccurances()
  3574. //
  3575. // Date of Creation : 08th Jan 2002
  3576. //
  3577. // Parameters : IN LPTSTR szInput,
  3578. // IN _TCHAR chData
  3579. //
  3580. // Return : DWORD
  3581. //
  3582. // Description :
  3583. //
  3584. //
  3585. // History :
  3586. //
  3587. // Date Author Comments
  3588. //
  3589. //////////////////////////////////////////////////////////////////////////////
  3590. DWORD
  3591. CheckCharForOccurances(
  3592. IN LPTSTR pszInput,
  3593. IN _TCHAR chData
  3594. )
  3595. {
  3596. DWORD dwCount = 0;
  3597. LPTSTR pszTmpPtr = NULL;
  3598. for ( dwCount=0,pszTmpPtr=pszInput; ;dwCount++)
  3599. {
  3600. pszTmpPtr = _tcschr(pszTmpPtr, chData);
  3601. if(pszTmpPtr)
  3602. {
  3603. pszTmpPtr++;
  3604. }
  3605. else
  3606. {
  3607. break;
  3608. }
  3609. }
  3610. return dwCount;
  3611. }
  3612. DWORD
  3613. ConvertStringToDword(
  3614. IN LPTSTR szInput,
  3615. OUT PDWORD pdwValue
  3616. )
  3617. {
  3618. DWORD dwReturn = ERROR_INVALID_OPTION_VALUE;
  3619. size_t i = 0;
  3620. DWORD dwValue = 0;
  3621. // our largest allowable value is 2147483647
  3622. while ((dwValue < 2147483647) && (szInput[i] >= '0') && (szInput[i] <= '9'))
  3623. {
  3624. dwValue = dwValue * 10 + (szInput[i] - '0');
  3625. ++i;
  3626. }
  3627. if (szInput[i] == '\0')
  3628. {
  3629. dwReturn = ERROR_SUCCESS;
  3630. *pdwValue = dwValue;
  3631. }
  3632. return dwReturn;
  3633. }