Add support for additional features of hosts.
Add support for MLSD command.
#define LIST_UNIX_73 45 /* UNIX 73 */\r
#define LIST_UNIX_74 46 /* UNIX 74 */\r
#define LIST_UNIX_75 47 /* UNIX 75 */\r
+// MLSD対応\r
+#define LIST_MLSD 48\r
\r
#define LIST_MELCOM 0x100 /* MELCOM80 */\r
\r
#define CRYPT_FTPIS 2\r
#define CRYPT_SFTP 3\r
\r
+// FEAT対応\r
+// UTF-8対応\r
+#define FEATURE_UTF8 0x00000001\r
+// MLSD対応\r
+#define FEATURE_MLSD 0x00000002\r
+\r
\r
/*=================================================\r
* ストラクチャ\r
int UseSFTP; /* SFTPで接続する (YES/NO) */\r
// 同時接続対応\r
int MaxThreadCount; /* 同時接続数 */\r
+ // FEAT対応\r
+ int Feature; /* 利用可能な機能のフラグ (FEATURE_xxx) */\r
+ // MLSD対応\r
+ int UseMLSD; /* "MLSD"コマンドを使用する */\r
} HOSTDATA;\r
\r
\r
int UseSFTP; /* SFTPで接続する (YES/NO) */\r
// 同時接続対応\r
int MaxThreadCount; /* 同時接続数 */\r
+ // MLSD対応\r
+ int UseMLSD; /* "MLSD"コマンドを使用する */\r
struct historydata *Next;\r
} HISTORYDATA;\r
\r
int AskUseSFTP(void);\r
// 同時接続対応\r
int AskMaxThreadCount(void);\r
+// FEAT対応\r
+int AskHostFeature(void);\r
+// MLSD対応\r
+int AskUseMLSD(void);\r
\r
/*===== cache.c =====*/\r
\r
// 同時接続対応\r
int ReConnectTrnSkt(SOCKET *Skt)\r
{\r
- char Path[FMAX_PATH+1];\r
+// char Path[FMAX_PATH+1];\r
int Sts;\r
\r
Sts = FFFTP_FAIL;\r
#endif\r
TryConnect = NO;\r
\r
+ // FEAT対応\r
+ // ホストの機能を確認\r
+ if(ContSock != INVALID_SOCKET)\r
+ {\r
+ if((Sts = command(ContSock, Reply, &CancelFlg, "FEAT")) == 211)\r
+ {\r
+ // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用\r
+ // UTF-8対応\r
+ if(strstr(Reply, " UTF8 "))\r
+ CurHost.Feature |= FEATURE_UTF8;\r
+ // MLST対応\r
+ if(strstr(Reply, " MLST ") || strstr(Reply, " MLSD "))\r
+ CurHost.Feature |= FEATURE_MLSD;\r
+ }\r
+ // UTF-8対応\r
+ if(CurHost.NameKanjiCode == KANJI_AUTO && (CurHost.Feature & FEATURE_UTF8))\r
+ {\r
+ if((Sts = command(ContSock, Reply, &CancelFlg, "OPTS UTF8 ON")) == 200)\r
+ {\r
+ }\r
+ }\r
+ }\r
+\r
return(ContSock);\r
}\r
\r
return(CurHost.MaxThreadCount);\r
}\r
\r
+// FEAT対応\r
+int AskHostFeature(void)\r
+{\r
+ return(CurHost.Feature);\r
+}\r
+\r
+// MLSD対応\r
+int AskUseMLSD(void)\r
+{\r
+ return(CurHost.UseMLSD);\r
+}\r
+\r
static int CheckYYYYMMDDformat(char *Str, char Sym);\r
static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
static int FindField(char *Str, char *Buf, int Num, int ToLast);\r
+// MLSD対応\r
+static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast);\r
static void GetMonth(char *Str, WORD *Month, WORD *Day);\r
static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);\r
}\r
}\r
\r
+ // MLSD対応\r
+ if(Ret == LIST_UNKNOWN)\r
+ {\r
+ if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
+ {\r
+ Ret = LIST_MLSD;\r
+ }\r
+ }\r
}\r
\r
DoPrintf("ListType=%d", Ret);\r
Ret = NODE_NONE;\r
}\r
break;\r
+\r
+ // MLSD対応\r
+ case LIST_MLSD:\r
+ {\r
+ int i = 0;\r
+ char Tmp[FMAX_PATH + 1];\r
+ char Name[FMAX_PATH + 1];\r
+ char Value[FMAX_PATH + 1];\r
+ while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(strncmp(Tmp, " ", 1) == 0)\r
+ strcpy(Fname, Tmp + 1);\r
+ else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(_stricmp(Name, "type") == 0)\r
+ {\r
+ if(_stricmp(Value, "dir") == 0)\r
+ Ret = NODE_DIR;\r
+ else if(_stricmp(Value, "file") == 0)\r
+ Ret = NODE_FILE;\r
+ }\r
+ else if(_stricmp(Name, "size") == 0)\r
+ {\r
+ *Size = _atoi64(Value);\r
+ *InfoExist |= FINFO_SIZE;\r
+ }\r
+ else if(_stricmp(Name, "modify") == 0)\r
+ {\r
+ sTime.wYear = atoi_n(Value, 4);\r
+ sTime.wMonth = atoi_n(Value + 4, 2);\r
+ sTime.wDay = atoi_n(Value + 6, 2);\r
+ sTime.wHour = atoi_n(Value + 8, 2);\r
+ sTime.wMinute = atoi_n(Value + 10, 2);\r
+ sTime.wSecond = atoi_n(Value + 12, 2);\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+ *InfoExist |= FINFO_DATE | FINFO_TIME;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.mode") == 0)\r
+ {\r
+ *Attr = strtol(Value, NULL, 16);\r
+ *InfoExist |= FINFO_ATTR;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.owner") == 0)\r
+ strcpy(Owner, Value);\r
+ }\r
+ i++;\r
+ }\r
+ }\r
+ break;\r
}\r
\r
if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
}\r
\r
\r
+// MLSD対応\r
+static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast)\r
+{\r
+ char *Pos;\r
+ int Sts;\r
+\r
+ Sts = FFFTP_FAIL;\r
+ *Buf = NUL;\r
+ if(Num >= 0)\r
+ {\r
+ while(*Str == Separator)\r
+ Str++;\r
+\r
+ for(; Num > 0; Num--)\r
+ {\r
+ if((Str = strchr(Str, Separator)) != NULL)\r
+ {\r
+ while(*Str == Separator)\r
+ {\r
+ if(*Str == NUL)\r
+ {\r
+ Str = NULL;\r
+ break;\r
+ }\r
+ Str++;\r
+ }\r
+ }\r
+ else\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(Str != NULL)\r
+ {\r
+ if((ToLast == YES) || ((Pos = strchr(Str, Separator)) == NULL))\r
+ strcpy(Buf, Str);\r
+ else\r
+ {\r
+ strncpy(Buf, Str, Pos - Str);\r
+ *(Buf + (Pos - Str)) = NUL;\r
+ }\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ return(Sts);\r
+}\r
+\r
+\r
/*----- 文字列から月を求める --------------------------------------------------\r
*\r
* Parameter\r
New->UseSFTP = Host->UseSFTP;\r
// 同時接続対応\r
New->MaxThreadCount = Host->MaxThreadCount;\r
+ // MLSD対応\r
+ New->UseMLSD = Host->UseMLSD;\r
return;\r
}\r
\r
Host->UseSFTP = Hist->UseSFTP;\r
// 同時接続対応\r
Host->MaxThreadCount = Hist->MaxThreadCount;\r
+ // MLSD対応\r
+ Host->UseMLSD = Hist->UseMLSD;\r
return;\r
}\r
\r
Set->UseSFTP = Pos->Set.UseSFTP;\r
// 同時接続対応\r
Set->MaxThreadCount = Pos->Set.MaxThreadCount;\r
+ // MLSD対応\r
+ Set->UseMLSD = Pos->Set.UseMLSD;\r
Sts = FFFTP_SUCCESS;\r
}\r
return(Sts);\r
Set->UseSFTP = YES;\r
// 同時接続対応\r
Set->MaxThreadCount = 1;\r
+ // MLSD対応\r
+ Set->Feature = 0;\r
+ Set->UseMLSD = YES;\r
return;\r
}\r
\r
#define END_ROUTINE }while(0);end_of_routine:
#define QUIT_ROUTINE goto end_of_routine;
+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
+{
+ int r = 0;
+ char* pm0 = NULL;
+START_ROUTINE
+ pm0 = DuplicateWtoM(lpCmdLine, -1);
+ r = WinMainM(hInstance, hPrevInstance, pm0, nCmdShow);
+END_ROUTINE
+ FreeDuplicatedString(pm0);
+ return r;
+}
+
HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
HANDLE r = INVALID_HANDLE_VALUE;
#ifndef DO_NOT_REPLACE
+#undef WinMain
+#define WinMain WinMainM
+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);
#undef CreateFile
#define CreateFile CreateFileM
HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
char* DuplicateWtoA(LPCWSTR lpString, int c);
void FreeDuplicatedString(void* p);
+int WINAPI WinMainM(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
+
#endif
SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount);\r
+ // MLSD対応\r
+ SaveIntNum(hKey5, "MLSD", Hist.UseMLSD, DefaultHist.UseMLSD);\r
\r
CloseSubKey(hKey5);\r
n++;\r
SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP);\r
// 同時接続対応\r
SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount);\r
+ // MLSD対応\r
+ SaveIntNum(hKey5, "MLSD", Host.UseMLSD, DefaultHost.UseMLSD);\r
}\r
CloseSubKey(hKey5);\r
}\r
ReadIntValueFromReg(hKey5, "SFTP", &Hist.UseSFTP);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount);\r
+ // MLSD対応\r
+ ReadIntValueFromReg(hKey5, "MLSD", &Hist.UseMLSD);\r
\r
CloseSubKey(hKey5);\r
AddHistoryToHistory(&Hist);\r
ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP);\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
+ // MLSD対応\r
+ ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
\r
CloseSubKey(hKey5);\r
\r
}\r
else\r
{\r
- strcpy(MainTransPkt.Cmd, "LIST");\r
+ // MLSD対応\r
+// strcpy(MainTransPkt.Cmd, "LIST");\r
+ if(AskUseMLSD() && (AskHostFeature() & FEATURE_MLSD))\r
+ strcpy(MainTransPkt.Cmd, "MLSD");\r
+ else\r
+ strcpy(MainTransPkt.Cmd, "LIST");\r
if(strlen(AddOpt) > 0)\r
{\r
strcat(MainTransPkt.Cmd, " -");\r