OSDN Git Service

Add options to control the behavior of mirroring transfer.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index d8e95d3..4083068 100644 (file)
--- a/main.c
+++ b/main.c
@@ -283,6 +283,10 @@ int AutoCheckForUpdates = YES;
 int AutoApplyUpdates = NO;\r
 int AutoCheckForUptatesInterval = 7;\r
 time_t LastAutoCheckForUpdates = 0;\r
+// ファイル一覧バグ修正\r
+int AbortOnListError = YES;\r
+// ミラーリング設定追加\r
+int MirrorNoTransferContents = NO; \r
 \r
 \r
 \r
@@ -305,98 +309,85 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
     MSG Msg;\r
        int Ret;\r
        BOOL Sts;\r
+       // プロセス保護\r
+       char* pCommand;\r
+       DWORD ProtectLevel;\r
+       char Option[FMAX_PATH+1];\r
        // ソフトウェア自動更新\r
+       int ImmediateExit;\r
+       char PrivateKeyFile[FMAX_PATH+1];\r
+       char Password[FMAX_PATH+1];\r
+       char ServerPath[FMAX_PATH+1];\r
+       char HashFile[FMAX_PATH+1];\r
+       char ListFile[FMAX_PATH+1];\r
+       char Description[FMAX_PATH+1];\r
        char UpdateDir[FMAX_PATH+1];\r
        char Path[FMAX_PATH+1];\r
        char Command[FMAX_PATH+1];\r
        char* p;\r
 \r
