#include <string.h>\r
#include <mbstring.h>\r
#include <time.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
+// 切断対策\r
+#include <mstcpip.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
\r
\r
/*===== プロトタイプ =====*/\r
\r
-static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
-static int SendInitCommand(char *Cmd);\r
+// 64ビット対応\r
+//static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 同時接続対応\r
+//static int SendInitCommand(char *Cmd);\r
+static int SendInitCommand(SOCKET Socket, char *Cmd, int *CancelCheckWork);\r
static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List);\r
static void SaveCurrentSetToHistory(void);\r
static int ReConnectSkt(SOCKET *Skt);\r
-static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
+// 暗号化通信対応\r
+// 同時接続対応\r
+//static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security);\r
+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);\r
+static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork);\r
static int CheckOneTimePassword(char *Pass, char *Reply, int Type);\r
static BOOL CALLBACK BlkHookFnc(void);\r
static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port);\r
+// IPv6対応\r
+static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port);\r
static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork);\r
-static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet);\r
-static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet);\r
+// 同時接続対応\r
+//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet);\r
+static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork);\r
+// 同時接続対応\r
+//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet);\r
+static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork);\r
static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork);\r
\r
/*===== 外部参照 =====*/\r
extern int FwallDelimiter;\r
extern int PasvDefault;\r
extern int QuickAnonymous;\r
+// 切断対策\r
+extern int TimeOut;\r
\r
/*===== ローカルなワーク =====*/\r
\r
\r
/* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */\r
/* この情報はlistenソケットを取得する際に用いる */\r
-static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
-static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */\r
+// IPv6対応\r
+//static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+//static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */\r
\r
static int UseIPadrs;\r
static char DomainName[HOST_ADRS_LEN+1];\r
\r
+#if defined(HAVE_TANDEM)\r
+static int Oss = NO; /* OSS ファイルシステムへアクセスしている場合は YES */\r
+#endif\r
\r
\r
\r
\r
InitPWDcommand();\r
CopyHostFromList(AskCurrentHost(), &CurHost);\r
+ // UTF-8対応\r
+ CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+ // IPv6対応\r
+ CurHost.CurNetType = CurHost.NetType;\r
\r
if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
{\r
Save = YES;\r
\r
DisableUserOpe();\r
- CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security);\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security);\r
+ CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security, &CancelFlg);\r
TrnCtrlSocket = CmdCtrlSocket;\r
\r
if(CmdCtrlSocket != INVALID_SOCKET)\r
{\r
+ // 暗号化通信対応\r
+ switch(CurHost.CryptMode)\r
+ {\r
+ case CRYPT_NONE:\r
+ if(CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO)\r
+ {\r
+ if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ SetHostExcryption(AskCurrentHost(), CurHost.UseNoEncryption, CurHost.UseFTPES, NO, NO);\r
+ }\r
+ break;\r
+ case CRYPT_FTPES:\r
+ if(CurHost.UseNoEncryption != NO || CurHost.UseFTPIS != NO || CurHost.UseSFTP != NO)\r
+ {\r
+ if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ SetHostExcryption(AskCurrentHost(), NO, CurHost.UseFTPES, NO, NO);\r
+ }\r
+ break;\r
+ case CRYPT_FTPIS:\r
+ if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseSFTP != NO)\r
+ {\r
+ if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ SetHostExcryption(AskCurrentHost(), NO, NO, CurHost.UseFTPIS, NO);\r
+ }\r
+ break;\r
+ case CRYPT_SFTP:\r
+ if(CurHost.UseNoEncryption != NO || CurHost.UseFTPES != NO || CurHost.UseFTPIS != NO)\r
+ {\r
+ if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savecrypt_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ SetHostExcryption(AskCurrentHost(), NO, NO, NO, CurHost.UseSFTP);\r
+ }\r
+ break;\r
+ }\r
+\r
+ // UTF-8対応\r
+ if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
+ {\r
+ if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+ CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+ }\r
+\r
strcpy(TitleHostName, CurHost.HostName);\r
DispWindowTitle();\r
SoundPlay(SND_CONNECT);\r
\r
- SendInitCommand(CurHost.InitCmd);\r
+ SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg);\r
\r
if(strlen(CurHost.LocalInitDir) > 0)\r
{\r
\r
InitPWDcommand();\r
CopyDefaultHost(&CurHost);\r
+ // UTF-8対応\r
+ CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+ // IPv6対応\r
+ CurHost.CurNetType = CurHost.NetType;\r
if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == FFFTP_SUCCESS)\r
{\r
if(strlen(CurHost.UserName) == 0)\r
SetSyncMoveMode(CurHost.SyncMove);\r
\r
DisableUserOpe();\r
- CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
TrnCtrlSocket = CmdCtrlSocket;\r
\r
if(CmdCtrlSocket != INVALID_SOCKET)\r
{\r
+ // UTF-8対応\r
+ if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
+ {\r
+ if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+ CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+ }\r
+\r
strcpy(TitleHostName, CurHost.HostAdrs);\r
DispWindowTitle();\r
SoundPlay(SND_CONNECT);\r
EnableUserOpe();\r
\r
if(strlen(File) > 0)\r
- DirectDownLoadProc(File);\r
+ DirectDownloadProc(File);\r
}\r
else\r
{\r
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
{\r
static char *Buf;\r
int i;\r
CurHost.KanaCnv = Kana;\r
CurHost.NameKanjiCode = Fkanji;\r
CurHost.KanaCnv = YES; /* とりあえず */\r
+ // UTF-8対応\r
+ CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+ // IPv6対応\r
+ CurHost.CurNetType = CurHost.NetType;\r
\r
SetHostKanaCnvImm(CurHost.KanaCnv);\r
SetHostKanjiCodeImm(CurHost.KanjiCode);\r
}\r
\r
DisableUserOpe();\r
- CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
TrnCtrlSocket = CmdCtrlSocket;\r
\r
if(CmdCtrlSocket != INVALID_SOCKET)\r
{\r
+ // UTF-8対応\r
+ if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
+ {\r
+ if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+ CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+ }\r
+\r
strcpy(TitleHostName, CurHost.HostAdrs);\r
DispWindowTitle();\r
SoundPlay(SND_CONNECT);\r
EnableUserOpe();\r
\r
if(strlen(File) > 0)\r
- DirectDownLoadProc(File);\r
+ DirectDownloadProc(File);\r
else\r
ResetAutoExitFlg();\r
}\r
\r
InitPWDcommand();\r
CopyHistoryToHost(&Hist, &CurHost);\r
+ // UTF-8対応\r
+ CurHost.CurNameKanjiCode = CurHost.NameKanjiCode;\r
+ // IPv6対応\r
+ CurHost.CurNetType = CurHost.NetType;\r
\r
if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == FFFTP_SUCCESS)\r
{\r
DispTransferType();\r
\r
DisableUserOpe();\r
- CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security);\r
+ CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg);\r
TrnCtrlSocket = CmdCtrlSocket;\r
\r
if(CmdCtrlSocket != INVALID_SOCKET)\r
{\r
+ // UTF-8対応\r
+ if(CurHost.CurNameKanjiCode == KANJI_AUTO)\r
+ {\r
+ if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE)\r
+ CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999);\r
+ }\r
+\r
strcpy(TitleHostName, CurHost.HostAdrs);\r
DispWindowTitle();\r
SoundPlay(SND_CONNECT);\r
\r
- SendInitCommand(CurHost.InitCmd);\r
+ SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg);\r
\r
DoLocalCWD(CurHost.LocalInitDir);\r
GetLocalDirForWnd();\r
* cmd1\r\ncmd2\r\n\0\r
*----------------------------------------------------------------------------*/\r
\r
-static int SendInitCommand(char *Cmd)\r
+// 同時接続対応\r
+//static int SendInitCommand(char *Cmd)\r
+static int SendInitCommand(SOCKET Socket, char *Cmd, int *CancelCheckWork)\r
{\r
char Tmp[INITCMD_LEN+1];\r
char *Pos;\r
if((Pos = strchr(Tmp, '\r')) != NULL)\r
*Pos = NUL;\r
if(strlen(Tmp) > 0)\r
- DoQUOTE(Tmp);\r
+// DoQUOTE(Tmp);\r
+ DoQUOTE(Socket, Tmp, CancelCheckWork);\r
\r
if((Cmd = strchr(Cmd, '\n')) != NULL)\r
Cmd++;\r
\r
*Fire = FwallDefault;\r
*Pasv = PasvDefault;\r
- *List = NO;\r
+ // NLSTを送ってしまうバグ修正(ただしNLSTを使うべきホストへクイック接続できなくなる)\r
+// *List = NO;\r
\r
i = 0;\r
while(CopyHostFromList(i, &Tmp) == FFFTP_SUCCESS)\r
\r
int AskHostNameKanji(void)\r
{\r
- if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
- CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
-\r
- return(CurHost.NameKanjiCode);\r
+ // UTF-8対応\r
+// if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
+// CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+//\r
+// return(CurHost.NameKanjiCode);\r
+ return(CurHost.CurNameKanjiCode);\r
}\r
\r
\r
if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
\r
+#if defined(HAVE_TANDEM)\r
+ /* OSS ファイルシステムは UNIX ファイルシステムと同じでいいので AUTO を返す\r
+ ただし、Guardian ファイルシステムに戻ったときにおかしくならないように\r
+ CurHost.HostType 変数は更新しない */\r
+ if(CurHost.HostType == HTYPE_TANDEM && Oss == YES)\r
+ return(HTYPE_AUTO);\r
+#endif\r
+\r
return(CurHost.HostType);\r
}\r
\r
{\r
int Sts;\r
\r
+\r
if(CmdCtrlSocket != TrnCtrlSocket)\r
do_closesocket(TrnCtrlSocket);\r
TrnCtrlSocket = INVALID_SOCKET;\r
//{\r
// return(ReConnectSkt(&TrnCtrlSocket));\r
//}\r
+// 同時接続対応\r
+int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork)\r
+{\r
+// char Path[FMAX_PATH+1];\r
+ int Sts;\r
+ // 暗号化通信対応\r
+ HOSTDATA HostData;\r
+\r
+ Sts = FFFTP_FAIL;\r
+\r
+ SetTaskMsg(MSGJPN003);\r
+\r
+// DisableUserOpe();\r
+ /* 現在のソケットは切断 */\r
+ if(*Skt != INVALID_SOCKET)\r
+ do_closesocket(*Skt);\r
+ /* 再接続 */\r
+ // 暗号化通信対応\r
+ HostData = CurHost;\r
+ if(HostData.CryptMode != CRYPT_NONE)\r
+ HostData.UseNoEncryption = NO;\r
+ if(HostData.CryptMode != CRYPT_FTPES)\r
+ HostData.UseFTPES = NO;\r
+ if(HostData.CryptMode != CRYPT_FTPIS)\r
+ HostData.UseFTPIS = NO;\r
+ if(HostData.CryptMode != CRYPT_SFTP)\r
+ HostData.UseSFTP = NO;\r
+ // UTF-8対応\r
+ HostData.CurNameKanjiCode = HostData.NameKanjiCode;\r
+ // IPv6対応\r
+ HostData.CurNetType = HostData.NetType;\r
+ // 同時接続対応\r
+ HostData.NoDisplayUI = YES;\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+ if((*Skt = DoConnect(&HostData, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, CancelCheckWork)) != INVALID_SOCKET)\r
+ {\r
+ SendInitCommand(*Skt, CurHost.InitCmd, CancelCheckWork);\r
+// AskRemoteCurDir(Path, FMAX_PATH);\r
+// DoCWD(Path, YES, YES, YES);\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ else\r
+ SoundPlay(SND_ERROR);\r
+\r
+// EnableUserOpe();\r
+ return(Sts);\r
+}\r
\r
\r
/*----- 回線の再接続 ----------------------------------------------------------\r
if(*Skt != INVALID_SOCKET)\r
do_closesocket(*Skt);\r
/* 再接続 */\r
- if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+ // 暗号化通信対応\r
+ // 同時接続対応\r
+// if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
+ if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg)) != INVALID_SOCKET)\r
{\r
+ SendInitCommand(*Skt, CurHost.InitCmd, &CancelFlg);\r
AskRemoteCurDir(Path, FMAX_PATH);\r
DoCWD(Path, YES, YES, YES);\r
Sts = FFFTP_SUCCESS;\r
\r
//SetTaskMsg("############### SktShareProh");\r
\r
- CmdCtrlSocket = INVALID_SOCKET;\r
- ReConnectSkt(&CmdCtrlSocket);\r
+ // 同時接続対応\r
+// CmdCtrlSocket = INVALID_SOCKET;\r
+// ReConnectSkt(&CmdCtrlSocket);\r
+ if(CurHost.ReuseCmdSkt == YES)\r
+ {\r
+ CmdCtrlSocket = INVALID_SOCKET;\r
+ ReConnectSkt(&CmdCtrlSocket);\r
+ }\r
}\r
return;\r
}\r
int Sts;\r
\r
Sts = YES;\r
- if(CmdCtrlSocket == TrnCtrlSocket)\r
+ // 同時接続対応\r
+// if(CmdCtrlSocket == TrnCtrlSocket)\r
+ if(CmdCtrlSocket == TrnCtrlSocket || TrnCtrlSocket == INVALID_SOCKET)\r
Sts = NO;\r
\r
return(Sts);\r
\r
if((CmdCtrlSocket != INVALID_SOCKET) && (CmdCtrlSocket != TrnCtrlSocket))\r
{\r
- DoQUIT(CmdCtrlSocket);\r
+ // 同時接続対応\r
+// DoQUIT(CmdCtrlSocket);\r
+ DoQUIT(CmdCtrlSocket, &CancelFlg);\r
DoClose(CmdCtrlSocket);\r
}\r
\r
if(TrnCtrlSocket != INVALID_SOCKET)\r
{\r
- DoQUIT(TrnCtrlSocket);\r
+ // 同時接続対応\r
+// DoQUIT(TrnCtrlSocket);\r
+ DoQUIT(TrnCtrlSocket, &CancelFlg);\r
DoClose(TrnCtrlSocket);\r
\r
SaveCurrentSetToHistory();\r
}\r
\r
\r
+#if defined(HAVE_TANDEM)\r
+/*----- 接続している本当のホストのホストタイプを返す --------------------------\r
+*\r
+* Parameter\r
+* なし\r
+*\r
+* Return Value\r
+* char *ファイル名/オプション\r
+*----------------------------------------------------------------------------*/\r
+\r
+int AskRealHostType(void)\r
+{\r
+ if(AskCurrentHost() != HOSTNUM_NOENTRY)\r
+ CopyHostFromListInConnect(AskCurrentHost(), &CurHost);\r
+\r
+ return(CurHost.HostType);\r
+}\r
+\r
+/*----- OSS ファイルシステムにアクセスしているかどうかのフラグを変更する ------\r
+*\r
+* Parameter\r
+* int ステータス (YES/NO)\r
+*\r
+* Return Value\r
+* int ステータス (YES/NO)\r
+*----------------------------------------------------------------------------*/\r
+\r
+int SetOSS(int wkOss)\r
+{\r
+ if(Oss != wkOss) {\r
+ if (wkOss == YES) {\r
+ strcpy(CurHost.InitCmd, "OSS");\r
+ } else {\r
+ strcpy(CurHost.InitCmd, "GUARDIAN");\r
+ }\r
+ }\r
+ Oss = wkOss;\r
+ return(Oss);\r
+}\r
+\r
+/*----- OSS ファイルシステムにアクセスしているかどうかを返す ------------------\r
+*\r
+* Parameter\r
+* なし\r
+*\r
+* Return Value\r
+* int ステータス (YES/NO)\r
+*----------------------------------------------------------------------------*/\r
+\r
+int AskOSS(void)\r
+{\r
+ return(Oss);\r
+}\r
+#endif /* HAVE_TANDEM */\r
+\r
+\r
/*----- ホストへ接続する ------------------------------------------------------\r
*\r
* Parameter\r
* none Connect host → USER user(h) → PASS pass(h) → ACCT acct\r
*----------------------------------------------------------------------------*/\r
\r
-static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security)\r
+// 暗号化通信対応\r
+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)\r
{\r
int Sts;\r
int Flg;\r
static const char *SiteTbl[4] = { "SITE", "site", "OPEN", "open" };\r
char TmpBuf[ONELINE_BUF_SIZE];\r
struct linger LingerOpt;\r
+ struct tcp_keepalive KeepAlive;\r
+ DWORD dwTmp;\r
\r
- if(Fwall == YES)\r
- Fwall = FwallType;\r
- else\r
- Fwall = FWALL_NONE;\r
+ // 暗号化通信対応\r
+ ContSock = INVALID_SOCKET;\r
+\r
+ if(CryptMode == CRYPT_NONE || CryptMode == CRYPT_FTPES || CryptMode == CRYPT_FTPIS)\r
+ {\r
+ if(Fwall == YES)\r
+ Fwall = FwallType;\r
+ else\r
+ Fwall = FWALL_NONE;\r
\r
- TryConnect = YES;\r
- CancelFlg = NO;\r
+ TryConnect = YES;\r
+ // 暗号化通信対応\r
+// CancelFlg = NO;\r
#if 0\r
-// WSASetBlockingHook(BlkHookFnc);\r
+// WSASetBlockingHook(BlkHookFnc);\r
#endif\r
\r
- ContSock = INVALID_SOCKET;\r
+ ContSock = INVALID_SOCKET;\r
\r
- HostPort = Port;\r
- Tmp = Host;\r
- if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
- (Fwall == FWALL_SIDEWINDER) ||\r
- (Fwall == FWALL_FU_FP))\r
- {\r
- Tmp = FwallHost;\r
- Port = FwallPort;\r
- }\r
+ HostPort = Port;\r
+ Tmp = Host;\r
+ if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
+ (Fwall == FWALL_SIDEWINDER) ||\r
+ (Fwall == FWALL_FU_FP))\r
+ {\r
+ Tmp = FwallHost;\r
+ Port = FwallPort;\r
+ }\r
\r
- if(strlen(Tmp) != 0)\r
- {\r
- if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET)\r
+ if(strlen(Tmp) != 0)\r
{\r
- // バッファを無効\r
+ // 同時接続対応\r
+// if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET)\r
+ if((ContSock = connectsock(Tmp, Port, "", CancelCheckWork)) != INVALID_SOCKET)\r
+ {\r
+ // バッファを無効\r
#ifdef DISABLE_CONTROL_NETWORK_BUFFERS\r
- int BufferSize = 0;\r
- setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int));\r
- setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int));\r
+ int BufferSize = 0;\r
+ setsockopt(ContSock, SOL_SOCKET, SO_SNDBUF, (char*)&BufferSize, sizeof(int));\r
+ setsockopt(ContSock, SOL_SOCKET, SO_RCVBUF, (char*)&BufferSize, sizeof(int));\r
#endif\r
- while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
- ;\r
-\r
- if(Sts == FTP_COMPLETE)\r
- {\r
- Flg = 1;\r
- if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
- ReportWSError("setsockopt", WSAGetLastError());\r
- // データ転送用ソケットのTCP遅延転送が無効されているので念のため\r
- if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
- ReportWSError("setsockopt", WSAGetLastError());\r
-#pragma aaa\r
- Flg = 1;\r
- if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
- ReportWSError("setsockopt", WSAGetLastError());\r
- LingerOpt.l_onoff = 1;\r
- LingerOpt.l_linger = 90;\r
- if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR)\r
- ReportWSError("setsockopt", WSAGetLastError());\r
-///////\r
-\r
-\r
- /*===== 認証を行なう =====*/\r
-\r
- Sts = FTP_COMPLETE;\r
- if((Fwall == FWALL_FU_FP_SITE) ||\r
- (Fwall == FWALL_FU_FP_USER) ||\r
- (Fwall == FWALL_FU_FP))\r
+ // FTPIS対応\r
+// while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM)\r
+// ;\r
+ if(CryptMode == CRYPT_FTPIS)\r
{\r
- if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE)\r
+ if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork))\r
{\r
- CheckOneTimePassword(FwallPass, Reply, FwallSecurity);\r
- Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+ while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM)\r
+ ;\r
}\r
+ else\r
+ Sts = FTP_ERROR;\r
}\r
- else if(Fwall == FWALL_SIDEWINDER)\r
- {\r
- Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100;\r
- }\r
- if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
+ else\r
{\r
- SetTaskMsg(MSGJPN006);\r
- DoClose(ContSock);\r
- ContSock = INVALID_SOCKET;\r
+ while((Sts = ReadReplyMessage(ContSock, Buf, 1024, CancelCheckWork, TmpBuf) / 100) == FTP_PRELIM)\r
+ ;\r
}\r
- else\r
+\r
+ if(Sts == FTP_COMPLETE)\r
{\r
- if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN))\r
+ Flg = 1;\r
+ if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+ ReportWSError("setsockopt", WSAGetLastError());\r
+ // データ転送用ソケットのTCP遅延転送が無効されているので念のため\r
+ if(setsockopt(ContSock, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+ ReportWSError("setsockopt", WSAGetLastError());\r
+//#pragma aaa\r
+ Flg = 1;\r
+ if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR)\r
+ ReportWSError("setsockopt", WSAGetLastError());\r
+ // 切断対策\r
+ if(TimeOut > 0)\r
{\r
- Flg = 0;\r
- if(Fwall == FWALL_OPEN)\r
- Flg = 2;\r
- if(FwallLower == YES)\r
- Flg++;\r
-\r
- if(HostPort == PORT_NOR)\r
- Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100;\r
- else\r
- Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100;\r
+ KeepAlive.onoff = 1;\r
+ KeepAlive.keepalivetime = TimeOut * 1000;\r
+ KeepAlive.keepaliveinterval = 1000;\r
+ if(WSAIoctl(ContSock, SIO_KEEPALIVE_VALS, &KeepAlive, sizeof(struct tcp_keepalive), NULL, 0, &dwTmp, NULL, NULL) == SOCKET_ERROR)\r
+ ReportWSError("WSAIoctl", WSAGetLastError());\r
}\r
+ LingerOpt.l_onoff = 1;\r
+ LingerOpt.l_linger = 90;\r
+ if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR)\r
+ ReportWSError("setsockopt", WSAGetLastError());\r
+///////\r
\r
+\r
+ /*===== 認証を行なう =====*/\r
+\r
+ Sts = FTP_COMPLETE;\r
+ if((Fwall == FWALL_FU_FP_SITE) ||\r
+ (Fwall == FWALL_FU_FP_USER) ||\r
+ (Fwall == FWALL_FU_FP))\r
+ {\r
+ // 同時接続対応\r
+// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE)\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", FwallUser) / 100) == FTP_CONTINUE)\r
+ {\r
+ CheckOneTimePassword(FwallPass, Reply, FwallSecurity);\r
+ // 同時接続対応\r
+// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+ Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100;\r
+ }\r
+ }\r
+ else if(Fwall == FWALL_SIDEWINDER)\r
+ {\r
+ // 同時接続対応\r
+// Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100;\r
+ Sts = command(ContSock, Reply, CancelCheckWork, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100;\r
+ }\r
if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
{\r
- SetTaskMsg(MSGJPN007, Host);\r
+ SetTaskMsg(MSGJPN006);\r
DoClose(ContSock);\r
ContSock = INVALID_SOCKET;\r
}\r
else\r
{\r
- Anony = NO;\r
- if((strlen(User) != 0) || \r
- (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN))\r
{\r
- if(Anony == YES)\r
- {\r
- strcpy(User, "anonymous");\r
- strcpy(Pass, UserMailAdrs);\r
- }\r
+ Flg = 0;\r
+ if(Fwall == FWALL_OPEN)\r
+ Flg = 2;\r
+ if(FwallLower == YES)\r
+ Flg++;\r
+\r
+ if(HostPort == PORT_NOR)\r
+ // 同時接続対応\r
+// Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100;\r
+ Sts = command(ContSock, NULL, CancelCheckWork, "%s %s", SiteTbl[Flg], Host) / 100;\r
+ else\r
+ // 同時接続対応\r
+// Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100;\r
+ Sts = command(ContSock, NULL, CancelCheckWork, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100;\r
+ }\r
\r
- if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER))\r
+ if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE))\r
+ {\r
+ SetTaskMsg(MSGJPN007, Host);\r
+ DoClose(ContSock);\r
+ ContSock = INVALID_SOCKET;\r
+ }\r
+ else\r
+ {\r
+ Anony = NO;\r
+ // 同時接続対応\r
+// if((strlen(User) != 0) || \r
+// (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ if((strlen(User) != 0) || \r
+ ((HostData->NoDisplayUI == NO) && (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)))\r
{\r
- if(HostPort == PORT_NOR)\r
- sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host);\r
+ if(Anony == YES)\r
+ {\r
+ strcpy(User, "anonymous");\r
+ strcpy(Pass, UserMailAdrs);\r
+ }\r
+\r
+ if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER))\r
+ {\r
+ if(HostPort == PORT_NOR)\r
+ sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host);\r
+ else\r
+ sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort);\r
+ }\r
else\r
- sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort);\r
- }\r
- else\r
- strcpy(Buf, User);\r
+ strcpy(Buf, User);\r
\r
- // FTPES対応\r
- // 2回以上呼ばれる事があるため既にFTPESで接続していても再確認\r
- if(CurHost.CryptMode == CRYPT_NONE || CurHost.CryptMode == CRYPT_FTPES)\r
- {\r
- if(IsOpenSSLLoaded() && CurHost.UseFTPES == YES && (Sts = command(ContSock, Reply, &CancelFlg, "AUTH TLS")) == 234)\r
+ // FTPES対応\r
+ if(CryptMode == CRYPT_FTPES)\r
{\r
- // SSLに切り替え\r
- SetTaskMsg(MSGJPN315);\r
- CurHost.CryptMode = CRYPT_FTPES;\r
- if(AttachSSL(ContSock))\r
+ if(IsOpenSSLLoaded() && ((Sts = command(ContSock, Reply, CancelCheckWork, "AUTH TLS")) == 234 || (Sts = command(ContSock, Reply, CancelCheckWork, "AUTH SSL")) == 234))\r
{\r
- if((Sts = command(ContSock, Reply, &CancelFlg, "PBSZ 0")) == 200)\r
+ if(AttachSSL(ContSock, INVALID_SOCKET, CancelCheckWork))\r
{\r
- if((Sts = command(ContSock, Reply, &CancelFlg, "PROT P")) == 200)\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200)\r
{\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200)\r
+ {\r
+ }\r
+ else\r
+ Sts = FTP_ERROR;\r
}\r
else\r
Sts = FTP_ERROR;\r
else\r
Sts = FTP_ERROR;\r
}\r
- else\r
+\r
+ // FTPIS対応\r
+ // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため\r
+ if(CryptMode == CRYPT_FTPIS)\r
{\r
- // 暗号化なし\r
- CurHost.CryptMode = CRYPT_NONE;\r
- SetTaskMsg(MSGJPN314);\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200)\r
+ {\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200)\r
+ {\r
+ }\r
+ }\r
}\r
- }\r
\r
- ReInPass = NO;\r
- do\r
- {\r
- Continue = NO;\r
- if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE)\r
+ ReInPass = NO;\r
+ do\r
{\r
- if((strlen(Pass) != 0) || \r
- (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ // FTPES対応\r
+ if(Sts == FTP_ERROR)\r
+ break;\r
+ Continue = NO;\r
+ // 同時接続対応\r
+// if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE)\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE)\r
{\r
- CheckOneTimePassword(Pass, Reply, Security);\r
+ // 同時接続対応\r
+// if((strlen(Pass) != 0) || \r
+// (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ if((strlen(Pass) != 0) || \r
+ ((HostData->NoDisplayUI == NO) && (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)))\r
+ {\r
+ CheckOneTimePassword(Pass, Reply, Security);\r
\r
- /* パスワードがスペース1個の時はパスワードの実体なしとする */\r
- if(strcmp(Reply, " ") == 0)\r
- strcpy(Reply, "");\r
+ /* パスワードがスペース1個の時はパスワードの実体なしとする */\r
+ if(strcmp(Reply, " ") == 0)\r
+ strcpy(Reply, "");\r
\r
- Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
- if(Sts == FTP_ERROR)\r
- {\r
- strcpy(Pass, "");\r
- if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)\r
- Continue = YES;\r
- else\r
- DoPrintf("No password specified.");\r
- ReInPass = YES;\r
- }\r
- else if(Sts == FTP_CONTINUE)\r
- {\r
- if((strlen(Acct) != 0) || \r
- (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ // 同時接続対応\r
+// Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100;\r
+ Sts = command(ContSock, NULL, CancelCheckWork, "PASS %s", Reply) / 100;\r
+ if(Sts == FTP_ERROR)\r
{\r
- Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100;\r
+ strcpy(Pass, "");\r
+ // 同時接続対応\r
+// if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)\r
+ if(HostData->NoDisplayUI == NO && InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)\r
+ Continue = YES;\r
+ else\r
+ DoPrintf("No password specified.");\r
+ ReInPass = YES;\r
+ }\r
+ else if(Sts == FTP_CONTINUE)\r
+ {\r
+ // 同時接続対応\r
+// if((strlen(Acct) != 0) || \r
+// (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))\r
+ if((strlen(Acct) != 0) || \r
+ ((HostData->NoDisplayUI == NO) && (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)))\r
+ {\r
+ // 同時接続対応\r
+// Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100;\r
+ Sts = command(ContSock, NULL, CancelCheckWork, "ACCT %s", Acct) / 100;\r
+ }\r
+ else\r
+ DoPrintf("No account specified");\r
}\r
- else\r
- DoPrintf("No account specified");\r
+ }\r
+ else\r
+ {\r
+ Sts = FTP_ERROR;\r
+ DoPrintf("No password specified.");\r
}\r
}\r
- else\r
- {\r
- Sts = FTP_ERROR;\r
- DoPrintf("No password specified.");\r
- }\r
+ // FTPES対応\r
+ if(Continue == YES)\r
+ Sts = FTP_COMPLETE;\r
}\r
+ while(Continue == YES);\r
+ }\r
+ else\r
+ {\r
+ Sts = FTP_ERROR;\r
+ DoPrintf("No user name specified");\r
}\r
- while(Continue == YES);\r
- }\r
- else\r
- {\r
- Sts = FTP_ERROR;\r
- DoPrintf("No user name specified");\r
- }\r
\r
- if(Sts != FTP_COMPLETE)\r
- {\r
- SetTaskMsg(MSGJPN008, Host);\r
- DoClose(ContSock);\r
- ContSock = INVALID_SOCKET;\r
- }\r
- else if((SavePass == YES) && (ReInPass == YES))\r
- {\r
- if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
- SetHostPassword(AskCurrentHost(), Pass);\r
+ if(Sts != FTP_COMPLETE)\r
+ {\r
+ SetTaskMsg(MSGJPN008, Host);\r
+ DoClose(ContSock);\r
+ ContSock = INVALID_SOCKET;\r
+ }\r
+ else if((SavePass == YES) && (ReInPass == YES))\r
+ {\r
+ // 同時接続対応\r
+// if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ if(HostData->NoDisplayUI == NO && DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+ SetHostPassword(AskCurrentHost(), Pass);\r
+ }\r
}\r
}\r
}\r
- }\r
- else\r
- {\r
+ else\r
+ {\r
//#pragma aaa\r
- SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/);\r
- DoClose(ContSock);\r
- ContSock = INVALID_SOCKET;\r
+ SetTaskMsg(MSGJPN009/*"接続できません(1) %x", ContSock*/);\r
+ DoClose(ContSock);\r
+ ContSock = INVALID_SOCKET;\r
+ }\r
}\r
}\r
- }\r
- else\r
- {\r
-\r
- if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
- (Fwall == FWALL_FU_FP))\r
- SetTaskMsg(MSGJPN010);\r
else\r
- SetTaskMsg(MSGJPN011);\r
- }\r
+ {\r
+\r
+ if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) ||\r
+ (Fwall == FWALL_FU_FP))\r
+ SetTaskMsg(MSGJPN010);\r
+ else\r
+ SetTaskMsg(MSGJPN011);\r
+ }\r
\r
#if 0\r
-// WSAUnhookBlockingHook();\r
+// WSAUnhookBlockingHook();\r
#endif\r
- TryConnect = NO;\r
+ TryConnect = NO;\r
+\r
+ // FEAT対応\r
+ // ホストの機能を確認\r
+ if(ContSock != INVALID_SOCKET)\r
+ {\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "FEAT")) == 211)\r
+ {\r
+ // 改行文字はReadReplyMessageで消去されるため区切り文字に空白を使用\r
+ // UTF-8対応\r
+ if(strstr(Reply, " UTF8 "))\r
+ HostData->Feature |= FEATURE_UTF8;\r
+ // MLST対応\r
+ if(strstr(Reply, " MLST ") || strstr(Reply, " MLSD "))\r
+ HostData->Feature |= FEATURE_MLSD;\r
+ // IPv6対応\r
+ if(strstr(Reply, " EPRT ") || strstr(Reply, " EPSV "))\r
+ HostData->Feature |= FEATURE_EPRT | FEATURE_EPSV;\r
+ // ホスト側の日時取得\r
+ if(strstr(Reply, " MDTM "))\r
+ HostData->Feature |= FEATURE_MDTM;\r
+ // ホスト側の日時設定\r
+ if(strstr(Reply, " MFMT "))\r
+ HostData->Feature |= FEATURE_MFMT;\r
+ }\r
+ // UTF-8対応\r
+ if(HostData->CurNameKanjiCode == KANJI_AUTO && (HostData->Feature & FEATURE_UTF8))\r
+ {\r
+ if((Sts = command(ContSock, Reply, CancelCheckWork, "OPTS UTF8 ON")) == 200)\r
+ HostData->CurNameKanjiCode = KANJI_UTF8N;\r
+ }\r
+ }\r
+ }\r
\r
return(ContSock);\r
}\r
\r
+// 同時接続対応\r
+//static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security)\r
+static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security, int *CancelCheckWork)\r
+{\r
+ SOCKET ContSock;\r
+ ContSock = INVALID_SOCKET;\r
+ *CancelCheckWork = NO;\r
+ if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPIS == YES)\r
+ {\r
+ SetTaskMsg(MSGJPN316);\r
+ if((ContSock = DoConnectCrypt(CRYPT_FTPIS, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET)\r
+ HostData->CryptMode = CRYPT_FTPIS;\r
+ }\r
+ if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseFTPES == YES)\r
+ {\r
+ SetTaskMsg(MSGJPN315);\r
+ if((ContSock = DoConnectCrypt(CRYPT_FTPES, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET)\r
+ HostData->CryptMode = CRYPT_FTPES;\r
+ }\r
+ if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseNoEncryption == YES)\r
+ {\r
+ SetTaskMsg(MSGJPN314);\r
+ if((ContSock = DoConnectCrypt(CRYPT_NONE, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET)\r
+ HostData->CryptMode = CRYPT_NONE;\r
+ }\r
+ return ContSock;\r
+}\r
+\r
\r
/*----- ワンタイムパスワードのチェック ----------------------------------------\r
*\r
* SOCKET ソケット\r
*----------------------------------------------------------------------------*/\r
\r
-SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
-{\r
- struct sockaddr_in saSockAddr;\r
- char HostEntry[MAXGETHOSTSTRUCT];\r
- struct hostent *pHostEntry;\r
- SOCKET sSocket;\r
- int Len;\r
- int Fwall;\r
- SOCKS4CMD Socks4Cmd;\r
- SOCKS4REPLY Socks4Reply;\r
- SOCKS5REQUEST Socks5Cmd;\r
- SOCKS5REPLY Socks5Reply;\r
+// IPv6対応\r
+typedef SOCKET (__cdecl* LPCONNECTSOCK)(char*, int, char*, int*);\r
\r
- //////////////////////////////\r
- // ホスト名解決と接続の準備\r
- //////////////////////////////\r
+typedef struct\r
+{\r
+ HANDLE h;\r
+ DWORD ExitCode;\r
+ char *host;\r
+ int port;\r
+ char *PreMsg;\r
+ int CancelCheckWork;\r
+ LPCONNECTSOCK f;\r
+ SOCKET s;\r
+} CONNECTSOCKDATA;\r
+\r
+DWORD WINAPI connectsockThreadProc(LPVOID lpParameter)\r
+{\r
+ CONNECTSOCKDATA* pData;\r
+ pData = (CONNECTSOCKDATA*)lpParameter;\r
+ pData->s = pData->f(pData->host, pData->port, pData->PreMsg, &pData->CancelCheckWork);\r
+ return 0;\r
+}\r
\r
- Fwall = FWALL_NONE;\r
+// IPv6対応\r
+SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
+{\r
+ SOCKET Result;\r
+ CONNECTSOCKDATA DataIPv4;\r
+ CONNECTSOCKDATA DataIPv6;\r
+ Result = INVALID_SOCKET;\r
+ switch(CurHost.CurNetType)\r
+ {\r
+ case NTYPE_AUTO:\r
+// if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET)\r
+// CurHost.CurNetType = NTYPE_IPV4;\r
+// else if((Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET)\r
+// CurHost.CurNetType = NTYPE_IPV6;\r
+ DataIPv4.host = host;\r
+ DataIPv4.port = port;\r
+ DataIPv4.PreMsg = PreMsg;\r
+ DataIPv4.CancelCheckWork = *CancelCheckWork;\r
+ DataIPv4.f = connectsockIPv4;\r
+ DataIPv4.h = CreateThread(NULL, 0, connectsockThreadProc, &DataIPv4, 0, NULL);\r
+ DataIPv6.host = host;\r
+ DataIPv6.port = port;\r
+ DataIPv6.PreMsg = PreMsg;\r
+ DataIPv6.CancelCheckWork = *CancelCheckWork;\r
+ DataIPv6.f = connectsockIPv6;\r
+ DataIPv6.h = CreateThread(NULL, 0, connectsockThreadProc, &DataIPv6, 0, NULL);\r
+ while(1)\r
+ {\r
+ if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode))\r
+ {\r
+ if(DataIPv4.ExitCode != STILL_ACTIVE)\r
+ {\r
+ if(DataIPv4.s != INVALID_SOCKET)\r
+ {\r
+ Result = DataIPv4.s;\r
+ CurHost.CurNetType = NTYPE_IPV4;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if(GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode))\r
+ {\r
+ if(DataIPv6.ExitCode != STILL_ACTIVE)\r
+ {\r
+ if(DataIPv6.s != INVALID_SOCKET)\r
+ {\r
+ Result = DataIPv6.s;\r
+ CurHost.CurNetType = NTYPE_IPV6;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode) && GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode))\r
+ {\r
+ if(DataIPv4.ExitCode != STILL_ACTIVE && DataIPv6.ExitCode != STILL_ACTIVE)\r
+ {\r
+ if(DataIPv4.s == INVALID_SOCKET && DataIPv6.s == INVALID_SOCKET)\r
+ break;\r
+ }\r
+ }\r
+ DataIPv4.CancelCheckWork = *CancelCheckWork;\r
+ DataIPv6.CancelCheckWork = *CancelCheckWork;\r
+ BackgrndMessageProc();\r
+ Sleep(1);\r
+ }\r
+ while(1)\r
+ {\r
+ if(GetExitCodeThread(DataIPv4.h, &DataIPv4.ExitCode) && GetExitCodeThread(DataIPv6.h, &DataIPv6.ExitCode))\r
+ {\r
+ if(DataIPv4.ExitCode != STILL_ACTIVE && DataIPv6.ExitCode != STILL_ACTIVE)\r
+ {\r
+ CloseHandle(DataIPv4.h);\r
+ CloseHandle(DataIPv6.h);\r
+ break;\r
+ }\r
+ }\r
+ DataIPv4.CancelCheckWork = YES;\r
+ DataIPv6.CancelCheckWork = YES;\r
+ BackgrndMessageProc();\r
+ Sleep(1);\r
+ }\r
+ break;\r
+ case NTYPE_IPV4:\r
+ Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork);\r
+ CurHost.CurNetType = NTYPE_IPV4;\r
+ break;\r
+ case NTYPE_IPV6:\r
+ Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork);\r
+ CurHost.CurNetType = NTYPE_IPV6;\r
+ break;\r
+ }\r
+ return Result;\r
+}\r
+\r
+\r
+// IPv6対応\r
+//SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
+SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
+{\r
+ // IPv6対応\r
+ struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+ struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */\r
+ struct sockaddr_in saSockAddr;\r
+ char HostEntry[MAXGETHOSTSTRUCT];\r
+ struct hostent *pHostEntry;\r
+ SOCKET sSocket;\r
+ int Len;\r
+ int Fwall;\r
+ SOCKS4CMD Socks4Cmd;\r
+ SOCKS4REPLY Socks4Reply;\r
+ SOCKS5REQUEST Socks5Cmd;\r
+ SOCKS5REPLY Socks5Reply;\r
+\r
+ //////////////////////////////\r
+ // ホスト名解決と接続の準備\r
+ //////////////////////////////\r
+\r
+ Fwall = FWALL_NONE;\r
if(AskHostFireWall() == YES)\r
Fwall = FwallType;\r
\r
else\r
{\r
// アドレスを取得\r
- SetTaskMsg(MSGJPN016, DomainName);\r
- pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN016, DomainName);\r
+ SetTaskMsg(MSGJPN016, DomainName, MSGJPN333);\r
+ // IPv6対応\r
+// pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
+ pHostEntry = do_gethostbynameIPv4(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
}\r
\r
if(pHostEntry != NULL)\r
{\r
memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
- SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
+ SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
}\r
else\r
{\r
if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
{\r
UseIPadrs = NO;\r
- SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port));\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port));\r
+ SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port), MSGJPN333);\r
}\r
else\r
{\r
- SetTaskMsg(MSGJPN019, host);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN019, host);\r
+ SetTaskMsg(MSGJPN019, host, MSGJPN333);\r
return(INVALID_SOCKET);\r
}\r
}\r
}\r
else\r
- SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
+ SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
\r
if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
{\r
memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
{\r
- if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
+ // IPv6対応\r
+// if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
+ if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
else\r
{\r
- SetTaskMsg(MSGJPN021, FwallHost);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN021, FwallHost);\r
+ SetTaskMsg(MSGJPN021, FwallHost, MSGJPN333);\r
return INVALID_SOCKET;\r
}\r
}\r
SocksSockAddr.sin_port = htons((u_short)FwallPort);\r
SocksSockAddr.sin_family = AF_INET;\r
- SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port));\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port));\r
+ SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port), MSGJPN333);\r
// connectで接続する先はSOCKSサーバ\r
memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
}\r
\r
if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
{\r
+ // ソケットにデータを付与\r
+ SetAsyncTableDataIPv4(sSocket, &CurSockAddr, &SocksSockAddr);\r
if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
{\r
if(Fwall == FWALL_SOCKS4)\r
{\r
Socks4Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || \r
+// (Socks4Reply.Result != SOCKS4_RES_OK))\r
if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (Socks4GetCmdReply(sSocket, &Socks4Reply) != FFFTP_SUCCESS) || \r
+ (Socks4GetCmdReply(sSocket, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
(Socks4Reply.Result != SOCKS4_RES_OK))\r
{\r
- SetTaskMsg(MSGJPN023, Socks4Reply.Result);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN023, Socks4Reply.Result);\r
+ SetTaskMsg(MSGJPN023, Socks4Reply.Result, MSGJPN333);\r
DoClose(sSocket);\r
sSocket = INVALID_SOCKET;\r
}\r
}\r
\r
Socks5Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || \r
+// (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+ (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
+ (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ {\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN024, Socks5Reply.Result);\r
+ SetTaskMsg(MSGJPN024, Socks5Reply.Result, MSGJPN333);\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+\r
+ }\r
+\r
+ if(sSocket != INVALID_SOCKET)\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN025);\r
+ SetTaskMsg(MSGJPN025, MSGJPN333);\r
+ }\r
+ else\r
+ {\r
+//#pragma aaa\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/);\r
+ SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/, MSGJPN333);\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+ }\r
+ else\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN027);\r
+ SetTaskMsg(MSGJPN027, MSGJPN333);\r
+\r
+ return(sSocket);\r
+}\r
+\r
+\r
+SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
+{\r
+ struct sockaddr_in6 SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+ struct sockaddr_in6 CurSockAddr; /* 接続先ホストのアドレス情報 */\r
+ struct sockaddr_in6 saSockAddr;\r
+ char HostEntry[MAXGETHOSTSTRUCT];\r
+ struct hostent *pHostEntry;\r
+ SOCKET sSocket;\r
+ int Len;\r
+ int Fwall;\r
+ SOCKS5REQUEST Socks5Cmd;\r
+ SOCKS5REPLY Socks5Reply;\r
+\r
+ //////////////////////////////\r
+ // ホスト名解決と接続の準備\r
+ //////////////////////////////\r
+\r
+ Fwall = FWALL_NONE;\r
+ if(AskHostFireWall() == YES)\r
+ Fwall = FwallType;\r
+\r
+ sSocket = INVALID_SOCKET;\r
+\r
+ UseIPadrs = YES;\r
+ strcpy(DomainName, host);\r
+ memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+ CurSockAddr.sin6_port = htons((u_short)port);\r
+ CurSockAddr.sin6_family = AF_INET6;\r
+ CurSockAddr.sin6_addr = inet6_addr(host);\r
+ if(memcmp(&CurSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+ {\r
+ // ホスト名が指定された\r
+ // ホスト名からアドレスを求める\r
+ if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) &&\r
+ (FwallResolv == YES))\r
+ {\r
+ // ホスト名解決はSOCKSサーバに任せる\r
+ pHostEntry = NULL;\r
+ }\r
+ else\r
+ {\r
+ // アドレスを取得\r
+ SetTaskMsg(MSGJPN016, DomainName, MSGJPN334);\r
+ pHostEntry = do_gethostbynameIPv6(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork);\r
+ }\r
+\r
+ if(pHostEntry != NULL)\r
+ {\r
+ memcpy((char *)&CurSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+ SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+ }\r
+ else\r
+ {\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ UseIPadrs = NO;\r
+ SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+ }\r
+ else\r
+ {\r
+ SetTaskMsg(MSGJPN019, host, MSGJPN334);\r
+ return(INVALID_SOCKET);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
+\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ // SOCKSを使う\r
+ // SOCKSに接続する準備\r
+ {\r
+ Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
+ }\r
+\r
+ memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+ SocksSockAddr.sin6_addr = inet6_addr(FwallHost);\r
+ if(memcmp(&SocksSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+ {\r
+ if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
+ memcpy((char *)&SocksSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+ else\r
+ {\r
+ SetTaskMsg(MSGJPN021, FwallHost, MSGJPN334);\r
+ return INVALID_SOCKET;\r
+ }\r
+ }\r
+ SocksSockAddr.sin6_port = htons((u_short)FwallPort);\r
+ SocksSockAddr.sin6_family = AF_INET6;\r
+ SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddr.sin6_addr), ntohs(SocksSockAddr.sin6_port), MSGJPN334);\r
+ // connectで接続する先はSOCKSサーバ\r
+ memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
+ }\r
+ else\r
+ {\r
+ // connectで接続するのは接続先のホスト\r
+ memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
+ }\r
+\r
+ /////////////\r
+ // 接続実行\r
+ /////////////\r
+\r
+ if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
+ {\r
+ // ソケットにデータを付与\r
+ SetAsyncTableDataIPv6(sSocket, &CurSockAddr, &SocksSockAddr);\r
+ if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
+ {\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL)\r
+ {\r
+ DoClose(sSocket);\r
+ sSocket = INVALID_SOCKET;\r
+ }\r
+\r
+ Socks5Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || \r
+// (Socks5Reply.Result != SOCKS5_RES_OK))\r
if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || \r
+ (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
(Socks5Reply.Result != SOCKS5_RES_OK))\r
{\r
- SetTaskMsg(MSGJPN024, Socks5Reply.Result);\r
+ SetTaskMsg(MSGJPN024, Socks5Reply.Result, MSGJPN334);\r
DoClose(sSocket);\r
sSocket = INVALID_SOCKET;\r
}\r
}\r
\r
if(sSocket != INVALID_SOCKET)\r
- SetTaskMsg(MSGJPN025);\r
+ SetTaskMsg(MSGJPN025, MSGJPN334);\r
}\r
else\r
{\r
//#pragma aaa\r
- SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/);\r
+ SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/, MSGJPN334);\r
DoClose(sSocket);\r
sSocket = INVALID_SOCKET;\r
}\r
}\r
else\r
- SetTaskMsg(MSGJPN027);\r
+ SetTaskMsg(MSGJPN027, MSGJPN334);\r
\r
return(sSocket);\r
}\r
* SOCKET リッスンソケット\r
*----------------------------------------------------------------------------*/\r
\r
+// IPv6対応\r
SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)\r
{\r
+ SOCKET Result;\r
+ Result = INVALID_SOCKET;\r
+ switch(CurHost.CurNetType)\r
+ {\r
+ case NTYPE_IPV4:\r
+ Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork);\r
+ break;\r
+ case NTYPE_IPV6:\r
+ Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork);\r
+ break;\r
+ }\r
+ return Result;\r
+}\r
+\r
+\r
+// IPv6対応\r
+//SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)\r
+SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)\r
+{\r
+ // IPv6対応\r
+ struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+ struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */\r
SOCKET listen_skt;\r
int iLength;\r
char *a,*p;\r
int Len;\r
int Fwall;\r
\r
+ // ソケットにデータを付与\r
+ GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
+\r
Fwall = FWALL_NONE;\r
if(AskHostFireWall() == YES)\r
Fwall = FwallType;\r
Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
\r
Socks4Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || \r
+// (Socks4Reply.Result != SOCKS4_RES_OK))\r
if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (Socks4GetCmdReply(listen_skt, &Socks4Reply) != FFFTP_SUCCESS) || \r
+ (Socks4GetCmdReply(listen_skt, &Socks4Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
(Socks4Reply.Result != SOCKS4_RES_OK))\r
{\r
- SetTaskMsg(MSGJPN028, Socks4Reply.Result);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN028, Socks4Reply.Result);\r
+ SetTaskMsg(MSGJPN028, Socks4Reply.Result, MSGJPN333);\r
DoClose(listen_skt);\r
listen_skt = INVALID_SOCKET;\r
}\r
Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
\r
Socks5Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || \r
+// (Socks5Reply.Result != SOCKS5_RES_OK))\r
if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || \r
+ (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
(Socks5Reply.Result != SOCKS5_RES_OK))\r
{\r
- SetTaskMsg(MSGJPN029, Socks5Reply.Result);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN029, Socks5Reply.Result);\r
+ SetTaskMsg(MSGJPN029, Socks5Reply.Result, MSGJPN333);\r
DoClose(listen_skt);\r
listen_skt = INVALID_SOCKET;\r
}\r
\r
- if(Socks5Reply.AdrsInt == 0)\r
- Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
+ // IPv6対応\r
+// if(Socks5Reply.AdrsInt == 0)\r
+// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
\r
- a = (char *)&Socks5Reply.AdrsInt;\r
- p = (char *)&Socks5Reply.Port;\r
+ // IPv6対応\r
+// a = (char *)&Socks5Reply.AdrsInt;\r
+// p = (char *)&Socks5Reply.Port;\r
+ a = (char *)&Socks5Reply._dummy[0];\r
+ p = (char *)&Socks5Reply._dummy[4];\r
}\r
}\r
else\r
}\r
\r
if(listen_skt == INVALID_SOCKET)\r
- SetTaskMsg(MSGJPN030);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN030);\r
+ SetTaskMsg(MSGJPN030, MSGJPN333);\r
}\r
}\r
else\r
if(listen_skt != INVALID_SOCKET)\r
{\r
#define UC(b) (((int)b)&0xff)\r
- if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d",\r
+ // 同時接続対応\r
+// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d",\r
+// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),\r
+// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE)\r
+ if((command(ctrl_skt,NULL, CancelCheckWork, "PORT %d,%d,%d,%d,%d,%d",\r
UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),\r
UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE)\r
{\r
- SetTaskMsg(MSGJPN031);\r
+ // IPv6対応\r
+// SetTaskMsg(MSGJPN031);\r
+ SetTaskMsg(MSGJPN031, MSGJPN333);\r
+ do_closesocket(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ }\r
+// else\r
+// DoPrintf("Skt=%u : listener %s port %u",listen_skt,inet_ntoa(saCtrlAddr.sin_addr),ntohs(saCtrlAddr.sin_port));\r
+ }\r
+\r
+ return(listen_skt);\r
+}\r
+\r
+\r
+SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)\r
+{\r
+ struct sockaddr_in6 SocksSockAddr; /* SOCKSサーバのアドレス情報 */\r
+ struct sockaddr_in6 CurSockAddr; /* 接続先ホストのアドレス情報 */\r
+ SOCKET listen_skt;\r
+ int iLength;\r
+ char *a,*p;\r
+ struct sockaddr_in6 saCtrlAddr;\r
+ struct sockaddr_in6 saTmpAddr;\r
+ SOCKS5REQUEST Socks5Cmd;\r
+ SOCKS5REPLY Socks5Reply;\r
+\r
+ int Len;\r
+ int Fwall;\r
+\r
+ char Adrs[40];\r
+\r
+ // ソケットにデータを付与\r
+ GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
+\r
+ Fwall = FWALL_NONE;\r
+ if(AskHostFireWall() == YES)\r
+ Fwall = FwallType;\r
+\r
+ if((listen_skt = do_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET)\r
+ {\r
+ if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
+ {\r
+ /*===== SOCKS5を使う =====*/\r
+ DoPrintf("Use SOCKS5 BIND");\r
+ if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
+ {\r
+ if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
+ {\r
+ DoClose(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ return(listen_skt);\r
+ }\r
+\r
+ Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
+\r
+ Socks5Reply.Result = -1;\r
+ // 同時接続対応\r
+// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || \r
+// (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+ (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || \r
+ (Socks5Reply.Result != SOCKS5_RES_OK))\r
+ {\r
+ SetTaskMsg(MSGJPN029, Socks5Reply.Result, MSGJPN334);\r
+ DoClose(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ }\r
+\r
+ // IPv6対応\r
+// if(Socks5Reply.AdrsInt == 0)\r
+// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
+\r
+ // IPv6対応\r
+// a = (char *)&Socks5Reply.AdrsInt;\r
+// p = (char *)&Socks5Reply.Port;\r
+ a = (char *)&Socks5Reply._dummy[0];\r
+ p = (char *)&Socks5Reply._dummy[16];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*===== SOCKSを使わない =====*/\r
+ DoPrintf("Use normal BIND");\r
+ saCtrlAddr.sin6_port = htons(0);\r
+ saCtrlAddr.sin6_family = AF_INET6;\r
+ memset(&saCtrlAddr.sin6_addr, 0, 16);\r
+\r
+ if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr_in6)) != SOCKET_ERROR)\r
+ {\r
+ iLength = sizeof(saCtrlAddr);\r
+ if(getsockname(listen_skt, (struct sockaddr *)&saCtrlAddr, &iLength) != SOCKET_ERROR)\r
+ {\r
+ if(do_listen(listen_skt, 1) == 0)\r
+ {\r
+ iLength = sizeof(saTmpAddr);\r
+ if(getsockname(ctrl_skt, (struct sockaddr *)&saTmpAddr, &iLength) == SOCKET_ERROR)\r
+ ReportWSError("getsockname", WSAGetLastError());\r
+\r
+ a = (char *)&saTmpAddr.sin6_addr;\r
+ p = (char *)&saCtrlAddr.sin6_port;\r
+ }\r
+ else\r
+ {\r
+ ReportWSError("listen", WSAGetLastError());\r
+ do_closesocket(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ ReportWSError("getsockname", WSAGetLastError());\r
+ do_closesocket(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ ReportWSError("bind", WSAGetLastError());\r
+ do_closesocket(listen_skt);\r
+ listen_skt = INVALID_SOCKET;\r
+ }\r
+\r
+ if(listen_skt == INVALID_SOCKET)\r
+ SetTaskMsg(MSGJPN030, MSGJPN334);\r
+ }\r
+ }\r
+ else\r
+ ReportWSError("socket create", WSAGetLastError());\r
+\r
+ if(listen_skt != INVALID_SOCKET)\r
+ {\r
+#define UC(b) (((int)b)&0xff)\r
+ // 同時接続対応\r
+// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d",\r
+// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),\r
+// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE)\r
+ if((command(ctrl_skt,NULL, CancelCheckWork, "EPRT |2|%s|%d|",\r
+ AddressToStringIPv6(Adrs, a),\r
+ (UC(p[0]) << 8) | UC(p[1])) / 100) != FTP_COMPLETE)\r
+ {\r
+ SetTaskMsg(MSGJPN031, MSGJPN334);\r
do_closesocket(listen_skt);\r
listen_skt = INVALID_SOCKET;\r
}\r
}\r
\r
\r
+// IPv6対応\r
+static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port)\r
+{\r
+ uchar *Pos;\r
+ int Len;\r
+ int TotalLen;\r
+\r
+ Pos = (uchar *)Packet;\r
+ Pos += SOCKS5REQUEST_SIZE;\r
+ TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2はポートの分 */\r
+\r
+ Packet->Ver = SOCKS5_VER;\r
+ Packet->Cmd = Cmd;\r
+ Packet->Rsv = 0;\r
+ if(ValidIP == YES)\r
+ {\r
+ /* IPアドレスを指定 */\r
+ Packet->Type = SOCKS5_ADRS_IPV6;\r
+ memcpy(Pos, IP, 16);\r
+ Pos += 16;\r
+ TotalLen += 16;\r
+ }\r
+ else\r
+ {\r
+ /* ホスト名を指定 */\r
+ Packet->Type = SOCKS5_ADRS_NAME;\r
+ Len = strlen(Host);\r
+ *Pos++ = Len;\r
+ strcpy(Pos, Host);\r
+ Pos += Len;\r
+ TotalLen += Len + 1;\r
+ }\r
+ *((ushort *)Pos) = Port;\r
+\r
+ return(TotalLen);\r
+}\r
+\r
+\r
/*----- SOCKSのコマンドを送る -------------------------------------------------\r
*\r
* Parameter\r
* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
*----------------------------------------------------------------------------*/\r
\r
-static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet)\r
+// 同時接続対応\r
+//static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet)\r
+static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelCheckWork)\r
{\r
uchar *Pos;\r
int Len;\r
Pos = (uchar *)Packet;\r
Pos += SOCKS5REPLY_SIZE;\r
\r
- if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS)\r
+ // 同時接続対応\r
+// if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == FFFTP_SUCCESS)\r
+ if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, CancelCheckWork)) == FFFTP_SUCCESS)\r
{\r
if(Packet->Type == SOCKS5_ADRS_IPV4)\r
Len = 4 + 2;\r
else if(Packet->Type == SOCKS5_ADRS_IPV6)\r
- Len = 6 + 2;\r
+ Len = 16 + 2;\r
else\r
{\r
- if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS)\r
+ // 同時接続対応\r
+// if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == FFFTP_SUCCESS)\r
+ if((Ret = ReadNchar(Socket, (char *)Pos, 1, CancelCheckWork)) == FFFTP_SUCCESS)\r
{\r
Len = *Pos + 2;\r
Pos++;\r
}\r
\r
if(Ret == FFFTP_SUCCESS)\r
- Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg);\r
+ // 同時接続対応\r
+// Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg);\r
+ Ret = ReadNchar(Socket, (char *)Pos, Len, CancelCheckWork);\r
}\r
\r
if(Ret != FFFTP_SUCCESS)\r
* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
*----------------------------------------------------------------------------*/\r
\r
-static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet)\r
+// 同時接続対応\r
+//static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet)\r
+static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet, int *CancelCheckWork)\r
{\r
int Ret;\r
\r
- Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg);\r
+ // 同時接続対応\r
+// Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg);\r
+ Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, CancelCheckWork);\r
\r
if(Ret != FFFTP_SUCCESS)\r
DoPrintf(MSGJPN035);\r
else\r
Socks5Method.Methods[0] = SOCKS5_AUTH_USER;\r
\r
+ // 同時接続対応\r
+// if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
+// (Socks5MethodReply.Method == (uchar)0xFF))\r
if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
+ (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, CancelCheckWork) != FFFTP_SUCCESS) ||\r
(Socks5MethodReply.Method == (uchar)0xFF))\r
{\r
SetTaskMsg(MSGJPN036);\r
Buf[2 + Len] = Len2;\r
strcpy(Buf+3+Len, FwallPass);\r
\r
+ // 同時接続対応\r
+// if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) ||\r
+// (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
+// (Socks5Status.Status != 0))\r
if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != FFFTP_SUCCESS) ||\r
- (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != FFFTP_SUCCESS) ||\r
+ (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, CancelCheckWork) != FFFTP_SUCCESS) ||\r
(Socks5Status.Status != 0))\r
{\r
SetTaskMsg(MSGJPN037);\r
* int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)\r
*----------------------------------------------------------------------------*/\r
\r
-int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data)\r
+// 同時接続対応\r
+//int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data)\r
+int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data, int *CancelCheckWork)\r
{\r
int Ret;\r
char Buf[300];\r
Ret = FFFTP_FAIL;\r
if((AskHostFireWall() == YES) && (FwallType == FWALL_SOCKS4))\r
{\r
- Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf);\r
+ // 同時接続対応\r
+// Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf);\r
+ Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf, CancelCheckWork);\r
*Data = Socket;\r
Ret = FFFTP_SUCCESS;\r
}\r
else if((AskHostFireWall() == YES) &&\r
((FwallType == FWALL_SOCKS5_NOAUTH) || (FwallType == FWALL_SOCKS5_USER)))\r
{\r
- Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf);\r
+ // 同時接続対応\r
+// Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf);\r
+ Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf, CancelCheckWork);\r
*Data = Socket;\r
Ret = FFFTP_SUCCESS;\r
}\r
return(CurHost.CryptMode);\r
}\r
\r
+int AskUseNoEncryption(void)\r
+{\r
+ return(CurHost.UseNoEncryption);\r
+}\r
+\r
int AskUseFTPES(void)\r
{\r
return(CurHost.UseFTPES);\r
return(CurHost.UseSFTP);\r
}\r
\r
+char *AskPrivateKey(void)\r
+{\r
+ return(CurHost.PrivateKey);\r
+}\r
+\r
+// 同時接続対応\r
+int AskMaxThreadCount(void)\r
+{\r
+ return(CurHost.MaxThreadCount);\r
+}\r
+\r
+int AskReuseCmdSkt(void)\r
+{\r
+ return(CurHost.ReuseCmdSkt);\r
+}\r
+\r
+// FEAT対応\r
+int AskHostFeature(void)\r
+{\r
+ return(CurHost.Feature);\r
+}\r
+\r
+// MLSD対応\r
+int AskUseMLSD(void)\r
+{\r
+ return(CurHost.UseMLSD);\r
+}\r
+\r
+// IPv6対応\r
+int AskCurNetType(void)\r
+{\r
+ return(CurHost.CurNetType);\r
+}\r
+\r
+// 自動切断対策\r
+int AskNoopInterval(void)\r
+{\r
+ return(CurHost.NoopInterval);\r
+}\r
+\r
+// 再転送対応\r
+int AskTransferErrorMode(void)\r
+{\r
+ return(CurHost.TransferErrorMode);\r
+}\r
+\r
+int AskTransferErrorNotify(void)\r
+{\r
+ return(CurHost.TransferErrorNotify);\r
+}\r
+\r