X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=connect.c;h=3e17909f239f171b0911d7d42e4ce65bae9314b6;hp=989c0267bb34ca03d4852ed3efdcdd4009e59f7e;hb=2bffe82de6811b380d280099f638dd7b4cbb3404;hpb=12e22e37ba002e45ecc54fbad867072a3cc2fac8 diff --git a/connect.c b/connect.c index 989c026..3e17909 100644 --- a/connect.c +++ b/connect.c @@ -37,7 +37,7 @@ #include // IPv6対応 //#include -#include +#include #include #include @@ -54,8 +54,12 @@ /*===== プロトタイプ =====*/ -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); @@ -121,6 +125,9 @@ static const struct in6_addr IN6ADDR_NONE = {{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 @@ -160,6 +167,8 @@ void ConnectProc(int Type, int Num) 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) { @@ -185,20 +194,53 @@ void ConnectProc(int Type, int Num) CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; - // UTF-8対応 - if(CurHost.CurNameKanjiCode == KANJI_AUTO) - { - if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) - CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); - } - 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) { @@ -252,6 +294,8 @@ void QuickConnectProc(void) 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) @@ -276,15 +320,15 @@ void QuickConnectProc(void) CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; - // UTF-8対応 - if(CurHost.CurNameKanjiCode == KANJI_AUTO) - { - if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) - CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); - } - 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); @@ -321,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; @@ -442,6 +488,8 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) CurHost.KanaCnv = YES; /* とりあえず */ // UTF-8対応 CurHost.CurNameKanjiCode = CurHost.NameKanjiCode; + // IPv6対応 + CurHost.CurNetType = CurHost.NetType; SetHostKanaCnvImm(CurHost.KanaCnv); SetHostKanjiCodeImm(CurHost.KanjiCode); @@ -460,15 +508,15 @@ void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; - // UTF-8対応 - if(CurHost.CurNameKanjiCode == KANJI_AUTO) - { - if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) - CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); - } - 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); @@ -526,6 +574,8 @@ void HistoryConnectProc(int MenuCmd) 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) { @@ -548,20 +598,20 @@ void HistoryConnectProc(int MenuCmd) CmdCtrlSocket = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg); TrnCtrlSocket = CmdCtrlSocket; - // UTF-8対応 - if(CurHost.CurNameKanjiCode == KANJI_AUTO) - { - if(DoDirListCmdSkt("", "", 999, &CancelFlg) == FTP_COMPLETE) - CurHost.CurNameKanjiCode = AnalyzeNameKanjiCode(999); - } - 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(); @@ -600,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; @@ -611,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++; @@ -850,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); } @@ -1041,11 +1102,16 @@ int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) 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; @@ -1087,6 +1153,7 @@ static int ReConnectSkt(SOCKET *Skt) // if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) if((*Skt = DoConnect(&CurHost, CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security, &CancelFlg)) != INVALID_SOCKET) { + SendInitCommand(*Skt, CurHost.InitCmd, &CancelFlg); AskRemoteCurDir(Path, FMAX_PATH); DoCWD(Path, YES, YES, YES); Sts = FFFTP_SUCCESS; @@ -1267,6 +1334,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 @@ -1453,8 +1576,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char 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) || - (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + ((HostData->NoDisplayUI == NO) && (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) { if(Anony == YES) { @@ -1497,6 +1623,18 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char Sts = FTP_ERROR; } + // FTPIS対応 + // "PBSZ 0"と"PROT P"は黙示的に設定されているはずだが念のため + if(CryptMode == CRYPT_FTPIS) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PBSZ 0")) == 200) + { + if((Sts = command(ContSock, Reply, CancelCheckWork, "PROT P")) == 200) + { + } + } + } + ReInPass = NO; do { @@ -1508,8 +1646,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char // if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE) { + // 同時接続対応 +// if((strlen(Pass) != 0) || +// (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) if((strlen(Pass) != 0) || - (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + ((HostData->NoDisplayUI == NO) && (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) { CheckOneTimePassword(Pass, Reply, Security); @@ -1523,7 +1664,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char if(Sts == FTP_ERROR) { strcpy(Pass, ""); - if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) + // 同時接続対応 +// 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."); @@ -1531,8 +1674,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char } 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) || - (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + ((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; @@ -1548,6 +1694,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char DoPrintf("No password specified."); } } + // FTPES対応 + if(Continue == YES) + Sts = FTP_COMPLETE; } while(Continue == YES); } @@ -1565,7 +1714,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char } else if((SavePass == YES) && (ReInPass == YES)) { - if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == 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); } } @@ -1622,6 +1773,61 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char } else if(CryptMode == CRYPT_SFTP) { + // TODO: + // テストコード + // ログイン成功を確認 +#define strrcmp(_Str1, _Str2) (strcmp(strstr(_Str1, _Str2) ? strstr(_Str1, _Str2) : "", _Str2)) + size_t r; + ContSock = SFTP_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + SFTP_SetTimeoutCallback(ContSock, SSLTimeoutCallback); + while(1) + { + r = SFTP_recv(ContSock, Reply, 1024, 0); + if(r == SOCKET_ERROR) + break; + if(r <= 0) + continue; + Reply[r] = '\0'; + SetTaskMsg("%s", Reply); + if(strrcmp(Reply, "psftp> ") == 0) + break; + } + r = SFTP_send(ContSock, "open \"", strlen("open \""), 0); + r = SFTP_send(ContSock, Host, strlen(Host), 0); + r = SFTP_send(ContSock, "\"\r\n", strlen("\"\r\n"), 0); + while(1) + { + r = SFTP_recv(ContSock, Reply, 1024, 0); + if(r == SOCKET_ERROR) + break; + if(r <= 0) + continue; + Reply[r] = '\0'; + SetTaskMsg("%s", Reply); + if(strrcmp(Reply, "Store key in cache? (y/n) ") == 0) + { + r = SFTP_send(ContSock, "n\r\n", strlen("n\r\n"), 0); + } + if(strrcmp(Reply, "Update cached key? (y/n, Return cancels connection) ") == 0) + { + r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0); + } + if(strrcmp(Reply, "login as: ") == 0) + { + r = SFTP_send(ContSock, User, strlen(User), 0); + r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0); + } + if(strrcmp(Reply, "password: ") == 0) + { + r = SFTP_send(ContSock, Pass, strlen(Pass), 0); + r = SFTP_send(ContSock, "\r\n", strlen("\r\n"), 0); + } + if(strrcmp(Reply, "psftp> ") == 0) + break; + Sleep(1); + } + SFTP_closesocket(ContSock); + ContSock = INVALID_SOCKET; } return(ContSock); @@ -1792,19 +1998,21 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) { SOCKET Result; Result = INVALID_SOCKET; - switch(CurHost.InetFamily) + switch(CurHost.CurNetType) { - case AF_UNSPEC: + case NTYPE_AUTO: if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) - CurHost.InetFamily = AF_INET; - else if(CurHost.UseIPv6 == YES && (Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) - CurHost.InetFamily = AF_INET6; + CurHost.CurNetType = NTYPE_IPV4; + else if((Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) + CurHost.CurNetType = NTYPE_IPV6; break; - case AF_INET: + case NTYPE_IPV4: Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV4; break; - case AF_INET6: + case NTYPE_IPV6: Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork); + CurHost.CurNetType = NTYPE_IPV6; break; } return Result; @@ -2183,14 +2391,12 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) { SOCKET Result; Result = INVALID_SOCKET; - switch(CurHost.InetFamily) + switch(CurHost.CurNetType) { - case AF_UNSPEC: - break; - case AF_INET: + case NTYPE_IPV4: Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork); break; - case AF_INET6: + case NTYPE_IPV6: Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork); break; } @@ -2911,13 +3117,25 @@ int AskUseMLSD(void) } // IPv6対応 -int AskInetFamily(void) +int AskCurNetType(void) +{ + return(CurHost.CurNetType); +} + +// 自動切断対策 +int AskNoopInterval(void) +{ + return(CurHost.NoopInterval); +} + +// 再転送対応 +int AskTransferErrorMode(void) { - return(CurHost.InetFamily); + return(CurHost.TransferErrorMode); } -int AskUseIPv6(void) +int AskTransferErrorNotify(void) { - return(CurHost.UseIPv6); + return(CurHost.TransferErrorNotify); }