OSDN Git Service

Add support for retrying file transfer.
[ffftp/ffftp.git] / connect.c
index dfbf5e0..bebf227 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -37,7 +37,7 @@
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
-#include <ws2tcpip.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
@@ -106,8 +106,6 @@ static int TryConnect = NO;
 static SOCKET CmdCtrlSocket = INVALID_SOCKET;\r
 static SOCKET TrnCtrlSocket = INVALID_SOCKET;\r
 static HOSTDATA CurHost;\r
-// UTF-8対応\r
-static int TmpNameKanjiCode;\r
 \r
 /* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */\r
 /* この情報はlistenソケットを取得する際に用いる */\r
@@ -161,7 +159,9 @@ void ConnectProc(int Type, int Num)
                InitPWDcommand();\r
                CopyHostFromList(AskCurrentHost(), &CurHost);\r
                // UTF-8対応\r
-               TmpNameKanjiCode = CurHost.NameKanjiCode;\r
+               CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+               // IPv6対応\r
+               CurHost.CurNetType = CurHost.NetType;\r
 \r
                if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
                {\r
@@ -187,18 +187,48 @@ void ConnectProc(int Type, int Num)
                        CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security, &CancelFlg);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
-                       // UTF-8対応\r
-                       if(TmpNameKanjiCode == KANJI_AUTO)\r
+                       if(CmdCtrlSocket != INVALID_SOCKET)\r
                        {\r
-                               if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                               // 暗号化通信対応\r
+                               switch(CurHost.CryptMode)\r
                                {\r
-                                       SetCache(999, "");\r
-                                       TmpNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                               case CRYPT_NONE:\r
+                                       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
+                                       }\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
+                                       }\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
+                                       }\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
+                                       }\r
+                                       break;\r
+                               }\r
+\r
+                               // UTF-8対応\r
+                               if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
+                               {\r
+                                       if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                                               CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
                                }\r
-                       }\r
 \r
-                       if(CmdCtrlSocket != INVALID_SOCKET)\r
-                       {\r
                                strcpy(TitleHostName, CurHost.HostName);\r
                                DispWindowTitle();\r
                                SoundPlay(SND_CONNECT);\r
@@ -256,7 +286,9 @@ void QuickConnectProc(void)
                InitPWDcommand();\r
                CopyDefaultHost(&CurHost);\r
                // UTF-8対応\r
-               TmpNameKanjiCode = CurHost.NameKanjiCode;\r
+               CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+               // IPv6対応\r
+               CurHost.CurNetType = CurHost.NetType;\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
@@ -281,18 +313,15 @@ void QuickConnectProc(void)
                        CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
-                       // UTF-8対応\r
-                       if(TmpNameKanjiCode == KANJI_AUTO)\r
+                       if(CmdCtrlSocket != INVALID_SOCKET)\r
                        {\r
-                               if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                               // UTF-8対応\r
+                               if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
                                {\r
-                                       SetCache(999, "");\r
-                                       TmpNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                                       if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                                               CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
                                }\r
-                       }\r
 \r
-                       if(CmdCtrlSocket != INVALID_SOCKET)\r
-                       {\r
                                strcpy(TitleHostName, CurHost.HostAdrs);\r
                                DispWindowTitle();\r
                                SoundPlay(SND_CONNECT);\r
@@ -449,7 +478,9 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
                CurHost.NameKanjiCode = Fkanji;\r
                CurHost.KanaCnv = YES;                  /* とりあえず */\r
                // UTF-8対応\r
-               TmpNameKanjiCode = CurHost.NameKanjiCode;\r
+               CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+               // IPv6対応\r
+               CurHost.CurNetType = CurHost.NetType;\r
 \r
                SetHostKanaCnvImm(CurHost.KanaCnv);\r
                SetHostKanjiCodeImm(CurHost.KanjiCode);\r
@@ -468,18 +499,15 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode)
                CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
                TrnCtrlSocket = CmdCtrlSocket;\r
 \r
-               // UTF-8対応\r
-               if(TmpNameKanjiCode == KANJI_AUTO)\r
+               if(CmdCtrlSocket != INVALID_SOCKET)\r
                {\r
-                       if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                       // UTF-8対応\r
+                       if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
                        {\r
-                               SetCache(999, "");\r
-                               TmpNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                               if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                                       CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
                        }\r
-               }\r
 \r
-               if(CmdCtrlSocket != INVALID_SOCKET)\r
-               {\r
                        strcpy(TitleHostName, CurHost.HostAdrs);\r
                        DispWindowTitle();\r
                        SoundPlay(SND_CONNECT);\r
@@ -536,7 +564,9 @@ void HistoryConnectProc(int MenuCmd)
                InitPWDcommand();\r
                CopyHistoryToHost(&Hist, &CurHost);\r
                // UTF-8対応\r
-               TmpNameKanjiCode = CurHost.NameKanjiCode;\r
+               CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+               // IPv6対応\r
+               CurHost.CurNetType = CurHost.NetType;\r
 \r
                if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
                {\r
@@ -559,18 +589,15 @@ void HistoryConnectProc(int MenuCmd)
                        CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
                        TrnCtrlSocket = CmdCtrlSocket;\r
 \r
-                       // UTF-8対応\r
-                       if(TmpNameKanjiCode == KANJI_AUTO)\r
+                       if(CmdCtrlSocket != INVALID_SOCKET)\r
                        {\r
-                               if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                               // UTF-8対応\r
+                               if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
                                {\r
-                                       SetCache(999, "");\r
-                                       TmpNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+                                       if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+                                               CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
                                }\r
-                       }\r
 \r
-                       if(CmdCtrlSocket != INVALID_SOCKET)\r
-                       {\r
                                strcpy(TitleHostName, CurHost.HostAdrs);\r
                                DispWindowTitle();\r
                                SoundPlay(SND_CONNECT);\r
@@ -719,7 +746,7 @@ int AskHostNameKanji(void)
 //             CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
 //\r
 //     return(CurHost.NameKanjiCode);\r
-       return(TmpNameKanjiCode);\r
+       return(CurHost.CurNameKanjiCode);\r
 }\r
 \r
 \r
@@ -1053,6 +1080,10 @@ int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork)
                HostData.UseFTPIS = NO;\r
        if(HostData.CryptMode != CRYPT_SFTP)\r
                HostData.UseSFTP = NO;\r
+       // UTF-8対応\r
+       HostData.CurNameKanjiCode = HostData.NameKanjiCode;\r
+       // IPv6対応\r
+       HostData.CurNetType = HostData.NetType;\r
        // 暗号化通信対応\r
        // 同時接続対応\r
 //     if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
@@ -1509,6 +1540,18 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                                                                                Sts = FTP_ERROR;\r
                                                                }\r
 \r
+                                                               // FTPIS対応\r
+                                                               // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため\r
+                                                               if(CryptMode == CRYPT_FTPIS)\r
+                                                               {\r
+                                                                       if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200)\r
+                                                                       {\r
+                                                                               if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200)\r
+                                                                               {\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+\r
                                                                ReInPass = NO;\r
                                                                do\r
                                                                {\r
@@ -1625,10 +1668,10 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                                        HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV;\r
                        }\r
                        // UTF-8対応\r
-                       if(TmpNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8))\r
+                       if(HostData->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8))\r
                        {\r
                                if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200)\r
