[Ttssh2-commit] [4812] KERMIT:

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2012年 1月 30日 (月) 00:39:59 JST


Revision: 4812
          http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4812
Author:   yutakapon
Date:     2012-01-30 00:39:58 +0900 (Mon, 30 Jan 2012)
Log Message:
-----------
KERMIT:
  - 可変長引数デバッグプリント KmtStringLog 関数の追加
  - File Attribute の実装

Modified Paths:
--------------
    trunk/teraterm/ttpfile/kermit.c

-------------- next part --------------
Modified: trunk/teraterm/ttpfile/kermit.c
===================================================================
--- trunk/teraterm/ttpfile/kermit.c	2012-01-29 13:21:15 UTC (rev 4811)
+++ trunk/teraterm/ttpfile/kermit.c	2012-01-29 15:39:58 UTC (rev 4812)
@@ -15,6 +15,7 @@
 #include <time.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <sys/utime.h>
 
 #include "tt_res.h"
 #include "ttcommon.h"
@@ -22,6 +23,8 @@
 #include "dlglib.h"
 #include "ftlib.h"
 
+//#define KERMIT_CAPAS
+
 /* kermit parameters */
 #define MaxNum 94
 
@@ -162,6 +165,21 @@
 	}
 }
 
+static void KmtStringLog(PFileVar fv, PKmtVar kv, char *fmt, ...)
+{
+	char tmp[1024];
+	int len;
+	va_list arg;
+
+	if (fv->LogFlag) {
+		va_start(arg, fmt);
+		len = _vsnprintf(tmp, sizeof(tmp), fmt, arg);
+		va_end(arg);
+		_lwrite(fv->LogFile, tmp, len);
+		_lwrite(fv->LogFile,"\015\012",2);
+	}
+}
+
 BYTE KmtNum(BYTE b)
 {
 	return (b - 32);
@@ -383,7 +401,7 @@
 
 	if (kv->PktInLen == 0) {  /* Long Packet */
 		NParam = kv->PktInLongPacketLen - kv->KmtMy.CHKT;
-		off = 7;
+		off = 6;
 
 	} else {
 		NParam = kv->PktInLen - 2 - kv->KmtMy.CHKT;
@@ -536,7 +554,7 @@
 
 	if (kv->PktInLen == 0) {  /* Long Packet */
 		DataLen = kv->PktInLongPacketLen - kv->KmtMy.CHKT;
-		off = 7;
+		off = 6;
 	} else {
 		DataLen = kv->PktInLen - kv->KmtMy.CHKT - 2;
 		off = 3;
@@ -603,20 +621,71 @@
 
 static void KmtRecvFileAttr(PFileVar fv, PKmtVar kv, PCHAR Buff, int *BuffLen)
 {
-	int DataLen, BuffPtr, off;
-	BYTE *p;
+	int DataLen, BuffPtr, off, c, n, j;
+	BYTE *p, *q;
+	char str[256];
+	struct tm tm;
 
 	BuffPtr = 0;
 
 	if (kv->PktInLen == 0) {  /* Long Packet */
 		DataLen = kv->PktInLongPacketLen - kv->KmtMy.CHKT;
-		off = 7;
+		off = 6;
 	} else {
 		DataLen = kv->PktInLen - kv->KmtMy.CHKT - 2;
 		off = 3;
 	}
 
-	p = &kv->PktIn[off];
+	kv->FileAttrFlag = 0;
+	p = q = &kv->PktIn[1 + off];
+	while ((p - q) < DataLen) {
+		c = *p++;
+
+		n = KmtNum(*p);  /* 0-255 */
+		p++;
+		for (j = 0 ; j < n ; j++) {
+			str[j] = *p++;
+		}
+		str[j] = 0;
+
+		switch(c) {
+		case '.':	// System ID
+		case '*':	// Encoding
+		case '!':	// File length in K byte
+		case '-':	// Generic "world" protection code
+		case '/':	// Record format
+		case '(':	// File Block Size
+		case '+':	// Disposition
+		case '0':	// System-dependent parameters
+			break;
+		case '"':	// File type
+			kv->FileAttrFlag |= KMT_ATTR_TYPE;
+			kv->FileType = (str[0] == 'A' ? TRUE : FALSE);
+			break;
+		case '#':	// File creation date "20100226 12:23:45"
+			kv->FileAttrFlag |= KMT_ATTR_TIME;
+			memset(&tm, 0, sizeof(tm));
+			if ( sscanf(str, "%04d%02d%02d %02d:%02d:%02d", 
+				&tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) < 6 ) {
+				kv->FileTime = time(NULL);
+
+			} else {
+				tm.tm_year -= 1900;		// 1900-
+				tm.tm_mon -= 1;			// 0 - 11
+				kv->FileTime = mktime(&tm);
+			}
+			break;
+		case ',':	// File attribute "664"
+			kv->FileAttrFlag |= KMT_ATTR_MODE;
+			sscanf(str, "%03o", &kv->FileMode);
+			break;
+		case '1':	// File length in bytes
+			kv->FileAttrFlag |= KMT_ATTR_SIZE;
+			kv->FileSize = _atoi64(str);
+			break;
+		}
+	}
+
 }
 
 BOOL KmtEncode(PFileVar fv, PKmtVar kv)
@@ -1086,7 +1155,9 @@
 					kv->PktInCount = kv->PktInLen + 2;
 				} else {
 					/* If unchar(LEN) = 1 or 2, the packet is invalid and should cause an Error. */
+					KmtStringLog(fv, kv, "If unchar(LEN) = %d is 1 or 2, the packet is invalid.", kv->PktInLen);
 					GetPkt = FALSE;
+					kv->PktReadMode = WaitMark;
 					goto read_end;
 				}
 #else
@@ -1100,7 +1171,9 @@
 				// Tera Term\x91\xA4\x82\xAALong Packet\x82\xF0\x83T\x83|\x81[\x83g\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x8Fꍇ\x82ɁA\x83T\x81[\x83o\x91\xA4\x82\xA9\x82\xE7\x95s\x90\xB3\x82\xC9
 				// Long Packet\x82\xAA\x91\x97\x82\xE7\x82\xEA\x82Ă\xAB\x82\xBD\x8Fꍇ\x82\xE0\x8B~\x8Dςł\xAB\x82\xE9\x81B
 				if (kv->PktInPtr > kv->KmtMy.MAXL) {
+					KmtStringLog(fv, kv, "Read buffer overflow(%d > %d).", kv->PktInPtr, kv->KmtMy.MAXL);
 					GetPkt = FALSE;
+					kv->PktReadMode = WaitMark;
 					goto read_end;
 				}
 				kv->PktIn[kv->PktInPtr] = b;
@@ -1115,7 +1188,6 @@
 				// \x8A\xFA\x91҂\xB5\x82\xBD\x83o\x83b\x83t\x83@\x83T\x83C\x83Y\x82ɂȂ\xC1\x82\xBD\x82\xE7\x8FI\x82\xED\x82\xE9\x81B
 				if (kv->PktInCount != 0 && kv->PktInPtr >= kv->PktInCount) {
 					GetPkt = TRUE;
-					break;
 				}
 #else
 				kv->PktInCount--;
@@ -1323,6 +1395,15 @@
 			if (fv->FileOpen) _lclose(fv->FileHandle);
 			fv->FileOpen = FALSE;
 			kv->KmtState = ReceiveFile;
+
+			/* \x83t\x83@\x83C\x83\x8B\x91\xAE\x90\xAB\x82\xF0\x90ݒ肷\x82\xE9\x81B*/
+			if (kv->FileAttrFlag & KMT_ATTR_TIME) {
+				struct _utimbuf utm;
+				memset(&utm, 0, sizeof(utm));
+				utm.actime  = kv->FileTime;
+				utm.modtime = kv->FileTime;
+				_utime(fv->FullName, &utm);
+			}
 		}
 	}
 



Ttssh2-commit メーリングリストの案内
Back to archive index