tnmain.cpp
上传用户:haiweijt
上传日期:2018-02-23
资源大小:8195k
文件大小:20k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //Telnet Win32 : an ANSI telnet client.
  3. //Copyright (C) 1998  Paul Brannan
  4. //Copyright (C) 1998  I.Ioannou
  5. //Copyright (C) 1997  Brad Johnson
  6. //
  7. //This program is free software; you can redistribute it and/or
  8. //modify it under the terms of the GNU General Public License
  9. //as published by the Free Software Foundation; either version 2
  10. //of the License, or (at your option) any later version.
  11. //
  12. //This program is distributed in the hope that it will be useful,
  13. //but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. //GNU General Public License for more details.
  16. //
  17. //You should have received a copy of the GNU General Public License
  18. //along with this program; if not, write to the Free Software
  19. //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. //
  21. //I.Ioannou
  22. //roryt@hol.gr
  23. //
  24. ///////////////////////////////////////////////////////////////////////////
  25. ///////////////////////////////////////////////////////////////////////////////
  26. //
  27. // Module: tnmain.cpp
  28. //
  29. // Contents: telnet main program
  30. //
  31. // Product: telnet
  32. //
  33. // Revisions: August 11, 1998 Thomas Briggs <tbriggs@qmetric.com>
  34. //            May 14, 1998 Paul Brannan <pbranna@clemson.edu>
  35. //            5.April.1997 jbj@nounname.com
  36. //            5.Dec.1996 jbj@nounname.com
  37. //            Version 2.0
  38. //
  39. //            02.Apr.1995 igor.milavec@uni-lj.si
  40. //   Original code
  41. //
  42. ///////////////////////////////////////////////////////////////////////////////
  43. #include <string.h>
  44. #include <locale.h>
  45. #include "tnmain.h"
  46. #include "tnmisc.h"
  47. #include "TNewADO.h"
  48. #include <windows.h>
  49. #include <conio.h>
  50. #include "TMyBuffer.h"
  51. //#include "TConfigA.h"
  52. int telCommandLine (Telnet &MyConnection);
  53. void waitforkey() {
  54. HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
  55. INPUT_RECORD InputRecord;
  56. DWORD dwInput;
  57. BOOL done = FALSE;
  58. while (!done){
  59. WaitForSingleObject( hConsole, INFINITE );
  60. if (!ReadConsoleInput(hConsole, &InputRecord, 1, &dwInput)){
  61. done = TRUE;
  62. continue;
  63. }
  64. if (InputRecord.EventType == KEY_EVENT &&
  65. InputRecord.Event.KeyEvent.bKeyDown )
  66. done = TRUE;
  67. }
  68. }
  69. //char * cfgets ( char * buf, unsigned int length, char pszHistory[][80], int iHistLength){
  70. struct cmdHistory * cfgets (char *buf, unsigned int length, struct cmdHistory *cmdhist) {
  71. HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
  72. unsigned int current=0, cursor =0, iEraseLength=0, i;
  73. char chr;
  74. char temp[2];
  75. char temp1[80];
  76. INPUT_RECORD InputRecord;
  77. BOOL done = FALSE;
  78. temp[1] = 0;
  79. buf[0] = '';
  80. if(!ini.get_input_redir()) {
  81. while (!done) {
  82. DWORD dwInput;
  83. int MustRefresh = 0;
  84. WaitForSingleObject( hConsole, INFINITE );
  85. if (!ReadConsoleInput(hConsole, &InputRecord, 1, &dwInput)){
  86. done = TRUE;
  87. continue;
  88. }
  89. MustRefresh = 0;
  90. if (InputRecord.EventType == KEY_EVENT &&
  91. InputRecord.Event.KeyEvent.bKeyDown ) {
  92. if(InputRecord.Event.KeyEvent.dwControlKeyState &
  93. (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
  94. switch(InputRecord.Event.KeyEvent.wVirtualKeyCode) {
  95. case 'D': // Thomas Briggs 8/11/98
  96. buf[0] = '4';
  97. buf[1] = '';
  98. current = 1;
  99. done = true;
  100. continue;
  101. case 'U': // Paul Brannan 8/11/98
  102. buf[0] = '';
  103. current = 0;
  104. cursor = 0;
  105. MustRefresh = 1;
  106. break;
  107. }
  108. }
  109. switch (InputRecord.Event.KeyEvent.wVirtualKeyCode) {
  110. case VK_UP:
  111. // crn@ozemail.com.au
  112. if (cmdhist != NULL) {
  113. if (!strcmp(buf, ""))
  114. strncpy(buf, cmdhist->cmd, 79);
  115. else if (cmdhist->prev != NULL) {
  116. cmdhist = cmdhist->prev;
  117. strncpy(buf, cmdhist->cmd, 79);
  118. }
  119. current = strlen(buf);
  120. }
  121. ///
  122. MustRefresh = 1;
  123. break;
  124. case VK_DOWN:
  125. // crn@ozemail.com.au
  126. if (cmdhist != NULL) {
  127. if (cmdhist->next != NULL) {
  128. cmdhist = cmdhist->next;
  129. strncpy(buf, cmdhist->cmd, 79);
  130. } else {
  131. strncpy(buf, "", 79);
  132. }
  133. current = strlen(buf);
  134. }
  135. ///
  136. MustRefresh = 1;
  137. break;
  138. case VK_RIGHT: //crn@ozemail.com.au (added ctrl+arrow)
  139. if (cursor < current)
  140. if (InputRecord.Event.KeyEvent.dwControlKeyState &
  141. (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
  142. unsigned int i,j;
  143. for (j = cursor; j <= current; j++)
  144. if (buf[j+1] == ' ' || (j+1)==current)
  145. break;
  146. for (i = ++j; i <= current; i++)
  147. if (buf[i] != ' ' || i == current) {
  148. cursor = i == current ? --i : i;
  149. break;
  150. }
  151. } else
  152. cursor++;
  153. MustRefresh = 1;
  154. break;
  155. case VK_LEFT: //crn@ozemail.com.au (added ctrl+arrow)
  156. if (cursor > 0)
  157. if(InputRecord.Event.KeyEvent.dwControlKeyState &
  158. (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
  159. int i,j;
  160. for (j = cursor; j >= 0; j--)
  161. if (buf[j-1] != ' ')
  162. break;
  163. for (i = --j; i >= 0; i--)
  164. if (buf[i] == ' ' || i == 0) {
  165. cursor = !i ? i : ++i;
  166. break;
  167. }
  168. } else
  169. cursor--;
  170. MustRefresh = 1;
  171. break;
  172. case VK_HOME:
  173. if (cursor>0) cursor = 0;
  174. MustRefresh = 1;
  175. break;
  176. case VK_END:
  177. if (cursor<current) cursor = current;
  178. MustRefresh = 1;
  179. break;
  180. case VK_DELETE:
  181. if (current > 0 && current > cursor) {
  182. strcpy(&buf[cursor],&buf[cursor+1]);
  183. current--;
  184. buf[current] = 0;
  185. printit("r");
  186. for (i = 0; i < current+strlen("telnet>")+1 ;i++)
  187. printit(" ");
  188. }
  189. MustRefresh = 1;
  190. break;
  191. case VK_BACK:
  192. if (cursor > 0 ) {
  193. strcpy(&buf[cursor-1],&buf[cursor]);
  194. current--;
  195. cursor--;
  196. buf[current] = 0;
  197. printit("r");
  198. for (i = 0; i < current+strlen("telnet>")+1 ;i++)
  199. printit(" ");
  200. }
  201. MustRefresh = 1;
  202. break;
  203. default:
  204. chr = InputRecord.Event.KeyEvent.uChar.AsciiChar;
  205. if (chr == 'r') {
  206. done = TRUE;
  207. continue;
  208. }
  209. if (current >= length-1){
  210. done = TRUE;
  211. continue;
  212. }
  213. if ( isprint (chr) ){
  214. strncpy(temp1,&buf[cursor],79);
  215. strncpy(&buf[cursor+1],temp1,79-(cursor+1));
  216. buf[cursor++]=chr;
  217. current++;
  218. buf[current] = 0;
  219. MustRefresh = 1;
  220. }
  221. break;
  222. }
  223. if (MustRefresh == 1)
  224. {
  225. printit("rtelnet");
  226. for (i = 0; i <= iEraseLength ;i++)
  227. printit(" ");
  228. printit("rtelnet>");
  229. printit(buf);
  230. iEraseLength = strlen(buf);
  231. for (i = 0; i < current-cursor; i++)
  232. printit("b");
  233. }
  234. }
  235. }
  236. buf[current] = 0;
  237. if (strcmp(buf, "")) {
  238. if (cmdhist == NULL) {
  239. cmdhist = new struct cmdHistory;
  240. if (cmdhist == NULL) {
  241. printit ("nUnable to allocate memory for history buffer -- use the "flush" command to clear the buffer.n");
  242. return cmdhist;
  243. }
  244. strncpy(cmdhist->cmd, buf, 79);
  245. cmdhist->next = NULL;
  246. cmdhist->prev = NULL;
  247. } else {
  248. while (cmdhist->next != NULL) //  move to the end of the list
  249. cmdhist = cmdhist->next;
  250. cmdhist->next = new struct cmdHistory;
  251. if (cmdhist->next == NULL) {
  252. printit ("nUnable to allocate memory for history buffer -- use the "flush" command to clear the buffer.n");
  253. return cmdhist;
  254. }
  255. cmdhist->next->prev = cmdhist; //  previous is where we are now
  256. cmdhist = cmdhist->next;
  257. strncpy(cmdhist->cmd, buf, 79);
  258. cmdhist->next = NULL;
  259. }
  260. while (cmdhist->next)
  261. cmdhist = cmdhist->next;
  262. }
  263. return cmdhist;
  264. ///
  265. } else {
  266. WaitForSingleObject( hConsole, INFINITE );
  267. DWORD dwInput;
  268. DWORD OldMode;
  269. GetConsoleMode(hConsole, &OldMode);
  270. SetConsoleMode(hConsole,
  271. OldMode &~ (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );
  272. while (ReadFile(hConsole, &chr, 1, &dwInput, NULL)) {
  273. if (chr == 'r') {
  274. temp[0] = chr;
  275. printit(&temp[0]);
  276. break;
  277. }
  278. if (chr == 'b' && current > 0) {
  279. current--;
  280. printit("b b");
  281. }
  282. if (current >= length-1){
  283. break;
  284. }
  285. if ( isprint (chr) ){
  286. temp[0] = chr;
  287. printit(&temp[0]);
  288. buf[current++]=chr;
  289. }
  290. }
  291. buf[current] = 0;
  292. SetConsoleMode(hConsole, OldMode);
  293. return NULL;
  294. }
  295. }
  296. // AVS ** for fix bug in command 'keys load keymapname' without file
  297. // static char keyfile[MAX_PATH*2];
  298. int main(int ArgC, char* ArgV[]) {
  299. //连接数据库--
  300. /*int i=1;
  301. TNewADO* tn=new TNewADO;
  302. tn->Open(".","sa","tcs54321","telnet");
  303. tn->Connect();
  304. //i=tn->Execute("SELECT [ip],[name],[id]FROM [telnet].[dbo].[IP]");
  305. i=tn->Execute("INSERT INTO [telnet].[dbo].[IP]([ip],[name],[id])VALUES('10.200.128' ,'005',5)");
  306. printf("%d====",i);*/
  307. //TMyBuffer* tmy=new TMyBuffer;
  308. //tmy->WriteString("=======");
  309. //TConfigA* tca=new TConfigA;
  310. //getch();
  311. //------------
  312. CONSOLE_SCREEN_BUFFER_INFO  ConsoleScreenBufferInfo;
  313. GetConsoleScreenBufferInfo(
  314. GetStdHandle(STD_OUTPUT_HANDLE),
  315. &ConsoleScreenBufferInfo
  316. );
  317. char *k;
  318. char startdir[MAX_PATH*2];
  319. char exename[MAX_PATH];
  320. // strncpy(startdir, ArgV[0],MAX_PATH);
  321. // This should be more accurate than using argv[0] (Paul Brannan 9/16/98)
  322. GetModuleFileName(NULL, startdir, sizeof(startdir));
  323. // Get the current console title so it can be set later
  324. // ("Pedro A. Aranda Guti閞rez" <paag@coppi.tid.es>)
  325. TCHAR ConsoleTitle[255];
  326. GetConsoleTitle(ConsoleTitle, sizeof(ConsoleTitle));
  327. k = strrchr(startdir, '\');
  328. if (k == NULL){ // if the  character is not found...
  329. strcpy(exename, startdir);
  330. strcpy(startdir,""); // set the path to nothing
  331. } else {
  332. // end the string after the last '' to get rid of the file name
  333. strcpy(exename, k+1);
  334. k[1] = 0;
  335. }
  336. printm(0, FALSE, MSG_COPYRIGHT);
  337. printm(0, FALSE, MSG_COPYRIGHT_1);
  338. // set up the ini class
  339. ini.init(startdir, exename);
  340. // Process the command line arguments and connect to a host if necessary
  341. if(ini.Process_Params(ArgC, ArgV)) {
  342. const char *szHost = ini.get_host();
  343. const char *strPort = ini.get_port();
  344. if(!*szHost) {
  345. Telnet MyConnection;
  346. while(telCommandLine(MyConnection));
  347. } else {
  348. Telnet MyConnection;
  349. if(MyConnection.Open(szHost, strPort) == TNPROMPT) {
  350. // still connected
  351. printit("n");
  352. telCommandLine(MyConnection);
  353. }
  354. }
  355. }
  356. //// (Paul Brannan 5/14/98)
  357. if(ini.get_term_width() != -1 || ini.get_term_height() != -1) {
  358. SetConsoleScreenBufferSize(
  359. GetStdHandle(STD_OUTPUT_HANDLE), // handle of console screen buffer
  360. ConsoleScreenBufferInfo.dwSize // new size in character rows and cols.
  361. );
  362. SetConsoleWindowInfo(
  363. GetStdHandle(STD_OUTPUT_HANDLE), // handle of console screen buffer
  364. TRUE, // coordinate type flag
  365. &ConsoleScreenBufferInfo.srWindow  // address of new window rectangle
  366. );
  367. }
  368. SetConsoleTextAttribute(
  369. GetStdHandle(STD_OUTPUT_HANDLE), // handle of console screen buffer
  370. ConsoleScreenBufferInfo.wAttributes  // text and background colors
  371. );
  372. // Restore the original console title
  373. // ("Pedro A. Aranda Guti閞rez" <paag@coppi.tid.es>)
  374. SetConsoleTitle(ConsoleTitle);
  375. return 0;
  376. }
  377. // AVS
  378. enum {
  379. BAD_USAGE = -3,
  380. EMPTY_LINE = -2,
  381. INVALID_CMD = -1,
  382. __FIRST_COMMAND = 0,
  383. OPEN = __FIRST_COMMAND,
  384. CLOSE,
  385. KEYS,
  386. QUIT,
  387. HELP,
  388. HELP2, // there is way for synonims
  389. K_LOAD, // subcommand of 'keys'
  390. K_SWITCH, // subcommand of 'keys'
  391. K_DISPLAY, // subcommand of 'keys'
  392. SET, // Paul Brannan 5/30/98
  393. SUSPEND,
  394. FASTQUIT, // Thomas Briggs 8/11/98
  395. CMD_HISTORY, // crn@ozemail.com.au
  396. CLEAR_HISTORY, // crn@ozemail.com.au
  397. ALIASES, // Paul Brannan 1/1/99
  398. __COMMAND_LIST_SIZE // must be last
  399. };
  400. struct command {
  401. char* cmd; // command
  402. int   minLen, // minimal length for match
  403.   minParms, // minimal count of parms
  404.   maxParms; // maximal -/- (negative disables)
  405. int   isSubCmd, // is a subcommand - number of wich command
  406.   haveSubCmd; // have subcommands? 0 or 1
  407. char* usage; // text of usage
  408. };
  409. command cmdList[__COMMAND_LIST_SIZE] = {
  410. {"open",     1, 1,  2, -1, 0, "o[pen] host [port]n"},
  411. {"close",    2, 0,  0, -1, 0, NULL},
  412. {"keys",     2, 1,  3, -1, 1, "ke[ys] l[oad] keymapname [file]n"
  413. "ke[ys] d[isplay]n"
  414. "ke[ys] s[witch] numbern"},
  415. // Ioannou : i change it to q, to be more compatible with unix telnet
  416. {"quit",     1, 0,  0, -1, 0, NULL}, // must type it exactly
  417. {"?",        1, 0,  0, -1, 0, NULL},
  418. {"help",     1, 0,  0, -1, 0, NULL},
  419. {"load",     1, 1,  2, KEYS, 0, NULL},
  420. {"switch",   1, 1,  1, KEYS, 0, NULL},
  421. {"display",  1, 0,  0, KEYS, 0, NULL},
  422. // Paul Brannan 5/30/98
  423. {"set",      3, 0, 2, -1, 0, "set will display available groups.n"
  424. "set groupname will display all variables/values in a group.n"
  425. "set [variable [value]] will set variable to value.n"},
  426. // Thomas Briggs 8/11/98
  427. {"z", 1, 0, 0, -1, 0, "suspend telnetn"},
  428. {"4", 1, 0, 0, -1, 0, NULL},
  429. // crn@ozemail.com.au
  430. {"history", 2, 0, 0, -1, 0, "show command history"},
  431. {"flush", 2, 0, 0, -1, 0, "flush history buffer"},
  432. // Paul Brannan 1/1/99
  433. {"aliases", 5, 0, 0, -1, 0, NULL}
  434. };
  435. // a maximal count of parms
  436. #define MAX_PARM_COUNT 3
  437. #define MAX_TOKEN_COUNT (MAX_PARM_COUNT+2)
  438. static int cmdMatch(const char* cmd, const char* token, int tokenLen, int minM) {
  439.     if ( tokenLen < minM ) return 0;
  440. // The (unsigned) gets rid of a compiler warning (Paul Brannan 5/25/98)
  441.     if ( (unsigned)tokenLen > strlen(cmd) ) return 0;
  442.     if ( strcmp(cmd,token) == 0 ) return 1;
  443.     int i;
  444.     for ( i = 0; i < minM; i++ ) if ( cmd[i] != token[i] ) return 0;
  445.     for ( i = minM; i < tokenLen; i++ ) if ( cmd[i] != token[i] ) return 0;
  446.     return 1;
  447. };
  448. static void printUsage(int cmd) {
  449. if ( cmdList[cmd].usage != NULL ) {
  450. printit(cmdList[cmd].usage);
  451. return;
  452. };
  453. if ( cmdList[cmd].isSubCmd >= 0 ) {
  454. printUsage(cmdList[cmd].isSubCmd);
  455. return;
  456.    }
  457.    printm(0, FALSE, MSG_BADUSAGE);
  458. };
  459. int tokenizeCommand(char* szCommand, int& argc, char** argv) {
  460.     char* tokens[MAX_TOKEN_COUNT];
  461.     char* p;
  462.     int   args = 0;
  463. if(!szCommand || !*szCommand) return EMPTY_LINE;
  464. // Removed strtok to handle tokens with spaces; this is handled with
  465. // quotes.  (Paul Brannan 3/18/99)
  466. char *token_start = szCommand;
  467. for(p = szCommand;; p++) {
  468. if(*p == '"') {
  469. char *tmp = p;
  470. for(p++; *p != '"' && *p != 0; p++); // Find the next quote
  471. if(*p != 0) strcpy(p, p + 1); // Remove quote#2
  472. strcpy(tmp, tmp + 1); // Remove quote#1
  473. }
  474. if(*p == 0 || *p == ' ' || *p == 't') {
  475. tokens[args] = token_start;
  476. args++;
  477. if(args >= MAX_TOKEN_COUNT) break; // Break if too many args
  478. token_start = p + 1;
  479. if(*p == 0) break;
  480. *p = 0;
  481. }
  482. }
  483. // while ( (p = strtok((args?NULL:szCommand), " t")) != NULL && args < MAX_TOKEN_COUNT ) {
  484. //  tokens[args] = p;
  485. //  args++;
  486. // };
  487.     if ( !args ) return EMPTY_LINE;
  488.     argc = args - 1;
  489.     args = 0;
  490.     int curCmd = -1;
  491.     int ok = -1;
  492.     while ( ok < 0 ) {
  493. int tokenLen = strlen(tokens[args]);
  494. int match = 0;
  495. for ( int i = 0; i<__COMMAND_LIST_SIZE; i++ ) {
  496. if ( cmdMatch(cmdList[i].cmd, tokens[args], tokenLen, cmdList[i].minLen) ) {
  497. if (argc < cmdList[i].minParms || argc > cmdList[i].maxParms) {
  498. printUsage(i);
  499. return BAD_USAGE;
  500. };
  501. if ( cmdList[i].haveSubCmd && curCmd == cmdList[i].isSubCmd) {
  502. curCmd = i;
  503. args++;
  504. argc--;
  505. match = 1;
  506. break;
  507. };
  508. if ( curCmd == cmdList[i].isSubCmd ) {
  509. ok = i;
  510. match = 1;
  511. break;
  512. };
  513. printUsage(i);
  514. return BAD_USAGE;
  515. };
  516. };
  517. if ( !match ) {
  518. if ( curCmd < 0 ) return INVALID_CMD;
  519. printUsage(curCmd);
  520. return -3;
  521. };
  522.     };
  523.     for ( int i = 0; i<argc; i++ ) {
  524.         argv[i] = tokens[i+args+1];
  525.     };
  526.     return ok;
  527. };
  528. int telCommandLine (Telnet &MyConnection){
  529. #define HISTLENGTH 25
  530. int i, retval;
  531. char* Parms[MAX_PARM_COUNT];
  532. char szCommand[80];
  533. int bDone = 0;
  534. char *extitle, *newtitle;
  535. struct cmdHistory *cmdhist;
  536. cmdhist = NULL;
  537. // printit("n");  // crn@ozemail.com.au 14/12/98
  538. while (!bDone){
  539. // printit("n"); // Paul Brannan 5/25/98
  540. printit( "telnet>");
  541. cmdhist = cfgets (szCommand, 79, cmdhist);
  542. printit( "n");
  543. strlwr(szCommand);  // convert command line to lower
  544. // i = sscanf(szCommand,"%80s %80s %80s %80s", szCmd, szArg1, szArg2, szArg3);
  545. switch ( tokenizeCommand(szCommand, i, Parms) ) {
  546. case BAD_USAGE:   break;
  547. case EMPTY_LINE:  
  548. if(MyConnection.Resume() == TNPROMPT) {
  549. printit("n");
  550. break;
  551. }
  552. else
  553.   return 1;
  554. case INVALID_CMD:
  555. printm(0, FALSE, MSG_INVCMD);
  556. break;
  557. case OPEN:
  558. if (i == 1)
  559. retval = MyConnection.Open(Parms[0], "23");
  560. else
  561. retval = MyConnection.Open(Parms[0], Parms[1]);
  562. if(retval != TNNOCON && retval != TNPROMPT) return 1;
  563. if(retval == TNPROMPT) printit("n");
  564. break;
  565. case CLOSE:
  566. MyConnection.Close();
  567. break;
  568. case FASTQUIT: // Thomas Briggs 8/11/98
  569. case QUIT:
  570. MyConnection.Close();
  571. bDone = 1;
  572. break;
  573. case HELP:
  574. case HELP2:
  575. printm(0, FALSE, MSG_HELP);
  576. printm(0, FALSE, MSG_HELP_1);
  577. break;
  578. // case KEYS: we should never get it
  579. case K_LOAD:
  580. if ( i == 1 ) {
  581. // Ioannou : changed to ini.get_keyfile()
  582. if(MyConnection.LoadKeyMap( ini.get_keyfile(), Parms[0]) != 1)
  583. printit("Error loading keymap.n");
  584. break;
  585. };
  586. if(MyConnection.LoadKeyMap( Parms[1], Parms[0]) != 1)
  587. printit("Error loading keymap.n");
  588. break;
  589. case K_DISPLAY:
  590. MyConnection.DisplayKeyMap();
  591. break;
  592. case K_SWITCH:
  593. MyConnection.SwitchKeyMap(atoi(Parms[0]));
  594. break;
  595. // Paul Brannan 5/30/98
  596. case SET:
  597. if(i == 0) {
  598. printit("Available groups:n"); // Print out groups
  599. ini.print_groups(); // (Paul Brannan 9/3/98)
  600. } else if(i == 1) {
  601. ini.print_vars(Parms[0]);
  602. } else if(i >= 2) {
  603. ini.set_value(Parms[0], Parms[1]);
  604. // FIX ME !!! Ioannou: here we must call the parser routine for
  605. // wrap line, not the ini.set_value
  606. //  something like Parser.ConLineWrap(Wrap_Line);
  607. }
  608. break;
  609. case SUSPEND: // Thomas Briggs 8/11/98
  610. // remind the user we're suspended -crn@ozemail.com.au 15/12/98
  611. extitle = new char[128];
  612. GetConsoleTitle (extitle, 128);
  613. newtitle = new char[128+sizeof("[suspended]")];
  614. strcpy(newtitle, extitle);
  615. strncat(newtitle, "[suspended]", 128+sizeof("[suspended]"));
  616. if(ini.get_set_title()) SetConsoleTitle (newtitle);
  617. delete[] newtitle;
  618. if (getenv("comspec") == NULL) {
  619. switch (GetWin32Version()) {
  620. case 2: // 'cmd' is faster than 'command' in NT -crn@ozemail.com.au
  621. system ("cmd");
  622. break;
  623. default:
  624. system ("command");
  625. break;
  626. }
  627. } else {
  628. system(getenv("comspec"));
  629. }
  630. if(ini.get_set_title()) SetConsoleTitle (extitle);
  631. delete[] extitle;
  632. ///
  633. break;
  634. case CMD_HISTORY: //crn@ozemail.com.au
  635. if (cmdhist != NULL) {
  636. while (cmdhist->prev != NULL)
  637. cmdhist = cmdhist->prev; //rewind
  638. printf ("Command history:n");
  639. while (1) {
  640. printf ("t%sn", cmdhist->cmd);
  641. if (cmdhist->next != NULL)
  642. cmdhist = cmdhist->next;
  643. else
  644. break;
  645. }
  646. } else
  647. printf ("No command history available.n");
  648. break;
  649. case CLEAR_HISTORY: //crn@ozemail.com.au
  650. if (cmdhist != NULL) {
  651. while (cmdhist->next != NULL)
  652. cmdhist = cmdhist->next; //fast forward
  653. while (cmdhist->prev != NULL) {
  654. cmdhist = cmdhist->prev;
  655. delete cmdhist->next;
  656. }
  657. delete cmdhist;
  658. cmdhist = NULL;
  659. printf ("Command history cleared.n");
  660. } else
  661. printf ("No command history available.n");
  662. case ALIASES: // Paul Brannan 1/1/99
  663. ini.print_aliases();
  664. break;
  665. default: // paranoik
  666. printm(0, FALSE, MSG_INVCMD);
  667. break;
  668. }
  669. }
  670. return 0;
  671. }