OSDN Git Service

Fix bugs of corruption on resuming downloading files larger than 4GB.
[ffftp/ffftp.git] / connect.c
index a83ae57..904fd0d 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -1,6 +1,6 @@
-/*=============================================================================\r
+/*=============================================================================\r
 *\r
-*                                                              \83z\83X\83g\82Ö\82Ì\90Ú\91±\81^\90Ø\92f\r
+*                                                              ホストへの接続/切断\r
 *\r
 ===============================================================================\r
 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
 #include <htmlhelp.h>\r
 #include "helpid.h"\r
 \r
-// UTF-8\91Î\89\9e\r
+// UTF-8対応\r
 #undef __MBSWRAPPER_H__\r
 #include "mbswrapper.h"\r
 \r
 \r
-/*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
+/*===== プロトタイプ =====*/\r
 \r
 static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 static int SendInitCommand(char *Cmd);\r
 static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List);\r
 static void SaveCurrentSetToHistory(void);\r
 static int ReConnectSkt(SOCKET *Skt);\r
-static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
+// 暗号化通信対応\r
+//static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
+static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
+static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
 static int CheckOneTimePassword(char *Pass, char *Reply, int Type);\r
 static BOOL CALLBACK BlkHookFnc(void);\r
 static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port);\r
@@ -66,13 +69,13 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet);
 static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet);\r
 static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork);\r
 \r
-/*===== \8aO\95\94\8eQ\8fÆ =====*/\r
+/*===== 外部参照 =====*/\r
 \r
 extern char FilterStr[FILTER_EXT_LEN+1];\r
 extern char TitleHostName[HOST_ADRS_LEN+1];\r
 extern int CancelFlg;\r
 \r
-/* \90Ý\92è\92l */\r
+/* 設定値 */\r
 extern char UserMailAdrs[USER_MAIL_LEN+1];\r
 extern char FwallHost[HOST_ADRS_LEN+1];\r
 extern char FwallUser[USER_NAME_LEN+1];\r
@@ -87,7 +90,7 @@ extern int FwallDelimiter;
 extern int PasvDefault;\r
 extern int QuickAnonymous;\r
 \r
-/*===== \83\8d\81[\83J\83\8b\82È\83\8f\81[\83N =====*/\r
+/*===== ローカルなワーク =====*/\r
 \r
 static int Anonymous;\r
 static int TryConnect = NO;\r
@@ -95,10 +98,10 @@ static SOCKET CmdCtrlSocket = INVALID_SOCKET;
 static SOCKET TrnCtrlSocket = INVALID_SOCKET;\r
 static HOSTDATA CurHost;\r
 \r
-/* \90Ú\91±\92\86\82Ì\90Ú\91±\90æ\81ASOCKS\83T\81[\83o\82Ì\83A\83h\83\8c\83X\8fî\95ñ\82ð\95Û\91\82µ\82Ä\82¨\82­ */\r
-/* \82±\82Ì\8fî\95ñ\82Ílisten\83\\83P\83b\83g\82ð\8eæ\93¾\82·\82é\8dÛ\82É\97p\82¢\82é */\r
-static struct sockaddr_in SocksSockAddr;       /* SOCKS\83T\81[\83o\82Ì\83A\83h\83\8c\83X\8fî\95ñ */\r
-static struct sockaddr_in CurSockAddr;         /* \90Ú\91±\90æ\83z\83X\83g\82Ì\83A\83h\83\8c\83X\8fî\95ñ */\r
+/* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */\r
+/* この情報はlistenソケットを取得する際に用いる */\r
+static struct sockaddr_in SocksSockAddr;       /* SOCKSサーバのアドレス情報 */\r
+static struct sockaddr_in CurSockAddr;         /* 接続先ホストのアドレス情報 */\r
 \r
 static int UseIPadrs;\r
 static char DomainName[HOST_ADRS_LEN+1];\r
@@ -106,14 +109,14 @@ static char DomainName[HOST_ADRS_LEN+1];
 \r
 \r
 \r
-/*----- \83z\83X\83g\88ê\97\97\82ð\8eg\82Á\82Ä\83z\83X\83g\82Ö\90Ú\91± ----------------------------------------\r
+/*----- ホスト一覧を使ってホストへ接続 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              int Type : \83_\83C\83A\83\8d\83O\82Ì\83^\83C\83v (DLG_TYPE_xxx)\r
-*              int Num : \90Ú\91±\82·\82é\83z\83X\83g\94Ô\8d\86(0\81`, -1=\83_\83C\83A\83\8d\83O\82ð\8fo\82·)\r
+*              int Type : ダイアログのタイプ (DLG_TYPE_xxx)\r
+*              int Num : 接続するホスト番号(0~, -1=ダイアログを出す)\r
 \r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void ConnectProc(int Type, int Num)\r
@@ -132,7 +135,7 @@ void ConnectProc(int Type, int Num)
                if(Num >= 0)\r
                        SetCurrentHost(Num);\r
 \r
-               /* \90Ú\91±\92\86\82È\82ç\90Ø\92f\82·\82é */\r
+               /* 接続中なら切断する */\r
                if(CmdCtrlSocket != INVALID_SOCKET)\r
                        DisconnectProc();\r
 \r
@@ -141,7 +144,7 @@ void ConnectProc(int Type, int Num)
                InitPWDcommand();\r
                CopyHostFromList(AskCurrentHost(), &CurHost);\r
 \r
-               if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS)\r
+               if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
                {\r
                        SetHostKanaCnvImm(CurHost.KanaCnv);\r
                        SetHostKanjiCodeImm(CurHost.KanjiCode);\r
@@ -159,7 +162,9 @@ void ConnectProc(int Type, int Num)
                                Save = YES;\r
 \r
                        DisableUserOpe();\r
-                       CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security);\r
+                       // 暗号化通信対応\r
+//                     CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security);\r
+                       CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
                        if(CmdCtrlSocket != INVALID_SOCKET)\r
@@ -193,13 +198,13 @@ void ConnectProc(int Type, int Num)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\96¼\82ð\93ü\97Í\82µ\82Ä\83z\83X\83g\82Ö\90Ú\91± ----------------------------------------\r
+/*----- ホスト名を入力してホストへ接続 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void QuickConnectProc(void)\r
@@ -212,7 +217,7 @@ void QuickConnectProc(void)
 \r
        if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(hostname_dlg), GetMainHwnd(), QuickConDialogCallBack, (LPARAM)Tmp) == YES)\r
        {\r
-               /* \90Ú\91±\92\86\82È\82ç\90Ø\92f\82·\82é */\r
+               /* 接続中なら切断する */\r
                if(CmdCtrlSocket != INVALID_SOCKET)\r
                        DisconnectProc();\r
 \r
@@ -220,7 +225,7 @@ void QuickConnectProc(void)
 \r
                InitPWDcommand();\r
                CopyDefaultHost(&CurHost);\r
