OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / connect.c
index 8742594..88c33e3 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -38,6 +38,8 @@
 // IPv6対応\r
 //#include <winsock.h>\r
 #include <winsock2.h>\r
+// 切断対策\r
+#include <mstcpip.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
@@ -97,11 +99,15 @@ extern int FwallPort;
 extern int FwallType;\r
 extern int FwallDefault;\r
 extern int FwallSecurity;\r
-extern int FwallResolv;\r
+extern int FwallResolve;\r
 extern int FwallLower;\r
 extern int FwallDelimiter;\r
 extern int PasvDefault;\r
 extern int QuickAnonymous;\r
+// 切断対策\r
+extern int TimeOut;\r
+// UPnP対応\r
+extern int UPnPEnabled;\r
 \r
 /*===== ローカルなワーク =====*/\r
 \r
@@ -116,11 +122,6 @@ static HOSTDATA CurHost;
 // IPv6対応\r
 //static struct sockaddr_in SocksSockAddr;     /* SOCKSサーバのアドレス情報 */\r
 //static struct sockaddr_in CurSockAddr;               /* 接続先ホストのアドレス情報 */\r
-static struct sockaddr_in SocksSockAddrIPv4;   /* SOCKSサーバのアドレス情報 */\r
-static struct sockaddr_in CurSockAddrIPv4;             /* 接続先ホストのアドレス情報 */\r
-static struct sockaddr_in6 SocksSockAddrIPv6;  /* SOCKSサーバのアドレス情報 */\r
-static struct sockaddr_in6 CurSockAddrIPv6;            /* 接続先ホストのアドレス情報 */\r
-static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};\r
 \r
 static int UseIPadrs;\r
 static char DomainName[HOST_ADRS_LEN+1];\r
@@ -203,28 +204,28 @@ void ConnectProc(int Type, int Num)
                                        if(CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO)\r
                                        {\r
                                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                                                       SetHostExcryption(AskCurrentHost(), CurHost.UseNoEncryption, CurHost.UseFTPES, NO, NO);\r
+                                                       SetHostEncryption(AskCurrentHost(), CurHost.UseNoEncryption, CurHost.UseFTPES, NO, NO);\r
                                        }\r
                                        break;\r
                                case CRYPT_FTPES:\r
                                        if(CurHost.UseNoEncryption != NO || CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO)\r
                                        {\r
                                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                                                       SetHostExcryption(AskCurrentHost(), NO, CurHost.UseFTPES, NO, NO);\r
+                                                       SetHostEncryption(AskCurrentHost(), NO, CurHost.UseFTPES, NO, NO);\r
                                        }\r
                                        break;\r
                                case CRYPT_FTPIS:\r
                                        if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseSFTP != NO)\r
                                        {\r
                                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                                                       SetHostExcryption(AskCurrentHost(), NO, NO, CurHost.UseFTPIS, NO);\r
+                                                       SetHostEncryption(AskCurrentHost(), NO, NO, CurHost.UseFTPIS, NO);\r
                                        }\r
                                        break;\r
                                case CRYPT_SFTP:\r
                                        if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseFTPIS != NO)\r
                                        {\r
                                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                                                       SetHostExcryption(AskCurrentHost(), NO, NO, NO, CurHost.UseSFTP);\r
+                                                       SetHostEncryption(AskCurrentHost(), NO, NO, NO, CurHost.UseSFTP);\r
                                        }\r
                                        break;\r
                                }\r
@@ -234,6 +235,27 @@ void ConnectProc(int Type, int Num)
                                {\r
                                        if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
                                                CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                                       switch(CurHost.CurNameKanjiCode)\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN345);\r
+                                               break;\r
+                                       case KANJI_JIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN346);\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN347);\r
+                                               break;\r
+                                       case KANJI_UTF8N:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN348);\r
+                                               break;\r
+                                       case KANJI_UTF8HFSX:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN349);\r
+                                               break;\r
+                                       default:\r
+                                               SetTaskMsg(MSGJPN344);\r
+                                               break;\r
+                                       }\r
                                }\r
 \r
                                strcpy(TitleHostName, CurHost.HostName);\r
@@ -327,6 +349,27 @@ void QuickConnectProc(void)
                                {\r
                                        if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
                                                CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                                       switch(CurHost.CurNameKanjiCode)\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN345);\r
