X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=connect.c;h=3e17909f239f171b0911d7d42e4ce65bae9314b6;hp=2dee5662201c1651b36cf7a325720a55242ea20b;hb=2bffe82de6811b380d280099f638dd7b4cbb3404;hpb=ffd9ce66d16fb452725a6bb1b5d1ef848fcd2628 diff --git a/connect.c b/connect.c index 2dee566..3e17909 100644 --- a/connect.c +++ b/connect.c @@ -57,7 +57,9 @@ // 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(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); @@ -123,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 @@ -235,7 +240,7 @@ void ConnectProc(int Type, int Num) DispWindowTitle(); SoundPlay(SND_CONNECT); - SendInitCommand(CurHost.InitCmd); + SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg); if(strlen(CurHost.LocalInitDir) > 0) { @@ -606,7 +611,7 @@ void HistoryConnectProc(int MenuCmd) DispWindowTitle(); SoundPlay(SND_CONNECT); - SendInitCommand(CurHost.InitCmd); + SendInitCommand(CmdCtrlSocket, CurHost.InitCmd, &CancelFlg); DoLocalCWD(CurHost.LocalInitDir); GetLocalDirForWnd(); @@ -645,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; @@ -656,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++; @@ -895,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); } @@ -1095,6 +1111,7 @@ int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) // 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; @@ -1136,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; @@ -1316,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 @@ -1620,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); } @@ -1696,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); @@ -1708,12 +1840,12 @@ static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, SOCKET ContSock; ContSock = INVALID_SOCKET; *CancelCheckWork = NO; -// if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->UseSFTP == YES) -// { -// SetTaskMsg(MSGJPN317); -// if((ContSock = DoConnectCrypt(CRYPT_SFTP, HostData, Host, User, Pass, Acct, Port, Fwall, SavePass, Security, CancelCheckWork)) != INVALID_SOCKET) -// HostData->CryptMode = CRYPT_SFTP; -// } + if(*CancelCheckWork == NO && ContSock == INVALID_SOCKET && HostData->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);