-               if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == SUCCESS)\r
+               if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == FFFTP_SUCCESS)\r
                {\r
                        if(strlen(CurHost.UserName) == 0)\r
                        {\r
@@ -238,7 +243,9 @@ void QuickConnectProc(void)
                        SetSyncMoveMode(CurHost.SyncMove);\r
 \r
                        DisableUserOpe();\r
-                       CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+                       // 暗号化通信対応\r
+//                     CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+                       CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
                        if(CmdCtrlSocket != INVALID_SOCKET)\r
@@ -267,13 +274,13 @@ void QuickConnectProc(void)
 }\r
 \r
 \r
-/*----- \83N\83C\83b\83N\90Ú\91±\83_\83C\83A\83\8d\83O\82Ì\83R\81[\83\8b\83o\83b\83N ----------------------------------\r
+/*----- クイック接続ダイアログのコールバック ----------------------------------\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
-*              WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
-*              LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
 *\r
 *      Return Value\r
 *              BOOL TRUE/FALSE\r
@@ -308,7 +315,7 @@ static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPa
                        SendDlgItemMessage(hDlg, QHOST_PASV, BM_SETCHECK, PasvDefault, 0);\r
                        for(i = 0; i < HISTORY_MAX; i++)\r
                        {\r
-                               if(GetHistoryByNum(i, &Tmp) == SUCCESS)\r
+                               if(GetHistoryByNum(i, &Tmp) == FFFTP_SUCCESS)\r
                                {\r
 //sprintf(Str, "%s (%s) %s", Tmp.HostAdrs, Tmp.UserName, Tmp.RemoteInitDir);\r
 //SendDlgItemMessage(hDlg, QHOST_HOST, CB_ADDSTRING, 0, (LPARAM)Str);\r
@@ -345,17 +352,17 @@ static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPa
 }\r
 \r
 \r
-/*----- \8ew\92è\82µ\82½\83z\83X\83g\96¼\82Å\83z\83X\83g\82Ö\90Ú\91± ----------------------------------------\r
+/*----- 指定したホスト名でホストへ接続 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *unc : UNC\95\8e\9a\97ñ\r
-*              int Kanji : \83z\83X\83g\82Ì\8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
-*              int Kana : \94¼\8ap\82©\82È\81¨\91S\8ap\95Ï\8a·\83\82\81[\83h (YES/NO)\r
-*              int Fkanji : \83t\83@\83C\83\8b\96¼\82Ì\8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
-*              int TrMode : \93]\91\97\83\82\81[\83h (TYPE_xx)\r
+*              char *unc : UNC文字列\r
+*              int Kanji : ホストの漢字コード (KANJI_xxx)\r
+*              int Kana : 半角かな→全角変換モード (YES/NO)\r
+*              int Fkanji : ファイル名の漢字コード (KANJI_xxx)\r
+*              int TrMode : 転送モード (TYPE_xx)\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)\r
@@ -370,14 +377,14 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
        SaveBookMark();\r
        SaveCurrentSetToHost();\r
 \r
-       /* \90Ú\91±\92\86\82È\82ç\90Ø\92f\82·\82é */\r
+       /* 接続中なら切断する */\r
        if(CmdCtrlSocket != INVALID_SOCKET)\r
                DisconnectProc();\r
 \r
        SetTaskMsg("----------------------------");\r
 \r
        InitPWDcommand();\r
-       if(SplitUNCpath(unc, Host, Path, File, User, Pass, &Port) == SUCCESS)\r
+       if(SplitUNCpath(unc, Host, Path, File, User, Pass, &Port) == FFFTP_SUCCESS)\r
        {\r
                if(strlen(User) == 0)\r
                {\r
@@ -397,7 +404,7 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
                CurHost.KanjiCode = Kanji;\r
                CurHost.KanaCnv = Kana;\r
                CurHost.NameKanjiCode = Fkanji;\r
-               CurHost.KanaCnv = YES;                  /* \82Æ\82è\82 \82¦\82¸ */\r
+               CurHost.KanaCnv = YES;                  /* とりあえず */\r
 \r
                SetHostKanaCnvImm(CurHost.KanaCnv);\r
                SetHostKanjiCodeImm(CurHost.KanjiCode);\r
@@ -410,7 +417,9 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
                }\r
 \r
                DisableUserOpe();\r
-               CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+               // 暗号化通信対応\r
+//             CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+               CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
                TrnCtrlSocket = CmdCtrlSocket;\r
 \r
                if(CmdCtrlSocket != INVALID_SOCKET)\r
@@ -440,13 +449,13 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82Ì\83q\83X\83g\83\8a\82Å\8ew\92è\82³\82ê\82½\83z\83X\83g\82Ö\90Ú\91± ------------------------------\r
+/*----- ホストのヒストリで指定されたホストへ接続 ------------------------------\r
 *\r
 *      Parameter\r
-*              int MenuCmd : \8eæ\82è\8fo\82·\83q\83X\83g\83\8a\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82½\83\81\83j\83\85\81[\83R\83}\83\93\83h\r
+*              int MenuCmd : 取り出すヒストリに割り当てられたメニューコマンド\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void HistoryConnectProc(int MenuCmd)\r
@@ -457,12 +466,12 @@ void HistoryConnectProc(int MenuCmd)
        int RFSort;\r
        int RDSort;\r
 \r
-       if(GetHistoryByCmd(MenuCmd, &Hist) == SUCCESS)\r
+       if(GetHistoryByCmd(MenuCmd, &Hist) == FFFTP_SUCCESS)\r
        {\r
                SaveBookMark();\r
                SaveCurrentSetToHost();\r
 \r
-               /* \90Ú\91±\92\86\82È\82ç\90Ø\92f\82·\82é */\r
+               /* 接続中なら切断する */\r
                if(CmdCtrlSocket != INVALID_SOCKET)\r
                        DisconnectProc();\r
 \r
@@ -471,7 +480,7 @@ void HistoryConnectProc(int MenuCmd)
                InitPWDcommand();\r
                CopyHistoryToHost(&Hist, &CurHost);\r
 \r
-               if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS)\r
+               if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
                {\r
                        SetCurrentHost(HOSTNUM_NOENTRY);\r
                        SetHostKanaCnvImm(CurHost.KanaCnv);\r
@@ -486,7 +495,9 @@ void HistoryConnectProc(int MenuCmd)
                        DispTransferType();\r
 \r
                        DisableUserOpe();\r
-                       CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+                       // 暗号化通信対応\r
+//                     CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+                       CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
                        if(CmdCtrlSocket != INVALID_SOCKET)\r
@@ -520,16 +531,16 @@ void HistoryConnectProc(int MenuCmd)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82Ì\8f\89\8aú\89»\83R\83}\83\93\83h\82ð\91\97\82é ------------------------------------------\r
+/*----- ホストの初期化コマンドを送る ------------------------------------------\r
 *\r
 *      Parameter\r
-*              int Cmd : \8f\89\8aú\89»\83R\83}\83\93\83h\83X\r
+*              int Cmd : 初期化コマンドス\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      NOte\r
-*              \8f\89\8aú\89»\83R\83}\83\93\83h\82Í\88È\89º\82Ì\82æ\82¤\82È\83t\83H\81[\83}\83b\83g\82Å\82 \82é\82±\82Æ\r
+*              初期化コマンドは以下のようなフォーマットであること\r
 *                      cmd1\0\r
 *                      cmd1\r\ncmd2\r\n\0\r
 *----------------------------------------------------------------------------*/\r
@@ -556,16 +567,16 @@ static int SendInitCommand(char *Cmd)
 }\r
 \r
 \r
