OSDN Git Service

Enhance routines for extra commands.
[ffftp/ffftp.git] / getput.c
index 561bc34..85897d7 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -753,40 +753,40 @@ static ULONG WINAPI TransferThread(void *Dummy)
                {\r
                        if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
                        {\r
+                               ReleaseMutex(hListAccMutex);\r
                                if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
-                               {\r
-                                       ReleaseMutex(hListAccMutex);\r
                                        ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
-                                       // 同時ログイン数制限対策\r
-                                       if(TrnSkt != INVALID_SOCKET)\r
-                                               LastUsed = timeGetTime();\r
-                                       else\r
-                                       {\r
-                                               // 同時ログイン数制限に引っかかった可能性あり\r
-                                               // 負荷を下げるために約10秒間待機\r
-                                               i = 10000;\r
-                                               while(NewCmdSkt != CmdSkt && i > 0)\r
-                                               {\r
-                                                       BackgrndMessageProc();\r
-                                                       Sleep(1);\r
-                                                       i--;\r
-                                               }\r
-                                       }\r
-//                                     WaitForSingleObject(hListAccMutex, INFINITE);\r
-                                       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               else\r
+                                       CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+                               // 同時ログイン数制限対策\r
+                               if(TrnSkt != INVALID_SOCKET)\r
+                                       LastUsed = timeGetTime();\r
+                               else\r
+                               {\r
+                                       // 同時ログイン数制限に引っかかった可能性あり\r
+                                       // 負荷を下げるために約10秒間待機\r
+                                       i = 10000;\r
+                                       while(NewCmdSkt != CmdSkt && i > 0)\r
                                        {\r
                                                BackgrndMessageProc();\r
                                                Sleep(1);\r
+                                               i--;\r
                                        }\r
                                }\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
                        }\r
                        else\r
                        {\r
                                if(TrnSkt != INVALID_SOCKET)\r
                                {\r
                                        // 同時ログイン数制限対策\r
-                                       // 10秒間は再利用を許可\r
-                                       if(timeGetTime() - LastUsed > 10000)\r
+                                       // 60秒間使用されなければログアウト\r
+                                       if(timeGetTime() - LastUsed > 60000)\r
                                        {\r
                                                ReleaseMutex(hListAccMutex);\r
                                                SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
@@ -806,6 +806,13 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //             if(TransPacketBase != NULL)\r
                if(TrnSkt != INVALID_SOCKET && NextTransPacketBase != NULL)\r
                {\r
+                       if(strcmp(NextTransPacketBase->Cmd, "GOQUIT") == 0 && NextTransPacketBase != TransPacketBase)\r
+                       {\r
+                               ReleaseMutex(hListAccMutex);\r
+                               BackgrndMessageProc();\r
+                               Sleep(1);\r
+                               continue;\r
+                       }\r
                        Pos = NextTransPacketBase;\r
                        NextTransPacketBase = NextTransPacketBase->Next;\r
                        // ディレクトリ操作は非同期で行わない\r
@@ -1298,7 +1305,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
        {\r
                iRetCode = 500;\r
                SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile));\r
-               DispDownloadFinishMsg(Pkt, iRetCode);\r
+               // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//             DispDownloadFinishMsg(Pkt, iRetCode);\r
        }\r
        else if(Pkt->Mode != EXIST_IGNORE)\r
        {\r
@@ -1345,6 +1353,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
                SetTaskMsg(MSGJPN089, Pkt->RemoteFile);\r
                iRetCode = 200;\r
        }\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+       DispDownloadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -1459,7 +1469,8 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                iRetCode = 500;\r
                SetErrorMsg(MSGJPN279);\r
        }\r
-       DispDownloadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispDownloadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -1556,7 +1567,8 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
        else\r
                SetErrorMsg(Buf);\r
 \r
-       DispDownloadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispDownloadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -2279,6 +2291,12 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                        if (AskHostType() == HTYPE_VMS)\r
                                return;\r
 #endif\r
+#if defined(HAVE_TANDEM)\r
+                       /* HP Nonstop Server の場合、ファイルのない subvol へ移動すると550 File not found\r
+                        * になるが問題ないのでエラーダイアログやエラーメッセージを出さないため */\r
+                       if (AskHostType() == HTYPE_TANDEM)\r
+                               return;\r
+#endif\r
 \r
                        if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
                        {\r
@@ -2587,7 +2605,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                        SetTaskMsg(MSGJPN105, Pkt->LocalFile);\r
                        iRetCode = 500;\r
                        Pkt->Abort = ABORT_ERROR;\r
-                       DispUploadFinishMsg(Pkt, iRetCode);\r
+                       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//                     DispUploadFinishMsg(Pkt, iRetCode);\r
                }\r
        }\r
        else\r
@@ -2596,6 +2615,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                SetTaskMsg(MSGJPN107, Pkt->LocalFile);\r
                iRetCode = 200;\r
        }\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+       DispUploadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -2629,6 +2650,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
        {\r
                SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);\r
                if(Resume == NO)\r
+#if defined(HAVE_TANDEM)\r
+                       if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {\r
+                               if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {\r
+                                       // EXTENTがデフォルトのときはコードのみ\r
+                                       sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);\r
+                               } else {\r
+                                       sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);\r
+                               }\r
+                       } else\r
+#endif\r
                        sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);\r
                else\r
                        sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
@@ -2714,7 +2745,8 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                SetErrorMsg(MSGJPN279);\r
                iRetCode = 500;\r
        }\r
-       DispUploadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispUploadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r
@@ -2772,6 +2804,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
 \r
                                SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);\r
                                if(Resume == NO)\r
+#if defined(HAVE_TANDEM)\r
+                                       if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {\r
+                                               if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {\r
+                                                       // EXTENTがデフォルトのときはコードのみ\r
+                                                       sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);\r
+                                               } else {\r
+                                                       sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);\r
+                                               }\r
+                                       } else\r
+#endif\r
                                        sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);\r
                                else\r
                                        sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
@@ -2821,7 +2863,8 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
        else\r
                SetErrorMsg(Buf);\r
 \r
-       DispUploadFinishMsg(Pkt, iRetCode);\r
+       // エラーによってはダイアログが表示されない場合があるバグ対策\r
+//     DispUploadFinishMsg(Pkt, iRetCode);\r
 \r
        return(iRetCode);\r
 }\r