X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=connect.c;h=bebf227d3f72c4f77da7bd9f03857de481d2e548;hb=b973cd74709d6f624fdc31d6008c1b8c521c87b7;hp=af55002a5b21c70ad848eea113645de960226e79;hpb=98a8ff5f501726ce2f71296138ab21e98eb68173;p=ffftp%2Fffftp.git diff --git a/connect.c b/connect.c index af55002..bebf227 100644 --- a/connect.c +++ b/connect.c @@ -35,7 +35,9 @@ #include #include #include -#include +// IPv6対応 +//#include +#include #include #include @@ -58,15 +60,22 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List); static void SaveCurrentSetToHistory(void); static int ReConnectSkt(SOCKET *Skt); // 暗号化通信対応 +// 同時接続対応 //static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); -static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); -static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); +static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork); +static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork); static int CheckOneTimePassword(char *Pass, char *Reply, int Type); static BOOL CALLBACK BlkHookFnc(void); static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port); +// IPv6対応 +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port); static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork); -static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); -static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet); +// 同時接続対応 +//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork); +// 同時接続対応 +//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet); +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork); static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork); /*===== 外部参照 =====*/ @@ -100,8 +109,14 @@ static HOSTDATA CurHost; /* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */ /* この情報はlistenソケットを取得する際に用いる */ -static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */ -static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */ +// 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]; @@ -143,6 +158,10 @@ void ConnectProc(int Type, int Num) InitPWDcommand(); CopyHostFromList(AskCurrentHost(), &CurHost); + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS) { @@ -163,12 +182,53 @@ void ConnectProc(int Type, int Num) DisableUserOpe(); // 暗号化通信対応 + // 同時接続対応 // CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); - CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // 暗号化通信対応 + switch(CurHost.CryptMode) + { + case CRYPT_NONE: + if(CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostExcryption(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); + } + 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); + } + 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); + } + break; + } + + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostName); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -225,6 +285,10 @@ void QuickConnectProc(void) InitPWDcommand(); CopyDefaultHost(&CurHost); + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == FFFTP_SUCCESS) { if(strlen(CurHost.UserName) == 0) @@ -244,12 +308,20 @@ void QuickConnectProc(void) DisableUserOpe(); // 暗号化通信対応 + // 同時接続対応 // CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); - CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -405,6 +477,10 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) CurHost.KanaCnv = Kana; CurHost.NameKanjiCode = Fkanji; CurHost.KanaCnv = YES; /* とりあえず */ + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; SetHostKanaCnvImm(CurHost.KanaCnv); SetHostKanjiCodeImm(CurHost.KanjiCode); @@ -418,12 +494,20 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) DisableUserOpe(); // 暗号化通信対応 + // 同時接続対応 // CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); - CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -479,6 +563,10 @@ void HistoryConnectProc(int MenuCmd) InitPWDcommand(); CopyHistoryToHost(&Hist, &CurHost); + // UTF-8対応 + CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS) { @@ -496,12 +584,20 @@ void HistoryConnectProc(int MenuCmd) DisableUserOpe(); // 暗号化通信対応 + // 同時接続対応 // CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); - CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; if(CmdCtrlSocket != INVALID_SOCKET) { + // UTF-8対応 + if(CurHost.CurNameKanjiCode == KANJI_AUTO) + { + if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) + CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); + } + strcpy(TitleHostName, CurHost.HostAdrs); DispWindowTitle(); SoundPlay(SND_CONNECT); @@ -586,7 +682,8 @@ static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List) *Fire = FwallDefault; *Pasv = PasvDefault; - *List = NO; + // NLSTを送ってしまうバグ修正(ただしNLSTを使うべきホストへクイック接続できなくなる) +// *List = NO; i = 0; while(CopyHostFromList(i, &Tmp) == FFFTP_SUCCESS) @@ -644,10 +741,12 @@ int AskHostPort(void) int AskHostNameKanji(void) { - if(AskCurrentHost() != HOSTNUM_NOENTRY) - CopyHostFromListInConnect(AskCurrentHost(), &CurHost); - - return(CurHost.NameKanjiCode); + // UTF-8対応 +// if(AskCurrentHost() != HOSTNUM_NOENTRY) +// CopyHostFromListInConnect(AskCurrentHost(), &CurHost); +// +// return(CurHost.NameKanjiCode); + return(CurHost.CurNameKanjiCode); } @@ -926,24 +1025,13 @@ static void SaveCurrentSetToHistory(void) int ReConnectCmdSkt(void) { int Sts; - SOCKET s; - // 同時接続対応 -// if(CmdCtrlSocket != TrnCtrlSocket) -// do_closesocket(TrnCtrlSocket); -// TrnCtrlSocket = INVALID_SOCKET; - s = TrnCtrlSocket; + if(CmdCtrlSocket != TrnCtrlSocket) + do_closesocket(TrnCtrlSocket); TrnCtrlSocket = INVALID_SOCKET; - if(CmdCtrlSocket != s && s != INVALID_SOCKET) - do_closesocket(s); - // 同時接続対応 -// Sts = ReConnectSkt(&CmdCtrlSocket); - s = CmdCtrlSocket; - CmdCtrlSocket = INVALID_SOCKET; - Sts = ReConnectSkt(&s); - CmdCtrlSocket = s; + Sts = ReConnectSkt(&CmdCtrlSocket); TrnCtrlSocket = CmdCtrlSocket; @@ -966,7 +1054,7 @@ int ReConnectCmdSkt(void) // return(ReConnectSkt(&TrnCtrlSocket)); //} // 同時接続対応 -int ReConnectTrnSkt(SOCKET *Skt) +int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) { // char Path[FMAX_PATH+1]; int Sts; @@ -992,8 +1080,14 @@ int ReConnectTrnSkt(SOCKET *Skt) HostData.UseFTPIS = NO; if(HostData.CryptMode != CRYPT_SFTP) HostData.UseSFTP = NO; + // UTF-8対応 + HostData.CurNameKanjiCode = HostData.NameKanjiCode; + // IPv6対応 + HostData.CurNetType = HostData.NetType; + // 暗号化通信対応 + // 同時接続対応 // if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) - if((*Skt = DoConnect(&HostData, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + if((*Skt = DoConnect(&HostData, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, CancelCheckWork)) != INVALID_SOCKET) { // AskRemoteCurDir(Path, FMAX_PATH); // DoCWD(Path, YES, YES, YES); @@ -1032,8 +1126,9 @@ static int ReConnectSkt(SOCKET *Skt) do_closesocket(*Skt); /* 再接続 */ // 暗号化通信対応 + // 同時接続対応 // if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) - if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg)) != INVALID_SOCKET) { AskRemoteCurDir(Path, FMAX_PATH); DoCWD(Path, YES, YES, YES); @@ -1094,10 +1189,13 @@ void SktShareProh(void) //SetTaskMsg("############### SktShareProh"); // 同時接続対応 - // 転送スレッドがソケットを各自で用意 - // TrnCtrlSocketはメインスレッド以外から使用されない // CmdCtrlSocket = INVALID_SOCKET; // ReConnectSkt(&CmdCtrlSocket); + if(CurHost.ReuseCmdSkt == YES) + { + CmdCtrlSocket = INVALID_SOCKET; + ReConnectSkt(&CmdCtrlSocket); + } } return; } @@ -1118,8 +1216,10 @@ int AskShareProh(void) int Sts; Sts = YES; + // 同時接続対応 // if(CmdCtrlSocket == TrnCtrlSocket) -// Sts = NO; + if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET) + Sts = NO; return(Sts); } @@ -1243,7 +1343,7 @@ int AskConnecting(void) *----------------------------------------------------------------------------*/ // 暗号化通信対応 -static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork) { int Sts; int Flg; @@ -1270,7 +1370,8 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char Fwall = FWALL_NONE; TryConnect = YES; - CancelFlg = NO; + // 暗号化通信対応 +// CancelFlg = NO; #if 0 // WSASetBlockingHook(BlkHookFnc); #endif @@ -1289,7 +1390,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char if(strlen(Tmp) != 0) { - if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + // 同時接続対応 +// if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + if((ContSock = connectsock(Tmp, Port, "", CancelCheckWork)) != INVALID_SOCKET) { // バッファを無効 #ifdef DISABLE_CONTROL_NETWORK_BUFFERS @@ -1302,27 +1405,17 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char // ; if(CryptMode == CRYPT_FTPIS) { - if(AttachSSL(ContSock)) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) ; - if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200) - { - if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200) - { - } - else - Sts = FTP_ERROR; - } - else - Sts = FTP_ERROR; } else Sts = FTP_ERROR; } else { - while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) ; } @@ -1352,15 +1445,21 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char (Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_FU_FP)) { - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + // 同時接続対応 +// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", FwallUser) / 100) == FTP_CONTINUE) { CheckOneTimePassword(FwallPass, Reply, FwallSecurity); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100; } } else if(Fwall == FWALL_SIDEWINDER) { - Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; + // 同時接続対応 +// Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; + Sts = command(ContSock, Reply, CancelCheckWork, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; } if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) { @@ -1379,9 +1478,13 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char Flg++; if(HostPort == PORT_NOR) - Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "%s %s", SiteTbl[Flg], Host) / 100; else - Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; } if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) @@ -1415,13 +1518,13 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char // FTPES対応 if(CryptMode == CRYPT_FTPES) { - if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234) + if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234) { - if(AttachSSL(ContSock)) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200) + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200) + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) { } else @@ -1437,6 +1540,18 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char Sts = FTP_ERROR; } + // FTPIS対応 + // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため + if(CryptMode == CRYPT_FTPIS) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + } + } + ReInPass = NO; do { @@ -1444,7 +1559,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char if(Sts == FTP_ERROR) break; Continue = NO; - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + // 同時接続対応 +// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE) { if((strlen(Pass) != 0) || (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) @@ -1455,7 +1572,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char if(strcmp(Reply, " ") == 0) strcpy(Reply, ""); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100; if(Sts == FTP_ERROR) { strcpy(Pass, ""); @@ -1470,7 +1589,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char if((strlen(Acct) != 0) || (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) { - Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "ACCT %s", Acct) / 100; } else DoPrintf("No account specified"); @@ -1533,7 +1654,7 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char // ホストの機能を確認 if(ContSock != INVALID_SOCKET) { - if((Sts = command(ContSock, Reply, &CancelFlg, "FEAT")) == 211) + if((Sts = command(ContSock, Reply, CancelCheckWork, "FEAT")) == 211) { // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用 // UTF-8対応 @@ -1542,13 +1663,15 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char // MLST対応 if(strstr(Reply, " MLST ") || strstr(Reply, " MLSD ")) HostData->Feature |= FEATURE_MLSD; + // IPv6対応 + if(strstr(Reply, " EPRT ") || strstr(Reply, " EPSV ")) + HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV; } // UTF-8対応 - if(HostData->NameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8)) + if(HostData->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8)) { - if((Sts = command(ContSock, Reply, &CancelFlg, "OPTS UTF8 ON")) == 200) - { - } + if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200) + HostData->CurNameKanjiCode = KANJI_UTF8N; } } } @@ -1559,32 +1682,35 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char return(ContSock); } -static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +// 同時接続対応 +//static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork) { SOCKET ContSock; ContSock = INVALID_SOCKET; - if(ContSock == INVALID_SOCKET && HostData->UseSFTP == YES) + *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)) != INVALID_SOCKET) + if((ContSock = DoConnectCrypt(CRYPT_SFTP, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) HostData->CryptMode = CRYPT_SFTP; } -// if(ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES) -// { -// SetTaskMsg(MSGJPN316); -// if((ContSock = DoConnectCrypt(CRYPT_FTPIS, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET) -// HostData->CryptMode = CRYPT_FTPIS; -// } - if(ContSock == INVALID_SOCKET && HostData->UseFTPES == YES) + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES) + { + SetTaskMsg(MSGJPN316); + if((ContSock = DoConnectCrypt(CRYPT_FTPIS, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_FTPIS; + } + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPES == YES) { SetTaskMsg(MSGJPN315); - if((ContSock = DoConnectCrypt(CRYPT_FTPES, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET) + if((ContSock = DoConnectCrypt(CRYPT_FTPES, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) HostData->CryptMode = CRYPT_FTPES; } - if(ContSock == INVALID_SOCKET && HostData->UseNoEncryption == YES) + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseNoEncryption == YES) { SetTaskMsg(MSGJPN314); - if((ContSock = DoConnectCrypt(CRYPT_NONE, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security)) != INVALID_SOCKET) + if((ContSock = DoConnectCrypt(CRYPT_NONE, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) HostData->CryptMode = CRYPT_NONE; } return ContSock; @@ -1716,8 +1842,36 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) * SOCKET ソケット *----------------------------------------------------------------------------*/ +// IPv6対応 SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) { + SOCKET Result; + Result = INVALID_SOCKET; + switch(CurHost.CurNetType) + { + case NTYPE_AUTO: + if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) + CurHost.CurNetType = NTYPE_IPV4; + else if((Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) + CurHost.CurNetType = NTYPE_IPV6; + break; + case NTYPE_IPV4: + Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV4; + break; + case NTYPE_IPV6: + Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV6; + break; + } + return Result; +} + + +// IPv6対応 +//SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) +SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ struct sockaddr_in saSockAddr; char HostEntry[MAXGETHOSTSTRUCT]; struct hostent *pHostEntry; @@ -1741,10 +1895,15 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) UseIPadrs = YES; strcpy(DomainName, host); - 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) + // 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) { // ホスト名が指定された // ホスト名からアドレスを求める @@ -1758,20 +1917,27 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) { // アドレスを取得 SetTaskMsg(MSGJPN016, DomainName); - pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + // IPv6対応 +// pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + pHostEntry = do_gethostbynameIPv4(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); } if(pHostEntry != NULL) { - memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); - SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + // 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); + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port)); } else { if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { UseIPadrs = NO; - SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); + // IPv6対応 +// SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port)); } else { @@ -1781,7 +1947,9 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } } else - SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + // 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)); if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { @@ -1791,37 +1959,56 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) { Socks4Cmd.Ver = SOCKS4_VER; Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT; - Socks4Cmd.Port = CurSockAddr.sin_port; - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + // 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; strcpy(Socks4Cmd.UserID, FwallUser); Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; } else { - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + // 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); } - memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); - if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) + // 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) { - if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) - memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + // 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); else { SetTaskMsg(MSGJPN021, FwallHost); return INVALID_SOCKET; } } - SocksSockAddr.sin_port = htons((u_short)FwallPort); - SocksSockAddr.sin_family = AF_INET; - SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); + // 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; + SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port)); // connectで接続する先はSOCKSサーバ - memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); + // IPv6対応 +// memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); + memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4)); } else { // connectで接続するのは接続先のホスト - memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); + // IPv6対応 +// memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); + memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4)); } ///////////// @@ -1835,8 +2022,12 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) if(Fwall == FWALL_SOCKS4) { Socks4Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || +// (Socks4Reply.Result != SOCKS4_RES_OK)) if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || - (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || + (Socks4GetCmdReply(sSocket, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks4Reply.Result != SOCKS4_RES_OK)) { SetTaskMsg(MSGJPN023, Socks4Reply.Result); @@ -1853,8 +2044,161 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN024, Socks5Reply.Result); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + } + + if(sSocket != INVALID_SOCKET) + SetTaskMsg(MSGJPN025); + } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + } + else + SetTaskMsg(MSGJPN027); + + return(sSocket); +} + + +SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ + struct sockaddr_in6 saSockAddr; + char HostEntry[MAXGETHOSTSTRUCT]; + struct hostent *pHostEntry; + SOCKET sSocket; + int Len; + int Fwall; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + ////////////////////////////// + // ホスト名解決と接続の準備 + ////////////////////////////// + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + sSocket = INVALID_SOCKET; + + 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) + { + // ホスト名が指定された + // ホスト名からアドレスを求める + if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) && + (FwallResolv == YES)) + { + // ホスト名解決はSOCKSサーバに任せる + pHostEntry = NULL; + } + else + { + // アドレスを取得 + SetTaskMsg(MSGJPN016, DomainName); + pHostEntry = do_gethostbynameIPv6(host, HostEntry, MAXGETHOSTSTRUCT, 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)); + } + else + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + UseIPadrs = NO; + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port)); + } + else + { + SetTaskMsg(MSGJPN019, host); + return(INVALID_SOCKET); + } + } + } + else + SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port)); + + 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); + } + + memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6)); + SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost); + if(memcmp(&SocksSockAddrIPv6.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); + else + { + SetTaskMsg(MSGJPN021, FwallHost); + 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)); + // connectで接続する先はSOCKSサーバ + memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6)); + } + else + { + // connectで接続するのは接続先のホスト + memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6)); + } + + ///////////// + // 接続実行 + ///////////// + + inet6_ntoa(saSockAddr.sin6_addr); + if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET) + { + if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR) + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL) + { + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || - (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Reply.Result != SOCKS5_RES_OK)) { SetTaskMsg(MSGJPN024, Socks5Reply.Result); @@ -1891,8 +2235,28 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) * SOCKET リッスンソケット *----------------------------------------------------------------------------*/ +// IPv6対応 SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { + SOCKET Result; + Result = INVALID_SOCKET; + switch(CurHost.CurNetType) + { + case NTYPE_IPV4: + Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork); + break; + case NTYPE_IPV6: + Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork); + break; + } + return Result; +} + + +// IPv6対応 +//SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) +SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork) +{ SOCKET listen_skt; int iLength; char *a,*p; @@ -1916,18 +2280,27 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { /*===== SOCKS4を使う =====*/ DoPrintf("Use SOCKS4 BIND"); - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + // 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) { Socks4Cmd.Ver = SOCKS4_VER; Socks4Cmd.Cmd = SOCKS4_CMD_BIND; - Socks4Cmd.Port = CurSockAddr.sin_port; - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + // 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; strcpy(Socks4Cmd.UserID, FwallUser); Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; Socks4Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || +// (Socks4Reply.Result != SOCKS4_RES_OK)) if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || - (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || + (Socks4GetCmdReply(listen_skt, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks4Reply.Result != SOCKS4_RES_OK)) { SetTaskMsg(MSGJPN028, Socks4Reply.Result); @@ -1936,7 +2309,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } if(Socks4Reply.AdrsInt == 0) - Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + // IPv6対応 +// Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr; a = (char *)&Socks4Reply.AdrsInt; p = (char *)&Socks4Reply.Port; @@ -1946,7 +2321,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { /*===== SOCKS5を使う =====*/ DoPrintf("Use SOCKS5 BIND"); - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + // 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(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) { @@ -1955,11 +2332,17 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) return(listen_skt); } - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + // 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); Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || - (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Reply.Result != SOCKS5_RES_OK)) { SetTaskMsg(MSGJPN029, Socks5Reply.Result); @@ -1967,11 +2350,15 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) listen_skt = INVALID_SOCKET; } - if(Socks5Reply.AdrsInt == 0) - Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + // IPv6対応 +// if(Socks5Reply.AdrsInt == 0) +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; - a = (char *)&Socks5Reply.AdrsInt; - p = (char *)&Socks5Reply.Port; + // IPv6対応 +// a = (char *)&Socks5Reply.AdrsInt; +// p = (char *)&Socks5Reply.Port; + a = (char *)&Socks5Reply._dummy[0]; + p = (char *)&Socks5Reply._dummy[4]; } } else @@ -2027,7 +2414,11 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) if(listen_skt != INVALID_SOCKET) { #define UC(b) (((int)b)&0xff) - if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", + // 同時接続対応 +// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", +// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), +// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) + if((command(ctrl_skt,NULL, CancelCheckWork, "PORT %d,%d,%d,%d,%d,%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) { @@ -2043,6 +2434,140 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } +SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork) +{ + SOCKET listen_skt; + int iLength; + char *a,*p; + struct sockaddr_in6 saCtrlAddr; + struct sockaddr_in6 saTmpAddr; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + int Len; + int Fwall; + + char Adrs[40]; + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + if((listen_skt = do_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + /*===== SOCKS5を使う =====*/ + DoPrintf("Use SOCKS5 BIND"); + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR) + { + if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) + { + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + return(listen_skt); + } + + Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port); + + Socks5Reply.Result = -1; + // 同時接続対応 +// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || +// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || +// (Socks5Reply.Result != SOCKS5_RES_OK)) + if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN029, Socks5Reply.Result); + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + } + + // IPv6対応 +// if(Socks5Reply.AdrsInt == 0) +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + + // IPv6対応 +// a = (char *)&Socks5Reply.AdrsInt; +// p = (char *)&Socks5Reply.Port; + a = (char *)&Socks5Reply._dummy[0]; + p = (char *)&Socks5Reply._dummy[16]; + } + } + else + { + /*===== SOCKSを使わない =====*/ + DoPrintf("Use normal BIND"); + saCtrlAddr.sin6_port = htons(0); + saCtrlAddr.sin6_family = AF_INET6; + memset(&saCtrlAddr.sin6_addr, 0, 16); + + if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr_in6)) != SOCKET_ERROR) + { + iLength = sizeof(saCtrlAddr); + if(getsockname(listen_skt, (struct sockaddr *)&saCtrlAddr, &iLength) != SOCKET_ERROR) + { + if(do_listen(listen_skt, 1) == 0) + { + iLength = sizeof(saTmpAddr); + if(getsockname(ctrl_skt, (struct sockaddr *)&saTmpAddr, &iLength) == SOCKET_ERROR) + ReportWSError("getsockname", WSAGetLastError()); + + a = (char *)&saTmpAddr.sin6_addr; + p = (char *)&saCtrlAddr.sin6_port; + } + else + { + ReportWSError("listen", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("getsockname", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("bind", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + + if(listen_skt == INVALID_SOCKET) + SetTaskMsg(MSGJPN030); + } + } + else + ReportWSError("socket create", WSAGetLastError()); + + if(listen_skt != INVALID_SOCKET) + { +#define UC(b) (((int)b)&0xff) + // 同時接続対応 +// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", +// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), +// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) + if((command(ctrl_skt,NULL, CancelCheckWork, "EPRT |2|%s|%d|", + AddressToStringIPv6(Adrs, a), + (UC(p[0]) << 8) | UC(p[1])) / 100) != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN031); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } +// else +// DoPrintf("Skt=%u : listener %s port %u",listen_skt,inet_ntoa(saCtrlAddr.sin_addr),ntohs(saCtrlAddr.sin_port)); + } + + return(listen_skt); +} + + /*----- ホストへ接続処理中かどうかを返す--------------------------------------- * * Parameter @@ -2136,6 +2661,44 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo } +// IPv6対応 +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port) +{ + uchar *Pos; + int Len; + int TotalLen; + + Pos = (uchar *)Packet; + Pos += SOCKS5REQUEST_SIZE; + TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2はポートの分 */ + + Packet->Ver = SOCKS5_VER; + Packet->Cmd = Cmd; + Packet->Rsv = 0; + if(ValidIP == YES) + { + /* IPアドレスを指定 */ + Packet->Type = SOCKS5_ADRS_IPV6; + memcpy(Pos, IP, 16); + Pos += 16; + TotalLen += 16; + } + else + { + /* ホスト名を指定 */ + Packet->Type = SOCKS5_ADRS_NAME; + Len = strlen(Host); + *Pos++ = Len; + strcpy(Pos, Host); + Pos += Len; + TotalLen += Len + 1; + } + *((ushort *)Pos) = Port; + + return(TotalLen); +} + + /*----- SOCKSのコマンドを送る ------------------------------------------------- * * Parameter @@ -2170,7 +2733,9 @@ static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWor * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) +// 同時接続対応 +//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork) { uchar *Pos; int Len; @@ -2179,15 +2744,19 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) Pos = (uchar *)Packet; Pos += SOCKS5REPLY_SIZE; - if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS) + // 同時接続対応 +// if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS) + if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, CancelCheckWork)) == FFFTP_SUCCESS) { if(Packet->Type == SOCKS5_ADRS_IPV4) Len = 4 + 2; else if(Packet->Type == SOCKS5_ADRS_IPV6) - Len = 6 + 2; + Len = 16 + 2; else { - if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS) + // 同時接続対応 +// if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS) + if((Ret = ReadNchar(Socket, (char *)Pos, 1, CancelCheckWork)) == FFFTP_SUCCESS) { Len = *Pos + 2; Pos++; @@ -2195,7 +2764,9 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) } if(Ret == FFFTP_SUCCESS) - Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg); + // 同時接続対応 +// Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg); + Ret = ReadNchar(Socket, (char *)Pos, Len, CancelCheckWork); } if(Ret != FFFTP_SUCCESS) @@ -2215,11 +2786,15 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet) +// 同時接続対応 +//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet) +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork) { int Ret; - Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg); + // 同時接続対応 +// Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg); + Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, CancelCheckWork); if(Ret != FFFTP_SUCCESS) DoPrintf(MSGJPN035); @@ -2255,8 +2830,12 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) else Socks5Method.Methods[0] = SOCKS5_AUTH_USER; + // 同時接続対応 +// if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || +// (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) || +// (Socks5MethodReply.Method == (uchar)0xFF)) if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || - (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5MethodReply.Method == (uchar)0xFF)) { SetTaskMsg(MSGJPN036); @@ -2273,8 +2852,12 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) Buf[2 + Len] = Len2; strcpy(Buf+3+Len, FwallPass); + // 同時接続対応 +// if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) || +// (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) || +// (Socks5Status.Status != 0)) if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) || - (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, CancelCheckWork) != FFFTP_SUCCESS) || (Socks5Status.Status != 0)) { SetTaskMsg(MSGJPN037); @@ -2298,7 +2881,9 @@ static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL) *----------------------------------------------------------------------------*/ -int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) +// 同時接続対応 +//int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) +int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data, int *CancelCheckWork) { int Ret; char Buf[300]; @@ -2306,14 +2891,18 @@ int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) Ret = FFFTP_FAIL; if((AskHostFireWall() == YES) && (FwallType == FWALL_SOCKS4)) { - Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf); + // 同時接続対応 +// Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf); + Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf, CancelCheckWork); *Data = Socket; Ret = FFFTP_SUCCESS; } else if((AskHostFireWall() == YES) && ((FwallType == FWALL_SOCKS5_NOAUTH) || (FwallType == FWALL_SOCKS5_USER))) { - Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf); + // 同時接続対応 +// Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf); + Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf, CancelCheckWork); *Data = Socket; Ret = FFFTP_SUCCESS; } @@ -2348,12 +2937,22 @@ int AskUseSFTP(void) return(CurHost.UseSFTP); } +char *AskPrivateKey(void) +{ + return(CurHost.PrivateKey); +} + // 同時接続対応 int AskMaxThreadCount(void) { return(CurHost.MaxThreadCount); } +int AskReuseCmdSkt(void) +{ + return(CurHost.ReuseCmdSkt); +} + // FEAT対応 int AskHostFeature(void) { @@ -2366,3 +2965,26 @@ int AskUseMLSD(void) return(CurHost.UseMLSD); } +// IPv6対応 +int AskCurNetType(void) +{ + return(CurHost.CurNetType); +} + +// 自動切断対策 +int AskNoopInterval(void) +{ + return(CurHost.NoopInterval); +} + +// 再転送対応 +int AskTransferErrorMode(void) +{ + return(CurHost.TransferErrorMode); +} + +int AskTransferErrorNotify(void) +{ + return(CurHost.TransferErrorNotify); +} +