+                                               break;\r
+                                       case KANJI_JIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN346);\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN347);\r
+                                               break;\r
+                                       case KANJI_UTF8N:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN348);\r
+                                               break;\r
+                                       case KANJI_UTF8HFSX:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN349);\r
+                                               break;\r
+                                       default:\r
+                                               SetTaskMsg(MSGJPN344);\r
+                                               break;\r
+                                       }\r
                                }\r
 \r
                                strcpy(TitleHostName, CurHost.HostAdrs);\r
@@ -515,6 +558,27 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
                        {\r
                                if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
                                        CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                               switch(CurHost.CurNameKanjiCode)\r
+                               {\r
+                               case KANJI_SJIS:\r
+                                       SetTaskMsg(MSGJPN343, MSGJPN345);\r
+                                       break;\r
+                               case KANJI_JIS:\r
+                                       SetTaskMsg(MSGJPN343, MSGJPN346);\r
+                                       break;\r
+                               case KANJI_EUC:\r
+                                       SetTaskMsg(MSGJPN343, MSGJPN347);\r
+                                       break;\r
+                               case KANJI_UTF8N:\r
+                                       SetTaskMsg(MSGJPN343, MSGJPN348);\r
+                                       break;\r
+                               case KANJI_UTF8HFSX:\r
+                                       SetTaskMsg(MSGJPN343, MSGJPN349);\r
+                                       break;\r
+                               default:\r
+                                       SetTaskMsg(MSGJPN344);\r
+                                       break;\r
+                               }\r
                        }\r
 \r
                        strcpy(TitleHostName, CurHost.HostAdrs);\r
@@ -605,6 +669,27 @@ void HistoryConnectProc(int MenuCmd)
                                {\r
                                        if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
                                                CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                                       switch(CurHost.CurNameKanjiCode)\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN345);\r
+                                               break;\r
+                                       case KANJI_JIS:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN346);\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN347);\r
+                                               break;\r
+                                       case KANJI_UTF8N:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN348);\r
+                                               break;\r
+                                       case KANJI_UTF8HFSX:\r
+                                               SetTaskMsg(MSGJPN343, MSGJPN349);\r
+                                               break;\r
+                                       default:\r
+                                               SetTaskMsg(MSGJPN344);\r
+                                               break;\r
+                                       }\r
                                }\r
 \r
                                strcpy(TitleHostName, CurHost.HostAdrs);\r
@@ -773,10 +858,18 @@ int AskHostNameKanji(void)
 \r
 int AskHostNameKana(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.NameKanaCnv);\r
+       // 同時接続対応\r
+//     return(CurHost.NameKanaCnv);\r
+       return(TmpHost.NameKanaCnv);\r
 }\r
 \r
 \r
@@ -791,13 +884,21 @@ int AskHostNameKana(void)
 \r
 int AskListCmdMode(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(CurHost.HostType == HTYPE_VMS)\r
                return(YES);\r
        else\r
        {\r
                if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-                       CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
-               return(CurHost.ListCmdOnly);\r
+                       // 同時接続対応\r
+//                     CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+                       CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
+               // 同時接続対応\r
+//             return(CurHost.ListCmdOnly);\r
+               return(TmpHost.ListCmdOnly);\r
        }\r
 }\r
 \r
@@ -813,10 +914,18 @@ int AskListCmdMode(void)
 \r
 int AskUseNLST_R(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.UseNLST_R);\r
+       // 同時接続対応\r
+//     return(CurHost.UseNLST_R);\r
+       return(TmpHost.UseNLST_R);\r
 }\r
 \r
 \r
@@ -831,10 +940,18 @@ int AskUseNLST_R(void)
 \r
 char *AskHostChmodCmd(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.ChmodCmd);\r
+       // 同時接続対応\r
+//     return(CurHost.ChmodCmd);\r
+       return(TmpHost.ChmodCmd);\r
 }\r
 \r
 \r
@@ -849,10 +966,18 @@ char *AskHostChmodCmd(void)
 \r
 int AskHostTimeZone(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.TimeZone);\r
+       // 同時接続対応\r
+//     return(CurHost.TimeZone);\r
+       return(TmpHost.TimeZone);\r
 }\r
 \r
 \r
