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); + } } }