OSDN Git Service

Fix bugs of the drag-and-drop routine.
[ffftp/ffftp.git] / remote.c
index 3b8c736..8ce4dbc 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -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
@@ -62,11 +64,17 @@ extern TRANSPACKET MainTransPkt;
 extern int TimeOut;\r
 extern int SendQuit;\r
 \r
+// 同時接続対応\r
+extern int CancelFlg;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
+\r
 /*===== ローカルなワーク =====*/\r
 \r
 static int PwdCommandType;\r
 \r
-static int CheckCancelFlg = NO;\r
+// 同時接続対応\r
+//static int CheckCancelFlg = NO;\r
 \r
 \r
 \r
@@ -90,13 +98,19 @@ int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell)
        Sts = FTP_COMPLETE * 100;\r
 \r
        if(strcmp(Path, "..") == 0)\r
-               Sts = CommandProcCmd(NULL, "CDUP");\r
+               // 同時接続対応\r
+//             Sts = CommandProcCmd(NULL, "CDUP");\r
+               Sts = CommandProcCmd(NULL, &CancelFlg, "CDUP");\r
        else if(strcmp(Path, "") != 0)\r
        {\r
                if((AskHostType() != HTYPE_VMS) || (strchr(Path, '[') != NULL))\r
-                       Sts = CommandProcCmd(NULL, "CWD %s", Path);\r
+                       // 同時接続対応\r
+//                     Sts = CommandProcCmd(NULL, "CWD %s", Path);\r
+                       Sts = CommandProcCmd(NULL, &CancelFlg, "CWD %s", Path);\r
                else\r
-                       Sts = CommandProcCmd(NULL, "CWD [.%s]", Path);  /* VMS用 */\r
+                       // 同時接続対応\r
+//                     Sts = CommandProcCmd(NULL, "CWD [.%s]", Path);  /* VMS用 */\r
+                       Sts = CommandProcCmd(NULL, &CancelFlg, "CWD [.%s]", Path);      /* VMS用 */\r
        }\r
 \r
        if((Sts/100 >= FTP_CONTINUE) && (ErrorBell == YES))\r
@@ -214,12 +228,16 @@ static int DoPWD(char *Buf)
 \r
        if(PwdCommandType == PWD_XPWD)\r
        {\r
-               Sts = CommandProcCmd(Tmp, "XPWD");\r
+               // 同時接続対応\r
+//             Sts = CommandProcCmd(Tmp, "XPWD");\r
+               Sts = CommandProcCmd(Tmp, &CancelFlg, "XPWD");\r
                if(Sts/100 != FTP_COMPLETE)\r
                        PwdCommandType = PWD_PWD;\r
        }\r
        if(PwdCommandType == PWD_PWD)\r
