OSDN Git Service

Recompile executable files.
[ffftp/ffftp.git] / remote.c
index bc80b07..8c6e665 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -66,6 +66,8 @@ extern int SendQuit;
 \r
 // 同時接続対応\r
 extern int CancelFlg;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
 \r
 /*===== ローカルなワーク =====*/\r
 \r
@@ -96,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
@@ -220,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
@@ -279,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
@@ -301,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
@@ -323,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
@@ -346,7 +385,9 @@ 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
                // 同時接続対応\r
 //             Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst);\r
@@ -355,6 +396,13 @@ int DoRENAME(char *Src, char *Dst)
        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
@@ -373,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
@@ -441,8 +498,11 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)
     Time->dwHighDateTime = 0;\r
 \r
        // 同時接続対応\r
+       // ホスト側の日時取得\r
 //     Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
-       Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "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
@@ -451,7 +511,8 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)
                        &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
@@ -459,6 +520,22 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)
 }\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
@@ -468,11 +545,14 @@ int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)
 *              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
@@ -519,7 +599,9 @@ 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
@@ -527,7 +609,7 @@ int DoQUIT(SOCKET ctrl_skt)
        if(SendQuit == YES)\r
                // 同時接続対応\r
 //             Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100;\r
-               Ret = command(ctrl_skt, NULL, &CancelFlg, "QUIT") / 100;\r
+               Ret = command(ctrl_skt, NULL, CancelCheckWork, "QUIT") / 100;\r
 \r
        return(Ret);\r
 }\r
@@ -633,7 +715,7 @@ static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num,
        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
@@ -656,7 +738,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
@@ -678,7 +762,7 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 //             {\r
                        // 同時接続対応\r
 //                     Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
-                       Sts = command(AskCmdCtrlSkt(), Reply, &CancelFlg, "%s", Cmd);\r
+                       Sts = command(AskCmdCtrlSkt(), Reply, CancelCheckWork, "%s", Cmd);\r
 //             }\r
 //     }\r
        return(Sts);\r
@@ -701,10 +785,10 @@ void SwitchOSSProc(void)
 \r
        /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */\r
        if(AskOSS() == YES) {\r
-               DoQUOTE("GUARDIAN");\r
+               DoQUOTE(AskCmdCtrlSkt(), "GUARDIAN", &CancelFlg);\r
                SetOSS(NO);\r
        } else {\r
-               DoQUOTE("OSS");\r
+               DoQUOTE(AskCmdCtrlSkt(), "OSS", &CancelFlg);\r
                SetOSS(YES);\r
        }\r
        /* Current Dir 再取得 */\r
@@ -721,7 +805,9 @@ void SwitchOSSProc(void)
 /*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)---------------\r
 *\r
 *      Parameter\r
+*              SOCKET cSkt : ソケット\r
 *              char *Reply : リプライのコピー先 (NULL=コピーしない)\r
+*              int *CancelCheckWork :\r
 *              char *fmt : フォーマット文字列\r
 *              ... : パラメータ\r
 *\r
@@ -775,93 +861,6 @@ int CommandProcTrn(SOCKET cSkt, char *Reply, int* CancelCheckWork, char *fmt, ..
 //#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
@@ -875,10 +874,6 @@ 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