OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / connect.c
index 3914924..26d61a0 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
@@ -102,6 +104,8 @@ extern int FwallLower;
 extern int FwallDelimiter;\r
 extern int PasvDefault;\r
 extern int QuickAnonymous;\r
+// 切断対策\r
+extern int TimeOut;\r
 \r
 /*===== ローカルなワーク =====*/\r
 \r
@@ -1437,6 +1441,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
@@ -1510,6 +1516,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
@@ -1600,7 +1615,7 @@ 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
                                                                                {\r
@@ -1761,6 +1776,12 @@ 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
@@ -1770,64 +1791,6 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char
                        }\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
@@ -1839,12 +1802,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