OSDN Git Service

Change to encode reply messages with Kanji code of filenames.
[ffftp/ffftp.git] / remote.c
index 1b617be..b2fffd6 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -62,11 +62,15 @@ extern TRANSPACKET MainTransPkt;
 extern int TimeOut;\r
 extern int SendQuit;\r
 \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
@@ -237,7 +241,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
@@ -343,7 +346,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
@@ -389,12 +394,16 @@ int DoCHMOD(char *Path, char *Mode)
 *              サイズが選られない時は 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
@@ -418,7 +427,9 @@ int DoSIZE(char *Path, LONGLONG *Size)
 *              日付が選られない時は 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 +438,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
@@ -510,7 +523,9 @@ 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
@@ -587,7 +602,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
@@ -654,7 +674,9 @@ 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, &CancelFlg, "%s", Cmd);\r
 //             }\r
 //     }\r
        return(Sts);\r
@@ -675,7 +697,9 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 *              転送コントロールソケットを使う\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
@@ -691,7 +715,8 @@ int CommandProcTrn(char *Reply, char *fmt, ...)
 //     if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429)\r
 //     {\r
 //             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-                       Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+//                     Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+                       Sts = command(cSkt, Reply, CancelCheckWork, "%s", Cmd);\r
 //     }\r
        return(Sts);\r
 }\r
@@ -876,6 +901,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
@@ -1026,14 +1053,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
-                                       ReConnectCmdSkt();\r
-                               else\r
-                                       DisconnectSet();\r
-                       }\r
+                               cSkt = DoClose(cSkt);\r
                }\r
                else\r
                {\r
@@ -1304,13 +1325,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
@@ -1412,8 +1441,13 @@ int ChangeFnameRemote2Local(char *Fname, int Max)
 //                             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
@@ -1436,13 +1470,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
@@ -1567,8 +1609,13 @@ int ChangeFnameLocal2Remote(char *Fname, int Max)
 //                             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