• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision10302 (tree)
Time2022-10-08 00:43:29
Authornmaya

Log Message

Kermit の調整をマージ

merge from trunk: r10172, r10173, r10174, r10175, r10182, r10282
ticket: #44873, #44691

Change Summary

Incremental Difference

--- branches/4-stable/doc/en/html/about/history.html (revision 10301)
+++ branches/4-stable/doc/en/html/about/history.html (revision 10302)
@@ -65,6 +65,8 @@
6565 <!--li>TERATERM.INI の MouseCursor の設定値が小文字だと Additional settings ダイアログに反映されない問題を修正</li-->
6666 <li>Fixed wrong color numbers were changed when the color palette change in Visual Tab in Additional settings dialog.</li>
6767 <li>Fixed wrong color numbers in the color change and response sequence.</li>
68+ <!--li>Kermit でファイルを受信できないことがある問題を修正した。</li-->
69+ <!--li>Kermit の送信パケットのサイズを調整した。</li-->
6870 </ul>
6971 </li>
7072
--- branches/4-stable/doc/ja/html/about/history.html (revision 10301)
+++ branches/4-stable/doc/ja/html/about/history.html (revision 10302)
@@ -65,6 +65,8 @@
6565 <li>TERATERM.INI の MouseCursor の設定値が小文字だと Additional settings ダイアログに反映されない問題を修正</li>
6666 <li>その他の設定ダイアログの表示タブのカラーパレット変更で正しくない色番号が変更される問題を修正した。</li>
6767 <li>カラーパレット変更、取得シーケンスで、色番号を誤っていた問題を修正した。</li>
68+ <li>Kermit でファイルを受信できないことがある問題を修正した。</li>
69+ <li>Kermit の送信パケットのサイズを調整した。</li>
6870 </ul>
6971 </li>
7072
--- branches/4-stable/teraterm/common/ttftypes.h (revision 10301)
+++ branches/4-stable/teraterm/common/ttftypes.h (revision 10302)
@@ -147,6 +147,7 @@
147147
148148 typedef struct {
149149 int MAXL;
150+ int MAXLX;
150151 BYTE TIME,NPAD,PADC,EOL,QCTL,QBIN,CHKT,REPT,CAPAS,WINDO,MAXLX1,MAXLX2;
151152 } KermitParam;
152153
--- branches/4-stable/teraterm/ttpfile/kermit.c (revision 10301)
+++ branches/4-stable/teraterm/ttpfile/kermit.c (revision 10302)
@@ -44,8 +44,6 @@
4444 #include "ftlib.h"
4545 #include "win16api.h"
4646
47-#define KERMIT_CAPAS
48-
4947 /* kermit parameters */
5048 #define MaxNum 94
5149
@@ -65,6 +63,17 @@
6563 #define KMT_CAP_LONGPKT 2
6664 #define KMT_CAP_SLIDWIN 4
6765 #define KMT_CAP_FILATTR 8
66+/*
67+ * Long Packet の動作
68+ * - 受信
69+ * KmtLongPacket が有効なら kv->KmtMy.CAPAS の Long Packet を有効にする
70+ * kv->KmtMy.CAPAS がリモートに送信され、Long Packet が受信可能であることを伝える
71+ * Long Packet が飛んでくると、KmtLongPacket の設定にかかわらず受信する
72+ * - 送信
73+ * リモートからの通知が kv->KmtYour.CAPAS に保存される
74+ * kv->KmtYour.CAPAS が有効で kv->KmtMy.CAPAS (KmtLongPacket) も有効なら長い送信データを作成する
75+ * LEN が 94 を超えるパケットは Long Packet で送信する
76+ */
6877
6978 #define KMT_ATTR_TIME 001
7079 #define KMT_ATTR_MODE 002
@@ -265,22 +274,12 @@
265274 CommBinaryOut(cv,&(kv->KmtYour.PADC), 1);
266275
267276 /* packet */
268-#ifdef KERMIT_CAPAS
269277 C = kv->PktOutCount;
270-#else
271- C = KmtNum(kv->PktOut[1]) + 2;
272-#endif
273278 CommBinaryOut(cv,&kv->PktOut[0], C);
274279
275280 if (fv->LogFlag)
276281 {
277-#if 0
278- _lwrite(fv->LogFile,"> ",2);
279- _lwrite(fv->LogFile,&(kv->PktOut[1]),C-1);
280- _lwrite(fv->LogFile,"\015\012",2);
281-#else
282282 KmtWriteLog(fv, kv, &(kv->PktOut[0]), C);
283-#endif
284283 }
285284
286285 /* end-of-line character */
@@ -354,18 +353,16 @@
354353 kv->PktOut[11] = kv->KmtMy.CHKT + 0x30;
355354 kv->PktOut[12] = kv->KmtMy.REPT;
356355
357-#ifdef KERMIT_CAPAS
358356 if (kv->KmtMy.CAPAS > 0) {
359357 kv->PktOut[13] = KmtChar(kv->KmtMy.CAPAS);
360358 NParam++;
361359 if (kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) {
362360 kv->PktOut[14] = KmtChar(0);
363- kv->PktOut[15] = KmtChar(KMT_DATAMAX / 95);
364- kv->PktOut[16] = KmtChar(KMT_DATAMAX % 95);
361+ kv->PktOut[15] = KmtChar(kv->KmtMy.MAXLX / 95);
362+ kv->PktOut[16] = KmtChar(kv->KmtMy.MAXLX % 95);
365363 NParam += 3;
366364 }
367365 }
368-#endif
369366
370367 KmtMakePacket(fv,kv,(BYTE)(kv->PktNum - kv->PktNumOffset),PktType,NParam);
371368 KmtSendPacket(fv,kv,cv);
@@ -433,7 +430,8 @@
433430
434431 void KmtParseInit(PKmtVar kv, BOOL AckFlag)
435432 {
436- int i, NParam, off, cap, maxlen;
433+ int i, NParam, off;
434+ int maxlen = 0;
437435 BYTE b, n;
438436
439437 if (kv->PktInLen == 0) { /* Long Packet */
@@ -488,6 +486,7 @@
488486 }
489487 }
490488 else /* S-packet from remote host */
489+ {
491490 if ((b=='Y') && KmtCheckQuote(kv->KmtMy.QBIN))
492491 kv->Quote8 = TRUE;
493492 else if (KmtCheckQuote(b))
@@ -495,10 +494,12 @@
495494 kv->KmtMy.QBIN = b;
496495 kv->Quote8 = TRUE;
497496 }
497+ }
498498
499- if (! kv->Quote8) kv->KmtMy.QBIN = 'N';
500- kv->KmtYour.QBIN = kv->KmtMy.QBIN;
501- break;
499+ if (! kv->Quote8)
500+ kv->KmtMy.QBIN = 'N';
501+ kv->KmtYour.QBIN = kv->KmtMy.QBIN;
502+ break;
502503
503504 case 8:
504505 kv->KmtYour.CHKT = b - 0x30;
@@ -535,19 +536,6 @@
535536
536537 case 10: /* CAPAS */
537538 kv->KmtYour.CAPAS = n;
538-
539- // Tera Termとサーバの capabilities のANDを取る。
540- cap = 0;
541- if (n & kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) {
542- cap |= KMT_CAP_LONGPKT;
543- }
544- if (n & kv->KmtMy.CAPAS & KMT_CAP_SLIDWIN) {
545- cap |= KMT_CAP_SLIDWIN;
546- }
547- if (n & kv->KmtMy.CAPAS & KMT_CAP_FILATTR) {
548- cap |= KMT_CAP_FILATTR;
549- }
550- kv->KmtMy.CAPAS = cap;
551539 break;
552540
553541 case 11: /* WINDO */
@@ -564,14 +552,13 @@
564552 }
565553 }
566554
567- /* Long Packet の場合、MAXL を更新する。*/
568- if (kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) {
569- kv->KmtMy.MAXL = maxlen;
570- if (kv->KmtMy.MAXL < 10)
571- kv->KmtMy.MAXL = 80;
572- else if (kv->KmtMy.MAXL > KMT_DATAMAX)
573- kv->KmtMy.MAXL = KMT_DATAMAX;
555+ /* Long Packet の場合、MAXLX を更新する。*/
556+ if (kv->KmtYour.CAPAS & KMT_CAP_LONGPKT) {
557+ kv->KmtYour.MAXLX = maxlen;
574558
559+ // こちらの送信バッファサイズを超えないため
560+ if (kv->KmtYour.MAXL > KMT_DATAMAX)
561+ kv->KmtYour.MAXL = KMT_DATAMAX;
575562 } else {
576563 /* Capabilities が落ちているのに、LEN=0 の場合は、MAXL は DefMAXL のままとする。
577564 * TODO: 本来はエラーとすべき?
@@ -928,19 +915,15 @@
928915 DataLen = 0;
929916 DataLenNew = 0;
930917
931- if (kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) {
932- // Long Packetで94バイト以上送ると、なぜか相手側が受け取ってくれないので、
933- // 送信失敗するため、94バイトに制限する。
934- // 受信は速いが、送信は遅くなる。
935- // (2012.2.5 yutaka)
936- // CommBinaryOut() で1KBまでという制限がかかっていることが判明したため、
937- // 512バイトまでに拡張する。
938- // (2012.2.7 yutaka)
939- maxlen = kv->KmtMy.MAXL - kv->KmtMy.CHKT - LONGPKT_HEADNUM - 1;
940- maxlen = min(maxlen, 512);
918+ // Long Packet
919+ // リモートの CAPAS が有効、かつ Tera Term の設定が有効
920+ if (kv->KmtYour.CAPAS & KMT_CAP_LONGPKT &&
921+ kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) {
922+ // CommBinaryOut() の制限は 16KB で、KMT_PKTMAX=4032 を超えない
923+ maxlen = kv->KmtYour.MAXLX - kv->KmtMy.CHKT - 7;
941924
942925 } else {
943- maxlen = kv->KmtYour.MAXL-kv->KmtMy.CHKT-4;
926+ maxlen = kv->KmtYour.MAXL - kv->KmtMy.CHKT - 2;
944927 }
945928
946929 NextFlag = KmtEncode(fv,kv);
@@ -1171,15 +1154,22 @@
11711154 * (2012/1/22 yutaka)
11721155 */
11731156 kv->KmtMy.CAPAS = 0x00;
1174-#ifdef KERMIT_CAPAS
1175- if (ts->KermitOpt & KmtOptLongPacket)
1157+ if (ts->KermitOpt & KmtOptLongPacket) {
11761158 kv->KmtMy.CAPAS |= KMT_CAP_LONGPKT;
1159+ kv->KmtMy.MAXLX = KMT_DATAMAX;
1160+ }
1161+ else {
1162+ // Tera Term から有効だと通知していなくても
1163+ // Long Packet を送ってくる場合のため
1164+ kv->KmtMy.MAXLX = KMT_DATAMAX;
1165+ }
11771166 if (ts->KermitOpt & KmtOptFileAttr)
11781167 kv->KmtMy.CAPAS |= KMT_CAP_FILATTR;
1179-#endif
11801168
11811169 /* default your parameters */
11821170 kv->KmtYour = kv->KmtMy;
1171+ kv->KmtYour.CAPAS = 0x00;
1172+ kv->KmtYour.MAXLX = 0;
11831173
11841174 kv->Quote8 = FALSE;
11851175 kv->RepeatFlag = FALSE;
@@ -1285,11 +1275,22 @@
12851275 case WaitLen:
12861276 kv->PktIn[1] = b;
12871277 kv->PktInLen = KmtNum(b);
1288-#ifdef KERMIT_CAPAS
1278+
12891279 if (kv->PktInLen == 0) { /* Long Packet */
12901280 kv->PktInCount = 0;
12911281 } else if (kv->PktInLen >= 3) { /* Normal Packet */
12921282 kv->PktInCount = kv->PktInLen + 2;
1283+ // OutputDebugPrintf("Normal Packet: %d bytes\n", kv->PktInCount);
1284+
1285+ // "Initialize でリモートが送ってきた MAXL" + 2 (MARK, LEN)
1286+ // を超えるサイズのパケットをリモートが送ろうとしてきた
1287+ if (kv->PktInCount > kv->KmtMy.MAXL + 2) {
1288+ KmtStringLog(fv, kv, "Remote is attempting to send %d bytes, but MAXL from remote is %d. Must be less than or equal to %d bytes.",
1289+ kv->PktInCount, kv->KmtMy.MAXL, kv->KmtMy.MAXL + 2);
1290+ GetPkt = FALSE;
1291+ kv->PktReadMode = WaitMark;
1292+ goto read_end;
1293+ }
12931294 } else {
12941295 /* If unchar(LEN) = 1 or 2, the packet is invalid and should cause an Error. */
12951296 KmtStringLog(fv, kv, "If unchar(LEN) = %d is 1 or 2, the packet is invalid.", kv->PktInLen);
@@ -1297,29 +1298,30 @@
12971298 kv->PktReadMode = WaitMark;
12981299 goto read_end;
12991300 }
1300-#else
1301- kv->PktInCount = kv->PktInLen;
1302-#endif
1301+
13031302 kv->PktInPtr = 2;
13041303 kv->PktReadMode = WaitCheck;
13051304 break;
13061305 case WaitCheck:
1307- // バッファが溢れたら、異常終了する。
1308- // Tera Term側がLong Packetをサポートしていない場合に、サーバ側から不正に
1309- // Long Packetが送られてきた場合も救済できる。
1310- if (kv->PktInPtr > kv->KmtMy.MAXL) {
1311- KmtStringLog(fv, kv, "Read buffer overflow(%d > %d).", kv->PktInPtr, kv->KmtMy.MAXL);
1312- GetPkt = FALSE;
1313- kv->PktReadMode = WaitMark;
1314- goto read_end;
1315- }
13161306 kv->PktIn[kv->PktInPtr] = b;
13171307 kv->PktInPtr++;
1318-#ifdef KERMIT_CAPAS
1319- // Long Packet
1308+ /* Long Packet */
1309+ // Tera Term から有効だと通知していなくても受信する
13201310 if (kv->PktInCount == 0 && kv->PktInPtr == 6) {
13211311 kv->PktInLongPacketLen = KmtNum(kv->PktIn[4])*95 + KmtNum(kv->PktIn[5]);
13221312 kv->PktInCount = kv->PktInLongPacketLen + 7;
1313+ // OutputDebugPrintf("Long Packet: %d bytes\n", kv->PktInCount);
1314+
1315+ // "Initialize でリモートが送ってきた MAXLX1*95 + MAXLX2" + 7 (MARK から HCHECK)
1316+ // を超えるサイズのパケットをリモートが送ろうとしてきた
1317+ // +1 は C-Kermit 9.0.305 Alpha.05 から C-Kermit 10.0 Beta.04 までが 1 バイト多く送ってくるため
1318+ if (kv->PktInCount > kv->KmtMy.MAXLX + 7 + 1) {
1319+ KmtStringLog(fv, kv, "Remote is attempting to send %d bytes, but MAXLX from remote is %d. Must be less than or equal to %d bytes.",
1320+ kv->PktInCount, kv->KmtMy.MAXLX, kv->KmtMy.MAXLX + 7 + 1);
1321+ GetPkt = FALSE;
1322+ kv->PktReadMode = WaitMark;
1323+ goto read_end;
1324+ }
13231325 }
13241326
13251327 // 期待したバッファサイズになったら終わる。
@@ -1326,10 +1328,7 @@
13261328 if (kv->PktInCount != 0 && kv->PktInPtr >= kv->PktInCount) {
13271329 GetPkt = TRUE;
13281330 }
1329-#else
1330- kv->PktInCount--;
1331- GetPkt = (kv->PktInCount==0);
1332-#endif
1331+
13331332 if (GetPkt) kv->PktReadMode = WaitMark;
13341333 break;
13351334 }
@@ -1342,11 +1341,7 @@
13421341
13431342 if (fv->LogFlag)
13441343 {
1345-#ifdef KERMIT_CAPAS
13461344 KmtReadLog(fv, kv, &(kv->PktIn[0]), kv->PktInCount);
1347-#else
1348- KmtReadLog(fv, kv, &(kv->PktIn[0]), kv->PktInLen+2);
1349-#endif
13501345 }
13511346
13521347 PktNumNew = KmtCalcPktNum(kv,kv->PktIn[2]);
@@ -1370,6 +1365,7 @@
13701365 fv->Success = TRUE;
13711366 return FALSE;
13721367 }
1368+ break;
13731369 case 'D':
13741370 if ((kv->KmtState == ReceiveData) &&
13751371 (PktNumNew > kv->PktNum))
@@ -1419,7 +1415,7 @@
14191415 if (PktNumNew==kv->PktNum)
14201416 KmtSendPacket(fv,kv,cv);
14211417 else if (PktNumNew==kv->PktNum+1) {
1422- if (kv->KmtMy.CAPAS & KMT_CAP_FILATTR)
1418+ if (kv->KmtYour.CAPAS & KMT_CAP_FILATTR)
14231419 KmtSendNextData(fv,kv,cv);
14241420 else
14251421 KmtSendNextData(fv,kv,cv);
@@ -1471,7 +1467,7 @@
14711467 break;
14721468 case SendFile:
14731469 if (PktNumNew==kv->PktNum) {
1474- if (kv->KmtMy.CAPAS & KMT_CAP_FILATTR)
1470+ if (kv->KmtYour.CAPAS & KMT_CAP_FILATTR)
14751471 KmtSendNextFileAttr(fv,kv,cv);
14761472 else
14771473 KmtSendNextData(fv,kv,cv);
Show on old repository browser