-/*----- \8ew\92è\82Ì\83z\83X\83g\82ÍFireWall\82ð\8eg\82¤\90Ý\92è\82©\82Ç\82¤\82©\82ð\95Ô\82· ------------------------\r
+/*----- 指定のホストはFireWallを使う設定かどうかを返す ------------------------\r
 *\r
 *      Parameter\r
-*              char *Hots : \83z\83X\83g\96¼\r
-*              int *Fire : FireWall\82ð\8eg\82¤\82©\82Ç\82¤\82©\82ð\95Ô\82·\83\8f\81[\83N\r
-*              int *Pasv : PASV\83\82\81[\83h\82ð\95Ô\82·\83\8f\81[\83N\r
-*              int *List : LIST\83R\83}\83\93\83h\82Ì\82Ý\8eg\97p\83t\83\89\83O\r
+*              char *Hots : ホスト名\r
+*              int *Fire : FireWallを使うかどうかを返すワーク\r
+*              int *Pasv : PASVモードを返すワーク\r
+*              int *List : LISTコマンドのみ使用フラグ\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List)\r
@@ -575,10 +586,11 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List)
 \r
        *Fire = FwallDefault;\r
        *Pasv = PasvDefault;\r
-       *List = NO;\r
+       // NLSTを送ってしまうバグ修正(ただしNLSTを使うべきホストへクイック接続できなくなる)\r
+//     *List = NO;\r
 \r
        i = 0;\r
-       while(CopyHostFromList(i, &Tmp) == SUCCESS)\r
+       while(CopyHostFromList(i, &Tmp) == FFFTP_SUCCESS)\r
        {\r
                if(strcmp(Host, Tmp.HostAdrs) == 0)\r
                {\r
@@ -593,13 +605,13 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83A\83h\83\8c\83X\82ð\95Ô\82· ------------------------------------\r
+/*----- 接続しているホストのアドレスを返す ------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              char *\83z\83X\83g\82Ì\83A\83h\83\8c\83X\r
+*              char *ホストのアドレス\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *AskHostAdrs(void)\r
@@ -608,13 +620,13 @@ char *AskHostAdrs(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83|\81[\83g\82ð\95Ô\82· --------------------------------------\r
+/*----- 接続しているホストのポートを返す --------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83z\83X\83g\82Ì\83|\81[\83g\r
+*              int ホストのポート\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostPort(void)\r
@@ -622,13 +634,13 @@ int AskHostPort(void)
        return(CurHost.Port);\r
 }\r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83t\83@\83C\83\8b\96¼\82Ì\8a¿\8e\9a\83R\81[\83h\82ð\95Ô\82· ----------------------\r
+/*----- 接続しているホストのファイル名の漢字コードを返す ----------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
+*              int 漢字コード (KANJI_xxx)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostNameKanji(void)\r
@@ -640,13 +652,13 @@ int AskHostNameKanji(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83t\83@\83C\83\8b\96¼\82Ì\94¼\8ap\83J\83i\95Ï\8a·\83t\83\89\83O\82ð\95Ô\82· --------------\r
+/*----- 接続しているホストのファイル名の半角カナ変換フラグを返す --------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \94¼\8ap\83J\83i\82ð\91S\8ap\82É\95Ï\8a·\82·\82é\82©\82Ç\82¤\82© (YES/NO)\r
+*              int 半角カナを全角に変換するかどうか (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostNameKana(void)\r
@@ -658,13 +670,13 @@ int AskHostNameKana(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÌLIST\83R\83}\83\93\83h\83\82\81[\83h\82ð\95Ô\82· --------------------------\r
+/*----- 接続しているホストのLISTコマンドモードを返す --------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int LIST\83R\83}\83\93\83h\83\82\81[\83h (YES/NO)\r
+*              int LISTコマンドモード (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskListCmdMode(void)\r
@@ -680,13 +692,13 @@ int AskListCmdMode(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÅNLST -R\82ð\8eg\82¤\82©\82Ç\82¤\82©\82ð\95Ô\82· ------------------------\r
+/*----- 接続しているホストでNLST -Rを使うかどうかを返す ------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int NLST -R\82ð\8eg\82¤\82©\82Ç\82¤\82© (YES/NO)\r
+*              int NLST -Rを使うかどうか (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskUseNLST_R(void)\r
@@ -698,13 +710,13 @@ int AskUseNLST_R(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÌChmod\83R\83}\83\93\83h\82ð\95Ô\82· -------------------------------\r
+/*----- 接続しているホストのChmodコマンドを返す -------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              char *Chmod\83R\83}\83\93\83h\r
+*              char *Chmodコマンド\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *AskHostChmodCmd(void)\r
@@ -716,13 +728,13 @@ char *AskHostChmodCmd(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83^\83C\83\80\83]\81[\83\93\82ð\95Ô\82· --------------------------------\r
+/*----- 接続しているホストのタイムゾーンを返す --------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83^\83C\83\80\83]\81[\83\93\r
+*              int タイムゾーン\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostTimeZone(void)\r
@@ -734,13 +746,13 @@ int AskHostTimeZone(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÌPASV\83\82\81[\83h\82ð\95Ô\82· ----------------------------------\r
+/*----- 接続しているホストのPASVモードを返す ----------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int PASV\83\82\81[\83h\82©\82Ç\82¤\82© (YES/NO)\r
+*              int PASVモードかどうか (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskPasvMode(void)\r
@@ -749,13 +761,13 @@ int AskPasvMode(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÌLNST\83t\83@\83C\83\8b\96¼\82ð\95Ô\82· ------------------------------\r
+/*----- 接続しているホストのLNSTファイル名を返す ------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              char *\83t\83@\83C\83\8b\96¼\81^\83I\83v\83V\83\87\83\93\r
+*              char *ファイル名/オプション\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *AskHostLsName(void)\r
@@ -767,13 +779,13 @@ char *AskHostLsName(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Ì\83z\83X\83g\83^\83C\83v\82ð\95Ô\82· --------------------------------\r
+/*----- 接続しているホストのホストタイプを返す --------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              char *\83t\83@\83C\83\8b\96¼\81^\83I\83v\83V\83\87\83\93\r
+*              char *ファイル名/オプション\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostType(void)\r
@@ -785,13 +797,13 @@ int AskHostType(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82ÍFireWall\82ð\8eg\82¤\83z\83X\83g\82©\82Ç\82¤\82©\82ð\95Ô\82· ----------------\r
+/*----- 接続しているホストはFireWallを使うホストかどうかを返す ----------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int FireWall\82ð\8eg\82¤\82©\82Ç\82¤\82© (YES/NO)\r
+*              int FireWallを使うかどうか (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskHostFireWall(void)\r
@@ -800,13 +812,13 @@ int AskHostFireWall(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83z\83X\83g\82Å\83t\83\8b\83p\83X\82Å\83t\83@\83C\83\8b\83A\83N\83Z\83X\82µ\82È\82¢\82©\82Ç\82¤\82©\82ð\95Ô\82· ----\r
+/*----- 接続しているホストでフルパスでファイルアクセスしないかどうかを返す ----\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83t\83\8b\83p\83X\82Å\83A\83N\83Z\83X\82µ\82È\82¢ (YES=\83t\83\8b\83p\83X\8bÖ\8e~/NO)\r
+*              int フルパスでアクセスしない (YES=フルパス禁止/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskNoFullPathMode(void)\r
@@ -818,13 +830,13 @@ int AskNoFullPathMode(void)
 }\r
 \r
 \r
-/*----- \90Ú\91±\82µ\82Ä\82¢\82é\83\86\81[\83U\96¼\82ð\95Ô\82· --------------------------------------------\r
+/*----- 接続しているユーザ名を返す --------------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              char *\83\86\81[\83U\96¼\r
+*              char *ユーザ名\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *AskHostUserName(void)\r
@@ -833,16 +845,16 @@ char *AskHostUserName(void)
 }\r
 \r
 \r
-/*----- \8c»\8dÝ\82Ì\90Ý\92è\82ð\83z\83X\83g\82Ì\90Ý\92è\82É\83Z\83b\83g\82·\82é ----------------------------------\r
+/*----- 現在の設定をホストの設定にセットする ----------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\81A\83\\81[\83g\95û\96@\82ð\83z\83X\83g\82Ì\90Ý\92è\82É\83Z\83b\83g\82·\82é\r
+*              カレントディレクトリ、ソート方法をホストの設定にセットする\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SaveCurrentSetToHost(void)\r
@@ -869,13 +881,13 @@ void SaveCurrentSetToHost(void)
 }\r
 \r
 \r
-/*----- \8c»\8dÝ\82Ì\90Ý\92è\82ð\83q\83X\83g\83\8a\82É\83Z\83b\83g\82·\82é --------------------------------------\r
+/*----- 現在の設定をヒストリにセットする --------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 static void SaveCurrentSetToHistory(void)\r
@@ -902,21 +914,24 @@ static void SaveCurrentSetToHistory(void)
 }\r
 \r
 \r
-/*----- \83R\83}\83\93\83h\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82Ì\8dÄ\90Ú\91± ----------------------------------\r
+/*----- コマンドコントロールソケットの再接続 ----------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ReConnectCmdSkt(void)\r
 {\r
        int Sts;\r
 \r
-       if(CmdCtrlSocket != TrnCtrlSocket)\r
+\r
+       // 同時接続対応\r
+//     if(CmdCtrlSocket != TrnCtrlSocket)\r
+       if(CmdCtrlSocket != TrnCtrlSocket && TrnCtrlSocket != INVALID_SOCKET)\r
                do_closesocket(TrnCtrlSocket);\r
        TrnCtrlSocket = INVALID_SOCKET;\r
 \r
@@ -928,30 +943,70 @@ int ReConnectCmdSkt(void)
 }\r
 \r
 \r
-/*----- \93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82Ì\8dÄ\90Ú\91± --------------------------------------\r
+/*----- 転送コントロールソケットの再接続 --------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 //int ReConnectTrnSkt(void)\r
 //{\r
 //     return(ReConnectSkt(&TrnCtrlSocket));\r
 //}\r
+// 同時接続対応\r
+int ReConnectTrnSkt(SOCKET *Skt)\r
+{\r
+//     char Path[FMAX_PATH+1];\r
+       int Sts;\r
+       // 暗号化通信対応\r
+       HOSTDATA HostData;\r
+\r
+       Sts = FFFTP_FAIL;\r
+\r
+       SetTaskMsg(MSGJPN003);\r
+\r
+//     DisableUserOpe();\r
+       /* 現在のソケットは切断 */\r
+       if(*Skt != INVALID_SOCKET)\r
+               do_closesocket(*Skt);\r
+       /* 再接続 */\r
+       // 暗号化通信対応\r
+       HostData = CurHost;\r
+       if(HostData.CryptMode != CRYPT_NONE)\r
+               HostData.UseNoEncryption = NO;\r
+       if(HostData.CryptMode != CRYPT_FTPES)\r
+               HostData.UseFTPES = NO;\r
+       if(HostData.CryptMode != CRYPT_FTPIS)\r
+               HostData.UseFTPIS = NO;\r
+       if(HostData.CryptMode != CRYPT_SFTP)\r
+               HostData.UseSFTP = NO;\r
+//     if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+       if((*Skt = DoConnect(&HostData, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+       {\r
+//             AskRemoteCurDir(Path, FMAX_PATH);\r
+//             DoCWD(Path, YES, YES, YES);\r
+               Sts = FFFTP_SUCCESS;\r
+       }\r
+       else\r
+               SoundPlay(SND_ERROR);\r
+\r
+//     EnableUserOpe();\r
+       return(Sts);\r
+}\r
 \r
 \r
-/*----- \89ñ\90ü\82Ì\8dÄ\90Ú\91± ----------------------------------------------------------\r
+/*----- 回線の再接続 ----------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET *Skt : \90Ú\91±\82µ\82½\83\\83P\83b\83g\82ð\95Ô\82·\83\8f\81[\83N\r
+*              SOCKET *Skt : 接続したソケットを返すワーク\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int ReConnectSkt(SOCKET *Skt)\r
@@ -959,20 +1014,22 @@ static int ReConnectSkt(SOCKET *Skt)
        char Path[FMAX_PATH+1];\r
        int Sts;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
 \r
        SetTaskMsg(MSGJPN003);\r
 \r
        DisableUserOpe();\r
-       /* \8c»\8dÝ\82Ì\83\\83P\83b\83g\82Í\90Ø\92f */\r
+       /* 現在のソケットは切断 */\r
        if(*Skt != INVALID_SOCKET)\r
                do_closesocket(*Skt);\r
-       /* \8dÄ\90Ú\91± */\r
-       if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+       /* 再接続 */\r
+       // 暗号化通信対応\r
+//     if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+       if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
        {\r
                AskRemoteCurDir(Path, FMAX_PATH);\r
                DoCWD(Path, YES, YES, YES);\r
-               Sts = SUCCESS;\r
+               Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
                SoundPlay(SND_ERROR);\r
@@ -982,13 +1039,13 @@ static int ReConnectSkt(SOCKET *Skt)
 }\r
 \r
 \r
-/*----- \83R\83}\83\93\83h\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82ð\95Ô\82· ------------------------------------\r
+/*----- コマンドコントロールソケットを返す ------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              SOCKET \83R\83}\83\93\83h\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
+*              SOCKET コマンドコントロールソケット\r
 *----------------------------------------------------------------------------*/\r
 \r
 SOCKET AskCmdCtrlSkt(void)\r
@@ -997,13 +1054,13 @@ SOCKET AskCmdCtrlSkt(void)
 }\r
 \r
 \r
-/*----- \93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82ð\95Ô\82· ----------------------------------------\r
+/*----- 転送コントロールソケットを返す ----------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              SOCKET \93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
+*              SOCKET 転送コントロールソケット\r
 *----------------------------------------------------------------------------*/\r
 \r
 SOCKET AskTrnCtrlSkt(void)\r
@@ -1012,13 +1069,13 @@ SOCKET AskTrnCtrlSkt(void)
 }\r
 \r
 \r