@@ -882,10 +1007,18 @@ int AskPasvMode(void)
 \r
 char *AskHostLsName(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.LsName);\r
+       // 同時接続対応\r
+//     return(CurHost.LsName);\r
+       return(TmpHost.LsName);\r
 }\r
 \r
 \r
@@ -900,8 +1033,14 @@ char *AskHostLsName(void)
 \r
 int AskHostType(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
 #if defined(HAVE_TANDEM)\r
        /* OSS ファイルシステムは UNIX ファイルシステムと同じでいいので AUTO を返す\r
@@ -911,7 +1050,9 @@ int AskHostType(void)
                return(HTYPE_AUTO);\r
 #endif\r
 \r
-       return(CurHost.HostType);\r
+       // 同時接続対応\r
+//     return(CurHost.HostType);\r
+       return(TmpHost.HostType);\r
 }\r
 \r
 \r
@@ -980,13 +1121,19 @@ void SaveCurrentSetToHost(void)
        int Host;\r
        char LocDir[FMAX_PATH+1];\r
        char HostDir[FMAX_PATH+1];\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
 \r
        if(TrnCtrlSocket != INVALID_SOCKET)\r
        {\r
                if((Host = AskCurrentHost()) != HOSTNUM_NOENTRY)\r
                {\r
-                       CopyHostFromListInConnect(Host, &CurHost);\r
-                       if(CurHost.LastDir == YES)\r
+                       // 同時接続対応\r
+//                     CopyHostFromListInConnect(Host, &CurHost);\r
+//                     if(CurHost.LastDir == YES)\r
+                       CopyHostFromListInConnect(Host, &TmpHost);\r
+                       if(TmpHost.LastDir == YES)\r
                        {\r
                                AskLocalCurDir(LocDir, FMAX_PATH);\r
                                AskRemoteCurDir(HostDir, FMAX_PATH);\r
@@ -1047,13 +1194,19 @@ int ReConnectCmdSkt(void)
        int Sts;\r
 \r
 \r
-       if(CmdCtrlSocket != TrnCtrlSocket)\r
-               do_closesocket(TrnCtrlSocket);\r
-       TrnCtrlSocket = INVALID_SOCKET;\r
+       // 同時接続対応\r
+//     if(CmdCtrlSocket != TrnCtrlSocket)\r
+//             do_closesocket(TrnCtrlSocket);\r
+//     TrnCtrlSocket = INVALID_SOCKET;\r
+       if(CmdCtrlSocket == TrnCtrlSocket)\r
+               TrnCtrlSocket = INVALID_SOCKET;\r
 \r
        Sts = ReConnectSkt(&CmdCtrlSocket);\r
 \r
-       TrnCtrlSocket = CmdCtrlSocket;\r
+       // 同時接続対応\r
+//     TrnCtrlSocket = CmdCtrlSocket;\r
+       if(TrnCtrlSocket == INVALID_SOCKET)\r
+               TrnCtrlSocket = CmdCtrlSocket;\r
 \r
        return(Sts);\r
 }\r
@@ -1217,6 +1370,7 @@ void SktShareProh(void)
 //             ReConnectSkt(&CmdCtrlSocket);\r
                if(CurHost.ReuseCmdSkt == YES)\r
                {\r
+                       CurHost.ReuseCmdSkt = NO;\r
                        CmdCtrlSocket = INVALID_SOCKET;\r
                        ReConnectSkt(&CmdCtrlSocket);\r
                }\r
@@ -1350,10 +1504,18 @@ int AskConnecting(void)
 \r
 int AskRealHostType(void)\r
 {\r
+       // 同時接続対応\r
+       HOSTDATA TmpHost;\r
+       TmpHost = CurHost;\r
+\r
        if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
-               CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               // 同時接続対応\r
+//             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+               CopyHostFromListInConnect(AskCurrentHost(), &TmpHost);\r
 \r
-       return(CurHost.HostType);\r
+       // 同時接続対応\r
+//     return(CurHost.HostType);\r
+       return(TmpHost.HostType);\r
 }\r
 \r
 /*----- OSS ファイルシステムにアクセスしているかどうかのフラグを変更する ------\r
@@ -1442,6 +1604,8 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
        static const char *SiteTbl[4] = { "SITE", "site", "OPEN", "open" };\r
        char TmpBuf[ONELINE_BUF_SIZE];\r
        struct linger LingerOpt;\r
+       struct tcp_keepalive KeepAlive;\r
+       DWORD dwTmp;\r
 \r
        // 暗号化通信対応\r
        ContSock = INVALID_SOCKET;\r
@@ -1489,7 +1653,7 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
 //                                     ;\r
                                if(CryptMode == CRYPT_FTPIS)\r
                                {\r
-                                       if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork))\r
+                                       if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork, HostData->NoWeakEncryption))\r
                                        {\r
                                                while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM)\r
                                                        ;\r
@@ -1515,6 +1679,15 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                                        Flg = 1;\r
                                        if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
                                                ReportWSError("setsockopt", WSAGetLastError());\r
+                                       // 切断対策\r
+                                       if(TimeOut > 0)\r
+                                       {\r
+                                               KeepAlive.onoff = 1;\r
+                                               KeepAlive.keepalivetime = TimeOut * 1000;\r
+                                               KeepAlive.keepaliveinterval = 1000;\r
+                                               if(WSAIoctl(ContSock, SIO_KEEPALIVE_VALS, &KeepAlive, sizeof(struct tcp_keepalive), NULL, 0, &dwTmp, NULL, NULL) == SOCKET_ERROR)\r
+                                                       ReportWSError("WSAIoctl", WSAGetLastError());\r
+                                       }\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
@@ -1605,9 +1778,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                                                                // FTPES対応\r
                                                                if(CryptMode == CRYPT_FTPES)\r
                                                                {\r
-                                                                       if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234)\r
+                                                                       if(IsOpenSSLLoaded() && ((Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234 || (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH SSL")) == 234))\r
                                                                        {\r
-                                                                               if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork))\r
+                                                                               if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork, HostData->NoWeakEncryption))\r
                                                                                {\r
                                                                                        if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200)\r
                                                                                        {\r
@@ -1766,73 +1939,23 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                                // IPv6対応\r
                                if(strstr(Reply, " EPRT ") || strstr(Reply, " EPSV "))\r
                                        HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV;\r
+                               // ホスト側の日時取得\r
+                               if(strstr(Reply, " MDTM "))\r
+                                       HostData->Feature |= FEATURE_MDTM;\r
+                               // ホスト側の日時設定\r
+                               if(strstr(Reply, " MFMT "))\r
+                                       HostData->Feature |= FEATURE_MFMT;\r
                        }\r
                        // UTF-8対応\r
                        if(HostData->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8))\r
                        {\r
-                               if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200)\r
-                                       HostData->CurNameKanjiCode = KANJI_UTF8N;\r
+                               // UTF-8を指定した場合も自動判別を行う\r
+//                             if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200)\r
+//                                     HostData->CurNameKanjiCode = KANJI_UTF8N;\r
+                               command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON");\r
                        }\r
                }\r
        }\r
-       else if(CryptMode == CRYPT_SFTP)\r
-       {\r
-               // TODO:\r
-               // テストコード\r
-               // ログイン成功を確認\r
-#define strrcmp(_Str1, _Str2) (strcmp(strstr(_Str1, _Str2) ? strstr(_Str1, _Str2) : "", _Str2))\r
-               size_t r;\r
-               ContSock = SFTP_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\r
-               SFTP_SetTimeoutCallback(ContSock, SSLTimeoutCallback);\r
-               while(1)\r
-               {\r
-                       r = SFTP_recv(ContSock, Reply, 1024, 0);\r
-                       if(r == SOCKET_ERROR)\r
-                               break;\r
-                       if(r <= 0)\r
-                               continue;\r
-                       Reply[r] = '\0';\r
-                       SetTaskMsg("%s", Reply);\r
-                       if(strrcmp(Reply, "psftp> ") == 0)\r
-                               break;\r
-               }\r
-               r = SFTP_send(ContSock, "open \"", strlen("open \""), 0);\r
-               r = SFTP_send(ContSock, Host, strlen(Host), 0);\r
-               r = SFTP_send(ContSock, "\"\r\n", strlen("\"\r\n"), 0);\r
-               while(1)\r
-               {\r
-                       r = SFTP_recv(ContSock, Reply, 1024, 0);\r
-                       if(r == SOCKET_ERROR)\r
-                               break;\r
-                       if(r <= 0)\r
-                               continue;\r
-                       Reply[r] = '\0';\r
-                       SetTaskMsg("%s", Reply);\r
-                       if(strrcmp(Reply, "Store key in cache? (y/n) ") == 0)\r
-                       {\r
-                               r = SFTP_send(ContSock, "n\r\n", strlen("n\r\n"), 0);\r
-                       }\r
-                       if(strrcmp(Reply, "Update cached key? (y/n, Return cancels connection) ") == 0)\r
-                       {\r
-                               r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0);\r
-                       }\r
-                       if(strrcmp(Reply, "login as: ") == 0)\r
-                       {\r
-                               r = SFTP_send(ContSock, User, strlen(User), 0);\r
-                               r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0);\r
-                       }\r
-                       if(strrcmp(Reply, "password: ") == 0)\r
-                       {\r
-                               r = SFTP_send(ContSock, Pass, strlen(Pass), 0);\r
-                               r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0);\r
-                       }\r
-                       if(strrcmp(Reply, "psftp> ") == 0)\r
-                               break;\r
-                       Sleep(1);\r
-               }\r
-               SFTP_closesocket(ContSock);\r
-               ContSock = INVALID_SOCKET;\r
-       }\r
 \r
        return(ContSock);\r
 }\r
@@ -1844,12 +1967,6 @@ static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass,
        SOCKET ContSock;\r
        ContSock = INVALID_SOCKET;\r
        *CancelCheckWork = NO;\r
-       if(*CancelCheckWork == 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, CancelCheckWork)) != INVALID_SOCKET)\r
-                       HostData->CryptMode = CRYPT_SFTP;\r
-       }\r
        if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES)\r
        {\r
                SetTaskMsg(MSGJPN316);\r
@@ -1923,7 +2040,7 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type)
        if((Type == MD4) || (Type == MD5) || (Type == SHA1))\r
        {\r
                /* シーケンス番号を見つけるループ */\r
-               DoPrintf("Analize OTP");\r
+               DoPrintf("Analyze OTP");\r
                DoPrintf("%s", Pos);\r
                Sts = FFFTP_FAIL;\r
                while((Pos = GetNextField(Pos)) != NULL)\r
@@ -2119,6 +2236,9 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
 //SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 {\r
+       // IPv6対応\r
+       struct sockaddr_in SocksSockAddr;       /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in CurSockAddr;         /* 接続先ホストのアドレス情報 */\r
        struct sockaddr_in saSockAddr;\r
        char HostEntry[MAXGETHOSTSTRUCT];\r
        struct hostent *pHostEntry;\r
@@ -2142,20 +2262,15 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        UseIPadrs = YES;\r
        strcpy(DomainName, host);\r
-       // IPv6対応\r
-//     memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
-//     CurSockAddr.sin_port = htons((u_short)port);\r
-//     CurSockAddr.sin_family = AF_INET;\r
-//     if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
-       memset(&CurSockAddrIPv4, 0, sizeof(CurSockAddrIPv4));\r
-       CurSockAddrIPv4.sin_port = htons((u_short)port);\r
-       CurSockAddrIPv4.sin_family = AF_INET;\r
-       if((CurSockAddrIPv4.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
+       memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+       CurSockAddr.sin_port = htons((u_short)port);\r
+       CurSockAddr.sin_family = AF_INET;\r
+       if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
        {\r
                // ホスト名が指定された\r
                // ホスト名からアドレスを求める\r
                if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) &&\r
-                  (FwallResolv == YES))\r
+                  (FwallResolve == YES))\r
                {\r
                        // ホスト名解決はSOCKSサーバに任せる\r
                        pHostEntry = NULL;\r
@@ -2173,13 +2288,10 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
                if(pHostEntry != NULL)\r
                {\r
+                       memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        // IPv6対応\r
-//                     memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
 //                     SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
-                       memcpy((char *)&CurSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
-                       // IPv6対応\r
-//                     SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port));\r
-                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
                }\r
                else\r
                {\r
@@ -2188,7 +2300,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                                UseIPadrs = NO;\r
                                // IPv6対応\r
 //                             SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port));\r
-                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port), MSGJPN333);\r
                        }\r
                        else\r
                        {\r
@@ -2202,7 +2314,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
        else\r
                // IPv6対応\r
 //             SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
-               SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+               SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
 \r
        if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
        {\r
@@ -2212,32 +2324,23 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                {\r
                        Socks4Cmd.Ver = SOCKS4_VER;\r
                        Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT;\r
-                       // IPv6対応\r
-//                     Socks4Cmd.Port = CurSockAddr.sin_port;\r
-//                     Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
-                       Socks4Cmd.Port = CurSockAddrIPv4.sin_port;\r
-                       Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;\r
+                       Socks4Cmd.Port = CurSockAddr.sin_port;\r
+                       Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
                        strcpy(Socks4Cmd.UserID, FwallUser);\r
                        Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
                }\r
                else\r
                {\r
-                       // IPv6対応\r
-//                     Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
-                       Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);\r
+                       Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
                }\r
 \r
-               // IPv6対応\r
-//             memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
-//             if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
-               memset(&SocksSockAddrIPv4, 0, sizeof(SocksSockAddrIPv4));\r
-               if((SocksSockAddrIPv4.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
+               memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+               if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
                {\r
                        // IPv6対応\r
 //                     if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-//                             memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-                               memcpy((char *)&SocksSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                               memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        else\r
                        {\r
                                // IPv6対応\r
@@ -2246,26 +2349,18 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                                return INVALID_SOCKET;\r
                        }\r
                }\r
+               SocksSockAddr.sin_port = htons((u_short)FwallPort);\r
+               SocksSockAddr.sin_family = AF_INET;\r
                // IPv6対応\r
-//             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
-               SocksSockAddrIPv4.sin_port = htons((u_short)FwallPort);\r
-               SocksSockAddrIPv4.sin_family = AF_INET;\r
-               // IPv6対応\r
-//             SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port));\r
-               SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port), MSGJPN333);\r
+               SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port), MSGJPN333);\r
                // connectで接続する先はSOCKSサーバ\r
