// IPv6対応\r
//#include <winsock.h>\r
#include <winsock2.h>\r
+// 切断対策\r
+#include <mstcpip.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
\r
extern int FwallDelimiter;\r
extern int PasvDefault;\r
extern int QuickAnonymous;\r
+// 切断対策\r
+extern int TimeOut;\r
\r
/*===== ローカルなワーク =====*/\r
\r
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
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
// 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
// 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
}\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
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