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