@@ -65,6 +65,8 @@ | ||
65 | 65 | <!--li>TERATERM.INI の MouseCursor の設定値が小文字だと Additional settings ダイアログに反映されない問題を修正</li--> |
66 | 66 | <li>Fixed wrong color numbers were changed when the color palette change in Visual Tab in Additional settings dialog.</li> |
67 | 67 | <li>Fixed wrong color numbers in the color change and response sequence.</li> |
68 | + <!--li>Kermit でファイルを受信できないことがある問題を修正した。</li--> | |
69 | + <!--li>Kermit の送信パケットのサイズを調整した。</li--> | |
68 | 70 | </ul> |
69 | 71 | </li> |
70 | 72 |
@@ -65,6 +65,8 @@ | ||
65 | 65 | <li>TERATERM.INI の MouseCursor の設定値が小文字だと Additional settings ダイアログに反映されない問題を修正</li> |
66 | 66 | <li>その他の設定ダイアログの表示タブのカラーパレット変更で正しくない色番号が変更される問題を修正した。</li> |
67 | 67 | <li>カラーパレット変更、取得シーケンスで、色番号を誤っていた問題を修正した。</li> |
68 | + <li>Kermit でファイルを受信できないことがある問題を修正した。</li> | |
69 | + <li>Kermit の送信パケットのサイズを調整した。</li> | |
68 | 70 | </ul> |
69 | 71 | </li> |
70 | 72 |
@@ -147,6 +147,7 @@ | ||
147 | 147 | |
148 | 148 | typedef struct { |
149 | 149 | int MAXL; |
150 | + int MAXLX; | |
150 | 151 | BYTE TIME,NPAD,PADC,EOL,QCTL,QBIN,CHKT,REPT,CAPAS,WINDO,MAXLX1,MAXLX2; |
151 | 152 | } KermitParam; |
152 | 153 |
@@ -44,8 +44,6 @@ | ||
44 | 44 | #include "ftlib.h" |
45 | 45 | #include "win16api.h" |
46 | 46 | |
47 | -#define KERMIT_CAPAS | |
48 | - | |
49 | 47 | /* kermit parameters */ |
50 | 48 | #define MaxNum 94 |
51 | 49 |
@@ -65,6 +63,17 @@ | ||
65 | 63 | #define KMT_CAP_LONGPKT 2 |
66 | 64 | #define KMT_CAP_SLIDWIN 4 |
67 | 65 | #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 | + */ | |
68 | 77 | |
69 | 78 | #define KMT_ATTR_TIME 001 |
70 | 79 | #define KMT_ATTR_MODE 002 |
@@ -265,22 +274,12 @@ | ||
265 | 274 | CommBinaryOut(cv,&(kv->KmtYour.PADC), 1); |
266 | 275 | |
267 | 276 | /* packet */ |
268 | -#ifdef KERMIT_CAPAS | |
269 | 277 | C = kv->PktOutCount; |
270 | -#else | |
271 | - C = KmtNum(kv->PktOut[1]) + 2; | |
272 | -#endif | |
273 | 278 | CommBinaryOut(cv,&kv->PktOut[0], C); |
274 | 279 | |
275 | 280 | if (fv->LogFlag) |
276 | 281 | { |
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 | |
282 | 282 | KmtWriteLog(fv, kv, &(kv->PktOut[0]), C); |
283 | -#endif | |
284 | 283 | } |
285 | 284 | |
286 | 285 | /* end-of-line character */ |
@@ -354,18 +353,16 @@ | ||
354 | 353 | kv->PktOut[11] = kv->KmtMy.CHKT + 0x30; |
355 | 354 | kv->PktOut[12] = kv->KmtMy.REPT; |
356 | 355 | |
357 | -#ifdef KERMIT_CAPAS | |
358 | 356 | if (kv->KmtMy.CAPAS > 0) { |
359 | 357 | kv->PktOut[13] = KmtChar(kv->KmtMy.CAPAS); |
360 | 358 | NParam++; |
361 | 359 | if (kv->KmtMy.CAPAS & KMT_CAP_LONGPKT) { |
362 | 360 | 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); | |
365 | 363 | NParam += 3; |
366 | 364 | } |
367 | 365 | } |
368 | -#endif | |
369 | 366 | |
370 | 367 | KmtMakePacket(fv,kv,(BYTE)(kv->PktNum - kv->PktNumOffset),PktType,NParam); |
371 | 368 | KmtSendPacket(fv,kv,cv); |
@@ -433,7 +430,8 @@ | ||
433 | 430 | |
434 | 431 | void KmtParseInit(PKmtVar kv, BOOL AckFlag) |
435 | 432 | { |
436 | - int i, NParam, off, cap, maxlen; | |
433 | + int i, NParam, off; | |
434 | + int maxlen = 0; | |
437 | 435 | BYTE b, n; |
438 | 436 | |
439 | 437 | if (kv->PktInLen == 0) { /* Long Packet */ |
@@ -488,6 +486,7 @@ | ||
488 | 486 | } |
489 | 487 | } |
490 | 488 | else /* S-packet from remote host */ |
489 | + { | |
491 | 490 | if ((b=='Y') && KmtCheckQuote(kv->KmtMy.QBIN)) |
492 | 491 | kv->Quote8 = TRUE; |
493 | 492 | else if (KmtCheckQuote(b)) |
@@ -495,10 +494,12 @@ | ||
495 | 494 | kv->KmtMy.QBIN = b; |
496 | 495 | kv->Quote8 = TRUE; |
497 | 496 | } |
497 | + } | |
498 | 498 | |
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; | |
502 | 503 | |
503 | 504 | case 8: |
504 | 505 | kv->KmtYour.CHKT = b - 0x30; |
@@ -535,19 +536,6 @@ | ||
535 | 536 | |
536 | 537 | case 10: /* CAPAS */ |
537 | 538 | 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; | |
551 | 539 | break; |
552 | 540 | |
553 | 541 | case 11: /* WINDO */ |
@@ -564,14 +552,13 @@ | ||
564 | 552 | } |
565 | 553 | } |
566 | 554 | |
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; | |
574 | 558 | |
559 | + // こちらの送信バッファサイズを超えないため | |
560 | + if (kv->KmtYour.MAXL > KMT_DATAMAX) | |
561 | + kv->KmtYour.MAXL = KMT_DATAMAX; | |
575 | 562 | } else { |
576 | 563 | /* Capabilities が落ちているのに、LEN=0 の場合は、MAXL は DefMAXL のままとする。 |
577 | 564 | * TODO: 本来はエラーとすべき? |
@@ -928,19 +915,15 @@ | ||
928 | 915 | DataLen = 0; |
929 | 916 | DataLenNew = 0; |
930 | 917 | |
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; | |
941 | 924 | |
942 | 925 | } else { |
943 | - maxlen = kv->KmtYour.MAXL-kv->KmtMy.CHKT-4; | |
926 | + maxlen = kv->KmtYour.MAXL - kv->KmtMy.CHKT - 2; | |
944 | 927 | } |
945 | 928 | |
946 | 929 | NextFlag = KmtEncode(fv,kv); |
@@ -1171,15 +1154,22 @@ | ||
1171 | 1154 | * (2012/1/22 yutaka) |
1172 | 1155 | */ |
1173 | 1156 | kv->KmtMy.CAPAS = 0x00; |
1174 | -#ifdef KERMIT_CAPAS | |
1175 | - if (ts->KermitOpt & KmtOptLongPacket) | |
1157 | + if (ts->KermitOpt & KmtOptLongPacket) { | |
1176 | 1158 | 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 | + } | |
1177 | 1166 | if (ts->KermitOpt & KmtOptFileAttr) |
1178 | 1167 | kv->KmtMy.CAPAS |= KMT_CAP_FILATTR; |
1179 | -#endif | |
1180 | 1168 | |
1181 | 1169 | /* default your parameters */ |
1182 | 1170 | kv->KmtYour = kv->KmtMy; |
1171 | + kv->KmtYour.CAPAS = 0x00; | |
1172 | + kv->KmtYour.MAXLX = 0; | |
1183 | 1173 | |
1184 | 1174 | kv->Quote8 = FALSE; |
1185 | 1175 | kv->RepeatFlag = FALSE; |
@@ -1285,11 +1275,22 @@ | ||
1285 | 1275 | case WaitLen: |
1286 | 1276 | kv->PktIn[1] = b; |
1287 | 1277 | kv->PktInLen = KmtNum(b); |
1288 | -#ifdef KERMIT_CAPAS | |
1278 | + | |
1289 | 1279 | if (kv->PktInLen == 0) { /* Long Packet */ |
1290 | 1280 | kv->PktInCount = 0; |
1291 | 1281 | } else if (kv->PktInLen >= 3) { /* Normal Packet */ |
1292 | 1282 | 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 | + } | |
1293 | 1294 | } else { |
1294 | 1295 | /* If unchar(LEN) = 1 or 2, the packet is invalid and should cause an Error. */ |
1295 | 1296 | KmtStringLog(fv, kv, "If unchar(LEN) = %d is 1 or 2, the packet is invalid.", kv->PktInLen); |
@@ -1297,29 +1298,30 @@ | ||
1297 | 1298 | kv->PktReadMode = WaitMark; |
1298 | 1299 | goto read_end; |
1299 | 1300 | } |
1300 | -#else | |
1301 | - kv->PktInCount = kv->PktInLen; | |
1302 | -#endif | |
1301 | + | |
1303 | 1302 | kv->PktInPtr = 2; |
1304 | 1303 | kv->PktReadMode = WaitCheck; |
1305 | 1304 | break; |
1306 | 1305 | 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 | - } | |
1316 | 1306 | kv->PktIn[kv->PktInPtr] = b; |
1317 | 1307 | kv->PktInPtr++; |
1318 | -#ifdef KERMIT_CAPAS | |
1319 | - // Long Packet | |
1308 | + /* Long Packet */ | |
1309 | + // Tera Term から有効だと通知していなくても受信する | |
1320 | 1310 | if (kv->PktInCount == 0 && kv->PktInPtr == 6) { |
1321 | 1311 | kv->PktInLongPacketLen = KmtNum(kv->PktIn[4])*95 + KmtNum(kv->PktIn[5]); |
1322 | 1312 | 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 | + } | |
1323 | 1325 | } |
1324 | 1326 | |
1325 | 1327 | // 期待したバッファサイズになったら終わる。 |
@@ -1326,10 +1328,7 @@ | ||
1326 | 1328 | if (kv->PktInCount != 0 && kv->PktInPtr >= kv->PktInCount) { |
1327 | 1329 | GetPkt = TRUE; |
1328 | 1330 | } |
1329 | -#else | |
1330 | - kv->PktInCount--; | |
1331 | - GetPkt = (kv->PktInCount==0); | |
1332 | -#endif | |
1331 | + | |
1333 | 1332 | if (GetPkt) kv->PktReadMode = WaitMark; |
1334 | 1333 | break; |
1335 | 1334 | } |
@@ -1342,11 +1341,7 @@ | ||
1342 | 1341 | |
1343 | 1342 | if (fv->LogFlag) |
1344 | 1343 | { |
1345 | -#ifdef KERMIT_CAPAS | |
1346 | 1344 | KmtReadLog(fv, kv, &(kv->PktIn[0]), kv->PktInCount); |
1347 | -#else | |
1348 | - KmtReadLog(fv, kv, &(kv->PktIn[0]), kv->PktInLen+2); | |
1349 | -#endif | |
1350 | 1345 | } |
1351 | 1346 | |
1352 | 1347 | PktNumNew = KmtCalcPktNum(kv,kv->PktIn[2]); |
@@ -1370,6 +1365,7 @@ | ||
1370 | 1365 | fv->Success = TRUE; |
1371 | 1366 | return FALSE; |
1372 | 1367 | } |
1368 | + break; | |
1373 | 1369 | case 'D': |
1374 | 1370 | if ((kv->KmtState == ReceiveData) && |
1375 | 1371 | (PktNumNew > kv->PktNum)) |
@@ -1419,7 +1415,7 @@ | ||
1419 | 1415 | if (PktNumNew==kv->PktNum) |
1420 | 1416 | KmtSendPacket(fv,kv,cv); |
1421 | 1417 | else if (PktNumNew==kv->PktNum+1) { |
1422 | - if (kv->KmtMy.CAPAS & KMT_CAP_FILATTR) | |
1418 | + if (kv->KmtYour.CAPAS & KMT_CAP_FILATTR) | |
1423 | 1419 | KmtSendNextData(fv,kv,cv); |
1424 | 1420 | else |
1425 | 1421 | KmtSendNextData(fv,kv,cv); |
@@ -1471,7 +1467,7 @@ | ||
1471 | 1467 | break; |
1472 | 1468 | case SendFile: |
1473 | 1469 | if (PktNumNew==kv->PktNum) { |
1474 | - if (kv->KmtMy.CAPAS & KMT_CAP_FILATTR) | |
1470 | + if (kv->KmtYour.CAPAS & KMT_CAP_FILATTR) | |
1475 | 1471 | KmtSendNextFileAttr(fv,kv,cv); |
1476 | 1472 | else |
1477 | 1473 | KmtSendNextData(fv,kv,cv); |