-               Sts = CommandProcCmd(Tmp, "PWD");\r
+               // 同時接続対応\r
+//             Sts = CommandProcCmd(Tmp, "PWD");\r
+               Sts = CommandProcCmd(Tmp, &CancelFlg, "PWD");\r
 \r
        if(Sts/100 == FTP_COMPLETE)\r
        {\r
@@ -237,7 +255,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
@@ -274,11 +291,20 @@ int DoMKD(char *Path)
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "MKD %s", Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcCmd(NULL, "MKD %s", Path);\r
+       Sts = CommandProcCmd(NULL, &CancelFlg, "MKD %s", Path);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
 \r
+       // 自動切断対策\r
+       if(CancelFlg == NO && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+       {\r
+               NoopProc(YES);\r
+               LastDataConnectionTime = time(NULL);\r
+       }\r
+\r
        return(Sts/100);\r
 }\r
 \r
@@ -296,11 +322,20 @@ int DoRMD(char *Path)
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "RMD %s", Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcCmd(NULL, "RMD %s", Path);\r
+       Sts = CommandProcCmd(NULL, &CancelFlg, "RMD %s", Path);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
 \r
+       // 自動切断対策\r
+       if(CancelFlg == NO && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+       {\r
+               NoopProc(YES);\r
+               LastDataConnectionTime = time(NULL);\r
+       }\r
+\r
        return(Sts/100);\r
 }\r
 \r
@@ -318,11 +353,20 @@ int DoDELE(char *Path)
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "DELE %s", Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcCmd(NULL, "DELE %s", Path);\r
+       Sts = CommandProcCmd(NULL, &CancelFlg, "DELE %s", Path);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
 \r
+       // 自動切断対策\r
+       if(CancelFlg == NO && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+       {\r
+               NoopProc(YES);\r
+               LastDataConnectionTime = time(NULL);\r
+       }\r
+\r
        return(Sts/100);\r
 }\r
 \r
@@ -341,13 +385,24 @@ int DoRENAME(char *Src, char *Dst)
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "RNFR %s", Src);\r
+       // 同時接続対応\r
+//     Sts = CommandProcCmd(NULL, "RNFR %s", Src);\r
+       Sts = CommandProcCmd(NULL, &CancelFlg, "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
 \r
+       // 自動切断対策\r
+       if(CancelFlg == NO && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+       {\r
+               NoopProc(YES);\r
+               LastDataConnectionTime = time(NULL);\r
+       }\r
+\r
        return(Sts/100);\r
 }\r
 \r
@@ -366,11 +421,20 @@ int DoCHMOD(char *Path, char *Mode)
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "%s %s %s", AskHostChmodCmd(), Mode, Path);\r
+       // 同時接続対応\r
+//     Sts = CommandProcCmd(NULL, "%s %s %s", AskHostChmodCmd(), Mode, Path);\r
+       Sts = CommandProcCmd(NULL, &CancelFlg, "%s %s %s", AskHostChmodCmd(), Mode, Path);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
 \r
+       // 自動切断対策\r
+       if(CancelFlg == NO && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+       {\r
+               NoopProc(YES);\r
+               LastDataConnectionTime = time(NULL);\r
+       }\r
+\r
        return(Sts/100);\r
 }\r
 \r
@@ -391,13 +455,14 @@ int DoCHMOD(char *Path, char *Mode)
 \r
 // 同時接続対応\r
 //int DoSIZE(char *Path, LONGLONG *Size)\r
-int DoSIZE(SOCKET cSkt, 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
+       // 同時接続対応\r
 //     Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
-       Sts = CommandProcTrn(cSkt, 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
@@ -423,17 +488,21 @@ int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size)
 \r
 // 同時接続対応\r
 //int DoMDTM(char *Path, FILETIME *Time)\r
-int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time)\r
+int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)\r
 {\r
        int Sts;\r
        char Tmp[1024];\r
        SYSTEMTIME sTime;\r
 \r
-    Time->dwLowDateTime = 0;\r
-    Time->dwHighDateTime = 0;\r
+       Time->dwLowDateTime = 0;\r
+       Time->dwHighDateTime = 0;\r
 \r
+       // 同時接続対応\r
+       // ホスト側の日時取得\r
 //     Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
-       Sts = CommandProcTrn(cSkt, Tmp, "MDTM %s", Path);\r
+       Sts = 500;\r
+       if(AskHostFeature() & FEATURE_MDTM)\r
+               Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "MDTM %s", Path);\r
        if(Sts/100 == FTP_COMPLETE)\r
        {\r
                sTime.wMilliseconds = 0;\r
@@ -442,7 +511,8 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time)
                        &sTime.wHour, &sTime.wMinute, &sTime.wSecond) == 6)\r
                {\r
                        SystemTimeToFileTime(&sTime, Time);\r
-                       SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+                       // 時刻はGMT\r
+//                     SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
 \r
                }\r
        }\r
@@ -450,6 +520,22 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time)
 }\r
 \r
 \r
