summaryrefslogtreecommitdiffabout
path: root/kinsole.cpp
authorMichael Krelin <hacker@klever.net>2005-08-06 13:47:13 (UTC)
committer Michael Krelin <hacker@klever.net>2005-08-06 13:47:13 (UTC)
commitfc7dc5278f4590c74e41b3ce89d093a05550ec44 (patch) (unidiff)
tree0c51dff7fad22caddab72ff125e2d7ace9c7e813 /kinsole.cpp
parentc71a33aff5d0bbe32dc9d0f732c11a87e5909d47 (diff)
downloadkinsole-master.zip
kinsole-master.tar.gz
kinsole-master.tar.bz2
fixed XP uninstall and prepared 1.1.1 releaseHEAD1.1.1master
git-svn-id: http://svn.klever.net/kin/kinsole/trunk@132 fe716a7a-6dde-0310-88d9-d003556173a8
Diffstat (limited to 'kinsole.cpp') (more/less context) (show whitespace changes)
-rw-r--r--kinsole.cpp4
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,115 +1,115 @@
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
24static char THIS_FILE[] = __FILE__; 24static char THIS_FILE[] = __FILE__;
25#endif 25#endif
26 26
27enum { 27enum {
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};
32enum { 32enum {
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
51WSADATA wsaData; 51WSADATA wsaData;
52ATOM wsaWC = NULL; 52ATOM wsaWC = NULL;
53HWND wsaW = NULL; 53HWND wsaW = NULL;
54 54
55CHAR remoteHost[256]; 55CHAR remoteHost[256];
56CHAR remoteProt[256]; 56CHAR remoteProt[256];
57sockaddr_in remoteSIN; 57sockaddr_in remoteSIN;
58 58
59 59
60SOCKET telnetSocket; 60SOCKET telnetSocket;
61HANDLE hConsoleInput; 61HANDLE hConsoleInput;
62HANDLE hConsoleOutput; 62HANDLE hConsoleOutput;
63HWND hConsoleWindow; 63HWND hConsoleWindow;
64HANDLE hConsoleThread; 64HANDLE hConsoleThread;
65DWORD consoleThreadID; 65DWORD consoleThreadID;
66HANDLE hDispatchThread; 66HANDLE hDispatchThread;
67DWORD dispatchThreadID; 67DWORD dispatchThreadID;
68BOOL bTelnet,bTermPulled; 68BOOL 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;
74BYTE negOption = 0; 74BYTE negOption = 0;
75 75
76 76
77BOOL SelectSocket() { 77BOOL 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
81BOOL ShowWill(BYTE o) 81BOOL 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);
84static 84static
85BYTE d[3] = {tnIAC,tnWILL,0}; 85BYTE d[3] = {tnIAC,tnWILL,0};
86 d[2] = o; 86 d[2] = o;
87BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); 87BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d);
88 SelectSocket(); 88 SelectSocket();
89 return rv; 89 return rv;
90} 90}
91BOOL ShowUnwill(BYTE o) 91BOOL 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);
94static 94static
95BYTE d[3] = {tnIAC,tnWONT,0}; 95BYTE d[3] = {tnIAC,tnWONT,0};
96 d[2] = o; 96 d[2] = o;
97BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); 97BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d);
98 SelectSocket(); 98 SelectSocket();
99 return rv; 99 return rv;
100} 100}
101BOOL BegDo(BYTE o) 101BOOL 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);
104static 104static
105BYTE d[3] = {tnIAC,tnDO,0}; 105BYTE d[3] = {tnIAC,tnDO,0};
106 d[2] = o; 106 d[2] = o;
107BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d); 107BOOL rv = send(telnetSocket,(char*)d,sizeof(d),0)==sizeof(d);
108 SelectSocket(); 108 SelectSocket();
109 return rv; 109 return rv;
110} 110}
111BOOL BegDont(BYTE o) 111BOOL 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);
114static 114static
115BYTE d[3] = {tnIAC,tnDONT,0}; 115BYTE d[3] = {tnIAC,tnDONT,0};
@@ -457,193 +457,193 @@ LRESULT WSMessage(WPARAM wP,LPARAM lP)
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
473LRESULT CALLBACK WSWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) 473LRESULT 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
488BOOL InitializeWinsock() 488BOOL 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 }
494WNDCLASS wc; 494WNDCLASS 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}
510void DeinitializeWinsock() 510void 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
521HWND GetThisConsoleWnd() 521HWND GetThisConsoleWnd()
522{ 522{
523DWORD pid = GetCurrentProcessId(); 523DWORD pid = GetCurrentProcessId();
524CHAR title[512]; 524CHAR title[512];
525CHAR* t = title; 525CHAR* t = title;
526 if(!GetConsoleTitle(title,sizeof(title))) 526 if(!GetConsoleTitle(title,sizeof(title)))
527 t = NULL; 527 t = NULL;
528HWND hrv = FindWindowEx(NULL,NULL,"tty",t); 528HWND hrv = FindWindowEx(NULL,NULL,"tty",t);
529HWND nopro = NULL; 529HWND nopro = NULL;
530UINT nopros=0; 530UINT 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
548main(int argc,char*argv[]) 548main(int argc,char*argv[])
549{ 549{
550 if(argc<2){ 550 if(argc<2){
551usagebye: 551usagebye:
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 }
574CONSOLE_SCREEN_BUFFER_INFO csbi; 574CONSOLE_SCREEN_BUFFER_INFO csbi;
575int ac = 0; 575int ac = 0;
576CHAR *ho = NULL, *po = NULL; 576CHAR *ho = NULL, *po = NULL;
577HANDLE hConsole = CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 577HANDLE 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));
582BOOL bSized=FALSE; 582BOOL 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");