X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=connect.c;h=87425948e584e0e6a647e3f5d35f5d2a8a15bd2b;hp=bb43e1108ef0719346dddc3240cd287a3823e73b;hb=663728dfaea4b4e0da170722b4046764e01555dc;hpb=dce74878dd044e66c99341f617cb1b9de781acad diff --git a/connect.c b/connect.c index bb43e11..8742594 100644 --- a/connect.c +++ b/connect.c @@ -35,7 +35,9 @@ #include #include #include -#include +// IPv6対応 +//#include +#include #include #include @@ -52,18 +54,32 @@ /*===== プロトタイプ =====*/ -static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); -static int SendInitCommand(char *Cmd); +// 64ビット対応 +//static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 同時接続対応 +//static int SendInitCommand(char *Cmd); +static int SendInitCommand(SOCKET Socket, char *Cmd, int *CancelCheckWork); 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 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, 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); /*===== 外部参照 =====*/ @@ -97,12 +113,21 @@ 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]; +#if defined(HAVE_TANDEM) +static int Oss = NO; /* OSS ファイルシステムへアクセスしている場合は YES */ +#endif @@ -140,6 +165,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) { @@ -159,16 +188,59 @@ void ConnectProc(int Type, int Num) Save = YES; DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// 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, &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); - SendInitCommand(CurHost.InitCmd); + SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg); if(strlen(CurHost.LocalInitDir) > 0) { @@ -220,6 +292,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) @@ -238,11 +314,21 @@ void QuickConnectProc(void) SetSyncMoveMode(CurHost.SyncMove); DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// 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, &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); @@ -254,7 +340,7 @@ void QuickConnectProc(void) EnableUserOpe(); if(strlen(File) > 0) - DirectDownLoadProc(File); + DirectDownloadProc(File); } else { @@ -279,7 +365,9 @@ void QuickConnectProc(void) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static char *Buf; int i; @@ -398,6 +486,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); @@ -410,11 +502,21 @@ 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.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); @@ -426,7 +528,7 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) EnableUserOpe(); if(strlen(File) > 0) - DirectDownLoadProc(File); + DirectDownloadProc(File); else ResetAutoExitFlg(); } @@ -470,6 +572,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) { @@ -486,16 +592,26 @@ void HistoryConnectProc(int MenuCmd) DispTransferType(); DisableUserOpe(); - CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + // 暗号化通信対応 + // 同時接続対応 +// 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, &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); - SendInitCommand(CurHost.InitCmd); + SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg); DoLocalCWD(CurHost.LocalInitDir); GetLocalDirForWnd(); @@ -534,7 +650,9 @@ void HistoryConnectProc(int MenuCmd) * cmd1\r\ncmd2\r\n\0 *----------------------------------------------------------------------------*/ -static int SendInitCommand(char *Cmd) +// 同時接続対応 +//static int SendInitCommand(char *Cmd) +static int SendInitCommand(SOCKET Socket, char *Cmd, int *CancelCheckWork) { char Tmp[INITCMD_LEN+1]; char *Pos; @@ -545,7 +663,8 @@ static int SendInitCommand(char *Cmd) if((Pos = strchr(Tmp, '\r')) != NULL) *Pos = NUL; if(strlen(Tmp) > 0) - DoQUOTE(Tmp); +// DoQUOTE(Tmp); + DoQUOTE(Socket, Tmp, CancelCheckWork); if((Cmd = strchr(Cmd, '\n')) != NULL) Cmd++; @@ -575,7 +694,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) @@ -633,10 +753,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); } @@ -781,6 +903,14 @@ int AskHostType(void) if(AskCurrentHost() != HOSTNUM_NOENTRY) CopyHostFromListInConnect(AskCurrentHost(), &CurHost); +#if defined(HAVE_TANDEM) + /* OSS ファイルシステムは UNIX ファイルシステムと同じでいいので AUTO を返す + ただし、Guardian ファイルシステムに戻ったときにおかしくならないように + CurHost.HostType 変数は更新しない */ + if(CurHost.HostType == HTYPE_TANDEM && Oss == YES) + return(HTYPE_AUTO); +#endif + return(CurHost.HostType); } @@ -915,24 +1045,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; @@ -955,10 +1074,12 @@ int ReConnectCmdSkt(void) // return(ReConnectSkt(&TrnCtrlSocket)); //} // 同時接続対応 -int ReConnectTrnSkt(SOCKET *Skt) +int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) { - char Path[FMAX_PATH+1]; +// char Path[FMAX_PATH+1]; int Sts; + // 暗号化通信対応 + HOSTDATA HostData; Sts = FFFTP_FAIL; @@ -969,8 +1090,28 @@ int ReConnectTrnSkt(SOCKET *Skt) if(*Skt != INVALID_SOCKET) do_closesocket(*Skt); /* 再接続 */ - if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + // 暗号化通信対応 + HostData = CurHost; + if(HostData.CryptMode != CRYPT_NONE) + HostData.UseNoEncryption = NO; + if(HostData.CryptMode != CRYPT_FTPES) + HostData.UseFTPES = NO; + if(HostData.CryptMode != CRYPT_FTPIS) + HostData.UseFTPIS = NO; + if(HostData.CryptMode != CRYPT_SFTP) + HostData.UseSFTP = NO; + // UTF-8対応 + HostData.CurNameKanjiCode = HostData.NameKanjiCode; + // IPv6対応 + HostData.CurNetType = HostData.NetType; + // 同時接続対応 + HostData.NoDisplayUI = YES; + // 暗号化通信対応 + // 同時接続対応 +// 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, CancelCheckWork)) != INVALID_SOCKET) { + SendInitCommand(*Skt, CurHost.InitCmd, CancelCheckWork); // AskRemoteCurDir(Path, FMAX_PATH); // DoCWD(Path, YES, YES, YES); Sts = FFFTP_SUCCESS; @@ -1007,8 +1148,12 @@ static int ReConnectSkt(SOCKET *Skt) if(*Skt != INVALID_SOCKET) 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.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) { + SendInitCommand(*Skt, CurHost.InitCmd, &CancelFlg); AskRemoteCurDir(Path, FMAX_PATH); DoCWD(Path, YES, YES, YES); Sts = FFFTP_SUCCESS; @@ -1068,10 +1213,13 @@ void SktShareProh(void) //SetTaskMsg("############### SktShareProh"); // 同時接続対応 - // 転送スレッドがソケットを各自で用意 - // TrnCtrlSocketはメインスレッド以外から使用されない // CmdCtrlSocket = INVALID_SOCKET; // ReConnectSkt(&CmdCtrlSocket); + if(CurHost.ReuseCmdSkt == YES) + { + CmdCtrlSocket = INVALID_SOCKET; + ReConnectSkt(&CmdCtrlSocket); + } } return; } @@ -1092,7 +1240,9 @@ int AskShareProh(void) int Sts; Sts = YES; - if(CmdCtrlSocket == TrnCtrlSocket) + // 同時接続対応 +// if(CmdCtrlSocket == TrnCtrlSocket) + if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET) Sts = NO; return(Sts); @@ -1115,13 +1265,17 @@ void DisconnectProc(void) if((CmdCtrlSocket != INVALID_SOCKET) && (CmdCtrlSocket != TrnCtrlSocket)) { - DoQUIT(CmdCtrlSocket); + // 同時接続対応 +// DoQUIT(CmdCtrlSocket); + DoQUIT(CmdCtrlSocket, &CancelFlg); DoClose(CmdCtrlSocket); } if(TrnCtrlSocket != INVALID_SOCKET) { - DoQUIT(TrnCtrlSocket); + // 同時接続対応 +// DoQUIT(TrnCtrlSocket); + DoQUIT(TrnCtrlSocket, &CancelFlg); DoClose(TrnCtrlSocket); SaveCurrentSetToHistory(); @@ -1184,6 +1338,62 @@ int AskConnecting(void) } +#if defined(HAVE_TANDEM) +/*----- 接続している本当のホストのホストタイプを返す -------------------------- +* +* Parameter +* なし +* +* Return Value +* char *ファイル名/オプション +*----------------------------------------------------------------------------*/ + +int AskRealHostType(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.HostType); +} + +/*----- OSS ファイルシステムにアクセスしているかどうかのフラグを変更する ------ +* +* Parameter +* int ステータス (YES/NO) +* +* Return Value +* int ステータス (YES/NO) +*----------------------------------------------------------------------------*/ + +int SetOSS(int wkOss) +{ + if(Oss != wkOss) { + if (wkOss == YES) { + strcpy(CurHost.InitCmd, "OSS"); + } else { + strcpy(CurHost.InitCmd, "GUARDIAN"); + } + } + Oss = wkOss; + return(Oss); +} + +/*----- OSS ファイルシステムにアクセスしているかどうかを返す ------------------ +* +* Parameter +* なし +* +* Return Value +* int ステータス (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskOSS(void) +{ + return(Oss); +} +#endif /* HAVE_TANDEM */ + + /*----- ホストへ接続する ------------------------------------------------------ * * Parameter @@ -1216,7 +1426,8 @@ int AskConnecting(void) * none Connect host → USER user(h) → PASS pass(h) → ACCT acct *----------------------------------------------------------------------------*/ -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, int *CancelCheckWork) { int Sts; int Flg; @@ -1232,143 +1443,179 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port char TmpBuf[ONELINE_BUF_SIZE]; struct linger LingerOpt; - if(Fwall == YES) - Fwall = FwallType; - else - Fwall = FWALL_NONE; + // 暗号化通信対応 + ContSock = INVALID_SOCKET; + + if(CryptMode == CRYPT_NONE || CryptMode == CRYPT_FTPES || CryptMode == CRYPT_FTPIS) + { + if(Fwall == YES) + Fwall = FwallType; + else + Fwall = FWALL_NONE; - TryConnect = YES; - CancelFlg = NO; + TryConnect = YES; + // 暗号化通信対応 +// CancelFlg = NO; #if 0 -// WSASetBlockingHook(BlkHookFnc); +// WSASetBlockingHook(BlkHookFnc); #endif - ContSock = INVALID_SOCKET; + ContSock = INVALID_SOCKET; - HostPort = Port; - Tmp = Host; - if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || - (Fwall == FWALL_SIDEWINDER) || - (Fwall == FWALL_FU_FP)) - { - Tmp = FwallHost; - Port = FwallPort; - } + HostPort = Port; + Tmp = Host; + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_SIDEWINDER) || + (Fwall == FWALL_FU_FP)) + { + Tmp = FwallHost; + Port = FwallPort; + } - if(strlen(Tmp) != 0) - { - if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + if(strlen(Tmp) != 0) { - // バッファを無効 + // 同時接続対応 +// if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + if((ContSock = connectsock(Tmp, Port, "", CancelCheckWork)) != INVALID_SOCKET) + { + // バッファを無効 #ifdef DISABLE_CONTROL_NETWORK_BUFFERS - int BufferSize = 0; - setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int)); - setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int)); + int BufferSize = 0; + setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int)); + setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int)); #endif - while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) - ; - - if(Sts == FTP_COMPLETE) - { - Flg = 1; - if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); - // データ転送用ソケットのTCP遅延転送が無効されているので念のため - if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); -#pragma aaa - Flg = 1; - if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); - LingerOpt.l_onoff = 1; - LingerOpt.l_linger = 90; - if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR) - ReportWSError("setsockopt", WSAGetLastError()); -/////// - - - /*===== 認証を行なう =====*/ - - Sts = FTP_COMPLETE; - if((Fwall == FWALL_FU_FP_SITE) || - (Fwall == FWALL_FU_FP_USER) || - (Fwall == FWALL_FU_FP)) + // FTPIS対応 +// while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) +// ; + if(CryptMode == CRYPT_FTPIS) { - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - CheckOneTimePassword(FwallPass, Reply, FwallSecurity); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) + ; } + else + Sts = FTP_ERROR; } - else if(Fwall == FWALL_SIDEWINDER) - { - Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; - } - if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) + else { - SetTaskMsg(MSGJPN006); - DoClose(ContSock); - ContSock = INVALID_SOCKET; + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM) + ; } - else + + if(Sts == FTP_COMPLETE) { - if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN)) + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + // データ転送用ソケットのTCP遅延転送が無効されているので念のため + if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +//#pragma aaa + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + LingerOpt.l_onoff = 1; + LingerOpt.l_linger = 90; + if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +/////// + + + /*===== 認証を行なう =====*/ + + Sts = FTP_COMPLETE; + if((Fwall == FWALL_FU_FP_SITE) || + (Fwall == FWALL_FU_FP_USER) || + (Fwall == FWALL_FU_FP)) { - Flg = 0; - if(Fwall == FWALL_OPEN) - Flg = 2; - if(FwallLower == YES) - Flg++; - - if(HostPort == PORT_NOR) - Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; - else - Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + // 同時接続対応 +// 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, 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, CancelCheckWork, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; } - if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) { - SetTaskMsg(MSGJPN007, Host); + SetTaskMsg(MSGJPN006); DoClose(ContSock); ContSock = INVALID_SOCKET; } else { - Anony = NO; - if((strlen(User) != 0) || - (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN)) { - if(Anony == YES) - { - strcpy(User, "anonymous"); - strcpy(Pass, UserMailAdrs); - } + Flg = 0; + if(Fwall == FWALL_OPEN) + Flg = 2; + if(FwallLower == YES) + Flg++; + + if(HostPort == PORT_NOR) + // 同時接続対応 +// 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, CancelCheckWork, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + } - if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER)) + if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) + { + SetTaskMsg(MSGJPN007, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else + { + Anony = NO; + // 同時接続対応 +// if((strlen(User) != 0) || +// (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + if((strlen(User) != 0) || + ((HostData->NoDisplayUI == NO) && (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) { - if(HostPort == PORT_NOR) - sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host); + if(Anony == YES) + { + strcpy(User, "anonymous"); + strcpy(Pass, UserMailAdrs); + } + + if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER)) + { + if(HostPort == PORT_NOR) + sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host); + else + sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort); + } else - sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort); - } - else - strcpy(Buf, User); + strcpy(Buf, User); - // FTPES対応 - // 2回以上呼ばれる事があるため既にFTPESで接続していても再確認 - if(CurHost.CryptMode == CRYPT_NONE || CurHost.CryptMode == CRYPT_FTPES) - { - if(IsOpenSSLLoaded() && CurHost.UseFTPES == YES && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234) + // FTPES対応 + if(CryptMode == CRYPT_FTPES) { - // SSLに切り替え - SetTaskMsg(MSGJPN315); - CurHost.CryptMode = CRYPT_FTPES; - if(AttachSSL(ContSock)) + if(IsOpenSSLLoaded() && (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200) + if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork)) { - if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200) + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + else + Sts = FTP_ERROR; } else Sts = FTP_ERROR; @@ -1379,106 +1626,251 @@ static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port else Sts = FTP_ERROR; } - else + + // FTPIS対応 + // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため + if(CryptMode == CRYPT_FTPIS) { - // 暗号化なし - CurHost.CryptMode = CRYPT_NONE; - SetTaskMsg(MSGJPN314); + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + } } - } - ReInPass = NO; - do - { - Continue = NO; - if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + ReInPass = NO; + do { - if((strlen(Pass) != 0) || - (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + // FTPES対応 + if(Sts == FTP_ERROR) + break; + Continue = NO; + // 同時接続対応 +// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE) { - CheckOneTimePassword(Pass, Reply, Security); + // 同時接続対応 +// if((strlen(Pass) != 0) || +// (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + if((strlen(Pass) != 0) || + ((HostData->NoDisplayUI == NO) && (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) + { + CheckOneTimePassword(Pass, Reply, Security); - /* パスワードがスペース1個の時はパスワードの実体なしとする */ - if(strcmp(Reply, " ") == 0) - strcpy(Reply, ""); + /* パスワードがスペース1個の時はパスワードの実体なしとする */ + if(strcmp(Reply, " ") == 0) + strcpy(Reply, ""); - Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; - if(Sts == FTP_ERROR) - { - strcpy(Pass, ""); - if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) - Continue = YES; - else - DoPrintf("No password specified."); - ReInPass = YES; - } - else if(Sts == FTP_CONTINUE) - { - if((strlen(Acct) != 0) || - (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + // 同時接続対応 +// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100; + if(Sts == FTP_ERROR) { - Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + strcpy(Pass, ""); + // 同時接続対応 +// if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) + if(HostData->NoDisplayUI == NO && InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) + Continue = YES; + else + DoPrintf("No password specified."); + ReInPass = YES; + } + else if(Sts == FTP_CONTINUE) + { + // 同時接続対応 +// if((strlen(Acct) != 0) || +// (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + if((strlen(Acct) != 0) || + ((HostData->NoDisplayUI == NO) && (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, CancelCheckWork, "ACCT %s", Acct) / 100; + } + else + DoPrintf("No account specified"); } - else - DoPrintf("No account specified"); + } + else + { + Sts = FTP_ERROR; + DoPrintf("No password specified."); } } - else - { - Sts = FTP_ERROR; - DoPrintf("No password specified."); - } + // FTPES対応 + if(Continue == YES) + Sts = FTP_COMPLETE; } + while(Continue == YES); + } + else + { + Sts = FTP_ERROR; + DoPrintf("No user name specified"); } - while(Continue == YES); - } - else - { - Sts = FTP_ERROR; - DoPrintf("No user name specified"); - } - if(Sts != FTP_COMPLETE) - { - SetTaskMsg(MSGJPN008, Host); - DoClose(ContSock); - ContSock = INVALID_SOCKET; - } - else if((SavePass == YES) && (ReInPass == YES)) - { - if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) - SetHostPassword(AskCurrentHost(), Pass); + if(Sts != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN008, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else if((SavePass == YES) && (ReInPass == YES)) + { + // 同時接続対応 +// if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + if(HostData->NoDisplayUI == NO && DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostPassword(AskCurrentHost(), Pass); + } } } } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } } + } + else + { + + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_FU_FP)) + SetTaskMsg(MSGJPN010); else + SetTaskMsg(MSGJPN011); + } + +#if 0 +// WSAUnhookBlockingHook(); +#endif + TryConnect = NO; + + // FEAT対応 + // ホストの機能を確認 + if(ContSock != INVALID_SOCKET) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "FEAT")) == 211) { -//#pragma aaa - SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/); - DoClose(ContSock); - ContSock = INVALID_SOCKET; + // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用 + // UTF-8対応 + if(strstr(Reply, " UTF8 ")) + HostData->Feature |= FEATURE_UTF8; + // 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->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8)) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200) + HostData->CurNameKanjiCode = KANJI_UTF8N; } } } - else + else if(CryptMode == CRYPT_SFTP) { - - if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || - (Fwall == FWALL_FU_FP)) - SetTaskMsg(MSGJPN010); - else - SetTaskMsg(MSGJPN011); + // 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; } -#if 0 -// WSAUnhookBlockingHook(); -#endif - TryConnect = NO; - 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, int *CancelCheckWork) +{ + 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); + 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, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_FTPES; + } + 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, CancelCheckWork)) != INVALID_SOCKET) + HostData->CryptMode = CRYPT_NONE; + } + return ContSock; +} + /*----- ワンタイムパスワードのチェック ---------------------------------------- * @@ -1605,9 +1997,129 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) * SOCKET ソケット *----------------------------------------------------------------------------*/ -SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) +// IPv6対応 +typedef SOCKET (__cdecl* LPCONNECTSOCK)(char*, int, char*, int*); + +typedef struct { - struct sockaddr_in saSockAddr; + HANDLE h; + DWORD ExitCode; + char *host; + int port; + char *PreMsg; + int CancelCheckWork; + LPCONNECTSOCK f; + SOCKET s; +} CONNECTSOCKDATA; + +DWORD WINAPI connectsockThreadProc(LPVOID lpParameter) +{ + CONNECTSOCKDATA* pData; + pData = (CONNECTSOCKDATA*)lpParameter; + pData->s = pData->f(pData->host, pData->port, pData->PreMsg, &pData->CancelCheckWork); + return 0; +} + +// IPv6対応 +SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ + SOCKET Result; + CONNECTSOCKDATA DataIPv4; + CONNECTSOCKDATA DataIPv6; + 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; + DataIPv4.host = host; + DataIPv4.port = port; + DataIPv4.PreMsg = PreMsg; + DataIPv4.CancelCheckWork = *CancelCheckWork; + DataIPv4.f = connectsockIPv4; + DataIPv4.h = CreateThread(NULL, 0, connectsockThreadProc, &DataIPv4, 0, NULL); + DataIPv6.host = host; + DataIPv6.port = port; + DataIPv6.PreMsg = PreMsg; + DataIPv6.CancelCheckWork = *CancelCheckWork; + DataIPv6.f = connectsockIPv6; + DataIPv6.h = CreateThread(NULL, 0, connectsockThreadProc, &DataIPv6, 0, NULL); + while(1) + { + if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode)) + { + if(DataIPv4.ExitCode != STILL_ACTIVE) + { + if(DataIPv4.s != INVALID_SOCKET) + { + Result = DataIPv4.s; + CurHost.CurNetType = NTYPE_IPV4; + break; + } + } + } + if(GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode)) + { + if(DataIPv6.ExitCode != STILL_ACTIVE) + { + if(DataIPv6.s != INVALID_SOCKET) + { + Result = DataIPv6.s; + CurHost.CurNetType = NTYPE_IPV6; + break; + } + } + } + if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode) && GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode)) + { + if(DataIPv4.ExitCode != STILL_ACTIVE && DataIPv6.ExitCode != STILL_ACTIVE) + { + if(DataIPv4.s == INVALID_SOCKET && DataIPv6.s == INVALID_SOCKET) + break; + } + } + DataIPv4.CancelCheckWork = *CancelCheckWork; + DataIPv6.CancelCheckWork = *CancelCheckWork; + BackgrndMessageProc(); + Sleep(1); + } + while(1) + { + if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode) && GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode)) + { + if(DataIPv4.ExitCode != STILL_ACTIVE && DataIPv6.ExitCode != STILL_ACTIVE) + { + CloseHandle(DataIPv4.h); + CloseHandle(DataIPv6.h); + break; + } + } + DataIPv4.CancelCheckWork = YES; + DataIPv6.CancelCheckWork = YES; + BackgrndMessageProc(); + Sleep(1); + } + 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; SOCKET sSocket; @@ -1630,10 +2142,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) { // ホスト名が指定された // ホスト名からアドレスを求める @@ -1646,31 +2163,46 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) else { // アドレスを取得 - SetTaskMsg(MSGJPN016, DomainName); - pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + // IPv6対応 +// SetTaskMsg(MSGJPN016, DomainName); + SetTaskMsg(MSGJPN016, DomainName, MSGJPN333); + // 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); + // 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); } 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), MSGJPN333); } else { - SetTaskMsg(MSGJPN019, host); + // IPv6対応 +// SetTaskMsg(MSGJPN019, host); + SetTaskMsg(MSGJPN019, host, MSGJPN333); return(INVALID_SOCKET); } } } 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), MSGJPN333); if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) { @@ -1680,37 +2212,60 @@ 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); + // IPv6対応 +// SetTaskMsg(MSGJPN021, FwallHost); + SetTaskMsg(MSGJPN021, FwallHost, MSGJPN333); 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; + // IPv6対応 +// SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port)); + SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port), MSGJPN333); // 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)); } ///////////// @@ -1724,11 +2279,17 @@ 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); + // IPv6対応 +// SetTaskMsg(MSGJPN023, Socks4Reply.Result); + SetTaskMsg(MSGJPN023, Socks4Reply.Result, MSGJPN333); DoClose(sSocket); sSocket = INVALID_SOCKET; } @@ -1742,11 +2303,172 @@ 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)) + { + // IPv6対応 +// SetTaskMsg(MSGJPN024, Socks5Reply.Result); + SetTaskMsg(MSGJPN024, Socks5Reply.Result, MSGJPN333); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + } + + if(sSocket != INVALID_SOCKET) + // IPv6対応 +// SetTaskMsg(MSGJPN025); + SetTaskMsg(MSGJPN025, MSGJPN333); + } + else + { +//#pragma aaa + // IPv6対応 +// SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/, MSGJPN333); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + } + else + // IPv6対応 +// SetTaskMsg(MSGJPN027); + SetTaskMsg(MSGJPN027, MSGJPN333); + + 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, MSGJPN334); + 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), MSGJPN334); + } + else + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + UseIPadrs = NO; + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334); + } + else + { + SetTaskMsg(MSGJPN019, host, MSGJPN334); + return(INVALID_SOCKET); + } + } + } + else + SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.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); + } + + 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, 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); + // 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); + SetTaskMsg(MSGJPN024, Socks5Reply.Result, MSGJPN334); DoClose(sSocket); sSocket = INVALID_SOCKET; } @@ -1754,18 +2476,18 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) } if(sSocket != INVALID_SOCKET) - SetTaskMsg(MSGJPN025); + SetTaskMsg(MSGJPN025, MSGJPN334); } else { //#pragma aaa - SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/, MSGJPN334); DoClose(sSocket); sSocket = INVALID_SOCKET; } } else - SetTaskMsg(MSGJPN027); + SetTaskMsg(MSGJPN027, MSGJPN334); return(sSocket); } @@ -1780,8 +2502,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; @@ -1805,27 +2547,40 @@ 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); + // IPv6対応 +// SetTaskMsg(MSGJPN028, Socks4Reply.Result); + SetTaskMsg(MSGJPN028, Socks4Reply.Result, MSGJPN333); DoClose(listen_skt); listen_skt = INVALID_SOCKET; } 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; @@ -1835,7 +2590,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) { @@ -1844,23 +2601,35 @@ 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); + // IPv6対応 +// SetTaskMsg(MSGJPN029, Socks5Reply.Result); + SetTaskMsg(MSGJPN029, Socks5Reply.Result, MSGJPN333); DoClose(listen_skt); 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 @@ -1907,7 +2676,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) } if(listen_skt == INVALID_SOCKET) - SetTaskMsg(MSGJPN030); + // IPv6対応 +// SetTaskMsg(MSGJPN030); + SetTaskMsg(MSGJPN030, MSGJPN333); } } else @@ -1916,11 +2687,151 @@ 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) { - SetTaskMsg(MSGJPN031); + // IPv6対応 +// SetTaskMsg(MSGJPN031); + SetTaskMsg(MSGJPN031, MSGJPN333); + 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); +} + + +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, MSGJPN334); + 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, MSGJPN334); + } + } + 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, MSGJPN334); do_closesocket(listen_skt); listen_skt = INVALID_SOCKET; } @@ -2025,6 +2936,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 @@ -2059,7 +3008,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; @@ -2068,15 +3019,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++; @@ -2084,7 +3039,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) @@ -2104,11 +3061,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); @@ -2144,8 +3105,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); @@ -2162,8 +3127,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); @@ -2187,7 +3156,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]; @@ -2195,14 +3166,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; } @@ -2217,6 +3192,11 @@ int AskCryptMode(void) return(CurHost.CryptMode); } +int AskUseNoEncryption(void) +{ + return(CurHost.UseNoEncryption); +} + int AskUseFTPES(void) { return(CurHost.UseFTPES); @@ -2232,9 +3212,54 @@ 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) +{ + return(CurHost.Feature); +} + +// MLSD対応 +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); +} +