OSDN Git Service

Fix bugs of simultaneous connection.
[ffftp/ffftp.git] / remote.c
index 2244517..bc80b07 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1,6 +1,6 @@
-/*=============================================================================\r
+/*=============================================================================\r
 *\r
-*                                                      \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\91\80\8dì\r
+*                                                      リモート側のファイル操作\r
 *\r
 ===============================================================================\r
 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
@@ -27,7 +27,7 @@
 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
 /============================================================================*/\r
 \r
-/* \82±\82Ì\83\\81[\83X\82Í\88ê\95\94\81AWS_FTP Version 93.12.05 \82Ì\83\\81[\83X\82ð\8eQ\8dl\82É\82µ\82Ü\82µ\82½\81B */\r
+/* このソースは一部、WS_FTP Version 93.12.05 のソースを参考にしました。 */\r
 \r
 #define        STRICT\r
 #include <stdio.h>\r
@@ -36,7 +36,9 @@
 #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
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
@@ -46,7 +48,7 @@
 #define PWD_XPWD               0\r
 #define PWD_PWD                        1\r
 \r
-/*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
+/*===== プロトタイプ =====*/\r
 \r
 static int DoPWD(char *Buf);\r
 static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork);\r
@@ -54,32 +56,36 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
 static void ChangeSepaLocal2Remote(char *Fname);\r
 static void ChangeSepaRemote2Local(char *Fname);\r
 \r
-/*===== \8aO\95\94\8eQ\8fÆ =====*/\r
+/*===== 外部参照 =====*/\r
 \r
 extern TRANSPACKET MainTransPkt;\r
 \r
-/* \90Ý\92è\92l */\r
+/* 設定値 */\r
 extern int TimeOut;\r
 extern int SendQuit;\r
 \r
-/*===== \83\8d\81[\83J\83\8b\82È\83\8f\81[\83N =====*/\r
+// 同時接続対応\r
+extern int CancelFlg;\r
+\r
+/*===== ローカルなワーク =====*/\r
 \r
 static int PwdCommandType;\r
 \r
-static int CheckCancelFlg = NO;\r
+// 同時接続対応\r
+//static int CheckCancelFlg = NO;\r
 \r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\95Ï\8dX ----------------------------------\r
+/*----- リモート側のカレントディレクトリ変更 ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              int Disp : \83f\83B\83\8c\83N\83g\83\8a\83\8a\83X\83g\82É\83p\83X\96¼\82ð\95\\8e¦\82·\82é\82©\82Ç\82¤\82©(YES/NO)\r
-*              int ForceGet : \8e¸\94s\82µ\82Ä\82à\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82ð\8eæ\93¾\82·\82é\r
-*              int ErrorBell : \83G\83\89\81[\8e\96\82Ì\89¹\82ð\96Â\82ç\82·\82©\82Ç\82¤\82©(YES/NO)\r
+*              char *Path : パス名\r
+*              int Disp : ディレクトリリストにパス名を表示するかどうか(YES/NO)\r
+*              int ForceGet : 失敗してもカレントディレクトリを取得する\r
+*              int ErrorBell : エラー事の音を鳴らすかどうか(YES/NO)\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell)\r
@@ -96,7 +102,7 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell)
                if((AskHostType() != HTYPE_VMS) || (strchr(Path, '[') != NULL))\r
                        Sts = CommandProcCmd(NULL, "CWD %s", Path);\r
                else\r
-                       Sts = CommandProcCmd(NULL, "CWD [.%s]", Path);  /* VMS\97p */\r
+                       Sts = CommandProcCmd(NULL, "CWD [.%s]", Path);  /* VMS */\r
        }\r
 \r
        if((Sts/100 >= FTP_CONTINUE) && (ErrorBell == YES))\r