-               // IPv6対応\r
-//             memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
-               memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4));\r
+               memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
        }\r
        else\r
        {\r
                // connectで接続するのは接続先のホスト\r
-               // IPv6対応\r
-//             memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
-               memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4));\r
+               memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
        }\r
 \r
        /////////////\r
@@ -2274,6 +2369,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
        {\r
+               // ソケットにデータを付与\r
+               SetAsyncTableDataIPv4(sSocket, &CurSockAddr, &SocksSockAddr);\r
                if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                {\r
                        if(Fwall == FWALL_SOCKS4)\r
@@ -2346,6 +2443,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
 SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 {\r
+       struct sockaddr_in6 SocksSockAddr;      /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in6 CurSockAddr;                /* 接続先ホストのアドレス情報 */\r
        struct sockaddr_in6 saSockAddr;\r
        char HostEntry[MAXGETHOSTSTRUCT];\r
        struct hostent *pHostEntry;\r
@@ -2367,16 +2466,16 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        UseIPadrs = YES;\r
        strcpy(DomainName, host);\r
-       memset(&CurSockAddrIPv6, 0, sizeof(CurSockAddrIPv6));\r
-       CurSockAddrIPv6.sin6_port = htons((u_short)port);\r
-       CurSockAddrIPv6.sin6_family = AF_INET6;\r
-       CurSockAddrIPv6.sin6_addr = inet6_addr(host);\r
-       if(memcmp(&CurSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+       memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+       CurSockAddr.sin6_port = htons((u_short)port);\r
+       CurSockAddr.sin6_family = AF_INET6;\r
+       CurSockAddr.sin6_addr = inet6_addr(host);\r
+       if(memcmp(&CurSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
        {\r
                // ホスト名が指定された\r
                // ホスト名からアドレスを求める\r
                if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) &&\r
-                  (FwallResolv == YES))\r
+                  (FwallResolve == YES))\r
                {\r
                        // ホスト名解決はSOCKSサーバに任せる\r
                        pHostEntry = NULL;\r
@@ -2390,15 +2489,15 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
                if(pHostEntry != NULL)\r
                {\r
-                       memcpy((char *)&CurSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
-                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+                       memcpy((char *)&CurSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
                }\r
                else\r
                {\r
                        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
                        {\r
                                UseIPadrs = NO;\r
-                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
                        }\r
                        else\r
                        {\r
@@ -2408,47 +2507,48 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
                }\r
        }\r
        else\r
-               SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+               SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
 \r
        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
        {\r
                // SOCKSを使う\r
                // SOCKSに接続する準備\r
                {\r
-                       Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);\r
+                       Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
                }\r
 \r
-               memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6));\r
-               SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost);\r
-               if(memcmp(&SocksSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+               memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+               SocksSockAddr.sin6_addr = inet6_addr(FwallHost);\r
+               if(memcmp(&SocksSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
                {\r
                        if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-                               memcpy((char *)&SocksSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                               memcpy((char *)&SocksSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        else\r
                        {\r
                                SetTaskMsg(MSGJPN021, FwallHost, MSGJPN334);\r
                                return INVALID_SOCKET;\r
                        }\r
                }\r
-               SocksSockAddrIPv6.sin6_port = htons((u_short)FwallPort);\r
-               SocksSockAddrIPv6.sin6_family = AF_INET6;\r
-               SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddrIPv6.sin6_addr), ntohs(SocksSockAddrIPv6.sin6_port), MSGJPN334);\r
+               SocksSockAddr.sin6_port = htons((u_short)FwallPort);\r
+               SocksSockAddr.sin6_family = AF_INET6;\r
+               SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddr.sin6_addr), ntohs(SocksSockAddr.sin6_port), MSGJPN334);\r
                // connectで接続する先はSOCKSサーバ\r
-               memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6));\r
+               memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
        }\r
        else\r
        {\r
                // connectで接続するのは接続先のホスト\r
-               memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6));\r
+               memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
        }\r
 \r
        /////////////\r
        // 接続実行\r
        /////////////\r
 \r
-       inet6_ntoa(saSockAddr.sin6_addr);\r
        if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
        {\r
+               // ソケットにデータを付与\r
+               SetAsyncTableDataIPv6(sSocket, &CurSockAddr, &SocksSockAddr);\r
                if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                {\r
                        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
@@ -2524,6 +2624,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
 //SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)\r
 SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)\r
 {\r
+       // IPv6対応\r
+       struct sockaddr_in SocksSockAddr;       /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in CurSockAddr;         /* 接続先ホストのアドレス情報 */\r
     SOCKET listen_skt;\r
     int iLength;\r
     char *a,*p;\r
@@ -2537,6 +2640,14 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
        int Len;\r
        int Fwall;\r
 \r
+       // UPnP対応\r
+       char Adrs[16];\r
+       int Port;\r
+       char ExtAdrs[40];\r
+\r
+       // ソケットにデータを付与\r
+       GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
+\r
        Fwall = FWALL_NONE;\r
        if(AskHostFireWall() == YES)\r
                Fwall = FwallType;\r
@@ -2547,17 +2658,12 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS4を使う =====*/\r
                        DoPrintf("Use SOCKS4 BIND");\r
-                       // IPv6対応\r
-//                     if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                Socks4Cmd.Ver = SOCKS4_VER;\r
                                Socks4Cmd.Cmd = SOCKS4_CMD_BIND;\r
-                               // IPv6対応\r
-//                             Socks4Cmd.Port = CurSockAddr.sin_port;\r
-//                             Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
-                               Socks4Cmd.Port = CurSockAddrIPv4.sin_port;\r
-                               Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;\r
+                               Socks4Cmd.Port = CurSockAddr.sin_port;\r
+                               Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
                                strcpy(Socks4Cmd.UserID, FwallUser);\r
                                Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
 \r
@@ -2578,9 +2684,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                                }\r
 \r
                                if(Socks4Reply.AdrsInt == 0)\r
-                                       // IPv6対応\r
-//                                     Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
-                                       Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr;\r
+                                       Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
 \r
                                a = (char *)&Socks4Reply.AdrsInt;\r
                                p = (char *)&Socks4Reply.Port;\r
@@ -2590,9 +2694,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS5を使う =====*/\r
                        DoPrintf("Use SOCKS5 BIND");\r
-                       // IPv6対応\r
-//                     if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
@@ -2601,9 +2703,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                                        return(listen_skt);\r
                                }\r
 \r
-                               // IPv6対応\r
-//                             Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
-                               Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);\r
+                               Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
 \r
                                Socks5Reply.Result = -1;\r
                                // 同時接続対応\r
@@ -2653,6 +2753,15 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
                                                a = (char *)&saTmpAddr.sin_addr;\r
                                                p = (char *)&saCtrlAddr.sin_port;\r
+                                               // UPnP対応\r
+                                               if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
+                                               {\r
+                                                       if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port), ExtAdrs) == FFFTP_SUCCESS)\r
+                                                       {\r
+                                                               saTmpAddr.sin_addr.s_addr = inet_addr(ExtAdrs);\r
+                                                               SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin_port));\r
+                                                       }\r
+                                               }\r
                                        }\r
                                        else\r
                                        {\r
@@ -2698,6 +2807,12 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                        // IPv6対応\r
 //                     SetTaskMsg(MSGJPN031);\r
                        SetTaskMsg(MSGJPN031, MSGJPN333);\r
+                       // UPnP対応\r
+                       if(IsUPnPLoaded() == YES)\r
+                       {\r
+                               if(GetAsyncTableDataMapPort(listen_skt, &Port) == YES)\r
+                                       RemovePortMapping(Port);\r
+                       }\r
                        do_closesocket(listen_skt);\r
                        listen_skt = INVALID_SOCKET;\r
                }\r
