author | Michael Krelin <hacker@klever.net> | 2005-08-06 13:47:13 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-08-06 13:47:13 (UTC) |
commit | fc7dc5278f4590c74e41b3ce89d093a05550ec44 (patch) (unidiff) | |
tree | 0c51dff7fad22caddab72ff125e2d7ace9c7e813 /kinsole.cpp | |
parent | c71a33aff5d0bbe32dc9d0f732c11a87e5909d47 (diff) | |
download | kinsole-master.zip kinsole-master.tar.gz kinsole-master.tar.bz2 |
git-svn-id: http://svn.klever.net/kin/kinsole/trunk@132 fe716a7a-6dde-0310-88d9-d003556173a8
-rw-r--r-- | kinsole.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kinsole.cpp b/kinsole.cpp index 01286f3..7fa3f8b 100644 --- a/kinsole.cpp +++ b/kinsole.cpp | |||
@@ -1,147 +1,147 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | 2 | ||
3 | #ifdef_DEBUG | 3 | #ifdef_DEBUG |
4 | #include <afxwin.h> | 4 | #include <afxwin.h> |
5 | #else | 5 | #else |
6 | #define ASSERT(f) ((void)0) | 6 | #define ASSERT(f) ((void)0) |
7 | #define VERIFY(f) ((void)(f)) | 7 | #define VERIFY(f) ((void)(f)) |
8 | #define TRACE0(sz) | 8 | #define TRACE0(sz) |
9 | #define TRACE1(sz, p1) | 9 | #define TRACE1(sz, p1) |
10 | #define TRACE2(sz, p1, p2) | 10 | #define TRACE2(sz, p1, p2) |
11 | #define TRACE3(sz, p1, p2, p3) | 11 | #define TRACE3(sz, p1, p2, p3) |
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | #include <winsock.h> | 14 | #include <winsock.h> |
15 | #include "resource.h" | 15 | #include "resource.h" |
16 | #include "windowsx.h" | 16 | #include "windowsx.h" |
17 | 17 | ||
18 | #define DAMN_KIN_NAME "KINSole" | 18 | #define DAMN_KIN_NAME "KINSole" |
19 | #define DAMN_KIN_VERSION"1.1" | 19 | #define DAMN_KIN_VERSION"1.1.1" |
20 | 20 | ||
21 | #ifdef _DEBUG | 21 | #ifdef _DEBUG |
22 | #define new DEBUG_NEW | 22 | #define new DEBUG_NEW |
23 | #undef THIS_FILE | 23 | #undef THIS_FILE |
24 | static char THIS_FILE[] = __FILE__; | 24 | static char THIS_FILE[] = __FILE__; |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | enum { | 27 | enum { |
28 | WM_USERSOCKET = WM_USER+16, | 28 | WM_USERSOCKET = WM_USER+16, |
29 | WM_USERKEY, | 29 | WM_USERKEY, |
30 | WM_USERNOP | 30 | WM_USERNOP |
31 | }; | 31 | }; |
32 | enum { | 32 | enum { |
33 | tnIAC = 255, | 33 | tnIAC = 255, |
34 | tnSE = 240, | 34 | tnSE = 240, |
35 | tnNOP = 241, | 35 | tnNOP = 241, |
36 | tnDM = 242, | 36 | tnDM = 242, |
37 | tnBreak = 243, | 37 | tnBreak = 243, |
38 | tnIP = 244, | 38 | tnIP = 244, |
39 | tnAO = 245, | 39 | tnAO = 245, |
40 | tnAYT = 246, | 40 | tnAYT = 246, |
41 | tnEC = 247, | 41 | tnEC = 247, |
42 | tnEL = 248, | 42 | tnEL = 248, |
43 | tnGA = 249, | 43 | tnGA = 249, |
44 | tnSB = 250, | 44 | tnSB = 250, |
45 | tnWILL = 251, | 45 | tnWILL = 251, |
46 | tnWONT = 252, | 46 | tnWONT = 252, |
47 | tnDO = 253, | 47 | tnDO = 253, |
48 | tnDONT = 254 | 48 | tnDONT = 254 |
49 | }; | 49 | }; |
50 | 50 | ||
51 | WSADATA wsaData; | 51 | WSADATA wsaData; |
52 | ATOM wsaWC = NULL; | 52 | ATOM wsaWC = NULL; |
53 | HWND wsaW = NULL; | 53 | HWND wsaW = NULL; |
54 | 54 | ||
55 | CHAR remoteHost[256]; | 55 | CHAR remoteHost[256]; |
56 | CHAR remoteProt[256]; | 56 | CHAR remoteProt[256]; |
57 | sockaddr_in remoteSIN; | 57 | sockaddr_in remoteSIN; |
58 | 58 | ||
59 | 59 | ||
60 | SOCKET telnetSocket; | 60 | SOCKET telnetSocket; |
61 | HANDLE hConsoleInput; | 61 | HANDLE hConsoleInput; |
62 | HANDLE hConsoleOutput; | 62 | HANDLE hConsoleOutput; |
63 | HWND hConsoleWindow; | 63 | HWND hConsoleWindow; |
64 | HANDLE hConsoleThread; | 64 | HANDLE hConsoleThread; |
65 | DWORD consoleThreadID; | 65 | DWORD consoleThreadID; |
66 | HANDLE hDispatchThread; | 66 | HANDLE hDispatchThread; |
67 | DWORD dispatchThreadID; | 67 | DWORD dispatchThreadID; |
68 | BOOL bTelnet,bTermPulled; | 68 | BOOL bTelnet,bTermPulled; |
69 | 69 | ||
70 | enum_cState { | 70 | enum_cState { |
71 | cstateNone = 0, cstateIAC, cstateDO, cstateSB, cstateSBData, | 71 | cstateNone = 0, cstateIAC, cstateDO, cstateSB, cstateSBData, |
72 | cstateSBDataIAC, cstateWILL, cstateDONT,cstateWONT, | 72 | cstateSBDataIAC, cstateWILL, cstateDONT,cstateWONT, |
73 | }connState = cstateNone; | 73 | }connState = cstateNone; |
74 | BYTE negOption = 0; | 74 | BYTE negOption = 0; |
75 | 75 | ||
76 | 76 | ||
77 | BOOL SelectSocket() { | 77 | BOOL SelectSocket() { |
78 | return WSAAsyncSelect(telnetSocket,wsaW,WM_USERSOCKET,FD_READ|FD_OOB|FD_CLOSE)!=SOCKET_ERROR; | 78 | return WSAAsyncSelect(telnetSocket,wsaW,WM_USERSOCKET,FD_READ|FD_OOB|FD_CLOSE)!=SOCKET_ERROR; |
79 | } | 79 | } |
80 | 80 | ||
81 | BOOL ShowWill(BYTE o) | 81 | BOOL ShowWill(BYTE o) |
82 | { | 82 | { |
83 | TRACE1("We're WILLing to %d\n",(WORD)o); | 83 | TRACE1("We're WILLing to %d\n",(WORD)o); |
84 | static | 84 | static |
85 | BYTE d[3] = {tnIAC,tnWILL,0}; | 85 | BYTE d[3] = {tnIAC,tnWILL,0}; |
86 | d[2] = o; | 86 | d[2] = o; |
87 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); | 87 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); |
88 | SelectSocket(); | 88 | SelectSocket(); |
89 | return rv; | 89 | return rv; |
90 | } | 90 | } |
91 | BOOL ShowUnwill(BYTE o) | 91 | BOOL ShowUnwill(BYTE o) |
92 | { | 92 | { |
93 | TRACE1("We're NOT WILLing to %d\n",(WORD)o); | 93 | TRACE1("We're NOT WILLing to %d\n",(WORD)o); |
94 | static | 94 | static |
95 | BYTE d[3] = {tnIAC,tnWONT,0}; | 95 | BYTE d[3] = {tnIAC,tnWONT,0}; |
96 | d[2] = o; | 96 | d[2] = o; |
97 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); | 97 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); |
98 | SelectSocket(); | 98 | SelectSocket(); |
99 | return rv; | 99 | return rv; |
100 | } | 100 | } |
101 | BOOL BegDo(BYTE o) | 101 | BOOL BegDo(BYTE o) |
102 | { | 102 | { |
103 | TRACE1("We beg to DO %d\n",(WORD)o); | 103 | TRACE1("We beg to DO %d\n",(WORD)o); |
104 | static | 104 | static |
105 | BYTE d[3] = {tnIAC,tnDO,0}; | 105 | BYTE d[3] = {tnIAC,tnDO,0}; |
106 | d[2] = o; | 106 | d[2] = o; |
107 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); | 107 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); |
108 | SelectSocket(); | 108 | SelectSocket(); |
109 | return rv; | 109 | return rv; |
110 | } | 110 | } |
111 | BOOL BegDont(BYTE o) | 111 | BOOL BegDont(BYTE o) |
112 | { | 112 | { |
113 | TRACE1("We beg DONT'T %d\n",(WORD)o); | 113 | TRACE1("We beg DONT'T %d\n",(WORD)o); |
114 | static | 114 | static |
115 | BYTE d[3] = {tnIAC,tnDONT,0}; | 115 | BYTE d[3] = {tnIAC,tnDONT,0}; |
116 | d[2] = o; | 116 | d[2] = o; |
117 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); | 117 | BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); |
118 | SelectSocket(); | 118 | SelectSocket(); |
119 | return rv; | 119 | return rv; |
120 | } | 120 | } |
121 | BOOL SubNegotiate(BYTE o,LPBYTE data,UINT size) | 121 | BOOL SubNegotiate(BYTE o,LPBYTE data,UINT size) |
122 | { | 122 | { |
123 | LPBYTE d = new BYTE[3+size*2+2]; | 123 | LPBYTE d = new BYTE[3+size*2+2]; |
124 | int ds = 0; | 124 | int ds = 0; |
125 | d[ds++]=tnIAC; d[ds++]=tnSB; d[ds++]=o; | 125 | d[ds++]=tnIAC; d[ds++]=tnSB; d[ds++]=o; |
126 | for(UINT tmp=0;tmp<size;tmp++) | 126 | for(UINT tmp=0;tmp<size;tmp++) |
127 | if(data[tmp]!=tnIAC) | 127 | if(data[tmp]!=tnIAC) |
128 | d[ds++]=data[tmp]; | 128 | d[ds++]=data[tmp]; |
129 | else{ | 129 | else{ |
130 | d[ds++]=tnIAC; d[ds++]=tnIAC; | 130 | d[ds++]=tnIAC; d[ds++]=tnIAC; |
131 | } | 131 | } |
132 | d[ds++]=tnIAC;d[ds++]=tnSE; | 132 | d[ds++]=tnIAC;d[ds++]=tnSE; |
133 | BOOL rv = send(telnetSocket,(char*)d,ds,0)==ds; | 133 | BOOL rv = send(telnetSocket,(char*)d,ds,0)==ds; |
134 | delete d; | 134 | delete d; |
135 | SelectSocket(); | 135 | SelectSocket(); |
136 | return rv; | 136 | return rv; |
137 | } | 137 | } |
138 | BOOL SendLiteral(CHAR c) | 138 | BOOL SendLiteral(CHAR c) |
139 | { | 139 | { |
140 | BYTE d[2] = {tnIAC,0}; | 140 | BYTE d[2] = {tnIAC,0}; |
141 | BOOL rv = FALSE; | 141 | BOOL rv = FALSE; |
142 | if(c==tnIAC){ | 142 | if(c==tnIAC){ |
143 | d[1]=c; | 143 | d[1]=c; |
144 | rv = send(telnetSocket,(char*)d,2,0)==2; | 144 | rv = send(telnetSocket,(char*)d,2,0)==2; |
145 | }else | 145 | }else |
146 | rv = send(telnetSocket,&c,1,0)==1; | 146 | rv = send(telnetSocket,&c,1,0)==1; |
147 | return rv; | 147 | return rv; |
@@ -425,257 +425,257 @@ void ProcessNetByte(BYTE c) | |||
425 | break; | 425 | break; |
426 | case cstateIAC: | 426 | case cstateIAC: |
427 | ProcessIACByte(c); | 427 | ProcessIACByte(c); |
428 | break; | 428 | break; |
429 | case cstateNone: | 429 | case cstateNone: |
430 | default: | 430 | default: |
431 | ASSERT(connState==cstateNone); | 431 | ASSERT(connState==cstateNone); |
432 | if(c==tnIAC) | 432 | if(c==tnIAC) |
433 | connState=cstateIAC; | 433 | connState=cstateIAC; |
434 | else | 434 | else |
435 | TerminalOut(c); | 435 | TerminalOut(c); |
436 | break; | 436 | break; |
437 | } | 437 | } |
438 | } | 438 | } |
439 | 439 | ||
440 | LRESULT WSMessage(WPARAM wP,LPARAM lP) | 440 | LRESULT WSMessage(WPARAM wP,LPARAM lP) |
441 | { | 441 | { |
442 | if(WSAGETSELECTERROR(lP)){ | 442 | if(WSAGETSELECTERROR(lP)){ |
443 | TRACE0("SelectError\n"); | 443 | TRACE0("SelectError\n"); |
444 | PostMessage(wsaW,WM_QUIT,0,0); | 444 | PostMessage(wsaW,WM_QUIT,0,0); |
445 | return 0; | 445 | return 0; |
446 | } | 446 | } |
447 | if(WSAGETSELECTEVENT(lP)&FD_READ){ | 447 | if(WSAGETSELECTEVENT(lP)&FD_READ){ |
448 | //?? TRACE0("FD_READ\n"); | 448 | //?? TRACE0("FD_READ\n"); |
449 | BYTE input[80*12]; | 449 | BYTE input[80*12]; |
450 | int got; | 450 | int got; |
451 | TerminalPreO(); | 451 | TerminalPreO(); |
452 | //?? TRACE0("rv\n"); | 452 | //?? TRACE0("rv\n"); |
453 | got=recv(telnetSocket,(CHAR*)input,sizeof(input),0); | 453 | got=recv(telnetSocket,(CHAR*)input,sizeof(input),0); |
454 | //?? TRACE1("/rv %d\n",got); | 454 | //?? TRACE1("/rv %d\n",got); |
455 | for(int tmp=0;tmp<got;tmp++) | 455 | for(int tmp=0;tmp<got;tmp++) |
456 | ProcessNetByte(input[tmp]); | 456 | ProcessNetByte(input[tmp]); |
457 | TerminalPostO(); | 457 | TerminalPostO(); |
458 | //?? TRACE0("/FD_READ\n"); | 458 | //?? TRACE0("/FD_READ\n"); |
459 | return 0; | 459 | return 0; |
460 | } | 460 | } |
461 | if(WSAGETSELECTEVENT(lP)&FD_OOB){ | 461 | if(WSAGETSELECTEVENT(lP)&FD_OOB){ |
462 | TRACE0("OOB\n"); | 462 | TRACE0("OOB\n"); |
463 | } | 463 | } |
464 | if(WSAGETSELECTEVENT(lP)&FD_CLOSE){ | 464 | if(WSAGETSELECTEVENT(lP)&FD_CLOSE){ |
465 | TRACE0("CLOSE\n"); | 465 | TRACE0("CLOSE\n"); |
466 | PostMessage(wsaW,WM_QUIT,0,0); | 466 | PostMessage(wsaW,WM_QUIT,0,0); |
467 | return 0; | 467 | return 0; |
468 | } | 468 | } |
469 | VERIFY(SelectSocket()); | 469 | VERIFY(SelectSocket()); |
470 | return 0; | 470 | return 0; |
471 | } | 471 | } |
472 | 472 | ||
473 | LRESULT CALLBACK WSWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) | 473 | LRESULT CALLBACK WSWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) |
474 | { | 474 | { |
475 | switch(uMsg){ | 475 | switch(uMsg){ |
476 | case WM_USERSOCKET: | 476 | case WM_USERSOCKET: |
477 | return WSMessage(wParam,lParam); | 477 | return WSMessage(wParam,lParam); |
478 | case WM_USERKEY: | 478 | case WM_USERKEY: |
479 | return ProcessConsoleInput(); | 479 | return ProcessConsoleInput(); |
480 | default: | 480 | default: |
481 | TRACE0("DEFWINDOWPROC\n"); | 481 | TRACE0("DEFWINDOWPROC\n"); |
482 | return ::DefWindowProc(hWnd,uMsg,wParam,lParam); | 482 | return ::DefWindowProc(hWnd,uMsg,wParam,lParam); |
483 | } | 483 | } |
484 | return 0; | 484 | return 0; |
485 | } | 485 | } |
486 | 486 | ||
487 | 487 | ||
488 | BOOL InitializeWinsock() | 488 | BOOL InitializeWinsock() |
489 | { | 489 | { |
490 | if(WSAStartup(0x101,&wsaData)){ | 490 | if(WSAStartup(0x101,&wsaData)){ |
491 | printf("Failed to initialize winsock services\n"); | 491 | printf("Failed to initialize winsock services\n"); |
492 | return FALSE; | 492 | return FALSE; |
493 | } | 493 | } |
494 | WNDCLASS wc; | 494 | WNDCLASS wc; |
495 | memset(&wc,0,sizeof(wc)); | 495 | memset(&wc,0,sizeof(wc)); |
496 | wc.lpfnWndProc=WSWndProc; wc.hInstance=::GetModuleHandle(NULL); | 496 | wc.lpfnWndProc=WSWndProc; wc.hInstance=::GetModuleHandle(NULL); |
497 | wc.lpszClassName = "_WSTFWC_"; | 497 | wc.lpszClassName = "_WSTFWC_"; |
498 | wsaWC = RegisterClass(&wc); | 498 | wsaWC = RegisterClass(&wc); |
499 | if(!wsaWC){ | 499 | if(!wsaWC){ |
500 | printf("Failed to initialize winsock services - 1\n"); | 500 | printf("Failed to initialize winsock services - 1\n"); |
501 | return FALSE; | 501 | return FALSE; |
502 | } | 502 | } |
503 | wsaW = ::CreateWindow("_WSTFWC_","KIN Sole Mio",0,0,0,0,0,NULL,NULL,::GetModuleHandle(NULL),NULL); | 503 | wsaW = ::CreateWindow("_WSTFWC_","KIN Sole Mio",0,0,0,0,0,NULL,NULL,::GetModuleHandle(NULL),NULL); |
504 | if(!wsaW){ | 504 | if(!wsaW){ |
505 | printf("Failed to initialize winsock services\n"); | 505 | printf("Failed to initialize winsock services\n"); |
506 | return FALSE; | 506 | return FALSE; |
507 | } | 507 | } |
508 | return TRUE; | 508 | return TRUE; |
509 | } | 509 | } |
510 | void DeinitializeWinsock() | 510 | void DeinitializeWinsock() |
511 | { | 511 | { |
512 | if(wsaW) | 512 | if(wsaW) |
513 | ::DestroyWindow(wsaW); | 513 | ::DestroyWindow(wsaW); |
514 | wsaW=NULL; | 514 | wsaW=NULL; |
515 | if(wsaWC) | 515 | if(wsaWC) |
516 | ::UnregisterClass("_WSTFWC_",::GetModuleHandle(NULL)); | 516 | ::UnregisterClass("_WSTFWC_",::GetModuleHandle(NULL)); |
517 | wsaWC=NULL; | 517 | wsaWC=NULL; |
518 | WSACleanup(); | 518 | WSACleanup(); |
519 | } | 519 | } |
520 | 520 | ||
521 | HWND GetThisConsoleWnd() | 521 | HWND GetThisConsoleWnd() |
522 | { | 522 | { |
523 | DWORD pid = GetCurrentProcessId(); | 523 | DWORD pid = GetCurrentProcessId(); |
524 | CHAR title[512]; | 524 | CHAR title[512]; |
525 | CHAR* t = title; | 525 | CHAR* t = title; |
526 | if(!GetConsoleTitle(title,sizeof(title))) | 526 | if(!GetConsoleTitle(title,sizeof(title))) |
527 | t = NULL; | 527 | t = NULL; |
528 | HWND hrv = FindWindowEx(NULL,NULL,"tty",t); | 528 | HWND hrv = FindWindowEx(NULL,NULL,"tty",t); |
529 | HWND nopro = NULL; | 529 | HWND nopro = NULL; |
530 | UINT nopros=0; | 530 | UINT nopros=0; |
531 | do{ | 531 | do{ |
532 | DWORD wpid; | 532 | DWORD wpid; |
533 | if(!GetWindowThreadProcessId(hrv,&wpid)) | 533 | if(!GetWindowThreadProcessId(hrv,&wpid)) |
534 | continue; | 534 | continue; |
535 | if(wpid==pid) | 535 | if(wpid==pid) |
536 | return hrv; | 536 | return hrv; |
537 | nopro=hrv; | 537 | nopro=hrv; |
538 | nopros++; | 538 | nopros++; |
539 | hrv = FindWindowEx(NULL,hrv,"tty",t); | 539 | hrv = FindWindowEx(NULL,hrv,"tty",t); |
540 | }while(hrv); | 540 | }while(hrv); |
541 | if(nopros==1){ | 541 | if(nopros==1){ |
542 | ASSERT(nopro); | 542 | ASSERT(nopro); |
543 | return nopro; | 543 | return nopro; |
544 | } | 544 | } |
545 | return NULL; | 545 | return NULL; |
546 | } | 546 | } |
547 | 547 | ||
548 | main(int argc,char*argv[]) | 548 | main(int argc,char*argv[]) |
549 | { | 549 | { |
550 | if(argc<2){ | 550 | if(argc<2){ |
551 | usagebye: | 551 | usagebye: |
552 | printf( | 552 | printf( |
553 | DAMN_KIN_NAME " " DAMN_KIN_VERSION ", Copyright (c) 1998-2004 Klever Group (http://www.klever.net/)\n\n" | 553 | DAMN_KIN_NAME " " DAMN_KIN_VERSION ", Copyright (c) 1998-2005 Klever Group (http://www.klever.net/)\n\n" |
554 | "Usage:\t" DAMN_KIN_NAME " [<options> ]<host-name/ip-address>[ <port>]\n\n" | 554 | "Usage:\t" DAMN_KIN_NAME " [<options> ]<host-name/ip-address>[ <port>]\n\n" |
555 | "Options are:\n" | 555 | "Options are:\n" |
556 | "-r## or -##\tSet number of rows in console screenbuffer\n" | 556 | "-r## or -##\tSet number of rows in console screenbuffer\n" |
557 | "-c##\t\tSet number of columns in console screenbuffer\n" | 557 | "-c##\t\tSet number of columns in console screenbuffer\n" |
558 | "\tnote: changing console screenbuffer size may not work properly\n" | 558 | "\tnote: changing console screenbuffer size may not work properly\n" |
559 | "\twhen in full-screen mode\n" | 559 | "\twhen in full-screen mode\n" |
560 | "-l<user>\tPass username to remote server in environment\n" | 560 | "-l<user>\tPass username to remote server in environment\n" |
561 | "-e<var>=<val>\tPass environment variable to remote server\n" | 561 | "-e<var>=<val>\tPass environment variable to remote server\n" |
562 | "-v<var>=<val>\tPass user environment variable to remote server\n" | 562 | "-v<var>=<val>\tPass user environment variable to remote server\n" |
563 | "-t<termtype>\tChange preferred terminal type\n" | 563 | "-t<termtype>\tChange preferred terminal type\n" |
564 | "\tnote: there are only two different terminal emulations in this\n" | 564 | "\tnote: there are only two different terminal emulations in this\n" |
565 | "\trelease - one for dumb terminal and one for vt terminal\n" | 565 | "\trelease - one for dumb terminal and one for vt terminal\n" |
566 | ); | 566 | ); |
567 | CleanEnvars(); | 567 | CleanEnvars(); |
568 | return 1; | 568 | return 1; |
569 | } | 569 | } |
570 | if(!InitializeWinsock()){ | 570 | if(!InitializeWinsock()){ |
571 | DeinitializeWinsock(); | 571 | DeinitializeWinsock(); |
572 | return 2; | 572 | return 2; |
573 | } | 573 | } |
574 | CONSOLE_SCREEN_BUFFER_INFO csbi; | 574 | CONSOLE_SCREEN_BUFFER_INFO csbi; |
575 | int ac = 0; | 575 | int ac = 0; |
576 | CHAR *ho = NULL, *po = NULL; | 576 | CHAR *ho = NULL, *po = NULL; |
577 | HANDLE hConsole = CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, | 577 | HANDLE hConsole = CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, |
578 | NULL,OPEN_EXISTING,0,NULL); | 578 | NULL,OPEN_EXISTING,0,NULL); |
579 | ASSERT(hConsole); | 579 | ASSERT(hConsole); |
580 | // *** GetStdHandle(STD_OUTPUT_HANDLE);// *?*?* Do something about redirections and not only here. | 580 | // *** GetStdHandle(STD_OUTPUT_HANDLE);// *?*?* Do something about redirections and not only here. |
581 | VERIFY(GetConsoleScreenBufferInfo(hConsole,&csbi)); | 581 | VERIFY(GetConsoleScreenBufferInfo(hConsole,&csbi)); |
582 | BOOL bSized=FALSE; | 582 | BOOL bSized=FALSE; |
583 | bTermPulled=FALSE; | 583 | bTermPulled=FALSE; |
584 | for(int tmp=1;tmp<argc;tmp++){ | 584 | for(int tmp=1;tmp<argc;tmp++){ |
585 | char* v = argv[tmp]; | 585 | char* v = argv[tmp]; |
586 | ASSERT(v && *v); | 586 | ASSERT(v && *v); |
587 | if((*v)=='/' || (*v)=='-'){ | 587 | if((*v)=='/' || (*v)=='-'){ |
588 | int lines = atoi(&v[1]); | 588 | int lines = atoi(&v[1]); |
589 | if(lines){ | 589 | if(lines){ |
590 | if(lines<csbi.dwSize.Y){ | 590 | if(lines<csbi.dwSize.Y){ |
591 | SMALL_RECT wi = {0,0,csbi.dwSize.X-1,lines-1}; | 591 | SMALL_RECT wi = {0,0,csbi.dwSize.X-1,lines-1}; |
592 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); | 592 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); |
593 | } | 593 | } |
594 | COORD ns = {csbi.dwSize.X,lines}; | 594 | COORD ns = {csbi.dwSize.X,lines}; |
595 | if(SetConsoleScreenBufferSize(hConsole,ns)) | 595 | if(SetConsoleScreenBufferSize(hConsole,ns)) |
596 | bSized=TRUE; | 596 | bSized=TRUE; |
597 | }else if(v[1]=='r'){ | 597 | }else if(v[1]=='r'){ |
598 | int lines = atoi(&v[2]); | 598 | int lines = atoi(&v[2]); |
599 | if(lines){ | 599 | if(lines){ |
600 | if(lines<csbi.dwSize.Y){ | 600 | if(lines<csbi.dwSize.Y){ |
601 | SMALL_RECT wi = {0,0,csbi.dwSize.X-1,lines-1}; | 601 | SMALL_RECT wi = {0,0,csbi.dwSize.X-1,lines-1}; |
602 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); | 602 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); |
603 | } | 603 | } |
604 | COORD ns = {csbi.dwSize.X,lines}; | 604 | COORD ns = {csbi.dwSize.X,lines}; |
605 | if(SetConsoleScreenBufferSize(hConsole,ns)) | 605 | if(SetConsoleScreenBufferSize(hConsole,ns)) |
606 | bSized=TRUE; | 606 | bSized=TRUE; |
607 | }else | 607 | }else |
608 | goto usagebye; | 608 | goto usagebye; |
609 | }else if(v[1]=='c'){ | 609 | }else if(v[1]=='c'){ |
610 | int rows = atoi(&v[2]); | 610 | int rows = atoi(&v[2]); |
611 | if(rows){ | 611 | if(rows){ |
612 | if(rows<csbi.dwSize.X){ | 612 | if(rows<csbi.dwSize.X){ |
613 | SMALL_RECT wi = {0,0,rows-1,csbi.dwSize.Y-1}; | 613 | SMALL_RECT wi = {0,0,rows-1,csbi.dwSize.Y-1}; |
614 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); | 614 | VERIFY(SetConsoleWindowInfo(hConsole,TRUE,&wi)); |
615 | } | 615 | } |
616 | COORD ns = {rows,csbi.dwSize.Y}; | 616 | COORD ns = {rows,csbi.dwSize.Y}; |
617 | if(SetConsoleScreenBufferSize(hConsole,ns)) | 617 | if(SetConsoleScreenBufferSize(hConsole,ns)) |
618 | bSized=TRUE; | 618 | bSized=TRUE; |
619 | }else | 619 | }else |
620 | goto usagebye; | 620 | goto usagebye; |
621 | }else if(v[1]=='l'){ | 621 | }else if(v[1]=='l'){ |
622 | CHAR* vv = &v[2]; | 622 | CHAR* vv = &v[2]; |
623 | VERIFY(AddEnvar(nesbVar,"USER",vv)); | 623 | VERIFY(AddEnvar(nesbVar,"USER",vv)); |
624 | }else if(v[1]=='e'){ // -e<name>=<value>VAR | 624 | }else if(v[1]=='e'){ // -e<name>=<value>VAR |
625 | CHAR* n = &v[2]; | 625 | CHAR* n = &v[2]; |
626 | CHAR* vv = strchr(&v[2],'='); | 626 | CHAR* vv = strchr(&v[2],'='); |
627 | if(!vv) | 627 | if(!vv) |
628 | goto usagebye; | 628 | goto usagebye; |
629 | *(vv++)=0; | 629 | *(vv++)=0; |
630 | VERIFY(AddEnvar(nesbVar,n,vv)); | 630 | VERIFY(AddEnvar(nesbVar,n,vv)); |
631 | }else if(v[1]=='v'){ // -v<name>=<value>USERVAR | 631 | }else if(v[1]=='v'){ // -v<name>=<value>USERVAR |
632 | CHAR* n = &v[2]; | 632 | CHAR* n = &v[2]; |
633 | CHAR* vv = strchr(n,'='); | 633 | CHAR* vv = strchr(n,'='); |
634 | if(!vv) | 634 | if(!vv) |
635 | goto usagebye; | 635 | goto usagebye; |
636 | *(vv++)=0; | 636 | *(vv++)=0; |
637 | VERIFY(AddEnvar(nesbUserVar,n,vv)); | 637 | VERIFY(AddEnvar(nesbUserVar,n,vv)); |
638 | }else if(v[1]=='t'){// -t<ttype> -t<tname>=<ttype> | 638 | }else if(v[1]=='t'){// -t<ttype> -t<tname>=<ttype> |
639 | CHAR* n = &v[2]; | 639 | CHAR* n = &v[2]; |
640 | CHAR* nn = strchr(n,'='); | 640 | CHAR* nn = strchr(n,'='); |
641 | if(nn){ | 641 | if(nn){ |
642 | *(nn++)=0; | 642 | *(nn++)=0; |
643 | if(!*nn) | 643 | if(!*nn) |
644 | nn=NULL; | 644 | nn=NULL; |
645 | } | 645 | } |
646 | if(!TerminalPullType(nn?nn:n,nn?n:NULL)){ | 646 | if(!TerminalPullType(nn?nn:n,nn?n:NULL)){ |
647 | printf("Available terminal types are:"); | 647 | printf("Available terminal types are:"); |
648 | TerminalPrintTypes(); | 648 | TerminalPrintTypes(); |
649 | printf("\n"); | 649 | printf("\n"); |
650 | goto usagebye; | 650 | goto usagebye; |
651 | } | 651 | } |
652 | bTermPulled=TRUE; | 652 | bTermPulled=TRUE; |
653 | }else if(v[1]=='#'){ | 653 | }else if(v[1]=='#'){ |
654 | int cp = atoi(&v[2]); | 654 | int cp = atoi(&v[2]); |
655 | #ifdef_DEBUG | 655 | #ifdef_DEBUG |
656 | TRACE2("SetCP(%d)=%d\n",cp,SetConsoleCP(cp)); | 656 | TRACE2("SetCP(%d)=%d\n",cp,SetConsoleCP(cp)); |
657 | TRACE2("SetOutCP(%d)=%d\n",cp,SetConsoleOutputCP(cp)); | 657 | TRACE2("SetOutCP(%d)=%d\n",cp,SetConsoleOutputCP(cp)); |
658 | #else | 658 | #else |
659 | SetConsoleCP(cp); | 659 | SetConsoleCP(cp); |
660 | SetConsoleOutputCP(cp); | 660 | SetConsoleOutputCP(cp); |
661 | #endif | 661 | #endif |
662 | TRACE2("CP,OCP=%d,%d\n",GetConsoleCP(),GetConsoleOutputCP()); | 662 | TRACE2("CP,OCP=%d,%d\n",GetConsoleCP(),GetConsoleOutputCP()); |
663 | }else | 663 | }else |
664 | goto usagebye; | 664 | goto usagebye; |
665 | }else{ | 665 | }else{ |
666 | if(ac==0){ | 666 | if(ac==0){ |
667 | ho = v; | 667 | ho = v; |
668 | ac++; | 668 | ac++; |
669 | }else if(ac==1){ | 669 | }else if(ac==1){ |
670 | po = v; | 670 | po = v; |
671 | ac++; | 671 | ac++; |
672 | }else | 672 | }else |
673 | goto usagebye; | 673 | goto usagebye; |
674 | } | 674 | } |
675 | } | 675 | } |
676 | if(!ho) | 676 | if(!ho) |
677 | goto usagebye; | 677 | goto usagebye; |
678 | servent* se = getservbyname("telnet","tcp"); | 678 | servent* se = getservbyname("telnet","tcp"); |
679 | UINT port = po?atol(po):(se?ntohs(se->s_port):23); | 679 | UINT port = po?atol(po):(se?ntohs(se->s_port):23); |
680 | if(port==23 || (se && port==ntohs(se->s_port))) | 680 | if(port==23 || (se && port==ntohs(se->s_port))) |
681 | bTelnet = TRUE; | 681 | bTelnet = TRUE; |