@@ -109,7 +115,7 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell)
                {\r
                        if(DoPWD(Buf) != FTP_COMPLETE)\r
                        {\r
-                               /*===== PWD\82ª\8eg\82¦\82È\82©\82Á\82½\8fê\8d\87 =====*/\r
+                               /*===== PWDが使えなかった場合 =====*/\r
 \r
                                if(*Path == '/')\r
                                        strcpy(Buf, Path);\r
@@ -153,18 +159,18 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell)
 \r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\95Ï\8dX\81i\82»\82Ì\82Q\81j-------------------------\r
+/*----- リモート側のカレントディレクトリ変更(その2)-------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              char *Cur : \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\r
+*              char *Path : パス名\r
+*              char *Cur : カレントディレクトリ\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *\r
 *      Note\r
-*              \83p\83X\96¼\82Í "xxx/yyy/zzz" \82Ì\8c`\8e®\r
-*              \83f\83B\83\8c\83N\83g\83\8a\95Ï\8dX\82ª\8e¸\94s\82µ\82½\82ç\81A\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82É\96ß\82µ\82Ä\82¨\82­\r
+*              パス名は "xxx/yyy/zzz" の形式\r
+*              ディレクトリ変更が失敗したら、カレントディレクトリに戻しておく\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoCWDStepByStep(char *Path, char *Cur)\r
@@ -197,13 +203,13 @@ int DoCWDStepByStep(char *Path, char *Cur)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\8eæ\93¾ ----------------------------------\r
+/*----- リモート側のカレントディレクトリ取得 ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Buf : \83p\83X\96¼\82ð\95Ô\82·\83o\83b\83t\83@\r
+*              char *Buf : パス名を返すバッファ\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int DoPWD(char *Buf)\r
@@ -237,7 +243,6 @@ static int DoPWD(char *Buf)
                        strcpy(Buf, Tmp);\r
                        ReplaceAll(Buf, '\\', '/');\r
                        ChangeSepaRemote2Local(Buf);\r
-                       ChangeFnameRemote2Local(Buf, FMAX_PATH);\r
                }\r
                else\r
                        Sts = FTP_ERROR*100;\r
@@ -246,13 +251,13 @@ static int DoPWD(char *Buf)
 }\r
 \r
 \r
-/*----- PWD\83R\83}\83\93\83h\82Ì\83^\83C\83v\82ð\8f\89\8aú\89»\82·\82é ---------------------------------------\r
+/*----- PWDコマンドのタイプを初期化する ---------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void InitPWDcommand()\r
@@ -261,13 +266,13 @@ void InitPWDcommand()
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83f\83B\83\8c\83N\83g\83\8a\8dì\90¬ ----------------------------------------\r
+/*----- リモート側のディレクトリ作成 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoMKD(char *Path)\r
@@ -283,13 +288,13 @@ int DoMKD(char *Path)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83f\83B\83\8c\83N\83g\83\8a\8dí\8f\9c ------------------------------------------\r
+/*----- リモート側のディレクトリ削除 ------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoRMD(char *Path)\r
@@ -305,13 +310,13 @@ int DoRMD(char *Path)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\8dí\8f\9c ----------------------------------------------\r
+/*----- リモート側のファイル削除 ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoDELE(char *Path)\r
@@ -327,14 +332,14 @@ int DoDELE(char *Path)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\96¼\95Ï\8dX --------------------------------------------\r
+/*----- リモート側のファイル名変更 --------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Src : \8c³\83t\83@\83C\83\8b\96¼\r
-*              char *Dst : \95Ï\8dX\8cã\82Ì\83t\83@\83C\83\8b\96¼\r
+*              char *Src : 元ファイル名\r
+*              char *Dst : 変更後のファイル名\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoRENAME(char *Src, char *Dst)\r
@@ -343,7 +348,9 @@ int DoRENAME(char *Src, char *Dst)
 \r
        Sts = CommandProcCmd(NULL, "RNFR %s", Src);\r
        if(Sts == 350)\r
-               Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst);\r
+               // 同時接続対応\r
+//             Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst);\r
+               Sts = command(AskCmdCtrlSkt(), NULL, &CancelFlg, "RNTO %s", Dst);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
@@ -352,14 +359,14 @@ int DoRENAME(char *Src, char *Dst)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\82Ì\91®\90«\95Ï\8dX ----------------------------------------\r
+/*----- リモート側のファイルの属性変更 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              char *Mode : \83\82\81[\83h\95\8e\9a\97ñ\r
+*              char *Path : パス名\r
+*              char *Mode : モード文字列\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoCHMOD(char *Path, char *Mode)\r
@@ -375,26 +382,30 @@ int DoCHMOD(char *Path, char *Mode)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\82Ì\83T\83C\83Y\82ð\8eæ\93¾\81i\93]\91\97\83\\83P\83b\83g\8eg\97p\81j-----------------\r
+/*----- リモート側のファイルのサイズを取得(転送ソケット使用)-----------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              LONGLONG *Size : \83t\83@\83C\83\8b\82Ì\83T\83C\83Y\82ð\95Ô\82·\83\8f\81[\83N\r
+*              char *Path : パス名\r
+*              LONGLONG *Size : ファイルのサイズを返すワーク\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *\r
 *      Note\r
-*              \81\9a\81\9a\93]\91\97\83\\83P\83b\83g\82ð\8eg\97p\82·\82é\81\9a\81\9a\r
-*              \83T\83C\83Y\82ª\91I\82ç\82ê\82È\82¢\8e\9e\82Í Size = -1 \82ð\95Ô\82·\r
+*              ★★転送ソケットを使用する★★\r
+*              サイズが選られない時は Size = -1 を返す\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoSIZE(char *Path, LONGLONG *Size)\r
+// 同時接続対応\r
+//int DoSIZE(char *Path, LONGLONG *Size)\r
+int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size, int *CancelCheckWork)\r
 {\r
        int Sts;\r
        char Tmp[1024];\r
 \r
-       Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+       Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "SIZE %s", Path);\r
 \r
        *Size = -1;\r
        if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4]))\r
@@ -404,21 +415,23 @@ int DoSIZE(char *Path, LONGLONG *Size)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83t\83@\83C\83\8b\82Ì\93ú\95t\82ð\8eæ\93¾\81i\93]\91\97\83\\83P\83b\83g\8eg\97p\81j-------------------\r
+/*----- リモート側のファイルの日付を取得(転送ソケット使用)-------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              FILETIME *Time : \93ú\95t\82ð\95Ô\82·\83\8f\81[\83N\r
+*              char *Path : パス名\r
+*              FILETIME *Time : 日付を返すワーク\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *\r
 *      Note\r
-*              \81\9a\81\9a\93]\91\97\83\\83P\83b\83g\82ð\8eg\97p\82·\82é\81\9a\81\9a\r
-*              \93ú\95t\82ª\91I\82ç\82ê\82È\82¢\8e\9e\82Í Time = 0 \82ð\95Ô\82·\r
+*              ★★転送ソケットを使用する★★\r
+*              日付が選られない時は Time = 0 を返す\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoMDTM(char *Path, FILETIME *Time)\r
+// 同時接続対応\r
+//int DoMDTM(char *Path, FILETIME *Time)\r
+int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)\r
 {\r
        int Sts;\r
        char Tmp[1024];\r
@@ -427,7 +440,9 @@ int DoMDTM(char *Path, FILETIME *Time)
     Time->dwLowDateTime = 0;\r
     Time->dwHighDateTime = 0;\r
 \r
-       Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+       Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "MDTM %s", Path);\r
        if(Sts/100 == FTP_COMPLETE)\r
        {\r
                sTime.wMilliseconds = 0;\r
@@ -444,13 +459,13 @@ int DoMDTM(char *Path, FILETIME *Time)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83R\83}\83\93\83h\82ð\8eÀ\8ds --------------------------------------------\r
+/*----- リモート側のコマンドを実行 --------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *CmdStr : \83R\83}\83\93\83h\95\8e\9a\97ñ\r
+*              char *CmdStr : コマンド文字列\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoQUOTE(char *CmdStr)\r
@@ -466,13 +481,13 @@ int DoQUOTE(char *CmdStr)
 }\r
 \r
 \r
-/*----- \83\\83P\83b\83g\82ð\95Â\82\82é ------------------------------------------------------\r
+/*----- ソケットを閉じる ------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Return Value\r
-*              SOCKET \95Â\82\82½\8cã\82Ì\83\\83P\83b\83g\r
+*              SOCKET 閉じた後のソケット\r
 *----------------------------------------------------------------------------*/\r
 \r
 SOCKET DoClose(SOCKET Sock)\r
@@ -495,13 +510,13 @@ SOCKET DoClose(SOCKET Sock)
 }\r
 \r
 \r