-/*----- \83R\83}\83\93\83h\81^\93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82Ì\8b¤\97L\82ð\89ð\8f\9c ------------------------\r
+/*----- コマンド/転送コントロールソケットの共有を解除 ------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SktShareProh(void)\r
@@ -1028,21 +1085,24 @@ void SktShareProh(void)
 \r
 //SetTaskMsg("############### SktShareProh");\r
 \r
-               CmdCtrlSocket = INVALID_SOCKET;\r
-               ReConnectSkt(&CmdCtrlSocket);\r
+               // 同時接続対応\r
+               // 転送スレッドがソケットを各自で用意\r
+               // TrnCtrlSocketはメインスレッド以外から使用されない\r
+//             CmdCtrlSocket = INVALID_SOCKET;\r
+//             ReConnectSkt(&CmdCtrlSocket);\r
        }\r
        return;\r
 }\r
 \r
 \r
-/*----- \83R\83}\83\93\83h\81^\93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82Ì\8b¤\97L\82ª\89ð\8f\9c\82³\82ê\82Ä\82¢\82é\82©\83`\83F\83b\83N ----\r
+/*----- コマンド/転送コントロールソケットの共有が解除されているかチェック ----\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      YES=\8b¤\97L\89ð\8f\9c/NO=\8b¤\97L\r
+*              int ステータス\r
+*                      YES=共有解除/NO=共有\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskShareProh(void)\r
@@ -1050,20 +1110,20 @@ int AskShareProh(void)
        int Sts;\r
 \r
        Sts = YES;\r
-       if(CmdCtrlSocket == TrnCtrlSocket)\r
-               Sts = NO;\r
+//     if(CmdCtrlSocket == TrnCtrlSocket)\r
+//             Sts = NO;\r
 \r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82©\82ç\90Ø\92f --------------------------------------------------------\r
+/*----- ホストから切断 --------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void DisconnectProc(void)\r
@@ -1099,13 +1159,13 @@ void DisconnectProc(void)
 }\r
 \r
 \r
-/*----- \83\\83P\83b\83g\82ª\8b­\90§\90Ø\92f\82³\82ê\82½\82Æ\82«\82Ì\8f\88\97\9d ------------------------------------\r
+/*----- ソケットが強制切断されたときの処理 ------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void DisconnectSet(void)\r
@@ -1121,13 +1181,13 @@ void DisconnectSet(void)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82É\90Ú\91±\92\86\82©\82Ç\82¤\82©\82ð\95Ô\82· ------------------------------------------\r
+/*----- ホストに接続中かどうかを返す ------------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (YES/NO)\r
+*              int ステータス (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskConnecting(void)\r
@@ -1142,39 +1202,40 @@ int AskConnecting(void)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82Ö\90Ú\91±\82·\82é ------------------------------------------------------\r
+/*----- ホストへ接続する ------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Host : \83z\83X\83g\96¼\r
-*              char *User : \83\86\81[\83U\96¼\r
-*              char *Pass : \83p\83X\83\8f\81[\83h\r
-*              char *Acct : \83A\83J\83E\83\93\83g\r
-*              int Port : \83|\81[\83g\r
-*              int Fwall : FireWall\82ð\8eg\82¤\82©\82Ç\82¤\82© (YES/NO)\r
-*              int SavePass : \83p\83X\83\8f\81[\83h\82ð\8dÄ\93ü\97Í\82µ\82½\8e\9e\82É\95Û\91\82·\82é\82©\82Ç\82¤\82© (YES/NO)\r
-*              int Security : \83Z\83L\83\85\83\8a\83e\83B (SECURITY_xxx, MDx)\r
+*              char *Host : ホスト名\r
+*              char *User : ユーザ名\r
+*              char *Pass : パスワード\r
+*              char *Acct : アカウント\r
+*              int Port : ポート\r
+*              int Fwall : FireWallを使うかどうか (YES/NO)\r
+*              int SavePass : パスワードを再入力した時に保存するかどうか (YES/NO)\r
+*              int Security : セキュリティ (SECURITY_xxx, MDx)\r
 *\r
 *      Return Value\r
-*              SOCKET \83\\83P\83b\83g\r
+*              SOCKET ソケット\r
 *\r
 *      Note\r
-*              \83z\83X\83g\96¼\81A\83\86\81[\83U\96¼\81A\83p\83X\83\8f\81[\83h\82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½\82Æ\82«\82Í\81A\90Ú\91±\82É\8eg\97p\r
-*              \82µ\82½\82à\82Ì\82ð\83R\83s\81[\82µ\82Ä\82©\82¦\82·\r
-*                      char *Host : \83z\83X\83g\96¼\r
-*                      char *User : \83\86\81[\83U\96¼\r
-*                      char *Pass : \83p\83X\83\8f\81[\83h\r
-*                      char *Acct : \83A\83J\83E\83\93\83g\r
-*\r
-*              FireWall\82Í\8e\9f\82Ì\82æ\82¤\82É\93®\8dì\82·\82é\r
-*                      TYPE1   Connect fire \81¨ USER user(f) \81¨ PASS pass(f) \81¨ SITE host \81¨ USER user(h) \81¨      PASS pass(h) \81¨ ACCT acct\r
-*                      TYPE2   Connect fire \81¨ USER user(f) \81¨ PASS pass(f) \81¨              USER user(h)@host \81¨ PASS pass(h) \81¨ ACCT acct\r
-*                      TYPE3   Connect fire \81¨                                              USER user(h)@host \81¨ PASS pass(h) \81¨ ACCT acct\r
-*                      TYPE4   Connect fire \81¨                                 OPEN host \81¨ USER user(h) \81¨      PASS pass(h) \81¨ ACCT acct\r
+*              ホスト名、ユーザ名、パスワードが指定されていなかったときは、接続に使用\r
+*              したものをコピーしてかえす\r
+*                      char *Host : ホスト名\r
+*                      char *User : ユーザ名\r
+*                      char *Pass : パスワード\r
+*                      char *Acct : アカウント\r
+*\r
+*              FireWallは次のように動作する\r
+*                      TYPE1   Connect fire → USER user(f) → PASS pass(f) → SITE host → USER user(h) →      PASS pass(h) → ACCT acct\r
+*                      TYPE2   Connect fire → USER user(f) → PASS pass(f) →              USER user(h)@host → PASS pass(h) → ACCT acct\r
+*                      TYPE3   Connect fire →                                              USER user(h)@host → PASS pass(h) → ACCT acct\r
+*                      TYPE4   Connect fire →                                 OPEN host → USER user(h) →      PASS pass(h) → ACCT acct\r
 *                      TYPE5   SOCKS4\r
-*                      none    Connect host \81¨                                              USER user(h) \81¨      PASS pass(h) \81¨ ACCT acct\r
+*                      none    Connect host →                                              USER user(h) →      PASS pass(h) → ACCT acct\r
 *----------------------------------------------------------------------------*/\r
 \r
-static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security)\r
+// 暗号化通信対応\r
+static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security)\r
 {\r
        int Sts;\r
        int Flg;\r
@@ -1190,143 +1251,164 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port
        char TmpBuf[ONELINE_BUF_SIZE];\r
        struct linger LingerOpt;\r
 \r
-       if(Fwall == YES)\r
-               Fwall = FwallType;\r
-       else\r
-               Fwall = FWALL_NONE;\r
+       // 暗号化通信対応\r
+       ContSock = INVALID_SOCKET;\r
 \r
-       TryConnect = YES;\r
-       CancelFlg = NO;\r
+       if(CryptMode == CRYPT_NONE || CryptMode == CRYPT_FTPES || CryptMode == CRYPT_FTPIS)\r
+       {\r
+               if(Fwall == YES)\r
+                       Fwall = FwallType;\r
+               else\r
+                       Fwall = FWALL_NONE;\r
+\r
+               TryConnect = YES;\r
+               // 暗号化通信対応\r
+//             CancelFlg = NO;\r
 #if 0\r
-//     WSASetBlockingHook(BlkHookFnc);\r
+//             WSASetBlockingHook(BlkHookFnc);\r
 #endif\r
 \r
-       ContSock = INVALID_SOCKET;\r
+               ContSock = INVALID_SOCKET;\r
 \r
-       HostPort = Port;\r
-       Tmp = Host;\r
-       if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
-          (Fwall == FWALL_SIDEWINDER) ||\r
-          (Fwall == FWALL_FU_FP))\r
-       {\r
-               Tmp = FwallHost;\r
-               Port = FwallPort;\r
-       }\r
+               HostPort = Port;\r
+               Tmp = Host;\r
+               if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
+                  (Fwall == FWALL_SIDEWINDER) ||\r
+                  (Fwall == FWALL_FU_FP))\r
+               {\r
+                       Tmp = FwallHost;\r
+                       Port = FwallPort;\r
+               }\r
 \r
-       if(strlen(Tmp) != 0)\r
-       {\r
-               if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET)\r
+               if(strlen(Tmp) != 0)\r
                {\r
-                       // \83o\83b\83t\83@\82ð\96³\8cø\r
+                       if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET)\r
+                       {\r
+                               // バッファを無効\r
 #ifdef DISABLE_CONTROL_NETWORK_BUFFERS\r
-                       int BufferSize = 0;\r
-                       setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int));\r
-                       setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int));\r
+                               int BufferSize = 0;\r
+                               setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int));\r
+                               setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int));\r
 #endif\r
-                       while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
-                               ;\r
-\r
-                       if(Sts == FTP_COMPLETE)\r
-                       {\r
-                               Flg = 1;\r
-                               if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
-                                       ReportWSError("setsockopt", WSAGetLastError());\r
-                               // \83f\81[\83^\93]\91\97\97p\83\\83P\83b\83g\82ÌTCP\92x\89\84\93]\91\97\82ª\96³\8cø\82³\82ê\82Ä\82¢\82é\82Ì\82Å\94O\82Ì\82½\82ß\r
-                               if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
-                                       ReportWSError("setsockopt", WSAGetLastError());\r
-#pragma aaa\r
-                               Flg = 1;\r
-                               if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
-                                       ReportWSError("setsockopt", WSAGetLastError());\r
-                               LingerOpt.l_onoff = 1;\r
-                               LingerOpt.l_linger = 90;\r
-                               if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR)\r
-                                       ReportWSError("setsockopt", WSAGetLastError());\r
-///////\r
-\r
-\r
-                               /*===== \94F\8fØ\82ð\8ds\82È\82¤ =====*/\r
-\r
-                               Sts = FTP_COMPLETE;\r
-                               if((Fwall == FWALL_FU_FP_SITE) ||\r
-                                  (Fwall == FWALL_FU_FP_USER) ||\r
-                                  (Fwall == FWALL_FU_FP))\r
+                               // FTPIS対応\r
+//                             while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
+//                                     ;\r
+                               if(CryptMode == CRYPT_FTPIS)\r
                                {\r
-                                       if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE)\r
+                                       if(AttachSSL(ContSock, INVALID_SOCKET))\r
                                        {\r
-                                               CheckOneTimePassword(FwallPass, Reply, FwallSecurity);\r
-                                               Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+                                               while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
+                                                       ;\r
                                        }\r