-       // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
+       ProtectLevel = PROCESS_PROTECTION_NONE;\r
+       pCommand = lpszCmdLine;\r
+       while(pCommand = GetToken(pCommand, Option))\r
        {\r
-               DWORD ProtectLevel;\r
-               char* pCommand;\r
-               char Option[FMAX_PATH+1];\r
-               ProtectLevel = PROCESS_PROTECTION_NONE;\r
-               pCommand = lpszCmdLine;\r
-               while(pCommand = GetToken(pCommand, Option))\r
+               if(Option[0] == '-')\r
                {\r
-                       if(Option[0] == '-')\r
+                       if(strcmp(&Option[1], "-protect") == 0)\r
                        {\r
-                               if(strcmp(&Option[1], "-protect") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-high") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_HIGH;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-medium") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-low") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
-                                       break;\r
-                               }\r
+                               ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
+                               break;\r
                        }\r
-               }\r
-               if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
-               {\r
-                       SetProcessProtectionLevel(ProtectLevel);\r
-                       if(!InitializeLoadLibraryHook())\r
+                       else if(strcmp(&Option[1], "-protect-high") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_HIGH;\r
+                               break;\r
                        }\r
-#ifndef _DEBUG\r
-                       if(IsDebuggerPresent())\r
+                       else if(strcmp(&Option[1], "-protect-medium") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
+                               break;\r
                        }\r
-#endif\r
-                       if(!UnloadUntrustedModule())\r
+                       else if(strcmp(&Option[1], "-protect-low") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_LOW;\r
+                               break;\r
                        }\r
+               }\r
+       }\r
+       if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+       {\r
+               SetProcessProtectionLevel(ProtectLevel);\r
+               if(!InitializeLoadLibraryHook())\r
+               {\r
+                       MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #ifndef _DEBUG\r
-                       if(RestartProtectedProcess(" --restart"))\r
-                               return 0;\r
+               if(IsDebuggerPresent())\r
+               {\r
+                       MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #endif\r
-                       if(!EnableLoadLibraryHook(TRUE))\r
-                       {\r
-                               MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
-                       }\r
+               if(!UnloadUntrustedModule())\r
+               {\r
+                       MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
                }\r
-               else\r
-                       InitializeLoadLibraryHook();\r
-       }\r
+#ifndef _DEBUG\r
+               if(RestartProtectedProcess(" --restart"))\r
+                       return 0;\r
 #endif\r
-\r
-       // ソフトウェア自動更新\r
-       if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-update", "-software-update"))\r
-       {\r
-               if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+               if(!EnableLoadLibraryHook(TRUE))\r
                {\r
-                       Sleep(1000);\r
-                       if(ApplyUpdates(UpdateDir, "updatebackup"))\r
-                               MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK);\r
-                       else\r
-                               MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
                }\r
-               return 0;\r
-       }\r
-       else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-cleanup", "-software-cleanup"))\r
-       {\r
-               CleanupUpdates(UpdateDir);\r
        }\r
+       else\r
+               InitializeLoadLibraryHook();\r
+#endif\r
 \r
        // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
 #ifdef DISABLE_MULTI_CPUS\r
@@ -426,13 +417,66 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        LoadOpenSSL();\r
 #endif\r
 \r
-       // SFTP対応\r
-       LoadPuTTY();\r
+       // ソフトウェア自動更新\r
+       ImmediateExit = NO;\r
+       pCommand = lpszCmdLine;\r
+       while(pCommand = GetToken(pCommand, Option))\r
+       {\r
+               if(Option[0] == '-')\r
+               {\r
+                       if(strcmp(&Option[1], "-build-software-update") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, PrivateKeyFile))\r
+                               {\r
+                                       if(pCommand = GetToken(pCommand, Password))\r
+                                       {\r
+                                               if(pCommand = GetToken(pCommand, ServerPath))\r
+                                               {\r
+                                                       if(pCommand = GetToken(pCommand, HashFile))\r
+                                                       {\r
+                                                               if(pCommand = GetToken(pCommand, ListFile))\r
+                                                               {\r
+                                                                       if(pCommand = GetToken(pCommand, Description))\r
+                                                                               BuildUpdates(PrivateKeyFile, Password, ServerPath, HashFile, ListFile, RELEASE_VERSION_NUM, VER_STR, Description);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               ImmediateExit = YES;\r
+                               break;\r
+                       }\r
+                       else if(strcmp(&Option[1], "-software-update") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, UpdateDir))\r
+                               {\r
+                                       if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+                                       {\r
+                                               Sleep(1000);\r
+                                               if(ApplyUpdates(UpdateDir, "updatebackup"))\r
+                                                       MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+                                               else\r
+                                                       MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
+                                       }\r
+                               }\r
+                               ImmediateExit = YES;\r
+                               break;\r
+                       }\r
+                       else if(strcmp(&Option[1], "-software-cleanup") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, UpdateDir))\r
+                                       CleanupUpdates(UpdateDir);\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
 \r
        Ret = FALSE;\r
        hWndFtp = NULL;\r
        hInstFtp = hInstance;\r
-       if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+       // ソフトウェア自動更新\r
+//     if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+       if(ImmediateExit == NO && InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
        {\r
                for(;;)\r
                {\r
@@ -464,8 +508,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #ifdef USE_OPENSSL\r
        FreeOpenSSL();\r
 #endif\r
-       // SFTP対応\r
-       FreePuTTY();\r
        // タスクバー進捗表示\r
        FreeTaskbarList3();\r
        // UPnP対応\r
@@ -490,7 +532,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
                        }\r
                }\r
                if(!Sts)\r
-                       MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
        }\r
        return(Ret);\r
 }\r
@@ -588,7 +630,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                {\r
                        if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
                        {\r
-                               switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+                               switch(MessageBox(GetMainHwnd(), MSGJPN350, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
                                {\r
                                        case IDCANCEL:\r
                                                ReadOnlySettings = YES;\r
@@ -658,6 +700,9 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                \r
                if(masterpass != 0)\r
                {\r
+                       // ホスト共通設定機能\r
+                       ResetDefaultHost();\r
+\r
                        LoadRegistry();\r
 \r
                        // ポータブル版判定\r
@@ -737,7 +782,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        DispTransferFiles();\r
 \r
                                        // ソフトウェア自動更新\r
-                                       if(AutoCheckForUptatesInterval == 0)\r
+                                       if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval == 0)\r
                                                UpdateSoftware(YES, YES, AutoApplyUpdates);\r
 \r
                                        StartupProc(lpszCmdLine);\r
@@ -914,16 +959,16 @@ void DispWindowTitle(void)
                switch(AskCryptMode())\r
                {\r
                case CRYPT_NONE:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN351);\r
                        break;\r
                case CRYPT_FTPES:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
                        break;\r
                case CRYPT_FTPIS:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
                        break;\r
                case CRYPT_SFTP:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
                        break;\r
                }\r
        }\r
@@ -1114,7 +1159,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        case 3:\r
                                if(AskUserOpeDisabled() == NO && AskTransferNow() == NO)\r
                                {\r
-                                       if(AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
+                                       if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
                                                UpdateSoftware(YES, YES, AutoApplyUpdates);\r
                                }\r
                                break;\r
@@ -1125,7 +1170,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        // 同時接続対応\r
                        // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
                        if(CancelFlg == YES)\r
-                               RemoveReceivedData(AskCmdCtrlSkt());\r
+                               AbortRecoveryProc();\r
                        switch(LOWORD(wParam))\r
                        {\r
                                case MENU_CONNECT :\r
@@ -2166,6 +2211,8 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
 {\r
        int Ret;\r
        char Tmp[FMAX_PATH+1];\r
+       // ソフトウェア自動更新\r
+       int i;\r
 \r
        *AutoConnect = -1;\r
        *CmdOption = 0;\r
@@ -2292,6 +2339,17 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
                                *CmdOption |= OPT_UTF8N_NAME;\r
                        // ソフトウェア自動更新\r
+                       else if(strcmp(&Tmp[1], "-build-software-update") == 0)\r
+                       {\r
+                               for(i = 0; i < 6; i++)\r
+                               {\r
+                                       if((Str = GetToken(Str, Tmp)) == NULL)\r
+                                       {\r
+                                               Ret = -1;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
                        else if(strcmp(&Tmp[1], "-software-update") == 0)\r
                        {\r
                                if((Str = GetToken(Str, Tmp)) == NULL)\r
@@ -2457,6 +2515,9 @@ static void ExitProc(HWND hWnd)
 \r
        CancelFlg = YES;\r
 \r
+       // バグ対策\r
+       DisableUserOpe();\r
+\r
        CloseTransferThread();\r
 \r
        if(SaveExit == YES)\r
@@ -3511,7 +3572,7 @@ BOOL LoadSSLRootCAFile()
                                for(i = 0; i < 5; i++)\r
                                        Hash[i] = _byteswap_ulong(Hash[i]);\r
                                // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
-                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xC8\xF6\x0B\x07\x10\x42\x55\xE7\x57\x7F\xE9\x52\xE0\x3F\xA8\xE4\x08\x2B\xB0\xE2", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xE8\xE7\x94\x39\x27\x66\xCC\xA1\x52\x88\x58\xA2\x29\xAC\x04\x6B\x0F\x5D\x58\x01", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3575,9 +3636,8 @@ int Restart()
        return Sts;\r
 }\r
 \r
-void RestartAndTerminate()\r
+void Terminate()\r
 {\r
-       Restart();\r
        exit(1);\r
 }\r
 \r
@@ -3650,7 +3710,8 @@ void UpdateSoftware(int Async, int NoError, int NoConfirm)
        UPDATESOFTWAREDATA* pData;\r
        DWORD Version;\r
        char VersionString[32];\r
-       char Tmp[FMAX_PATH+1];\r
+       char Description[1024];\r
+       char Tmp[2048];\r
        if(Async == YES)\r
        {\r
                if(pData = malloc(sizeof(UPDATESOFTWAREDATA)))\r
@@ -3667,31 +3728,31 @@ void UpdateSoftware(int Async, int NoError, int NoConfirm)
                {\r
                        Version = RELEASE_VERSION_NUM;\r
                        LastAutoCheckForUpdates = time(NULL);\r
-                       if(CheckForUpdates(FALSE, NULL, &Version, VersionString))\r
+                       if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description))\r
                        {\r
                                if(Version > RELEASE_VERSION_NUM)\r
                                {\r
-                                       sprintf(Tmp, MSGJPN362, VER_STR, VersionString);\r
+                                       sprintf(Tmp, MSGJPN361, VER_STR, VersionString, Description);\r
                                        if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES)\r
                                        {\r
                                                strcpy(Tmp, TmpPath);\r
                                                SetYenTail(Tmp);\r
                                                strcat(Tmp, "update");\r
                                                _mkdir(Tmp);\r
-                                               if(CheckForUpdates(TRUE, Tmp, &Version, VersionString))\r
+                                               if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description))\r
                                                {\r
-                                                       MessageBox(GetMainHwnd(), MSGJPN365, "FFFTP", MB_OK);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
                                                        ApplyUpdatesOnExit = YES;\r
                                                }\r
                                                else if(NoError == NO)\r
-                                                       MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
                                        }\r
                                }\r
                                else if(NoError == NO)\r
-                                       MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
+                                       MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK);\r
                        }\r
                        else if(NoError == NO)\r
-                               MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
                }\r
        }\r
 }\r