-/*----- \83z\83X\83g\82©\82ç\83\8d\83O\83A\83E\83g\82·\82é ----------------------------------------------\r
+/*----- ホストからログアウトする ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              kSOCKET ctrl_skt : \83\\83P\83b\83g\r
+*              kSOCKET ctrl_skt : ソケット\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoQUIT(SOCKET ctrl_skt)\r
@@ -510,21 +525,23 @@ int DoQUIT(SOCKET ctrl_skt)
 \r
        Ret = FTP_COMPLETE;\r
        if(SendQuit == YES)\r
-               Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100;\r
+               // 同時接続対応\r
+//             Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100;\r
+               Ret = command(ctrl_skt, NULL, &CancelFlg, "QUIT") / 100;\r
 \r
        return(Ret);\r
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83f\83B\83\8c\83N\83g\83\8a\83\8a\83X\83g\82ð\8eæ\93¾\81i\83R\83}\83\93\83h\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82ð\8eg\97p)\r
+/*----- リモート側のディレクトリリストを取得(コマンドコントロールソケットを使用)\r
 *\r
 *      Parameter\r
-*              char *AddOpt : \92Ç\89Á\82Ì\83I\83v\83V\83\87\83\93\r
-*              char *Path : \83p\83X\96¼\r
-*              int Num : \83t\83@\83C\83\8b\96¼\94Ô\8d\86\r
+*              char *AddOpt : 追加のオプション\r
+*              char *Path : パス名\r
+*              int Num : ファイル名番号\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\82Ì\82P\8c\85\96Ú\r
+*              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
 int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork)\r
@@ -546,17 +563,17 @@ int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ì\83f\83B\83\8c\83N\83g\83\8a\83\8a\83X\83g\82ð\8eæ\93¾ ----------------------------------\r
+/*----- リモート側のディレクトリリストを取得 ----------------------------------\r
 *\r
 *      Parameter\r
-*              HWND hWnd : \93]\91\97\92\86\83_\83C\83A\83\8d\83O\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              SOCKET cSkt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
-*              char *AddOpt : \92Ç\89Á\82Ì\83I\83v\83V\83\87\83\93\r
-*              char *Path : \83p\83X\96¼ (""=\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a)\r
-*              int Num : \83t\83@\83C\83\8b\96¼\94Ô\8d\86\r
+*              HWND hWnd : 転送中ダイアログのウインドウハンドル\r
+*              SOCKET cSkt : コントロールソケット\r
+*              char *AddOpt : 追加のオプション\r
+*              char *Path : パス名 (""=カレントディレクトリ)\r
+*              int Num : ファイル名番号\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, int *CancelCheckWork)\r
@@ -587,7 +604,12 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
        }\r
        else\r
        {\r
-               strcpy(MainTransPkt.Cmd, "LIST");\r
+               // MLSD対応\r
+//             strcpy(MainTransPkt.Cmd, "LIST");\r
+               if(AskUseMLSD() && (AskHostFeature() & FEATURE_MLSD))\r
+                       strcpy(MainTransPkt.Cmd, "MLSD");\r
+               else\r
+                       strcpy(MainTransPkt.Cmd, "LIST");\r
                if(strlen(AddOpt) > 0)\r
                {\r
                        strcat(MainTransPkt.Cmd, " -");\r
@@ -602,8 +624,8 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
        strcpy(MainTransPkt.LocalFile, Tmp);\r
        MainTransPkt.Type = TYPE_A;\r
        MainTransPkt.Size = -1;\r
-       /* \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\92\86\82Ì\8a¿\8e\9a\82Ì\83t\83@\83C\83\8b\96¼\82Í\81A\95Ê\93r */\r
-       /* ChangeFnameRemote2Local \82Å\95Ï\8a·\82·\82é                   */\r
+       /* ファイルリストの中の漢字のファイル名は、別途   */\r
+       /* ChangeFnameRemote2Local で変換する                      */\r
        MainTransPkt.KanjiCode = KANJI_NOCNV;\r
        MainTransPkt.KanaCnv = YES;\r
        MainTransPkt.Mode = EXIST_OVW;\r