+// ホスト側の日時設定\r
+int DoMFMT(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)\r
+{\r
+       int Sts;\r
+       char Tmp[1024];\r
+       SYSTEMTIME sTime;\r
+\r
+       FileTimeToSystemTime(Time, &sTime);\r
+\r
+       Sts = 500;\r
+       if(AskHostFeature() & FEATURE_MFMT)\r
+               Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "MFMT %04d%02d%02d%02d%02d%02d %s", sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, Path);\r
+       return(Sts/100);\r
+}\r
+\r
+\r
 /*----- リモート側のコマンドを実行 --------------------------------------------\r
 *\r
 *      Parameter\r
@@ -459,11 +545,14 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time)
 *              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoQUOTE(char *CmdStr)\r
+// 同時接続対応\r
+//int DoQUOTE(char *CmdStr)\r
+int DoQUOTE(SOCKET cSkt, char *CmdStr, int *CancelCheckWork)\r
 {\r
        int Sts;\r
 \r
-       Sts = CommandProcCmd(NULL, "%s", CmdStr);\r
+//     Sts = CommandProcCmd(NULL, "%s", CmdStr);\r
+       Sts = CommandProcTrn(cSkt, NULL, CancelCheckWork, "%s", CmdStr);\r
 \r
        if(Sts/100 >= FTP_CONTINUE)\r
                SoundPlay(SND_ERROR);\r
@@ -510,13 +599,17 @@ SOCKET DoClose(SOCKET Sock)
 *              int 応答コードの1桁目\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoQUIT(SOCKET ctrl_skt)\r
+// 同時接続対応\r
+//int DoQUIT(SOCKET ctrl_skt)\r
+int DoQUIT(SOCKET ctrl_skt, int *CancelCheckWork)\r
 {\r
        int Ret;\r
 \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, CancelCheckWork, "QUIT") / 100;\r
 \r
        return(Ret);\r
 }\r
@@ -593,7 +686,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
@@ -613,11 +711,13 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
        MainTransPkt.KanjiCode = KANJI_NOCNV;\r
        MainTransPkt.KanaCnv = YES;\r
        MainTransPkt.Mode = EXIST_OVW;\r
+       // ミラーリング設定追加\r
+       MainTransPkt.NoTransfer = NO;\r
        MainTransPkt.ExistSize = 0;\r
        MainTransPkt.hWndTrans = hWnd;\r
        MainTransPkt.Next = NULL;\r
 \r
-       Sts = DoDownLoad(cSkt, &MainTransPkt, YES, CancelCheckWork);\r
+       Sts = DoDownload(cSkt, &MainTransPkt, YES, CancelCheckWork);\r
 \r
 //#pragma aaa\r
 //DoPrintf("===== DoDirList Done.");\r
@@ -640,7 +740,9 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
 *              コマンドコントロールソケットを使う\r
 *----------------------------------------------------------------------------*/\r
 \r
-int CommandProcCmd(char *Reply, char *fmt, ...)\r
+// 同時接続対応\r
+//int CommandProcCmd(char *Reply, char *fmt, ...)\r
+int CommandProcCmd(char *Reply, int* CancelCheckWork, char *fmt, ...)\r
 {\r
        va_list Args;\r
        char Cmd[1024];\r
@@ -660,17 +762,54 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 //     {\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, CancelCheckWork, "%s", Cmd);\r
 //             }\r
 //     }\r
        return(Sts);\r
 }\r
 \r
 \r