+                                       else\r
+                                               Sts = FTP_ERROR;\r
                                }\r
-                               else if(Fwall == FWALL_SIDEWINDER)\r
-                               {\r
-                                       Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100;\r
-                               }\r
-                               if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
+                               else\r
                                {\r
-                                       SetTaskMsg(MSGJPN006);\r
-                                       DoClose(ContSock);\r
-                                       ContSock = INVALID_SOCKET;\r
+                                       while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
+                                               ;\r
                                }\r
-                               else\r
+\r
+                               if(Sts == FTP_COMPLETE)\r
                                {\r
-                                       if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN))\r
+                                       Flg = 1;\r
+                                       if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+                                               ReportWSError("setsockopt", WSAGetLastError());\r
+                                       // データ転送用ソケットのTCP遅延転送が無効されているので念のため\r
+                                       if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+                                               ReportWSError("setsockopt", WSAGetLastError());\r
+//#pragma aaa\r
+                                       Flg = 1;\r
+                                       if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+                                               ReportWSError("setsockopt", WSAGetLastError());\r
+                                       LingerOpt.l_onoff = 1;\r
+                                       LingerOpt.l_linger = 90;\r
+                                       if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR)\r
+                                               ReportWSError("setsockopt", WSAGetLastError());\r
+///////\r
+\r
+\r
+                                       /*===== 認証を行なう =====*/\r
+\r
+                                       Sts = FTP_COMPLETE;\r
+                                       if((Fwall == FWALL_FU_FP_SITE) ||\r
+                                          (Fwall == FWALL_FU_FP_USER) ||\r
+                                          (Fwall == FWALL_FU_FP))\r
                                        {\r
-                                               Flg = 0;\r
-                                               if(Fwall == FWALL_OPEN)\r
-                                                       Flg = 2;\r
-                                               if(FwallLower == YES)\r
-                                                       Flg++;\r
-\r
-                                               if(HostPort == PORT_NOR)\r
-                                                       Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100;\r
-                                               else\r
-                                                       Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100;\r
+                                               if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE)\r
+                                               {\r
+                                                       CheckOneTimePassword(FwallPass, Reply, FwallSecurity);\r
+                                                       Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+                                               }\r
+                                       }\r
+                                       else if(Fwall == FWALL_SIDEWINDER)\r
+                                       {\r
+                                               Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100;\r
                                        }\r
-\r
                                        if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
                                        {\r
-                                               SetTaskMsg(MSGJPN007, Host);\r
+                                               SetTaskMsg(MSGJPN006);\r
                                                DoClose(ContSock);\r
                                                ContSock = INVALID_SOCKET;\r
                                        }\r
                                        else\r
                                        {\r
-                                               Anony = NO;\r
-                                               if((strlen(User) != 0) || \r
-                                                  (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+                                               if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN))\r
                                                {\r
-                                                       if(Anony == YES)\r
-                                                       {\r
-                                                               strcpy(User, "anonymous");\r
-                                                               strcpy(Pass, UserMailAdrs);\r
-                                                       }\r
+                                                       Flg = 0;\r
+                                                       if(Fwall == FWALL_OPEN)\r
+                                                               Flg = 2;\r
+                                                       if(FwallLower == YES)\r
+                                                               Flg++;\r
+\r
+                                                       if(HostPort == PORT_NOR)\r
+                                                               Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100;\r
+                                                       else\r
+                                                               Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100;\r
+                                               }\r
 \r
-                                                       if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER))\r
+                                               if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
+                                               {\r
+                                                       SetTaskMsg(MSGJPN007, Host);\r
+                                                       DoClose(ContSock);\r
+                                                       ContSock = INVALID_SOCKET;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       Anony = NO;\r
+                                                       if((strlen(User) != 0) || \r
+                                                          (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
                                                        {\r
-                                                               if(HostPort == PORT_NOR)\r
-                                                                       sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host);\r
+                                                               if(Anony == YES)\r
+                                                               {\r
+                                                                       strcpy(User, "anonymous");\r
+                                                                       strcpy(Pass, UserMailAdrs);\r
+                                                               }\r
+\r
+                                                               if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER))\r
+                                                               {\r
+                                                                       if(HostPort == PORT_NOR)\r
+                                                                               sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host);\r
+                                                                       else\r
+                                                                               sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort);\r
+                                                               }\r
                                                                else\r
-                                                                       sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort);\r
-                                                       }\r
-                                                       else\r
-                                                               strcpy(Buf, User);\r
+                                                                       strcpy(Buf, User);\r
 \r
-                                                       // FTPES\91Î\89\9e\r
-                                                       // 2\89ñ\88È\8fã\8cÄ\82Î\82ê\82é\8e\96\82ª\82 \82é\82½\82ß\8aù\82ÉFTPES\82Å\90Ú\91±\82µ\82Ä\82¢\82Ä\82à\8dÄ\8am\94F\r
-                                                       if(CurHost.CryptMode == CRYPT_NONE || CurHost.CryptMode == CRYPT_FTPES)\r
-                                                       {\r
-                                                               if(IsOpenSSLLoaded() && CurHost.UseFTPES == YES && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234)\r
+                                                               // FTPES対応\r
+                                                               if(CryptMode == CRYPT_FTPES)\r
                                                                {\r
-                                                                       // SSL\82É\90Ø\82è\91Ö\82¦\r
-                                                                       SetTaskMsg(MSGJPN315);\r
-                                                                       CurHost.CryptMode = CRYPT_FTPES;\r
-                                                                       if(AttachSSL(ContSock))\r
+                                                                       if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234)\r
                                                                        {\r
-                                                                               if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200)\r
+                                                                               if(AttachSSL(ContSock, INVALID_SOCKET))\r
                                                                                {\r
-                                                                                       if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200)\r
+                                                                                       if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200)\r
                                                                                        {\r
+                                                                                               if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200)\r
+                                                                                               {\r
+                                                                                               }\r
+                                                                                               else\r
+                                                                                                       Sts = FTP_ERROR;\r
                                                                                        }\r
                                                                                        else\r
                                                                                                Sts = FTP_ERROR;\r
@@ -1337,121 +1419,179 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port
                                                                        else\r
                                                                                Sts = FTP_ERROR;\r
                                                                }\r
-                                                               else\r
-                                                               {\r
-                                                                       // \88Ã\8d\86\89»\82È\82µ\r
-                                                                       CurHost.CryptMode = CRYPT_NONE;\r
-                                                                       SetTaskMsg(MSGJPN314);\r
-                                                               }\r
-                                                       }\r
 \r
-                                                       ReInPass = NO;\r
-                                                       do\r
-                                                       {\r
-                                                               Continue = NO;\r
-                                                               if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE)\r
+                                                               ReInPass = NO;\r
+                                                               do\r
                                                                {\r
-                                                                       if((strlen(Pass) != 0) || \r
-                                                                          (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+                                                                       // FTPES対応\r
+                                                                       if(Sts == FTP_ERROR)\r
+                                                                               break;\r
+                                                                       Continue = NO;\r
+                                                                       if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE)\r
                                                                        {\r
-                                                                               CheckOneTimePassword(Pass, Reply, Security);\r
+                                                                               if((strlen(Pass) != 0) || \r
+                                                                                  (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+                                                                               {\r
+                                                                                       CheckOneTimePassword(Pass, Reply, Security);\r
 \r
-                                                                               /* \83p\83X\83\8f\81[\83h\82ª\83X\83y\81[\83X1\8cÂ\82Ì\8e\9e\82Í\83p\83X\83\8f\81[\83h\82Ì\8eÀ\91Ì\82È\82µ\82Æ\82·\82é */\r
-                                                                               if(strcmp(Reply, " ") == 0)\r
-                                                                                       strcpy(Reply, "");\r
+                                                                                       /* パスワードがスペース1個の時はパスワードの実体なしとする */\r
+                                                                                       if(strcmp(Reply, " ") == 0)\r
+                                                                                               strcpy(Reply, "");\r
 \r
-                                                                               Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
-                                                                               if(Sts == FTP_ERROR)\r
-                                                                               {\r
-                                                                                       strcpy(Pass, "");\r
-                                                                                       if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)\r
-                                                                                               Continue = YES;\r
-                                                                                       else\r
-                                                                                               DoPrintf("No password specified.");\r
-                                                                                       ReInPass = YES;\r
-                                                                               }\r
-                                                                               else if(Sts == FTP_CONTINUE)\r
-                                                                               {\r
-                                                                                       if((strlen(Acct) != 0) || \r
-                                                                                          (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+                                                                                       Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+                                                                                       if(Sts == FTP_ERROR)\r
                                                                                        {\r
-                                                                                               Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100;\r
+                                                                                               strcpy(Pass, "");\r
+                                                                                               if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)\r
+                                                                                                       Continue = YES;\r
+                                                                                               else\r
+                                                                                                       DoPrintf("No password specified.");\r
+                                                                                               ReInPass = YES;\r
+                                                                                       }\r
+                                                                                       else if(Sts == FTP_CONTINUE)\r
+                                                                                       {\r
+                                                                                               if((strlen(Acct) != 0) || \r
+                                                                                                  (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+                                                                                               {\r
+                                                                                                       Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100;\r
+                                                                                               }\r
+                                                                                               else\r
+                                                                                                       DoPrintf("No account specified");\r
                                                                                        }\r
-                                                                                       else\r
-                                                                                               DoPrintf("No account specified");\r
                                                                                }\r
-                                                                       }\r
-                                                                       else\r
-                                                                       {\r
-                                                                               Sts = FTP_ERROR;\r
-                                                                               DoPrintf("No password specified.");\r
+                                                                               else\r
+                                                                               {\r
+                                                                                       Sts = FTP_ERROR;\r
+                                                                                       DoPrintf("No password specified.");\r
+                                                                               }\r
                                                                        }\r
                                                                }\r
+                                                               while(Continue == YES);\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               Sts = FTP_ERROR;\r
+                                                               DoPrintf("No user name specified");\r
                                                        }\r
-                                                       while(Continue == YES);\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       Sts = FTP_ERROR;\r
-                                                       DoPrintf("No user name specified");\r
-                                               }\r
 \r
-                                               if(Sts != FTP_COMPLETE)\r
-                                               {\r
-                                                       SetTaskMsg(MSGJPN008, Host);\r
-                                                       DoClose(ContSock);\r
-                                                       ContSock = INVALID_SOCKET;\r
-                                               }\r
-                                               else if((SavePass == YES) && (ReInPass == YES))\r
-                                               {\r
-                                                       if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                                                               SetHostPassword(AskCurrentHost(), Pass);\r
+                                                       if(Sts != FTP_COMPLETE)\r
+                                                       {\r
+                                                               SetTaskMsg(MSGJPN008, Host);\r
+                                                               DoClose(ContSock);\r
+                                                               ContSock = INVALID_SOCKET;\r
+                                                       }\r
+                                                       else if((SavePass == YES) && (ReInPass == YES))\r
+                                                       {\r
+                                                               if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+                                                                       SetHostPassword(AskCurrentHost(), Pass);\r
+                                                       }\r
                                                }\r
                                        }\r
                                }\r
+                               else\r
+                               {\r
+//#pragma aaa\r
+                                       SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/);\r
+                                       DoClose(ContSock);\r
+                                       ContSock = INVALID_SOCKET;\r
+                               }\r
                        }\r
