X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=remote.c;h=9ae046fad8076de3938ae1d3767c33cf75e69480;hb=refs%2Fheads%2F1.98e;hp=46cf59a60de4735405b60d807e19228712b8c4b0;hpb=791b047f2c0c10f5d5cc09db8d642191c5c23a83;p=ffftp%2Fffftp.git diff --git a/remote.c b/remote.c index 46cf59a..9ae046f 100644 --- a/remote.c +++ b/remote.c @@ -1,6 +1,6 @@ -/*============================================================================= +/*============================================================================= * -* ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‘€ì +* リモート側のファイル操作 * =============================================================================== / Copyright (C) 1997-2007 Sota. All rights reserved. @@ -27,7 +27,7 @@ / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /============================================================================*/ -/* ‚±‚̃\[ƒX‚͈ꕔAWS_FTP Version 93.12.05 ‚̃\[ƒX‚ðŽQl‚É‚µ‚Ü‚µ‚½B */ +/* このソースは一部、WS_FTP Version 93.12.05 のソースを参考にしました。 */ #define STRICT #include @@ -36,7 +36,9 @@ #include #include #include -#include +// IPv6対応 +//#include +#include #include #include @@ -46,7 +48,7 @@ #define PWD_XPWD 0 #define PWD_PWD 1 -/*===== ƒvƒƒgƒ^ƒCƒv =====*/ +/*===== プロトタイプ =====*/ static int DoPWD(char *Buf); static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork); @@ -54,32 +56,36 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, static void ChangeSepaLocal2Remote(char *Fname); static void ChangeSepaRemote2Local(char *Fname); -/*===== ŠO•”ŽQÆ =====*/ +/*===== 外部参照 =====*/ extern TRANSPACKET MainTransPkt; -/* Ý’è’l */ +/* 設定値 */ extern int TimeOut; extern int SendQuit; -/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ +// 同時接続対応 +extern int CancelFlg; + +/*===== ローカルなワーク =====*/ static int PwdCommandType; -static int CheckCancelFlg = NO; +// 同時接続対応 +//static int CheckCancelFlg = NO; -/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ•ÏX ---------------------------------- +/*----- リモート側のカレントディレクトリ変更 ---------------------------------- * * Parameter -* char *Path : ƒpƒX–¼ -* int Disp : ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ɃpƒX–¼‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©(YES/NO) -* int ForceGet : Ž¸”s‚µ‚Ä‚àƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðŽæ“¾‚·‚é -* int ErrorBell : ƒGƒ‰[Ž–‚̉¹‚ð–‚炷‚©‚Ç‚¤‚©(YES/NO) +* char *Path : パス名 +* int Disp : ディレクトリリストにパス名を表示するかどうか(YES/NO) +* int ForceGet : 失敗してもカレントディレクトリを取得する +* int ErrorBell : エラー事の音を鳴らすかどうか(YES/NO) * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell) @@ -96,7 +102,7 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell) if((AskHostType() != HTYPE_VMS) || (strchr(Path, '[') != NULL)) Sts = CommandProcCmd(NULL, "CWD %s", Path); else - Sts = CommandProcCmd(NULL, "CWD [.%s]", Path); /* VMS—p */ + Sts = CommandProcCmd(NULL, "CWD [.%s]", Path); /* VMS用 */ } if((Sts/100 >= FTP_CONTINUE) && (ErrorBell == YES)) @@ -109,7 +115,7 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell) { if(DoPWD(Buf) != FTP_COMPLETE) { - /*===== PWD‚ªŽg‚¦‚È‚©‚Á‚½ê‡ =====*/ + /*===== PWDが使えなかった場合 =====*/ if(*Path == '/') strcpy(Buf, Path); @@ -153,18 +159,18 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell) -/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ•ÏXi‚»‚Ì‚Qj------------------------- +/*----- リモート側のカレントディレクトリ変更(その2)------------------------- * * Parameter -* char *Path : ƒpƒX–¼ -* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* char *Path : パス名 +* char *Cur : カレントディレクトリ * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 * * Note -* ƒpƒX–¼‚Í "xxx/yyy/zzz" ‚ÌŒ`Ž® -* ƒfƒBƒŒƒNƒgƒŠ•ÏX‚ªŽ¸”s‚µ‚½‚çAƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚É–ß‚µ‚Ä‚¨‚­ +* パス名は "xxx/yyy/zzz" の形式 +* ディレクトリ変更が失敗したら、カレントディレクトリに戻しておく *----------------------------------------------------------------------------*/ int DoCWDStepByStep(char *Path, char *Cur) @@ -197,13 +203,13 @@ int DoCWDStepByStep(char *Path, char *Cur) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠŽæ“¾ ---------------------------------- +/*----- リモート側のカレントディレクトリ取得 ---------------------------------- * * Parameter -* char *Buf : ƒpƒX–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* char *Buf : パス名を返すバッファ * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ static int DoPWD(char *Buf) @@ -237,7 +243,6 @@ static int DoPWD(char *Buf) strcpy(Buf, Tmp); ReplaceAll(Buf, '\\', '/'); ChangeSepaRemote2Local(Buf); - ChangeFnameRemote2Local(Buf, FMAX_PATH); } else Sts = FTP_ERROR*100; @@ -246,13 +251,13 @@ static int DoPWD(char *Buf) } -/*----- PWDƒRƒ}ƒ“ƒh‚̃^ƒCƒv‚ð‰Šú‰»‚·‚é --------------------------------------- +/*----- PWDコマンドのタイプを初期化する --------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void InitPWDcommand() @@ -261,13 +266,13 @@ void InitPWDcommand() } -/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠì¬ ---------------------------------------- +/*----- リモート側のディレクトリ作成 ---------------------------------------- * * Parameter -* char *Path : ƒpƒX–¼ +* char *Path : パス名 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoMKD(char *Path) @@ -283,13 +288,13 @@ int DoMKD(char *Path) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠíœ ------------------------------------------ +/*----- リモート側のディレクトリ削除 ------------------------------------------ * * Parameter -* char *Path : ƒpƒX–¼ +* char *Path : パス名 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoRMD(char *Path) @@ -305,13 +310,13 @@ int DoRMD(char *Path) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹íœ ---------------------------------------------- +/*----- リモート側のファイル削除 ---------------------------------------------- * * Parameter -* char *Path : ƒpƒX–¼ +* char *Path : パス名 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoDELE(char *Path) @@ -327,14 +332,14 @@ int DoDELE(char *Path) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹–¼•ÏX -------------------------------------------- +/*----- リモート側のファイル名変更 -------------------------------------------- * * Parameter -* char *Src : Œ³ƒtƒ@ƒCƒ‹–¼ -* char *Dst : •ÏXŒã‚̃tƒ@ƒCƒ‹–¼ +* char *Src : 元ファイル名 +* char *Dst : 変更後のファイル名 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoRENAME(char *Src, char *Dst) @@ -343,7 +348,9 @@ int DoRENAME(char *Src, char *Dst) Sts = CommandProcCmd(NULL, "RNFR %s", Src); if(Sts == 350) - Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst); + // 同時接続対応 +// Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst); + Sts = command(AskCmdCtrlSkt(), NULL, &CancelFlg, "RNTO %s", Dst); if(Sts/100 >= FTP_CONTINUE) SoundPlay(SND_ERROR); @@ -352,14 +359,14 @@ int DoRENAME(char *Src, char *Dst) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚Ì‘®«•ÏX ---------------------------------------- +/*----- リモート側のファイルの属性変更 ---------------------------------------- * * Parameter -* char *Path : ƒpƒX–¼ -* char *Mode : ƒ‚[ƒh•¶Žš—ñ +* char *Path : パス名 +* char *Mode : モード文字列 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoCHMOD(char *Path, char *Mode) @@ -375,26 +382,30 @@ int DoCHMOD(char *Path, char *Mode) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚̃TƒCƒY‚ðŽæ“¾i“]‘—ƒ\ƒPƒbƒgŽg—pj----------------- +/*----- リモート側のファイルのサイズを取得(転送ソケット使用)----------------- * * Parameter -* char *Path : ƒpƒX–¼ -* LONGLONG *Size : ƒtƒ@ƒCƒ‹‚̃TƒCƒY‚ð•Ô‚·ƒ[ƒN +* char *Path : パス名 +* LONGLONG *Size : ファイルのサイズを返すワーク * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 * * Note -* šš“]‘—ƒ\ƒPƒbƒg‚ðŽg—p‚·‚遚š -* ƒTƒCƒY‚ª‘I‚ç‚ê‚È‚¢Žž‚Í Size = -1 ‚ð•Ô‚· +* ★★転送ソケットを使用する★★ +* サイズが選られない時は Size = -1 を返す *----------------------------------------------------------------------------*/ -int DoSIZE(char *Path, LONGLONG *Size) +// 同時接続対応 +//int DoSIZE(char *Path, LONGLONG *Size) +int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size, int *CancelCheckWork) { int Sts; char Tmp[1024]; - Sts = CommandProcTrn(Tmp, "SIZE %s", Path); + // 同時接続対応 +// Sts = CommandProcTrn(Tmp, "SIZE %s", Path); + Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "SIZE %s", Path); *Size = -1; if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4])) @@ -404,21 +415,23 @@ int DoSIZE(char *Path, LONGLONG *Size) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚Ì“ú•t‚ðŽæ“¾i“]‘—ƒ\ƒPƒbƒgŽg—pj------------------- +/*----- リモート側のファイルの日付を取得(転送ソケット使用)------------------- * * Parameter -* char *Path : ƒpƒX–¼ -* FILETIME *Time : “ú•t‚ð•Ô‚·ƒ[ƒN +* char *Path : パス名 +* FILETIME *Time : 日付を返すワーク * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 * * Note -* šš“]‘—ƒ\ƒPƒbƒg‚ðŽg—p‚·‚遚š -* “ú•t‚ª‘I‚ç‚ê‚È‚¢Žž‚Í Time = 0 ‚ð•Ô‚· +* ★★転送ソケットを使用する★★ +* 日付が選られない時は Time = 0 を返す *----------------------------------------------------------------------------*/ -int DoMDTM(char *Path, FILETIME *Time) +// 同時接続対応 +//int DoMDTM(char *Path, FILETIME *Time) +int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork) { int Sts; char Tmp[1024]; @@ -427,7 +440,9 @@ int DoMDTM(char *Path, FILETIME *Time) Time->dwLowDateTime = 0; Time->dwHighDateTime = 0; - Sts = CommandProcTrn(Tmp, "MDTM %s", Path); + // 同時接続対応 +// Sts = CommandProcTrn(Tmp, "MDTM %s", Path); + Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "MDTM %s", Path); if(Sts/100 == FTP_COMPLETE) { sTime.wMilliseconds = 0; @@ -436,7 +451,8 @@ int DoMDTM(char *Path, FILETIME *Time) &sTime.wHour, &sTime.wMinute, &sTime.wSecond) == 6) { SystemTimeToFileTime(&sTime, Time); - SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + // 時刻はGMT +// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); } } @@ -444,20 +460,23 @@ int DoMDTM(char *Path, FILETIME *Time) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃Rƒ}ƒ“ƒh‚ðŽÀs -------------------------------------------- +/*----- リモート側のコマンドを実行 -------------------------------------------- * * Parameter -* char *CmdStr : ƒRƒ}ƒ“ƒh•¶Žš—ñ +* char *CmdStr : コマンド文字列 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ -int DoQUOTE(char *CmdStr) +// 同時接続対応 +//int DoQUOTE(char *CmdStr) +int DoQUOTE(SOCKET cSkt, char *CmdStr, int *CancelCheckWork) { int Sts; - Sts = CommandProcCmd(NULL, "%s", CmdStr); +// Sts = CommandProcCmd(NULL, "%s", CmdStr); + Sts = CommandProcTrn(cSkt, NULL, CancelCheckWork, "%s", CmdStr); if(Sts/100 >= FTP_CONTINUE) SoundPlay(SND_ERROR); @@ -466,13 +485,13 @@ int DoQUOTE(char *CmdStr) } -/*----- ƒ\ƒPƒbƒg‚ð•Â‚¶‚é ------------------------------------------------------ +/*----- ソケットを閉じる ------------------------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* SOCKET •Â‚¶‚½Œã‚̃\ƒPƒbƒg +* SOCKET 閉じた後のソケット *----------------------------------------------------------------------------*/ SOCKET DoClose(SOCKET Sock) @@ -495,36 +514,40 @@ SOCKET DoClose(SOCKET Sock) } -/*----- ƒzƒXƒg‚©‚烍ƒOƒAƒEƒg‚·‚é ---------------------------------------------- +/*----- ホストからログアウトする ---------------------------------------------- * * Parameter -* kSOCKET ctrl_skt : ƒ\ƒPƒbƒg +* kSOCKET ctrl_skt : ソケット * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ -int DoQUIT(SOCKET ctrl_skt) +// 同時接続対応 +//int DoQUIT(SOCKET ctrl_skt) +int DoQUIT(SOCKET ctrl_skt, int *CancelCheckWork) { int Ret; Ret = FTP_COMPLETE; if(SendQuit == YES) - Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100; + // 同時接続対応 +// Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100; + Ret = command(ctrl_skt, NULL, CancelCheckWork, "QUIT") / 100; return(Ret); } -/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ðŽæ“¾iƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg—p) +/*----- リモート側のディレクトリリストを取得(コマンドコントロールソケットを使用) * * Parameter -* char *AddOpt : ’ljÁ‚̃IƒvƒVƒ‡ƒ“ -* char *Path : ƒpƒX–¼ -* int Num : ƒtƒ@ƒCƒ‹–¼”ԍ† +* char *AddOpt : 追加のオプション +* char *Path : パス名 +* int Num : ファイル名番号 * * Return Value -* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* int 応答コードの1桁目 *----------------------------------------------------------------------------*/ int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork) @@ -546,17 +569,17 @@ int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork) } -/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ðŽæ“¾ ---------------------------------- +/*----- リモート側のディレクトリリストを取得 ---------------------------------- * * Parameter -* HWND hWnd : “]‘—’†ƒ_ƒCƒAƒƒO‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ -* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg -* char *AddOpt : ’ljÁ‚̃IƒvƒVƒ‡ƒ“ -* char *Path : ƒpƒX–¼ (""=ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ) -* int Num : ƒtƒ@ƒCƒ‹–¼”ԍ† +* HWND hWnd : 転送中ダイアログのウインドウハンドル +* SOCKET cSkt : コントロールソケット +* char *AddOpt : 追加のオプション +* char *Path : パス名 (""=カレントディレクトリ) +* int Num : ファイル名番号 * * Return Value -* int ‰ž“šƒR[ƒh +* int 応答コード *----------------------------------------------------------------------------*/ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, int *CancelCheckWork) @@ -587,7 +610,12 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, } else { - strcpy(MainTransPkt.Cmd, "LIST"); + // MLSD対応 +// strcpy(MainTransPkt.Cmd, "LIST"); + if(AskUseMLSD() && (AskHostFeature() & FEATURE_MLSD)) + strcpy(MainTransPkt.Cmd, "MLSD"); + else + strcpy(MainTransPkt.Cmd, "LIST"); if(strlen(AddOpt) > 0) { strcat(MainTransPkt.Cmd, " -"); @@ -602,8 +630,8 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, strcpy(MainTransPkt.LocalFile, Tmp); MainTransPkt.Type = TYPE_A; MainTransPkt.Size = -1; - /* ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì’†‚ÌŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚́A•Ê“r */ - /* ChangeFnameRemote2Local ‚Å•ÏŠ·‚·‚é */ + /* ファイルリストの中の漢字のファイル名は、別途 */ + /* ChangeFnameRemote2Local で変換する */ MainTransPkt.KanjiCode = KANJI_NOCNV; MainTransPkt.KanaCnv = YES; MainTransPkt.Mode = EXIST_OVW; @@ -611,7 +639,7 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, MainTransPkt.hWndTrans = hWnd; MainTransPkt.Next = NULL; - Sts = DoDownLoad(cSkt, &MainTransPkt, YES, CancelCheckWork); + Sts = DoDownload(cSkt, &MainTransPkt, YES, CancelCheckWork); //#pragma aaa //DoPrintf("===== DoDirList Done."); @@ -620,18 +648,18 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, } -/*----- ƒŠƒ‚[ƒg‘¤‚ÖƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘҂iƒRƒ}ƒ“ƒhƒ\ƒPƒbƒgj----------- +/*----- リモート側へコマンドを送りリプライを待つ(コマンドソケット)----------- * * Parameter -* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) -* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ -* ... : ƒpƒ‰ƒ[ƒ^ +* char *Reply : リプライのコピー先 (NULL=コピーしない) +* char *fmt : フォーマット文字列 +* ... : パラメータ * * Return Value -* int ‰ž“šƒR[ƒh +* int 応答コード * * Note -* ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg‚¤ +* コマンドコントロールソケットを使う *----------------------------------------------------------------------------*/ int CommandProcCmd(char *Reply, char *fmt, ...) @@ -652,30 +680,69 @@ int CommandProcCmd(char *Reply, char *fmt, ...) // if((Sts = command(AskCmdCtrlSkt(), Reply, "%s", Cmd)) == 429) // { -// if(ReConnectCmdSkt() == SUCCESS) +// if(ReConnectCmdSkt() == FFFTP_SUCCESS) // { - Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); + // 同時接続対応 +// Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); + Sts = command(AskCmdCtrlSkt(), Reply, &CancelFlg, "%s", Cmd); // } // } return(Sts); } -/*----- ƒŠƒ‚[ƒg‘¤‚ÖƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘҂i“]‘—ƒ\ƒPƒbƒgj--------------- +#if defined(HAVE_TANDEM) +/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る --------------- * * Parameter -* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) -* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ -* ... : ƒpƒ‰ƒ[ƒ^ +* なし * * Return Value -* int ‰ž“šƒR[ƒh +* なし +*----------------------------------------------------------------------------*/ + +void SwitchOSSProc(void) +{ + char Buf[MAX_PATH+1]; + + /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */ + if(AskOSS() == YES) { + DoQUOTE(AskCmdCtrlSkt(), "GUARDIAN", &CancelFlg); + SetOSS(NO); + } else { + DoQUOTE(AskCmdCtrlSkt(), "OSS", &CancelFlg); + SetOSS(YES); + } + /* Current Dir 再取得 */ + if (DoPWD(Buf) == FTP_COMPLETE) + SetRemoteDirHist(Buf); + /* ファイルリスト再読み込み */ + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0); + + return; +} +#endif + + +/*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)--------------- +* +* Parameter +* SOCKET cSkt : ソケット +* char *Reply : リプライのコピー先 (NULL=コピーしない) +* int *CancelCheckWork : +* char *fmt : フォーマット文字列 +* ... : パラメータ +* +* Return Value +* int 応答コード * * Note -* “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg‚¤ +* 転送コントロールソケットを使う *----------------------------------------------------------------------------*/ -int CommandProcTrn(char *Reply, char *fmt, ...) +// 同時接続対応 +//int CommandProcTrn(char *Reply, char *fmt, ...) +int CommandProcTrn(SOCKET cSkt, char *Reply, int* CancelCheckWork, char *fmt, ...) { va_list Args; char Cmd[1024]; @@ -690,26 +757,27 @@ int CommandProcTrn(char *Reply, char *fmt, ...) // if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429) // { -// if(ReConnectTrnSkt() == SUCCESS) - Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); +// if(ReConnectTrnSkt() == FFFTP_SUCCESS) +// Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); + Sts = command(cSkt, Reply, CancelCheckWork, "%s", Cmd); // } return(Sts); } -/*----- ƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘Ò‚Â ------------------------------------------ +/*----- コマンドを送りリプライを待つ ------------------------------------------ * * Parameter -* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg -* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) -* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ -* ... : ƒpƒ‰ƒ[ƒ^ +* SOCKET cSkt : コントロールソケット +* char *Reply : リプライのコピー先 (NULL=コピーしない) +* char *fmt : フォーマット文字列 +* ... : パラメータ * * Return Value -* int ‰ž“šƒR[ƒh +* int 応答コード * * Note -* ƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ɉž‚¶‚āA‚±‚±‚ÅŠ¿ŽšƒR[ƒh‚Ì•ÏŠ·‚ðs‚È‚¤ +* ホストのファイル名の漢字コードに応じて、ここで漢字コードの変換を行なう *----------------------------------------------------------------------------*/ //#pragma aaa @@ -749,7 +817,7 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...) strcpy(Reply, ""); Sts = 429; - if(SendData(cSkt, Cmd, strlen(Cmd), 0, CancelCheckWork) == SUCCESS) + if(SendData(cSkt, Cmd, strlen(Cmd), 0, CancelCheckWork) == FFFTP_SUCCESS) { Sts = ReadReplyMessage(cSkt, Reply, 1024, CancelCheckWork, TmpBuf); } @@ -769,17 +837,17 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...) } -/*----- ƒf[ƒ^‚ð‘—‚é ---------------------------------------------------------- +/*----- データを送る ---------------------------------------------------------- * * Parameter -* SOCKET Skt : ƒ\ƒPƒbƒg -* char *Data : ƒf[ƒ^ -* int Size : ‘—‚éƒf[ƒ^‚̃TƒCƒY -* int Mode : ƒR[ƒ‹ƒ‚[ƒh +* SOCKET Skt : ソケット +* char *Data : データ +* int Size : 送るデータのサイズ +* int Mode : コールモード * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) @@ -791,10 +859,10 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) // struct timeval *ToutPtr; int TimeOutErr; - Sts = FAIL; + Sts = FFFTP_FAIL; if(Skt != INVALID_SOCKET) { - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; while(Size > 0) { // FD_ZERO(&SendFds); @@ -809,13 +877,13 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) // Tmp = select(0, NULL, &SendFds, NULL, ToutPtr); // if(Tmp == SOCKET_ERROR) // { -// Sts = FAIL; +// Sts = FFFTP_FAIL; // ReportWSError("select", WSAGetLastError()); // break; // } // else if(Tmp == 0) // { -// Sts = FAIL; +// Sts = FFFTP_FAIL; // SetTaskMsg(MSGJPN241); // break; // } @@ -823,13 +891,13 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) Tmp = do_send(Skt, Data, Size, Mode, &TimeOutErr, CancelCheckWork); if(TimeOutErr == YES) { - Sts = FAIL; + Sts = FFFTP_FAIL; SetTaskMsg(MSGJPN241); break; } else if(Tmp == SOCKET_ERROR) { - Sts = FAIL; + Sts = FFFTP_FAIL; ReportWSError("send", WSAGetLastError()); break; } @@ -842,17 +910,17 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) } -/*----- ‰ž“šƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚é ---------------------------------------------- +/*----- 応答メッセージを受け取る ---------------------------------------------- * * Parameter -* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg -* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ (NULL=ƒRƒs[‚µ‚È‚¢) -* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* SOCKET cSkt : コントロールソケット +* char *Buf : メッセージを受け取るバッファ (NULL=コピーしない) +* int Max : バッファのサイズ * int *CancelCheckWork : -* char *Tmp : ƒeƒ“ƒ|ƒ‰ƒŠƒ[ƒN +* char *Tmp : テンポラリワーク * * Return Value -* int ‰ž“šƒR[ƒh +* int 応答コード *----------------------------------------------------------------------------*/ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp) @@ -876,11 +944,13 @@ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char iContinue = NO; iRetCode = ReadOneLine(cSkt, Tmp, ONELINE_BUF_SIZE, CancelCheckWork); + // 文字化け対策 + ChangeFnameRemote2Local(Tmp, ONELINE_BUF_SIZE); SetTaskMsg("%s", Tmp); if(Buf != NULL) { - // ‚Qs–ڈȍ~‚̉ž“šƒR[ƒh‚͏Á‚· + // 2行目以降の応答コードは消す if(Lines > 0) { for(i = 0; ; i++) @@ -922,16 +992,16 @@ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char } -/*----- ‚Ps•ª‚̃f[ƒ^‚ðŽó‚¯Žæ‚é ---------------------------------------------- +/*----- 1行分のデータを受け取る ---------------------------------------------- * * Parameter -* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg -* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ -* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* SOCKET cSkt : コントロールソケット +* char *Buf : メッセージを受け取るバッファ +* int Max : バッファのサイズ * int *CancelCheckWork : * * Return Value -* int ‰ž“šƒR[ƒh +* int 応答コード *----------------------------------------------------------------------------*/ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) @@ -951,7 +1021,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) if(cSkt != INVALID_SOCKET) { memset(Buf, NUL, Max); - Max--; /* ––”ö‚ÌNULL‚Ì‚Ô‚ñ */ + Max--; /* 末尾のNULLのぶん */ Pos = Buf; for(;;) @@ -979,7 +1049,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) // break; // } - /* LF‚Ü‚Å‚ðŽóM‚·‚邽‚߂ɁAÅ‰‚ÍPEEK‚ÅŽóM */ + /* LFまでを受信するために、最初はPEEKで受信 */ if((SizeOnce = do_recv(cSkt, (LPSTR)Tmp, 1024, MSG_PEEK, &TimeOutErr, CancelCheckWork)) <= 0) { if(TimeOutErr == YES) @@ -994,7 +1064,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) break; } - /* LF‚ð’T‚µ‚āA‚ ‚Á‚½‚ç‚»‚±‚Ü‚Å‚Ì’·‚³‚ðƒZƒbƒg */ + /* LFを探して、あったらそこまでの長さをセット */ for(i = 0; i < SizeOnce ; i++) { if(*(Tmp + i) == NUL || *(Tmp + i) == 0x0A) @@ -1004,7 +1074,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) } } - /* –{ŽóM */ + /* 本受信 */ if((SizeOnce = do_recv(cSkt, Tmp, SizeOnce, 0, &TimeOutErr, CancelCheckWork)) <= 0) break; @@ -1013,7 +1083,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) Pos += CopySize; Max -= CopySize; - /* ƒf[ƒ^‚ªLF‚ŏI‚í‚Á‚Ä‚¢‚½‚ç‚PsI‚í‚è */ + /* データがLFで終わっていたら1行終わり */ if(*(Tmp + SizeOnce - 1) == 0x0A) break; } @@ -1025,7 +1095,9 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) memset(Buf, 0, Max); if((SizeOnce == -2) || (AskTransferNow() == YES)) - DisconnectSet(); + // 転送中に全て中止を行うと不正なデータが得られる場合のバグ修正 +// DisconnectSet(); + cSkt = DoClose(cSkt); } else { @@ -1036,7 +1108,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) ResCode = atoi(Tmp); } - /* ––”ö‚Ì CR,LF,ƒXƒy[ƒX‚ðŽæ‚菜‚­ */ + /* 末尾の CR,LF,スペースを取り除く */ while((i=strlen(Buf))>2 && (Buf[i-1]==0x0a || Buf[i-1]==0x0d || Buf[i-1]==' ')) Buf[i-1]=0; @@ -1046,17 +1118,17 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) } -/*----- ŒÅ’è’·ƒf[ƒ^‚ðŽó‚¯Žæ‚é ------------------------------------------------ +/*----- 固定長データを受け取る ------------------------------------------------ * * Parameter -* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg -* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ -* int Size : ƒoƒCƒg” +* SOCKET cSkt : コントロールソケット +* char *Buf : メッセージを受け取るバッファ +* int Size : バイト数 * int *CancelCheckWork : * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) @@ -1069,10 +1141,10 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) int Sts; int TimeOutErr; - Sts = FAIL; + Sts = FFFTP_FAIL; if(cSkt != INVALID_SOCKET) { - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; while(Size > 0) { // FD_ZERO(&ReadFds); @@ -1088,13 +1160,13 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) // if(i == SOCKET_ERROR) // { // ReportWSError("select", WSAGetLastError()); -// Sts = FAIL; +// Sts = FFFTP_FAIL; // break; // } // else if(i == 0) // { // SetTaskMsg(MSGJPN243); -// Sts = FAIL; +// Sts = FFFTP_FAIL; // break; // } @@ -1102,7 +1174,7 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) { if(TimeOutErr == YES) SetTaskMsg(MSGJPN243); - Sts = FAIL; + Sts = FFFTP_FAIL; break; } @@ -1111,20 +1183,20 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) } } - if(Sts == FAIL) + if(Sts == FFFTP_FAIL) SetTaskMsg(MSGJPN244); return(Sts); } -/*----- ƒGƒ‰[•¶Žš—ñ‚ðŽæ“¾ ---------------------------------------------------- +/*----- エラー文字列を取得 ---------------------------------------------------- * * Parameter -* UINT Error : ƒGƒ‰[”ԍ† +* UINT Error : エラー番号 * * Return Value -* char *ƒGƒ‰[•¶Žš—ñ +* char *エラー文字列 *----------------------------------------------------------------------------*/ char *ReturnWSError(UINT Error) @@ -1260,14 +1332,14 @@ char *ReturnWSError(UINT Error) } -/*----- ƒfƒoƒbƒOƒRƒ“ƒ\[ƒ‹‚ɃGƒ‰[‚ð•\Ž¦ -------------------------------------- +/*----- デバッグコンソールにエラーを表示 -------------------------------------- * * Parameter -* char *Msg : ƒGƒ‰[‚Ì‘O‚É•\Ž¦‚·‚郁ƒbƒZ[ƒW -* UINT Error : ƒGƒ‰[”ԍ† +* char *Msg : エラーの前に表示するメッセージ +* UINT Error : エラー番号 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void ReportWSError(char *Msg, UINT Error) @@ -1279,15 +1351,15 @@ void ReportWSError(char *Msg, UINT Error) } -/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒ[ƒJƒ‹‘¤‚ňµ‚¦‚é‚悤‚É•ÏŠ·‚·‚é -------------------------- +/*----- ファイル名をローカル側で扱えるように変換する -------------------------- * * Parameter -* char *Fname : ƒtƒ@ƒCƒ‹–¼ -* int Max : Å‘å’· +* char *Fname : ファイル名 +* int Max : 最大長 * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ int ChangeFnameRemote2Local(char *Fname, int Max) @@ -1296,19 +1368,27 @@ int ChangeFnameRemote2Local(char *Fname, int Max) char *Buf; char *Pos; CODECONVINFO cInfo; + // バッファ上書きバグ対策 + char *Buf2; - Sts = FAIL; + Sts = FFFTP_FAIL; if((Buf = malloc(Max)) != NULL) { + // バッファ上書きバグ対策 + if((Buf2 = malloc(strlen(Fname) + 1)) != NULL) + { InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; //AskHostNameKana(); - cInfo.Str = Fname; + // バッファ上書きバグ対策 +// cInfo.Str = Fname; + strcpy(Buf2, Fname); + cInfo.Str = Buf2; cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; - // ‚±‚±‚Å‘S‚ÄUTF-8‚Ö•ÏŠ·‚·‚é - // TODO: SJISˆÈŠO‚à’¼ÚUTF-8‚Ö•ÏŠ· + // ここで全てUTF-8へ変換する + // TODO: SJIS以外も直接UTF-8へ変換 switch(AskHostNameKanji()) { case KANJI_SJIS : @@ -1332,8 +1412,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoUTF8N(&cInfo); @@ -1356,8 +1436,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoUTF8N(&cInfo); @@ -1381,8 +1461,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoUTF8N(&cInfo); @@ -1404,22 +1484,27 @@ int ChangeFnameRemote2Local(char *Fname, int Max) // strcpy(Pos, Buf); // break; } + // バッファ上書きバグ対策 + free(Buf2); + Sts = FFFTP_SUCCESS; + } free(Buf); - Sts = SUCCESS; + // バッファ上書きバグ対策 +// Sts = FFFTP_SUCCESS; } return(Sts); } -/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒŠƒ‚[ƒg‘¤‚ňµ‚¦‚é‚悤‚É•ÏŠ·‚·‚é -------------------------- +/*----- ファイル名をリモート側で扱えるように変換する -------------------------- * * Parameter -* char *Fname : ƒtƒ@ƒCƒ‹–¼ -* int Max : Å‘å’· +* char *Fname : ファイル名 +* int Max : 最大長 * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ int ChangeFnameLocal2Remote(char *Fname, int Max) @@ -1428,19 +1513,27 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) char *Buf; char *Pos; CODECONVINFO cInfo; + // バッファ上書きバグ対策 + char *Buf2; - Sts = FAIL; + Sts = FFFTP_FAIL; if((Buf = malloc(Max)) != NULL) { + // バッファ上書きバグ対策 + if((Buf2 = malloc(strlen(Fname) + 1)) != NULL) + { InitCodeConvInfo(&cInfo); cInfo.KanaCnv = AskHostNameKana(); - cInfo.Str = Fname; + // バッファ上書きバグ対策 +// cInfo.Str = Fname; + strcpy(Buf2, Fname); + cInfo.Str = Buf2; cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; - // ‚±‚±‚Å‘S‚ÄUTF-8‚©‚ç•ÏŠ·‚·‚é - // TODO: SJISˆÈŠO‚à’¼ÚUTF-8‚©‚ç•ÏŠ· + // ここで全てUTF-8から変換する + // TODO: SJIS以外も直接UTF-8から変換 switch(AskHostNameKanji()) { case KANJI_SJIS : @@ -1464,8 +1557,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoJIS(&cInfo); @@ -1488,8 +1581,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoEUC(&cInfo); @@ -1512,8 +1605,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoSMB_HEX(&cInfo); @@ -1536,8 +1629,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) // TODO InitCodeConvInfo(&cInfo); cInfo.KanaCnv = NO; - cInfo.Str = Pos; - cInfo.StrLen = strlen(Pos); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); cInfo.Buf = Buf; cInfo.BufSize = Max - 1; ConvSJIStoSMB_CAP(&cInfo); @@ -1559,20 +1652,25 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) // strcpy(Pos, Buf); // break; } + // バッファ上書きバグ対策 + free(Buf2); + Sts = FFFTP_SUCCESS; + } free(Buf); - Sts = SUCCESS; + // バッファ上書きバグ対策 +// Sts = FFFTP_SUCCESS; } return(Sts); } -/*----- ƒpƒX‚Ì‹æØ‚蕶Žš‚ðƒzƒXƒg‚ɍ‡‚킹‚ĕύX‚·‚é ---------------------------- +/*----- パスの区切り文字をホストに合わせて変更する ---------------------------- * * Parameter -* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* char *Fname : ファイル名 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void ChangeSepaLocal2Remote(char *Fname) { @@ -1584,13 +1682,13 @@ static void ChangeSepaLocal2Remote(char *Fname) } -/*----- ƒpƒX‚Ì‹æØ‚蕶Žš‚ðƒ[ƒJƒ‹‚ɍ‡‚킹‚ĕύX‚·‚é -------------------------- +/*----- パスの区切り文字をローカルに合わせて変更する -------------------------- * * Parameter -* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* char *Fname : ファイル名 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void ChangeSepaRemote2Local(char *Fname) {