-                                       TmpNameKanjiCode = KANJI_UTF8N;\r
+                                       HostData->CurNameKanjiCode = KANJI_UTF8N;\r
                        }\r
                }\r
        }\r
@@ -1804,19 +1847,21 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
 {\r
        SOCKET Result;\r
        Result = INVALID_SOCKET;\r
-       switch(CurHost.InetFamily)\r
+       switch(CurHost.CurNetType)\r
        {\r
-       case AF_UNSPEC:\r
+       case NTYPE_AUTO:\r
                if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET)\r
-                       CurHost.InetFamily = AF_INET;\r
-               else if(CurHost.UseIPv6 == YES && (Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET)\r
-                       CurHost.InetFamily = AF_INET6;\r
+                       CurHost.CurNetType = NTYPE_IPV4;\r
+               else if((Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET)\r
+                       CurHost.CurNetType = NTYPE_IPV6;\r
                break;\r
-       case AF_INET:\r
+       case NTYPE_IPV4:\r
                Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork);\r
+               CurHost.CurNetType = NTYPE_IPV4;\r
                break;\r
-       case AF_INET6:\r
+       case NTYPE_IPV6:\r
                Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork);\r
+               CurHost.CurNetType = NTYPE_IPV6;\r
                break;\r
        }\r
        return Result;\r
@@ -2195,14 +2240,12 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
 {\r
        SOCKET Result;\r
        Result = INVALID_SOCKET;\r
-       switch(CurHost.InetFamily)\r
+       switch(CurHost.CurNetType)\r
        {\r
-       case AF_UNSPEC:\r
-               break;\r
-       case AF_INET:\r
+       case NTYPE_IPV4:\r
                Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork);\r
                break;\r
-       case AF_INET6:\r
+       case NTYPE_IPV6:\r
                Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork);\r
                break;\r
        }\r
@@ -2504,14 +2547,14 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
        if(listen_skt != INVALID_SOCKET)\r
        {\r
-#define  US(w)  (((int)w)&0xffff)\r
+#define  UC(b)  (((int)b)&0xff)\r
                // 同時接続対応\r
 //             if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d",\r
 //                             UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),\r
 //                             UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE)\r
                if((command(ctrl_skt,NULL, CancelCheckWork, "EPRT |2|%s|%d|",\r
                                AddressToStringIPv6(Adrs, a),\r
-                               US(p[0])) / 100) != FTP_COMPLETE)\r
+                               (UC(p[0]) << 8) | UC(p[1])) / 100) != FTP_COMPLETE)\r
                {\r
                        SetTaskMsg(MSGJPN031);\r
                        do_closesocket(listen_skt);\r
@@ -2923,13 +2966,25 @@ int AskUseMLSD(void)
 }\r
 \r
 // IPv6対応\r
-int AskInetFamily(void)\r
+int AskCurNetType(void)\r
+{\r
+       return(CurHost.CurNetType);\r
+}\r
+\r
+// 自動切断対策\r
+int AskNoopInterval(void)\r
+{\r
+       return(CurHost.NoopInterval);\r
+}\r
+\r
+// 再転送対応\r
+int AskTransferErrorMode(void)\r
 {\r
-       return(CurHost.InetFamily);\r
+       return(CurHost.TransferErrorMode);\r
 }\r
 \r
-int AskUseIPv6(void)\r
+int AskTransferErrorNotify(void)\r
 {\r
-       return(CurHost.UseIPv6);\r
+       return(CurHost.TransferErrorNotify);\r
 }\r
 \r