svnno****@sourc*****
svnno****@sourc*****
2012年 3月 9日 (金) 00:50:27 JST
Revision: 4857 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4857 Author: yutakapon Date: 2012-03-09 00:50:26 +0900 (Fri, 09 Mar 2012) Log Message: ----------- 名前付きパイプをサポートした。 VMware Player 3.1.5 + Fedora 16 で動作確認済み。 * 未サポート - 接続ダイアログからの設定 - ブレーク送信 - 他 * コマンドライン 書式 /NAMEDPIPE 名前付きパイプ名 例 /NAMEDPIPE \\.\pipe\vmware-serial-port * teraterm.ini Port=namedpipe 追加 Modified Paths: -------------- trunk/installer/release/TERATERM.INI trunk/teraterm/common/tttypes.h trunk/teraterm/teraterm/commlib.c trunk/teraterm/teraterm/ttwinman.c trunk/teraterm/ttpset/ttset.c -------------- next part -------------- Modified: trunk/installer/release/TERATERM.INI =================================================================== --- trunk/installer/release/TERATERM.INI 2012-03-08 13:12:30 UTC (rev 4856) +++ trunk/installer/release/TERATERM.INI 2012-03-08 15:50:26 UTC (rev 4857) @@ -116,7 +116,7 @@ ; Background color of text uses background color of screen (on/off) UseNormalBGColor=on -; Port type (serial/tcpip) +; Port type (serial/tcpip/namedpipe) Port=tcpip ; Window positions Modified: trunk/teraterm/common/tttypes.h =================================================================== --- trunk/teraterm/common/tttypes.h 2012-03-08 13:12:30 UTC (rev 4856) +++ trunk/teraterm/common/tttypes.h 2012-03-08 15:50:26 UTC (rev 4857) @@ -158,6 +158,7 @@ #define IdTCPIP 1 #define IdSerial 2 #define IdFile 3 +#define IdNamedPipe 4 /* XMODEM option */ #define XoptCheck 1 Modified: trunk/teraterm/teraterm/commlib.c =================================================================== --- trunk/teraterm/teraterm/commlib.c 2012-03-08 13:12:30 UTC (rev 4856) +++ trunk/teraterm/teraterm/commlib.c 2012-03-08 15:50:26 UTC (rev 4857) @@ -234,8 +234,8 @@ #ifdef NO_INET6 int Err; #endif /* NO_INET6 */ - char ErrMsg[21]; - char P[50]; + char ErrMsg[21+256]; + char P[50+256]; MSG Msg; #ifndef NO_INET6 @@ -550,6 +550,33 @@ PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0); } break; + + case IdNamedPipe: + InitFileIO(IdNamedPipe); /* TTPLUG */ + TTXOpenFile(); /* TTPLUG */ + strncpy_s(P, sizeof(P), ts->HostName, _TRUNCATE); + cv->ComID = + PCreateFile(P,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING, + 0, // \x83u\x83\x8D\x83b\x83L\x83\x93\x83O\x83\x82\x81[\x83h\x82ɂ\xB7\x82\xE9(FILE_FLAG_OVERLAPPED \x82͎w\x92肵\x82Ȃ\xA2) + NULL); + if (cv->ComID == INVALID_HANDLE_VALUE ) { + get_lang_msg("MSG_CANTOEPN_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open %s(%d)", ts->UILanguageFile); + _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, ts->UIMsg, &P[0], GetLastError()); + + if (cv->NoMsg==0) { + get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile); + MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION); + } + InvalidHost = TRUE; + } + else { + cv->Open = TRUE; + PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0); + InvalidHost = FALSE; + } + break; /* end of "case IdNamedPipe:" */ + } /* end of "switch" */ #ifndef NO_INET6 @@ -568,6 +595,45 @@ } } +// \x96\xBC\x91O\x95t\x82\xAB\x83p\x83C\x83v\x97p\x83X\x83\x8C\x83b\x83h +void NamedPipeThread(void *arg) +{ + PComVar cv = (PComVar)arg; + DWORD DErr; + HANDLE REnd; + char Temp[20]; + char Buffer[1]; // 1byte + DWORD BytesRead, TotalBytesAvail, BytesLeftThisMessage; + + _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort); + REnd = OpenEvent(EVENT_ALL_ACCESS,FALSE, Temp); + while (TRUE) { + BytesRead = 0; + // \x96\xBC\x91O\x95t\x82\xAB\x83p\x83C\x83v\x82̓C\x83x\x83\x93\x83g\x82\xF0\x91҂\xB1\x82Ƃ\xAA\x82ł\xAB\x82Ȃ\xA2\x8Ed\x97l\x82Ȃ̂ŁA\x83L\x83\x85\x81[\x82̒\x86\x90g\x82\xF0 + // \x94`\x82\xAB\x8C\xA9\x82\xB7\x82邱\x82ƂŁAReadFile() \x82\xB7\x82邩\x82ǂ\xA4\x82\xA9\x94\xBB\x92f\x82\xB7\x82\xE9\x81B + if (PeekNamedPipe(cv->ComID, Buffer, sizeof(Buffer), &BytesRead, &TotalBytesAvail, &BytesLeftThisMessage)) { + if (! cv->Ready) { + _endthread(); + } + if (BytesRead == 0) { // \x8B\xC1\x82\xBD\x82\xE7\x81A\x89\xBD\x82\xE0\x82\xB5\x82Ȃ\xA2\x81B + Sleep(1); + continue; + } + if (! cv->RRQ) { + PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_READ); + } + // ReadFile() \x82\xAA\x8FI\x82\xED\x82\xE9\x82܂ő҂B + WaitForSingleObject(REnd,INFINITE); + } + else { + DErr = GetLastError(); // this returns 995 (operation aborted) if a USB com port is removed + if (! cv->Ready || ERROR_OPERATION_ABORTED == DErr) { + _endthread(); + } + } + } +} + void CommThread(void *arg) { DWORD Evt; @@ -703,6 +769,25 @@ case IdFile: cv->RRQ = TRUE; break; + + case IdNamedPipe: + cv->ComPort = 0; + _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort); + ReadEnd = CreateEvent(NULL,FALSE,FALSE,Temp); + _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", WRITENAME, cv->ComPort); + memset(&wol,0,sizeof(OVERLAPPED)); + wol.hEvent = CreateEvent(NULL,TRUE,TRUE,Temp); + _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READNAME, cv->ComPort); + memset(&rol,0,sizeof(OVERLAPPED)); + rol.hEvent = CreateEvent(NULL,TRUE,FALSE,Temp); + + /* create the receiver thread */ + if (_beginthread(NamedPipeThread,0,cv) == -1) { + get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile); + get_lang_msg("MSG_TT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Can't create thread", ts->UILanguageFile); + MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION); + } + break; } cv->Ready = TRUE; } @@ -782,6 +867,16 @@ } TTXCloseFile(); /* TTPLUG */ break; + + case IdNamedPipe: + if ( cv->ComID != INVALID_HANDLE_VALUE ) { + CloseHandle(ReadEnd); + CloseHandle(wol.hEvent); + CloseHandle(rol.hEvent); + PCloseFile(cv->ComID); + } + TTXCloseFile(); /* TTPLUG */ + break; } cv->ComID = INVALID_HANDLE_VALUE; cv->PortType = 0; @@ -870,6 +965,29 @@ DErr = GetLastError(); } break; + + case IdNamedPipe: + // \x83L\x83\x85\x81[\x82̒\x86\x82ɍŒ\xE11\x83o\x83C\x83g\x88ȏ\xE3\x82̃f\x81[\x83^\x82\xAA\x93\xFC\x82\xC1\x82Ă\xA2\x82邱\x82Ƃ\xF0\x8Am\x94F\x82ł\xAB\x82Ă\xA2\x82邽\x82߁A + // ReadFile() \x82̓u\x83\x8D\x83b\x83N\x82\xB7\x82邱\x82Ƃ͂Ȃ\xA2\x82\xBD\x82߁A\x88ꊇ\x82\xB5\x82ēǂށB + if (PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]), + InBuffSize-cv->InBuffCount,&C,NULL)) { + if (C == 0) { + DErr = ERROR_HANDLE_EOF; + } + else { + cv->InBuffCount = cv->InBuffCount + C; + } + } + else { + DErr = GetLastError(); + } + + // 1\x83o\x83C\x83g\x88ȏ\xE3\x93ǂ߂\xBD\x82\xE7\x81A\x83C\x83x\x83\x93\x83g\x82\xF0\x8BN\x82\xB1\x82\xB5\x81A\x83X\x83\x8C\x83b\x83h\x82\xF0\x8DĊJ\x82\xB3\x82\xB9\x82\xE9\x81B + if (cv->InBuffCount > 0) { + cv->RRQ = FALSE; + SetEvent(ReadEnd); + } + break; } } @@ -894,6 +1012,17 @@ cv->RRQ = TRUE; } return; + case IdNamedPipe: + // TODO: \x82\xBD\x82Ԃ\xF1\x81A\x82\xB1\x82\xB1\x82ɗ\x88\x82邱\x82Ƃ͂Ȃ\xA2\x81B + if (DErr != ERROR_IO_PENDING) { + PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE); + cv->RRQ = FALSE; + } + else { + cv->RRQ = TRUE; + } + SetEvent(ReadEnd); + return; } cv->RRQ = FALSE; } @@ -931,6 +1060,9 @@ case IdFile: Max = cv->OutBuffCount; break; + case IdNamedPipe: + Max = cv->OutBuffCount; + break; } if ( Max<=0 ) { @@ -1008,6 +1140,14 @@ } } break; + + case IdNamedPipe: + if (! PWriteFile(cv->ComID, &(cv->OutBuff[cv->OutPtr]), C, (LPDWORD)&D, NULL)) { + if (! GetLastError() == ERROR_IO_PENDING) { + D = C; /* ignore data */ + } + } + break; } cv->OutBuffCount = cv->OutBuffCount - D; Modified: trunk/teraterm/teraterm/ttwinman.c =================================================================== --- trunk/teraterm/teraterm/ttwinman.c 2012-03-08 13:12:30 UTC (rev 4856) +++ trunk/teraterm/teraterm/ttwinman.c 2012-03-08 15:50:26 UTC (rev 4857) @@ -183,6 +183,19 @@ strncat_s(TempTitle, sizeof(TempTitle), str, _TRUNCATE); } } + else if (cv.PortType == IdNamedPipe) + { + char str[sizeof(TempTitle)]; + strncpy_s(str, sizeof(str), ts.HostName, _TRUNCATE); + + if (ts.TitleFormat & 8) { + // format ID = 13(8 + 5): <hots/port> - <title> + _snprintf_s(TempTitle, sizeof(TempTitle), _TRUNCATE, "%s - %s", str, TempTitleWithRemote); + } + else { + strncat_s(TempTitle, sizeof(TempTitle), str, _TRUNCATE); + } + } else { char str[sizeof(TempTitle)]; if (ts.TitleFormat & 16) { Modified: trunk/teraterm/ttpset/ttset.c =================================================================== --- trunk/teraterm/ttpset/ttset.c 2012-03-08 13:12:30 UTC (rev 4856) +++ trunk/teraterm/ttpset/ttset.c 2012-03-08 15:50:26 UTC (rev 4857) @@ -258,6 +258,8 @@ ts->PortType = IdTCPIP; else if (_stricmp(Temp, "serial") == 0) ts->PortType = IdSerial; + else if (_stricmp(Temp, "namedpipe") == 0) + ts->PortType = IdNamedPipe; else { ts->PortType = IdTCPIP; } @@ -1508,6 +1510,8 @@ /* Port type */ if (ts->PortType == IdSerial) strncpy_s(Temp, sizeof(Temp), "serial", _TRUNCATE); + if (ts->PortType == IdNamedPipe) + strncpy_s(Temp, sizeof(Temp), "namedpipe", _TRUNCATE); else /* IdFile -> IdTCPIP */ strncpy_s(Temp, sizeof(Temp), "tcpip", _TRUNCATE); @@ -3192,7 +3196,10 @@ HostNameFlag = FALSE; } - if (_strnicmp(Temp, "/BAUD=", 6) == 0) { /* Serial port baud rate */ + if (_strnicmp(Temp, "/NAMEDPIPE", 10) == 0) { /* \x96\xBC\x91O\x95t\x82\xAB\x83p\x83C\x83v */ + ParamPort = IdNamedPipe; + } + else if (_strnicmp(Temp, "/BAUD=", 6) == 0) { /* Serial port baud rate */ ParamPort = IdSerial; ParamBaud = atoi(&Temp[6]); } @@ -3368,9 +3375,14 @@ if (JustAfterHost && (sscanf(Temp, "%d", &c) == 1)) ParamTCP = c; else { - ParamPort = IdTCPIP; strncpy_s(ts->HostName, sizeof(ts->HostName), Temp, _TRUNCATE); /* host name */ - HostNameFlag = TRUE; + if (ParamPort == IdNamedPipe) { + // \x89\xBD\x82\xE0\x82\xB5\x82Ȃ\xA2\x81B + + } else { + ParamPort = IdTCPIP; + HostNameFlag = TRUE; + } } } JustAfterHost = FALSE; @@ -3435,6 +3447,11 @@ break; case IdFile: ts->PortType = IdFile; + break; + case IdNamedPipe: + ts->PortType = IdNamedPipe; + ts->ComPort = 0; + break; } }