+#if defined(HAVE_TANDEM)\r
+/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る ---------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void SwitchOSSProc(void)\r
+{\r
+       char Buf[MAX_PATH+1];\r
+\r
+       /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */\r
+       if(AskOSS() == YES) {\r
+               DoQUOTE(AskCmdCtrlSkt(), "GUARDIAN", &CancelFlg);\r
+               SetOSS(NO);\r
+       } else {\r
+               DoQUOTE(AskCmdCtrlSkt(), "OSS", &CancelFlg);\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
+*              SOCKET cSkt : ソケット\r
 *              char *Reply : リプライのコピー先 (NULL=コピーしない)\r
+*              int *CancelCheckWork :\r
 *              char *fmt : フォーマット文字列\r
 *              ... : パラメータ\r
 *\r
@@ -683,7 +822,7 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 \r
 // 同時接続対応\r
 //int CommandProcTrn(char *Reply, char *fmt, ...)\r
-int CommandProcTrn(SOCKET cSkt, 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
@@ -700,7 +839,7 @@ int CommandProcTrn(SOCKET cSkt, char *Reply, char *fmt, ...)
 //     {\r
 //             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
 //                     Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
-                       Sts = command(cSkt, Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       Sts = command(cSkt, Reply, CancelCheckWork, "%s", Cmd);\r
 //     }\r
        return(Sts);\r
 }\r
@@ -748,8 +887,11 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)
                {\r
                        ChangeSepaLocal2Remote(Cmd);\r
                        SetTaskMsg(">%s", Cmd);\r
-                       ChangeFnameLocal2Remote(Cmd, FMAX_PATH*2);\r
+                       // UTF-8対応\r
+//                     ChangeFnameLocal2Remote(Cmd, FMAX_PATH*2);\r
                }\r
+               // UTF-8対応\r
+               ChangeFnameLocal2Remote(Cmd, FMAX_PATH*2);\r
 \r
 //             DoPrintf("SEND : %s", Cmd);\r
                strcat(Cmd, "\x0D\x0A");\r
@@ -885,6 +1027,8 @@ 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
@@ -1035,14 +1179,8 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork)
 \r
                        if((SizeOnce == -2) || (AskTransferNow() == YES))\r
                        // 転送中に全て中止を行うと不正なデータが得られる場合のバグ修正\r
-                       // エラーの種類によっては無限ループとスタックオーバーフローの可能性あり\r
 //                             DisconnectSet();\r
-                       {\r
-                               if(SizeOnce == -1)\r
-                                       ReConnectTrnSkt(&cSkt);\r
-                               else\r
-                                       DisconnectSet();\r
-                       }\r
+                               cSkt = DoClose(cSkt);\r
                }\r
                else\r
                {\r
@@ -1313,13 +1451,21 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
        char *Buf;\r
        char *Pos;\r
        CODECONVINFO cInfo;\r
+       // バッファ上書きバグ対策\r
+       char *Buf2;\r
 \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
@@ -1420,9 +1566,25 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
 //                             *(Buf + cInfo.OutLen) = NUL;\r
 //                             strcpy(Pos, Buf);\r
 //                             break;\r
+\r
+                       // UTF-8 HFS+対応\r
+                       case KANJI_UTF8HFSX :\r
+                               ConvUTF8HFSXtoUTF8N(&cInfo);\r
+                               *(Buf + cInfo.OutLen) = NUL;\r
+                               strcpy(Fname, Buf);\r
+                               Pos = strchr(Fname, NUL);\r
+                               FlushRestData(&cInfo);\r
+                               *(Buf + cInfo.OutLen) = NUL;\r
+                               strcpy(Pos, Buf);\r
+                               break;\r
                }\r
-               free(Buf);\r
+               // バッファ上書きバグ対策\r
+               free(Buf2);\r
                Sts = FFFTP_SUCCESS;\r
+               }\r
+               free(Buf);\r
+               // バッファ上書きバグ対策\r
+//             Sts = FFFTP_SUCCESS;\r
        }\r
        return(Sts);\r
 }\r
@@ -1445,13 +1607,21 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
        char *Buf;\r
        char *Pos;\r
        CODECONVINFO cInfo;\r
+       // バッファ上書きバグ対策\r
+       char *Buf2;\r
 \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
@@ -1575,9 +1745,25 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
 //                             *(Buf + cInfo.OutLen) = NUL;\r
 //                             strcpy(Pos, Buf);\r
 //                             break;\r
+\r
+                       // UTF-8 HFS+対応\r
+                       case KANJI_UTF8HFSX :\r
+                               ConvUTF8NtoUTF8HFSX(&cInfo);\r
+                               *(Buf + cInfo.OutLen) = NUL;\r
+                               strcpy(Fname, Buf);\r
+                               Pos = strchr(Fname, NUL);\r
+                               FlushRestData(&cInfo);\r
+                               *(Buf + cInfo.OutLen) = NUL;\r
+                               strcpy(Pos, Buf);\r
+                               break;\r
                }\r
-               free(Buf);\r
+               // バッファ上書きバグ対策\r
+               free(Buf2);\r
                Sts = FFFTP_SUCCESS;\r
+               }\r
+               free(Buf);\r
+               // バッファ上書きバグ対策\r
+//             Sts = FFFTP_SUCCESS;\r
        }\r
        return(Sts);\r
 }\r