@@ -2711,6 +2826,8 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
 SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)\r
 {\r
+       struct sockaddr_in6 SocksSockAddr;      /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in6 CurSockAddr;                /* 接続先ホストのアドレス情報 */\r
     SOCKET listen_skt;\r
     int iLength;\r
     char *a,*p;\r
@@ -2723,6 +2840,12 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
        int Fwall;\r
 \r
        char Adrs[40];\r
+       // UPnP対応\r
+       int Port;\r
+       char ExtAdrs[40];\r
+\r
+       // ソケットにデータを付与\r
+       GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
 \r
        Fwall = FWALL_NONE;\r
        if(AskHostFireWall() == YES)\r
@@ -2734,7 +2857,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS5を使う =====*/\r
                        DoPrintf("Use SOCKS5 BIND");\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
@@ -2743,7 +2866,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                                        return(listen_skt);\r
                                }\r
 \r
-                               Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);\r
+                               Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
 \r
                                Socks5Reply.Result = -1;\r
                                // 同時接続対応\r
@@ -2777,6 +2900,8 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                        saCtrlAddr.sin6_port = htons(0);\r
                        saCtrlAddr.sin6_family = AF_INET6;\r
                        memset(&saCtrlAddr.sin6_addr, 0, 16);\r
+                       saCtrlAddr.sin6_flowinfo = 0;\r
+                       saCtrlAddr.sin6_scope_id = 0;\r
 \r
                        if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr_in6)) != SOCKET_ERROR)\r
                        {\r
@@ -2791,6 +2916,15 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
                                                a = (char *)&saTmpAddr.sin6_addr;\r
                                                p = (char *)&saCtrlAddr.sin6_port;\r
+                                               // UPnP対応\r
+                                               if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
+                                               {\r
+                                                       if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port), ExtAdrs) == FFFTP_SUCCESS)\r
+                                                       {\r
+                                                               saTmpAddr.sin6_addr = inet6_addr(ExtAdrs);\r
+                                                               SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin6_port));\r
+                                                       }\r
+                                               }\r
                                        }\r
                                        else\r
                                        {\r
@@ -2832,6 +2966,12 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                                (UC(p[0]) << 8) | UC(p[1])) / 100) != FTP_COMPLETE)\r
                {\r
                        SetTaskMsg(MSGJPN031, MSGJPN334);\r
+                       // UPnP対応\r
+                       if(IsUPnPLoaded() == YES)\r
+                       {\r
+                               if(GetAsyncTableDataMapPort(listen_skt, &Port) == YES)\r
+                                       RemovePortMapping(Port);\r
+                       }\r
                        do_closesocket(listen_skt);\r
                        listen_skt = INVALID_SOCKET;\r
                }\r
@@ -3263,3 +3403,9 @@ int AskTransferErrorNotify(void)
        return(CurHost.TransferErrorNotify);\r
 }\r
 \r
+// セッションあたりの転送量制限対策\r
+int AskErrorReconnect(void)\r
+{\r
+       return(CurHost.TransferErrorReconnect);\r
+}\r
+\r