+               }\r
+               else\r
+               {\r
+\r
+                       if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
+                          (Fwall == FWALL_FU_FP))\r
+                               SetTaskMsg(MSGJPN010);\r
                        else\r
+                               SetTaskMsg(MSGJPN011);\r
+               }\r
+\r
+#if 0\r
+//             WSAUnhookBlockingHook();\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
-//#pragma aaa\r
-                               SetTaskMsg(MSGJPN009/*"\90Ú\91±\82Å\82«\82Ü\82¹\82ñ(1) %x", ContSock*/);\r
-                               DoClose(ContSock);\r
-                               ContSock = INVALID_SOCKET;\r
+                               // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用\r
+                               // UTF-8対応\r
+                               if(strstr(Reply, " UTF8 "))\r
+                                       HostData->Feature |= FEATURE_UTF8;\r
+                               // MLST対応\r
+                               if(strstr(Reply, " MLST ") || strstr(Reply, " MLSD "))\r
+                                       HostData->Feature |= FEATURE_MLSD;\r
+                               // IPv6対応\r
+                               if(strstr(Reply, " EPRT ") || strstr(Reply, " EPSV "))\r
+                                       HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV;\r
+                       }\r
+                       // UTF-8対応\r
+                       if(HostData->NameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8))\r
+                       {\r
+                               if((Sts = command(ContSock, Reply, &CancelFlg, "OPTS UTF8 ON")) == 200)\r
+                               {\r
+                               }\r
                        }\r
                }\r
        }\r
-       else\r
+       else if(CryptMode == CRYPT_SFTP)\r
        {\r
-\r
-               if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
-                  (Fwall == FWALL_FU_FP))\r
-                       SetTaskMsg(MSGJPN010);\r
-               else\r
-                       SetTaskMsg(MSGJPN011);\r
        }\r
 \r
-#if 0\r
-//     WSAUnhookBlockingHook();\r
-#endif\r
-       TryConnect = NO;\r
-\r
        return(ContSock);\r
 }\r
 \r