@@ -620,18 +642,18 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ö\83R\83}\83\93\83h\82ð\91\97\82è\83\8a\83v\83\89\83C\82ð\91Ò\82Â\81i\83R\83}\83\93\83h\83\\83P\83b\83g\81j-----------\r
+/*----- リモート側へコマンドを送りリプライを待つ(コマンドソケット)-----------\r
 *\r
 *      Parameter\r
-*              char *Reply : \83\8a\83v\83\89\83C\82Ì\83R\83s\81[\90æ (NULL=\83R\83s\81[\82µ\82È\82¢)\r
-*              char *fmt : \83t\83H\81[\83}\83b\83g\95\8e\9a\97ñ\r
-*              ... : \83p\83\89\83\81\81[\83^\r
+*              char *Reply : リプライのコピー先 (NULL=コピーしない)\r
+*              char *fmt : フォーマット文字列\r
+*              ... : パラメータ\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              int 応答コード\r
 *\r
 *      Note\r
-*              \83R\83}\83\93\83h\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82ð\8eg\82¤\r
+*              コマンドコントロールソケットを使う\r
 *----------------------------------------------------------------------------*/\r
 \r
 int CommandProcCmd(char *Reply, char *fmt, ...)\r
@@ -652,30 +674,67 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 \r
 //     if((Sts = command(AskCmdCtrlSkt(), Reply, "%s", Cmd)) == 429)\r
 //     {\r
-//             if(ReConnectCmdSkt() == SUCCESS)\r
+//             if(ReConnectCmdSkt() == FFFTP_SUCCESS)\r
 //             {\r
-                       Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       // 同時接続対応\r
+//                     Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       Sts = command(AskCmdCtrlSkt(), Reply, &CancelFlg, "%s", Cmd);\r
 //             }\r
 //     }\r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83\8a\83\82\81[\83g\91¤\82Ö\83R\83}\83\93\83h\82ð\91\97\82è\83\8a\83v\83\89\83C\82ð\91Ò\82Â\81i\93]\91\97\83\\83P\83b\83g\81j---------------\r
+#if defined(HAVE_TANDEM)\r
+/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る ---------------\r
 *\r
 *      Parameter\r