+static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security)\r
+{\r
+       SOCKET ContSock;\r
+       ContSock = INVALID_SOCKET;\r
+       CancelFlg = NO;\r
+       if(CancelFlg == NO && ContSock == INVALID_SOCKET && HostData->UseSFTP == YES)\r
+       {\r
+               SetTaskMsg(MSGJPN317);\r
+               if((ContSock = DoConnectCrypt(CRYPT_SFTP, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET)\r
+                       HostData->CryptMode = CRYPT_SFTP;\r
+       }\r
+       if(CancelFlg == NO && ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES)\r
+       {\r
+               SetTaskMsg(MSGJPN316);\r
+               if((ContSock = DoConnectCrypt(CRYPT_FTPIS, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET)\r
+                       HostData->CryptMode = CRYPT_FTPIS;\r
+       }\r
+       if(CancelFlg == NO && ContSock == INVALID_SOCKET && HostData->UseFTPES == YES)\r
+       {\r
+               SetTaskMsg(MSGJPN315);\r
+               if((ContSock = DoConnectCrypt(CRYPT_FTPES, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET)\r
+                       HostData->CryptMode = CRYPT_FTPES;\r
+       }\r
+       if(CancelFlg == NO && ContSock == INVALID_SOCKET && HostData->UseNoEncryption == YES)\r
+       {\r
+               SetTaskMsg(MSGJPN314);\r
+               if((ContSock = DoConnectCrypt(CRYPT_NONE, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET)\r
+                       HostData->CryptMode = CRYPT_NONE;\r
+       }\r
+       return ContSock;\r
+}\r
+\r
 \r
-/*----- \83\8f\83\93\83^\83C\83\80\83p\83X\83\8f\81[\83h\82Ì\83`\83F\83b\83N ----------------------------------------\r
+/*----- ワンタイムパスワードのチェック ----------------------------------------\r
 *\r
 *      Parameter\r
-*              chat *Pass : \83p\83X\83\8f\81[\83h\81^\83p\83X\83t\83\8c\81[\83Y\r
-*              char *Reply : USER\83R\83}\83\93\83h\82ð\91\97\82Á\82½\82 \82Æ\82Ì\83\8a\83v\83\89\83C\95\8e\9a\97ñ\r
-*                                              \81^PASS\83R\83}\83\93\83h\82Å\91\97\82é\83p\83X\83\8f\81[\83h\82ð\95Ô\82·\83o\83b\83t\83@\r
-*              int Type : \83^\83C\83v (SECURITY_xxx, MDx)\r
+*              chat *Pass : パスワード/パスフレーズ\r
+*              char *Reply : USERコマンドを送ったあとのリプライ文字列\r
+*                                              /PASSコマンドで送るパスワードを返すバッファ\r
+*              int Type : タイプ (SECURITY_xxx, MDx)\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *\r
 *      Note\r
-*              \83\8f\83\93\83^\83C\83\80\83p\83X\83\8f\81[\83h\82Å\82È\82¢\8e\9e\82ÍPass\82ð\82»\82Ì\82Ü\82ÜReply\82É\83R\83s\81[\r
+*              ワンタイムパスワードでない時はPassをそのままReplyにコピー\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int CheckOneTimePassword(char *Pass, char *Reply, int Type)\r
@@ -1462,7 +1602,7 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
        char Seed[MAX_SEED_LEN+1];\r
        int i;\r
 \r
-       Sts = SUCCESS;\r
+       Sts = FFFTP_SUCCESS;\r
        Pos = NULL;\r
 \r
        if(Type == SECURITY_AUTO)\r
@@ -1488,10 +1628,10 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
 \r
        if((Type == MD4) || (Type == MD5) || (Type == SHA1))\r
        {\r
-               /* \83V\81[\83P\83\93\83X\94Ô\8d\86\82ð\8c©\82Â\82¯\82é\83\8b\81[\83v */\r
+               /* シーケンス番号を見つけるループ */\r
                DoPrintf("Analize OTP");\r
                DoPrintf("%s", Pos);\r
-               Sts = FAIL;\r
+               Sts = FFFTP_FAIL;\r
                while((Pos = GetNextField(Pos)) != NULL)\r
                {\r
                        if(IsDigit(*Pos))\r
@@ -1502,9 +1642,9 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
                                /* Seed */\r
                                if((Pos = GetNextField(Pos)) != NULL)\r
                                {\r
-                                       if(GetOneField(Pos, Seed, MAX_SEED_LEN) == SUCCESS)\r
+                                       if(GetOneField(Pos, Seed, MAX_SEED_LEN) == FFFTP_SUCCESS)\r
                                        {\r
-                                               /* Seed\82Í\89p\90\94\8e\9a\82Ì\82Ý\97L\8cø\82Æ\82·\82é */\r
+                                               /* Seedは英数字のみ有効とする */\r
                                                for(i = strlen(Seed)-1; i >= 0; i--)\r
                                                {\r
                                                        if((IsAlpha(Seed[i]) == 0) && (IsDigit(Seed[i]) == 0))\r
@@ -1516,11 +1656,11 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
                                                        Make6WordPass(Seq, Seed, Pass, Type, Reply);\r
                                                        DoPrintf("Response=%s", Reply);\r
 \r
-                                                       /* \83V\81[\83P\83\93\83X\94Ô\8d\86\82Ì\83`\83F\83b\83N\82Æ\8cx\8d\90 */\r
+                                                       /* シーケンス番号のチェックと警告 */\r
                                                        if(Seq <= 10)\r
                                                                DialogBox(GetFtpInst(), MAKEINTRESOURCE(otp_notify_dlg), GetMainHwnd(), ExeEscDialogProc);\r
 \r
-                                                       Sts = SUCCESS;\r
+                                                       Sts = FFFTP_SUCCESS;\r
                                                }\r
                                        }\r
                                }\r
@@ -1528,7 +1668,7 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
                        }\r
                }\r
 \r
-               if(Sts == FAIL)\r
+               if(Sts == FFFTP_FAIL)\r
                        SetTaskMsg(MSGJPN015);\r
        }\r
        else\r
@@ -1552,15 +1692,15 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
 \r
 \r
 \r
-/*----- \83\\83P\83b\83g\82ð\90Ú\91±\82·\82é ----------------------------------------------------\r
+/*----- ソケットを接続する ----------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *host : \83z\83X\83g\96¼\r
-*              int port : \83|\81[\83g\94Ô\8d\86\r
-*              char *PreMsg : \83\81\83b\83Z\81[\83W\82Ì\91O\94¼\95\94\95ª\r
+*              char *host : ホスト名\r
+*              int port : ポート番号\r
+*              char *PreMsg : メッセージの前半部分\r
 *\r
 *      Return Value\r
-*              SOCKET \83\\83P\83b\83g\r
+*              SOCKET ソケット\r
 *----------------------------------------------------------------------------*/\r
 \r
 SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
@@ -1577,7 +1717,7 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
        SOCKS5REPLY Socks5Reply;\r
 \r
        //////////////////////////////\r
-       // \83z\83X\83g\96¼\89ð\8c\88\82Æ\90Ú\91±\82Ì\8f\80\94õ\r
+       // ホスト名解決と接続の準備\r
        //////////////////////////////\r
 \r
        Fwall = FWALL_NONE;\r
@@ -1593,17 +1733,17 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
        CurSockAddr.sin_family = AF_INET;\r
        if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
        {\r
-               // \83z\83X\83g\96¼\82ª\8ew\92è\82³\82ê\82½\r
-               // \83z\83X\83g\96¼\82©\82ç\83A\83h\83\8c\83X\82ð\8b\81\82ß\82é\r
+               // ホスト名が指定された\r
+               // ホスト名からアドレスを求める\r
                if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) &&\r
                   (FwallResolv == YES))\r
                {\r
-                       // \83z\83X\83g\96¼\89ð\8c\88\82ÍSOCKS\83T\81[\83o\82É\94C\82¹\82é\r
+                       // ホスト名解決はSOCKSサーバに任せる\r
                        pHostEntry = NULL;\r
                }\r
                else\r
                {\r
-                       // \83A\83h\83\8c\83X\82ð\8eæ\93¾\r
+                       // アドレスを取得\r
                        SetTaskMsg(MSGJPN016, DomainName);\r
                        pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
                }\r
@@ -1632,8 +1772,8 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
        {\r
-               // SOCKS\82ð\8eg\82¤\r
-               // SOCKS\82É\90Ú\91±\82·\82é\8f\80\94õ\r
+               // SOCKSを使う\r
+               // SOCKSに接続する準備\r
                if(Fwall == FWALL_SOCKS4)\r
                {\r
                        Socks4Cmd.Ver = SOCKS4_VER;\r
@@ -1662,17 +1802,17 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
                SocksSockAddr.sin_port = htons((u_short)FwallPort);\r
                SocksSockAddr.sin_family = AF_INET;\r
                SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port));\r
-               // connect\82Å\90Ú\91±\82·\82é\90æ\82ÍSOCKS\83T\81[\83o\r
+               // connectで接続する先はSOCKSサーバ\r
                memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
        }\r
        else\r
        {\r
-               // connect\82Å\90Ú\91±\82·\82é\82Ì\82Í\90Ú\91±\90æ\82Ì\83z\83X\83g\r
+               // connectで接続するのは接続先のホスト\r
                memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
        }\r
 \r
        /////////////\r
-       // \90Ú\91±\8eÀ\8ds\r
+       // 接続実行\r
        /////////////\r
 \r
        if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
@@ -1682,8 +1822,8 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
                        if(Fwall == FWALL_SOCKS4)\r
                        {\r
                                Socks4Reply.Result = -1;\r
-                               if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) ||\r
-                                  (Socks4GetCmdReply(sSocket, &Socks4Reply) != SUCCESS) || \r
+                               if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+                                  (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || \r
                                   (Socks4Reply.Result != SOCKS4_RES_OK))\r
                                {\r
                                        SetTaskMsg(MSGJPN023, Socks4Reply.Result);\r
@@ -1693,15 +1833,15 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
                        }\r
                        else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
                        {\r
-                               if(Socks5SelMethod(sSocket, CancelCheckWork) == FAIL)\r
+                               if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
                                        DoClose(sSocket);\r
                                        sSocket = INVALID_SOCKET;\r
                                }\r
 \r
                                Socks5Reply.Result = -1;\r
-                               if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) ||\r
-                                  (Socks5GetCmdReply(sSocket, &Socks5Reply) != SUCCESS) || \r
+                               if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+                                  (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || \r
                                   (Socks5Reply.Result != SOCKS5_RES_OK))\r
                                {\r
                                        SetTaskMsg(MSGJPN024, Socks5Reply.Result);\r
@@ -1717,7 +1857,7 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
                else\r
                {\r
 //#pragma aaa\r
-                       SetTaskMsg(MSGJPN026/*"\90Ú\91±\82Å\82«\82Ü\82¹\82ñ(2) %x", sSocket*/);\r
+                       SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/);\r
                        DoClose(sSocket);\r
                        sSocket = INVALID_SOCKET;\r
                }\r
@@ -1729,13 +1869,13 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- \83\8a\83b\83X\83\93\83\\83P\83b\83g\82ð\8eæ\93¾ ------------------------------------------------\r
+/*----- リッスンソケットを取得 ------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET ctrl_skt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
+*              SOCKET ctrl_skt : コントロールソケット\r
 *\r
 *      Return Value\r
-*              SOCKET \83\8a\83b\83X\83\93\83\\83P\83b\83g\r
+*              SOCKET リッスンソケット\r
 *----------------------------------------------------------------------------*/\r
 \r
 SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)\r
@@ -1761,7 +1901,7 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
        {\r
                if(Fwall == FWALL_SOCKS4)\r
                {\r
-                       /*===== SOCKS4\82ð\8eg\82¤ =====*/\r
+                       /*===== SOCKS4を使う =====*/\r
                        DoPrintf("Use SOCKS4 BIND");\r
                        if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
@@ -1773,8 +1913,8 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
                                Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
 \r
                                Socks4Reply.Result = -1;\r
-                               if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) ||\r
-                                  (Socks4GetCmdReply(listen_skt, &Socks4Reply) != SUCCESS) || \r
+                               if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+                                  (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || \r
                                   (Socks4Reply.Result != SOCKS4_RES_OK))\r
                                {\r
                                        SetTaskMsg(MSGJPN028, Socks4Reply.Result);\r
@@ -1791,11 +1931,11 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
                }\r
                else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
                {\r
-                       /*===== SOCKS5\82ð\8eg\82¤ =====*/\r
+                       /*===== SOCKS5を使う =====*/\r
                        DoPrintf("Use SOCKS5 BIND");\r
                        if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
-                               if(Socks5SelMethod(listen_skt, CancelCheckWork) == FAIL)\r
+                               if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
                                        DoClose(listen_skt);\r
                                        listen_skt = INVALID_SOCKET;\r
@@ -1805,8 +1945,8 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
                                Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
 \r
                                Socks5Reply.Result = -1;\r
-                               if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) ||\r
-                                  (Socks5GetCmdReply(listen_skt, &Socks5Reply) != SUCCESS) || \r
+                               if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+                                  (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || \r
                                   (Socks5Reply.Result != SOCKS5_RES_OK))\r
                                {\r
                                        SetTaskMsg(MSGJPN029, Socks5Reply.Result);\r
@@ -1823,7 +1963,7 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
                }\r
                else\r
                {\r
-                       /*===== SOCKS\82ð\8eg\82í\82È\82¢ =====*/\r
+                       /*===== SOCKSを使わない =====*/\r
                        DoPrintf("Use normal BIND");\r
                        saCtrlAddr.sin_port = htons(0);\r
                        saCtrlAddr.sin_family = AF_INET;\r
@@ -1890,13 +2030,13 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82Ö\90Ú\91±\8f\88\97\9d\92\86\82©\82Ç\82¤\82©\82ð\95Ô\82·---------------------------------------\r
+/*----- ホストへ接続処理中かどうかを返す---------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
+*              int ステータス\r
 *                      YES/NO\r
 *----------------------------------------------------------------------------*/\r
 \r
@@ -1907,10 +2047,10 @@ int AskTryingConnect(void)
 \r
 \r
 #if 0\r
-///*----- \83u\83\8d\83b\83L\83\93\83O\83R\81[\83\8b\82Ì\83t\83b\83N\83R\81[\83\8b\83o\83b\83N --------------------------------\r
+///*----- ブロッキングコールのフックコールバック --------------------------------\r
 //*\r
 //*    Parameter\r
-//*            \82È\82µ\r
+//*            なし\r
 //*\r
 //*    Return Value\r
 //*            BOOL FALSE\r
@@ -1932,18 +2072,18 @@ int AskTryingConnect(void)
 \r
 \r
 \r
-/*----- SOCKS5\82Ì\83R\83}\83\93\83h\83p\83P\83b\83g\82ð\8dì\90¬\82·\82é ------------------------------------\r
+/*----- SOCKS5のコマンドパケットを作成する ------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKS5REQUEST *Packet : \83p\83P\83b\83g\82ð\8dì\90¬\82·\82é\83\8f\81[\83N\r
-*              char Cmd : \83R\83}\83\93\83h\r
-*              int ValidIP : IP\83A\83h\83\8c\83X\82ð\8eg\82¤\82©\82Ç\82¤\82©(YES/NO)\r
-*              ulong IP : IP\83A\83h\83\8c\83X\r
-*              char *Host : \83z\83X\83g\96¼\r
-*              ushort Port : \83|\81[\83g\r
+*              SOCKS5REQUEST *Packet : パケットを作成するワーク\r
+*              char Cmd : コマンド\r
+*              int ValidIP : IPアドレスを使うかどうか(YES/NO)\r
+*              ulong IP : IPアドレス\r
+*              char *Host : ホスト名\r
+*              ushort Port : ポート\r
 *\r
 *      Return Value\r
-*              int \83R\83}\83\93\83h\83p\83P\83b\83g\82Ì\92·\82³\r
+*              int コマンドパケットの長さ\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port)\r
@@ -1954,14 +2094,14 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo
 \r
        Pos = (uchar *)Packet;\r
        Pos += SOCKS5REQUEST_SIZE;\r
-       TotalLen = SOCKS5REQUEST_SIZE + 2;      /* +2\82Í\83|\81[\83g\82Ì\95ª */\r
+       TotalLen = SOCKS5REQUEST_SIZE + 2;      /* +2はポートの分 */\r
 \r
        Packet->Ver = SOCKS5_VER;\r
        Packet->Cmd = Cmd;\r
        Packet->Rsv = 0;\r
        if(ValidIP == YES)\r
        {\r
-               /* IP\83A\83h\83\8c\83X\82ð\8ew\92è */\r
+               /* IPアドレスを指定 */\r
                Packet->Type = SOCKS5_ADRS_IPV4;\r
                *((ulong *)Pos) = IP;\r
                Pos += 4;\r
@@ -1969,7 +2109,7 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo
        }\r
        else\r
        {\r
-               /* \83z\83X\83g\96¼\82ð\8ew\92è */\r
+               /* ホスト名を指定 */\r
                Packet->Type = SOCKS5_ADRS_NAME;\r
                Len = strlen(Host);\r
                *Pos++ = Len;\r
@@ -1983,15 +2123,15 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo
 }\r
 \r
 \r
-/*----- SOCKS\82Ì\83R\83}\83\93\83h\82ð\91\97\82é -------------------------------------------------\r
+/*----- SOCKSのコマンドを送る -------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Socket : \83\\83P\83b\83g\r
-*              void *Data : \91\97\82é\83f\81[\83^\r
-*              int Size : \83T\83C\83Y\r
+*              SOCKET Socket : ソケット\r
+*              void *Data : 送るデータ\r
+*              int Size : サイズ\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
+*              int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork)\r
@@ -2000,21 +2140,21 @@ static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWor
 \r
        Ret = SendData(Socket, (char *)Data, Size, 0, CancelCheckWork);\r
 \r
-       if(Ret != SUCCESS)\r
+       if(Ret != FFFTP_SUCCESS)\r
                SetTaskMsg(MSGJPN033, *((short *)Data));\r
 \r
        return(Ret);\r
 }\r
 \r
 \r
-/*----- SOCKS5\82Ì\83R\83}\83\93\83h\82É\91Î\82·\82é\83\8a\83v\83\89\83C\83p\83P\83b\83g\82ð\8eó\90M\82·\82é --------------------\r
+/*----- SOCKS5のコマンドに対するリプライパケットを受信する --------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Socket : \83\\83P\83b\83g\r
-*              SOCKS5REPLY *Packet : \83p\83P\83b\83g\r
+*              SOCKET Socket : ソケット\r
+*              SOCKS5REPLY *Packet : パケット\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
+*              int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet)\r
@@ -2026,7 +2166,7 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet)
        Pos = (uchar *)Packet;\r
        Pos += SOCKS5REPLY_SIZE;\r
 \r
-       if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == SUCCESS)\r
+       if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS)\r
        {\r
                if(Packet->Type == SOCKS5_ADRS_IPV4)\r
                        Len = 4 + 2;\r
@@ -2034,32 +2174,32 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet)
                        Len = 6 + 2;\r
                else\r
                {\r
-                       if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == SUCCESS)\r
+                       if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS)\r
                        {\r
                                Len = *Pos + 2;\r
                                Pos++;\r
                        }\r
                }\r
 \r
-               if(Ret == SUCCESS)\r
+               if(Ret == FFFTP_SUCCESS)\r
                        Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg);\r
        }\r
 \r
-       if(Ret != SUCCESS)\r
+       if(Ret != FFFTP_SUCCESS)\r
                SetTaskMsg(MSGJPN034);\r
 \r
        return(Ret);\r
 }\r
 \r
 \r
-/*----- SOCKS4\82Ì\83R\83}\83\93\83h\82É\91Î\82·\82é\83\8a\83v\83\89\83C\83p\83P\83b\83g\82ð\8eó\90M\82·\82é --------------------\r
+/*----- SOCKS4のコマンドに対するリプライパケットを受信する --------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Socket : \83\\83P\83b\83g\r
-*              SOCKS5REPLY *Packet : \83p\83P\83b\83g\r
+*              SOCKET Socket : ソケット\r
+*              SOCKS5REPLY *Packet : パケット\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
+*              int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet)\r
@@ -2068,20 +2208,20 @@ static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet)
 \r
        Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg);\r
 \r
-       if(Ret != SUCCESS)\r
+       if(Ret != FFFTP_SUCCESS)\r
                DoPrintf(MSGJPN035);\r
 \r
        return(Ret);\r
 }\r
 \r
 \r
-/*----- SOCKS5\82Ì\94F\8fØ\82ð\8ds\82¤ ----------------------------------------------------\r
+/*----- SOCKS5の認証を行う ----------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Socket : \83\\83P\83b\83g\r
+*              SOCKET Socket : ソケット\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
+*              int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork)\r
@@ -2094,7 +2234,7 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork)
        int Len;\r
        int Len2;\r
 \r
-       Ret = SUCCESS;\r
+       Ret = FFFTP_SUCCESS;\r
        Socks5Method.Ver = SOCKS5_VER;\r
        Socks5Method.Num = 1;\r
        if(FwallType == FWALL_SOCKS5_NOAUTH)\r
@@ -2102,12 +2242,12 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork)
        else\r
                Socks5Method.Methods[0] = SOCKS5_AUTH_USER;\r
 \r
-       if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != SUCCESS) ||\r
-          (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != SUCCESS) ||\r
+       if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+          (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
           (Socks5MethodReply.Method == (uchar)0xFF))\r
        {\r
                SetTaskMsg(MSGJPN036);\r
-               Ret = FAIL;\r
+               Ret = FFFTP_FAIL;\r
        }\r
        else if(Socks5MethodReply.Method == SOCKS5_AUTH_USER)\r
        {\r
@@ -2120,12 +2260,12 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork)
                Buf[2 + Len] = Len2;\r
                strcpy(Buf+3+Len, FwallPass);\r
 \r
-               if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != SUCCESS) ||\r
-                  (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != SUCCESS) ||\r
+               if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+                  (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
                   (Socks5Status.Status != 0))\r
                {\r
                        SetTaskMsg(MSGJPN037);\r
-                       Ret = FAIL;\r
+                       Ret = FFFTP_FAIL;\r
                }\r
        }\r
        else\r
@@ -2135,14 +2275,14 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- SOCKS\82ÌBIND\82Ì\91æ\82Q\83\8a\83v\83\89\83C\83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82é -------------------------\r
+/*----- SOCKSのBINDの第2リプライメッセージを受け取る -------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Socket : \83\\83P\83b\83g\r
-*              SOCKET *Data : \83f\81[\83^\83\\83P\83b\83g\82ð\95Ô\82·\83\8f\81[\83N\r
+*              SOCKET Socket : ソケット\r
+*              SOCKET *Data : データソケットを返すワーク\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
+*              int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data)\r
@@ -2150,31 +2290,36 @@ int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data)
        int Ret;\r
        char Buf[300];\r
 \r
-       Ret = FAIL;\r
+       Ret = FFFTP_FAIL;\r
        if((AskHostFireWall() == YES) && (FwallType == FWALL_SOCKS4))\r
        {\r
                Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf);\r
                *Data = Socket;\r
-               Ret = SUCCESS;\r
+               Ret = FFFTP_SUCCESS;\r
        }\r
        else if((AskHostFireWall() == YES) &&\r
                        ((FwallType == FWALL_SOCKS5_NOAUTH) || (FwallType == FWALL_SOCKS5_USER)))\r
        {\r
                Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf);\r
                *Data = Socket;\r
-               Ret = SUCCESS;\r
+               Ret = FFFTP_SUCCESS;\r
        }\r
        return(Ret);\r
 }\r
 \r
 \r
 \r
-// \88Ã\8d\86\89»\92Ê\90M\91Î\89\9e\r
+// 暗号化通信対応\r
 int AskCryptMode(void)\r
 {\r
        return(CurHost.CryptMode);\r
 }\r
 \r
+int AskUseNoEncryption(void)\r
+{\r
+       return(CurHost.UseNoEncryption);\r
+}\r
+\r
 int AskUseFTPES(void)\r
 {\r
        return(CurHost.UseFTPES);\r
@@ -2190,3 +2335,32 @@ int AskUseSFTP(void)
        return(CurHost.UseSFTP);\r
 }\r
 \r
+char *AskPrivateKey(void)\r
+{\r
+       return(CurHost.PrivateKey);\r
+}\r
+\r
+// 同時接続対応\r
+int AskMaxThreadCount(void)\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
+// IPv6対応\r
+int AskUseIPv6(void)\r
+{\r
+       return(CurHost.UseIPv6);\r
+}\r
+\r