-*              char *Reply : \83\8a\83v\83\89\83C\82Ì\83R\83s\81[\90æ (NULL=\83R\83s\81[\82µ\82È\82¢)\r
-*              char *fmt : \83t\83H\81[\83}\83b\83g\95\8e\9a\97ñ\r
-*              ... : \83p\83\89\83\81\81[\83^\r
+*              なし\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void SwitchOSSProc(void)\r
+{\r
+       char Buf[MAX_PATH+1];\r
+\r
+       /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */\r
+       if(AskOSS() == YES) {\r
+               DoQUOTE("GUARDIAN");\r
+               SetOSS(NO);\r
+       } else {\r
+               DoQUOTE("OSS");\r
+               SetOSS(YES);\r
+       }\r
+       /* Current Dir 再取得 */\r
+       if (DoPWD(Buf) == FTP_COMPLETE)\r
+               SetRemoteDirHist(Buf);\r
+       /* ファイルリスト再読み込み */\r
+       PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
+\r
+       return;\r
+}\r
+#endif\r
+\r
+\r
+/*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)---------------\r
+*\r
+*      Parameter\r
+*              char *Reply : リプライのコピー先 (NULL=コピーしない)\r
+*              char *fmt : フォーマット文字列\r
+*              ... : パラメータ\r
+*\r
+*      Return Value\r
+*              int 応答コード\r
 *\r
 *      Note\r
-*              \93]\91\97\83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\82ð\8eg\82¤\r
+*              転送コントロールソケットを使う\r
 *----------------------------------------------------------------------------*/\r
 \r
-int CommandProcTrn(char *Reply, char *fmt, ...)\r
+// 同時接続対応\r
+//int CommandProcTrn(char *Reply, char *fmt, ...)\r
+int CommandProcTrn(SOCKET cSkt, char *Reply, int* CancelCheckWork, char *fmt, ...)\r
 {\r
        va_list Args;\r
        char Cmd[1024];\r
@@ -690,31 +749,119 @@ int CommandProcTrn(char *Reply, char *fmt, ...)
 \r
 //     if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429)\r
 //     {\r
-//             if(ReConnectTrnSkt() == SUCCESS)\r
-                       Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+//             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
+//                     Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       Sts = command(cSkt, Reply, CancelCheckWork, "%s", Cmd);\r
 //     }\r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83R\83}\83\93\83h\82ð\91\97\82è\83\8a\83v\83\89\83C\82ð\91Ò\82 ------------------------------------------\r
+/*----- コマンドを送りリプライを待つ ------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET cSkt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
-*              char *Reply : \83\8a\83v\83\89\83C\82Ì\83R\83s\81[\90æ (NULL=\83R\83s\81[\82µ\82È\82¢)\r
-*              char *fmt : \83t\83H\81[\83}\83b\83g\95\8e\9a\97ñ\r
-*              ... : \83p\83\89\83\81\81[\83^\r
+*              SOCKET cSkt : コントロールソケット\r
+*              char *Reply : リプライのコピー先 (NULL=コピーしない)\r
+*              char *fmt : フォーマット文字列\r
+*              ... : パラメータ\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              int 応答コード\r
 *\r
 *      Note\r
-*              \83z\83X\83g\82Ì\83t\83@\83C\83\8b\96¼\82Ì\8a¿\8e\9a\83R\81[\83h\82É\89\9e\82\82Ä\81A\82±\82±\82Å\8a¿\8e\9a\83R\81[\83h\82Ì\95Ï\8a·\82ð\8ds\82È\82¤\r
+*              ホストのファイル名の漢字コードに応じて、ここで漢字コードの変換を行なう\r
 *----------------------------------------------------------------------------*/\r
 \r
 //#pragma aaa\r
 //static int cntcnt = 0;\r
 \r
+// SFTP対応\r
+int ConvertFTPCommandToPuTTYSFTP(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *Cmd)\r
+{\r
+       // TODO:\r
+       // 未実装\r
+       int Sts;\r
+       char NewCmd[FMAX_PATH*2];\r
+       static char RenameFrom[FMAX_PATH+1];\r
+       Sts = 429;\r
+       Reply[0] = '\0';\r
+       if(strcmp(Cmd, "QUIT") == 0)\r
+       {\r
+               sprintf(NewCmd, "ls\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       if(strcmp(Cmd, "LIST") == 0)\r
+       {\r
+               sprintf(NewCmd, "ls\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "REST ", 5) == 0)\r
+       {\r
+               SFTP_SetFilePosition(cSkt, (LONGLONG)_strtoi64(&Cmd[5], NULL, 10));\r
+       }\r
+       else if(strncmp(Cmd, "RETR ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "get \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "STOR ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "put \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "APPE ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "reput \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "DELE ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "rm \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "CWD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "cd \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strcmp(Cmd, "PWD") == 0)\r
+       {\r
+               sprintf(NewCmd, "pwd\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strcmp(Cmd, "XPWD") == 0)\r
+       {\r
+               sprintf(NewCmd, "pwd\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "MKD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "mkdir \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "RMD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "rmdir \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "RNFR ", 5) == 0)\r
+       {\r
+               strcpy(RenameFrom, &Cmd[5]);\r
+       }\r
+       else if(strncmp(Cmd, "RNTO ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "mv \"%s\" \"%s\"\r\n", RenameFrom, &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "SITE CHMOD ", 11) == 0)\r
+       {\r
+               Cmd[14] = '\0';\r
+               sprintf(NewCmd, "chmod %s \"%s\"\r\n", &Cmd[11], &Cmd[15]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       return Sts;\r
+}\r
+\r
 int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)\r
 {\r
        va_list Args;\r
@@ -728,6 +875,10 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)
                wvsprintf(Cmd, fmt, Args);\r
                va_end(Args);\r
 \r
+               // SFTP対応\r
+               if(IsSFTPAttached(cSkt))\r
+                       return ConvertFTPCommandToPuTTYSFTP(cSkt, Reply, CancelCheckWork, Cmd);\r
+\r
                if(strncmp(Cmd, "PASS ", 5) == 0)\r
                        SetTaskMsg(">PASS [xxxxxx]");\r
                else if((strncmp(Cmd, "USER ", 5) == 0) ||\r
@@ -749,7 +900,7 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)
                        strcpy(Reply, "");\r
 \r
                Sts = 429;\r
-               if(SendData(cSkt, Cmd, strlen(Cmd), 0, CancelCheckWork) == SUCCESS)\r
+               if(SendData(cSkt, Cmd, strlen(Cmd), 0, CancelCheckWork) == FFFTP_SUCCESS)\r
                {\r
                        Sts = ReadReplyMessage(cSkt, Reply, 1024, CancelCheckWork, TmpBuf);\r
                }\r
@@ -769,17 +920,17 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)
 }\r
 \r
 \r
-/*----- \83f\81[\83^\82ð\91\97\82é ----------------------------------------------------------\r
+/*----- データを送る ----------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET Skt : \83\\83P\83b\83g\r
-*              char *Data : \83f\81[\83^\r
-*              int Size : \91\97\82é\83f\81[\83^\82Ì\83T\83C\83Y\r
-*              int Mode : \83R\81[\83\8b\83\82\81[\83h\r
+*              SOCKET Skt : ソケット\r
+*              char *Data : データ\r
+*              int Size : 送るデータのサイズ\r
+*              int Mode : コールモード\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork)\r
@@ -791,10 +942,10 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork)
 //     struct timeval *ToutPtr;\r
        int TimeOutErr;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if(Skt != INVALID_SOCKET)\r
        {\r
-               Sts = SUCCESS;\r
+               Sts = FFFTP_SUCCESS;\r
                while(Size > 0)\r
                {\r
 //                     FD_ZERO(&SendFds);\r
@@ -809,13 +960,13 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork)
 //                     Tmp = select(0, NULL, &SendFds, NULL, ToutPtr);\r
 //                     if(Tmp == SOCKET_ERROR)\r
 //                     {\r
-//                             Sts = FAIL;\r
+//                             Sts = FFFTP_FAIL;\r
 //                             ReportWSError("select", WSAGetLastError());\r
 //                             break;\r
 //                     }\r
 //                     else if(Tmp == 0)\r
 //                     {\r
-//                             Sts = FAIL;\r
+//                             Sts = FFFTP_FAIL;\r
 //                             SetTaskMsg(MSGJPN241);\r
 //                             break;\r
 //                     }\r
@@ -823,13 +974,13 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork)
                        Tmp = do_send(Skt, Data, Size, Mode, &TimeOutErr, CancelCheckWork);\r
                        if(TimeOutErr == YES)\r
                        {\r
-                               Sts = FAIL;\r
+                               Sts = FFFTP_FAIL;\r
                                SetTaskMsg(MSGJPN241);\r
                                break;\r
                        }\r
                        else if(Tmp == SOCKET_ERROR)\r
                        {\r
-                               Sts = FAIL;\r
+                               Sts = FFFTP_FAIL;\r
                                ReportWSError("send", WSAGetLastError());\r
                                break;\r
                        }\r
@@ -842,17 +993,17 @@ int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- \89\9e\93\9a\83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82é ----------------------------------------------\r
+/*----- 応答メッセージを受け取る ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET cSkt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
-*              char *Buf : \83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82é\83o\83b\83t\83@ (NULL=\83R\83s\81[\82µ\82È\82¢)\r
-*              int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
+*              SOCKET cSkt : コントロールソケット\r
+*              char *Buf : メッセージを受け取るバッファ (NULL=コピーしない)\r
+*              int Max : バッファのサイズ\r
 *              int *CancelCheckWork :\r
-*              char *Tmp : \83e\83\93\83|\83\89\83\8a\83\8f\81[\83N\r
+*              char *Tmp : テンポラリワーク\r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp)\r
@@ -876,11 +1027,13 @@ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char
                        iContinue = NO;\r
                        iRetCode = ReadOneLine(cSkt, Tmp, ONELINE_BUF_SIZE, CancelCheckWork);\r
 \r
+                       // 文字化け対策\r
+                       ChangeFnameRemote2Local(Tmp, ONELINE_BUF_SIZE);\r
                        SetTaskMsg("%s", Tmp);\r
 \r
                        if(Buf != NULL)\r
                        {\r
-                               // \82Q\8ds\96Ú\88È\8d~\82Ì\89\9e\93\9a\83R\81[\83h\82Í\8fÁ\82·\r
+                               // 2行目以降の応答コードは消す\r
                                if(Lines > 0)\r
                                {\r
                                        for(i = 0; ; i++)\r
@@ -922,16 +1075,16 @@ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char
 }\r
 \r
 \r
-/*----- \82P\8ds\95ª\82Ì\83f\81[\83^\82ð\8eó\82¯\8eæ\82é ----------------------------------------------\r
+/*----- 1行分のデータを受け取る ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET cSkt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
-*              char *Buf : \83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82é\83o\83b\83t\83@\r
-*              int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
+*              SOCKET cSkt : コントロールソケット\r
+*              char *Buf : メッセージを受け取るバッファ\r
+*              int Max : バッファのサイズ\r
 *              int *CancelCheckWork : \r
 *\r
 *      Return Value\r
-*              int \89\9e\93\9a\83R\81[\83h\r
+*              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)\r
@@ -951,7 +1104,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
        if(cSkt != INVALID_SOCKET)\r
        {\r
                memset(Buf, NUL, Max);\r
-               Max--;                                  /* \96\96\94ö\82ÌNULL\82Ì\82Ô\82ñ */\r
+               Max--;                                  /* 末尾のNULLのぶん */\r
                Pos = Buf;\r
 \r
                for(;;)\r
@@ -979,7 +1132,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
 //                             break;\r
 //                     }\r
 \r
-                       /* LF\82Ü\82Å\82ð\8eó\90M\82·\82é\82½\82ß\82É\81A\8dÅ\8f\89\82ÍPEEK\82Å\8eó\90M */\r
+                       /* LFまでを受信するために、最初はPEEKで受信 */\r
                        if((SizeOnce = do_recv(cSkt, (LPSTR)Tmp, 1024, MSG_PEEK, &TimeOutErr, CancelCheckWork)) <= 0)\r
                        {\r
                                if(TimeOutErr == YES)\r
@@ -994,7 +1147,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
                                break;\r
                        }\r
 \r
-                       /* LF\82ð\92T\82µ\82Ä\81A\82 \82Á\82½\82ç\82»\82±\82Ü\82Å\82Ì\92·\82³\82ð\83Z\83b\83g */\r
+                       /* LFを探して、あったらそこまでの長さをセット */\r
                        for(i = 0; i < SizeOnce ; i++)\r
                        {\r
                                if(*(Tmp + i) == NUL || *(Tmp + i) == 0x0A)\r
@@ -1004,7 +1157,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
                                }\r
                        }\r
 \r
-                       /* \96{\8eó\90M */\r
+                       /* 本受信 */\r
                        if((SizeOnce = do_recv(cSkt, Tmp, SizeOnce, 0, &TimeOutErr, CancelCheckWork)) <= 0)\r
                                break;\r
 \r
@@ -1013,7 +1166,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
                        Pos += CopySize;\r
                        Max -= CopySize;\r
 \r
-                       /* \83f\81[\83^\82ªLF\82Å\8fI\82í\82Á\82Ä\82¢\82½\82ç\82P\8ds\8fI\82í\82è */\r
+                       /* データがLFで終わっていたら1行終わり */\r
                        if(*(Tmp + SizeOnce - 1) == 0x0A)\r
                                break;\r
                }\r
@@ -1025,15 +1178,9 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
                        memset(Buf, 0, Max);\r
 \r
                        if((SizeOnce == -2) || (AskTransferNow() == YES))\r
-                       // \93]\91\97\92\86\82É\91S\82Ä\92\86\8e~\82ð\8ds\82¤\82Æ\95s\90³\82È\83f\81[\83^\82ª\93¾\82ç\82ê\82é\8fê\8d\87\82Ì\83o\83O\8fC\90³\r
-                       // \83G\83\89\81[\82Ì\8eí\97Þ\82É\82æ\82Á\82Ä\82Í\96³\8cÀ\83\8b\81[\83v\82Æ\83X\83^\83b\83N\83I\81[\83o\81[\83t\83\8d\81[\82Ì\89Â\94\\90«\82 \82è\r
+                       // 転送中に全て中止を行うと不正なデータが得られる場合のバグ修正\r
 //                             DisconnectSet();\r
-                       {\r
-                               if(SizeOnce == -1)\r
-                                       ReConnectCmdSkt();\r
-                               else\r
-                                       DisconnectSet();\r
-                       }\r
+                               cSkt = DoClose(cSkt);\r
                }\r
                else\r
                {\r
@@ -1044,7 +1191,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
                                ResCode = atoi(Tmp);\r
                        }\r
 \r
-                       /* \96\96\94ö\82Ì CR,LF,\83X\83y\81[\83X\82ð\8eæ\82è\8f\9c\82­ */\r
+                       /* 末尾の CR,LF,スペースを取り除く */\r
                        while((i=strlen(Buf))>2 &&\r
                                  (Buf[i-1]==0x0a || Buf[i-1]==0x0d || Buf[i-1]==' '))\r
                                Buf[i-1]=0;\r
@@ -1054,17 +1201,17 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
 }\r
 \r
 \r
-/*----- \8cÅ\92è\92·\83f\81[\83^\82ð\8eó\82¯\8eæ\82é ------------------------------------------------\r
+/*----- 固定長データを受け取る ------------------------------------------------\r
 *\r
 *      Parameter\r
-*              SOCKET cSkt : \83R\83\93\83g\83\8d\81[\83\8b\83\\83P\83b\83g\r
-*              char *Buf : \83\81\83b\83Z\81[\83W\82ð\8eó\82¯\8eæ\82é\83o\83b\83t\83@\r
-*              int Size : \83o\83C\83g\90\94\r
+*              SOCKET cSkt : コントロールソケット\r
+*              char *Buf : メッセージを受け取るバッファ\r
+*              int Size : バイト数\r
 *              int *CancelCheckWork : \r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork)\r
@@ -1077,10 +1224,10 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork)
        int Sts;\r
        int TimeOutErr;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if(cSkt != INVALID_SOCKET)\r
        {\r
-               Sts = SUCCESS;\r
+               Sts = FFFTP_SUCCESS;\r
                while(Size > 0)\r
                {\r
 //                     FD_ZERO(&ReadFds);\r
@@ -1096,13 +1243,13 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork)
 //                     if(i == SOCKET_ERROR)\r
 //                     {\r
 //                             ReportWSError("select", WSAGetLastError());\r
-//                             Sts = FAIL;\r
+//                             Sts = FFFTP_FAIL;\r
 //                             break;\r
 //                     }\r
 //                     else if(i == 0)\r
 //                     {\r
 //                             SetTaskMsg(MSGJPN243);\r
-//                             Sts = FAIL;\r
+//                             Sts = FFFTP_FAIL;\r
 //                             break;\r
 //                     }\r
 \r
@@ -1110,7 +1257,7 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork)
                        {\r
                                if(TimeOutErr == YES)\r
                                        SetTaskMsg(MSGJPN243);\r
-                               Sts = FAIL;\r
+                               Sts = FFFTP_FAIL;\r
                                break;\r
                        }\r
 \r
@@ -1119,20 +1266,20 @@ int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork)
                }\r
        }\r
 \r
-       if(Sts == FAIL)\r
+       if(Sts == FFFTP_FAIL)\r
                SetTaskMsg(MSGJPN244);\r
 \r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83G\83\89\81[\95\8e\9a\97ñ\82ð\8eæ\93¾ ----------------------------------------------------\r
+/*----- エラー文字列を取得 ----------------------------------------------------\r
 *\r
 *      Parameter\r
-*              UINT Error : \83G\83\89\81[\94Ô\8d\86\r
+*              UINT Error : エラー番号\r
 *\r
 *      Return Value\r
-*              char *\83G\83\89\81[\95\8e\9a\97ñ\r
+*              char *エラー文字列\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *ReturnWSError(UINT Error)\r
@@ -1268,14 +1415,14 @@ char *ReturnWSError(UINT Error)
 }\r
 \r
 \r
-/*----- \83f\83o\83b\83O\83R\83\93\83\\81[\83\8b\82É\83G\83\89\81[\82ð\95\\8e¦ --------------------------------------\r
+/*----- デバッグコンソールにエラーを表示 --------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Msg : \83G\83\89\81[\82Ì\91O\82É\95\\8e¦\82·\82é\83\81\83b\83Z\81[\83W\r
-*              UINT Error : \83G\83\89\81[\94Ô\8d\86\r
+*              char *Msg : エラーの前に表示するメッセージ\r
+*              UINT Error : エラー番号\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void ReportWSError(char *Msg, UINT Error)\r
@@ -1287,15 +1434,15 @@ void ReportWSError(char *Msg, UINT Error)
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\96¼\82ð\83\8d\81[\83J\83\8b\91¤\82Å\88µ\82¦\82é\82æ\82¤\82É\95Ï\8a·\82·\82é --------------------------\r
+/*----- ファイル名をローカル側で扱えるように変換する --------------------------\r
 *\r
 *      Parameter\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\r
-*              int Max : \8dÅ\91å\92·\r
+*              char *Fname : ファイル名\r
+*              int Max : æ\9c\80大é\95·\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ChangeFnameRemote2Local(char *Fname, int Max)\r
@@ -1304,19 +1451,27 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
        char *Buf;\r
        char *Pos;\r
        CODECONVINFO cInfo;\r
+       // バッファ上書きバグ対策\r
+       char *Buf2;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if((Buf = malloc(Max)) != NULL)\r
        {\r
+       // バッファ上書きバグ対策\r
+       if((Buf2 = malloc(strlen(Fname) + 1)) != NULL)\r
+       {\r
                InitCodeConvInfo(&cInfo);\r
                cInfo.KanaCnv = NO;                     //AskHostNameKana();\r
-               cInfo.Str = Fname;\r
+               // バッファ上書きバグ対策\r
+//             cInfo.Str = Fname;\r
+               strcpy(Buf2, Fname);\r
+               cInfo.Str = Buf2;\r
                cInfo.StrLen = strlen(Fname);\r
                cInfo.Buf = Buf;\r
                cInfo.BufSize = Max - 1;\r
 \r
-               // \82±\82±\82Å\91S\82ÄUTF-8\82Ö\95Ï\8a·\82·\82é\r
-               // TODO: SJIS\88È\8aO\82à\92¼\90ÚUTF-8\82Ö\95Ï\8a·\r
+               // ここで全てUTF-8へ変換する\r
+               // TODO: SJIS以外も直接UTF-8へ変換\r
                switch(AskHostNameKanji())\r
                {\r
                        case KANJI_SJIS :\r
@@ -1340,8 +1495,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoUTF8N(&cInfo);\r
@@ -1364,8 +1519,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoUTF8N(&cInfo);\r
@@ -1389,8 +1544,8 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoUTF8N(&cInfo);\r
@@ -1412,22 +1567,27 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
 //                             strcpy(Pos, Buf);\r
 //                             break;\r
                }\r
+               // バッファ上書きバグ対策\r
+               free(Buf2);\r
+               Sts = FFFTP_SUCCESS;\r
+               }\r
                free(Buf);\r
-               Sts = SUCCESS;\r
+               // バッファ上書きバグ対策\r
+//             Sts = FFFTP_SUCCESS;\r
        }\r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\96¼\82ð\83\8a\83\82\81[\83g\91¤\82Å\88µ\82¦\82é\82æ\82¤\82É\95Ï\8a·\82·\82é --------------------------\r
+/*----- ファイル名をリモート側で扱えるように変換する --------------------------\r
 *\r
 *      Parameter\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\r
-*              int Max : \8dÅ\91å\92·\r
+*              char *Fname : ファイル名\r
+*              int Max : æ\9c\80大é\95·\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ChangeFnameLocal2Remote(char *Fname, int Max)\r
@@ -1436,19 +1596,27 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
        char *Buf;\r
        char *Pos;\r
        CODECONVINFO cInfo;\r
+       // バッファ上書きバグ対策\r
+       char *Buf2;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if((Buf = malloc(Max)) != NULL)\r
        {\r
+       // バッファ上書きバグ対策\r
+       if((Buf2 = malloc(strlen(Fname) + 1)) != NULL)\r
+       {\r
                InitCodeConvInfo(&cInfo);\r
                cInfo.KanaCnv = AskHostNameKana();\r
-               cInfo.Str = Fname;\r
+               // バッファ上書きバグ対策\r
+//             cInfo.Str = Fname;\r
+               strcpy(Buf2, Fname);\r
+               cInfo.Str = Buf2;\r
                cInfo.StrLen = strlen(Fname);\r
                cInfo.Buf = Buf;\r
                cInfo.BufSize = Max - 1;\r
 \r
-               // \82±\82±\82Å\91S\82ÄUTF-8\82©\82ç\95Ï\8a·\82·\82é\r
-               // TODO: SJIS\88È\8aO\82à\92¼\90ÚUTF-8\82©\82ç\95Ï\8a·\r
+               // ここで全てUTF-8から変換する\r
+               // TODO: SJIS以外も直接UTF-8から変換\r
                switch(AskHostNameKanji())\r
                {\r
                        case KANJI_SJIS :\r
@@ -1472,8 +1640,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoJIS(&cInfo);\r
@@ -1496,8 +1664,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoEUC(&cInfo);\r
@@ -1520,8 +1688,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoSMB_HEX(&cInfo);\r
@@ -1544,8 +1712,8 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
                                // TODO\r
                                InitCodeConvInfo(&cInfo);\r
                                cInfo.KanaCnv = NO;\r
-                               cInfo.Str = Pos;\r
-                               cInfo.StrLen = strlen(Pos);\r
+                               cInfo.Str = Fname;\r
+                               cInfo.StrLen = strlen(Fname);\r
                                cInfo.Buf = Buf;\r
                                cInfo.BufSize = Max - 1;\r
                                ConvSJIStoSMB_CAP(&cInfo);\r
@@ -1567,20 +1735,25 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
 //                             strcpy(Pos, Buf);\r
 //                             break;\r
                }\r
+               // バッファ上書きバグ対策\r
+               free(Buf2);\r
+               Sts = FFFTP_SUCCESS;\r
+               }\r
                free(Buf);\r
-               Sts = SUCCESS;\r
+               // バッファ上書きバグ対策\r
+//             Sts = FFFTP_SUCCESS;\r
        }\r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83p\83X\82Ì\8bæ\90Ø\82è\95\8e\9a\82ð\83z\83X\83g\82É\8d\87\82í\82¹\82Ä\95Ï\8dX\82·\82é ----------------------------\r
+/*----- パスの区切り文字をホストに合わせて変更する ----------------------------\r
 *\r
 *      Parameter\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\r
+*              char *Fname : ファイル名\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 static void ChangeSepaLocal2Remote(char *Fname)\r
 {\r
@@ -1592,13 +1765,13 @@ static void ChangeSepaLocal2Remote(char *Fname)
 }\r
 \r
 \r
-/*----- \83p\83X\82Ì\8bæ\90Ø\82è\95\8e\9a\82ð\83\8d\81[\83J\83\8b\82É\8d\87\82í\82¹\82Ä\95Ï\8dX\82·\82é --------------------------\r
+/*----- パスの区切り文字をローカルに合わせて変更する --------------------------\r
 *\r
 *      Parameter\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\r
+*              char *Fname : ファイル名\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 static void ChangeSepaRemote2Local(char *Fname)\r
 {\r