OSDN Git Service

Add routines for IPv6.
[ffftp/ffftp.git] / getput.c
index 0eada3d..48f0d63 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -41,7 +41,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
 #include <process.h>\r
@@ -711,44 +713,53 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        free(Pos);\r
                }\r
                NewCmdSkt = AskCmdCtrlSkt();\r
-               if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
+               if(AskReuseCmdSkt() == YES && ThreadCount == 0)\r
                {\r
-                       if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
+                       if(TransPacketBase && ThreadCount < AskMaxThreadCount())\r
+                               TrnSkt = AskTrnCtrlSkt();\r
+               }\r
+               else\r
+               {\r
+                       if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
                        {\r
-                               ReleaseMutex(hListAccMutex);\r
-                               ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
-                               // 同時ログイン数制限に引っかかった可能性あり\r
-                               // 負荷を下げるためにしばらく待機\r
-                               if(TrnSkt == INVALID_SOCKET)\r
+                               if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
                                {\r
-                                       i = 10000;\r
-                                       while(NewCmdSkt != CmdSkt && i > 0)\r
+                                       ReleaseMutex(hListAccMutex);\r
+                                       ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+                                       // 同時ログイン数制限に引っかかった可能性あり\r
+                                       // 負荷を下げるためにしばらく待機\r
+                                       if(TrnSkt == INVALID_SOCKET)\r
+                                       {\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
-                                               i--;\r
                                        }\r
                                }\r
-//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
-                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
-                               {\r
-                                       BackgrndMessageProc();\r
-                                       Sleep(1);\r
-                               }\r
                        }\r
-               }\r
-               else\r
-               {\r
-                       if(TrnSkt != INVALID_SOCKET)\r
+                       else\r
                        {\r
-                               ReleaseMutex(hListAccMutex);\r
-                               DoClose(TrnSkt);\r
-                               TrnSkt = INVALID_SOCKET;\r
-//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
-                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               if(TrnSkt != INVALID_SOCKET)\r
                                {\r
-                                       BackgrndMessageProc();\r
-                                       Sleep(1);\r
+                                       ReleaseMutex(hListAccMutex);\r
+                                       SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
+                                       DoClose(TrnSkt);\r
+                                       TrnSkt = INVALID_SOCKET;\r
+//                                     WaitForSingleObject(hListAccMutex, INFINITE);\r
+                                       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                                       {\r
+                                               BackgrndMessageProc();\r
+                                               Sleep(1);\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -1017,7 +1028,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                     else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0)\r
                        else if(strcmp(Pos->Cmd, "SETCUR") == 0)\r
                        {\r
-                               if(AskShareProh() == YES)\r
+//                             if(AskShareProh() == YES)\r
+                               if(AskReuseCmdSkt() == NO || AskShareProh() == YES)\r
                                {\r
 //                                     if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
                                        if(strcmp(CurDir[Pos->ThreadCount], Pos->RemoteFile) != 0)\r
@@ -1038,7 +1050,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                     else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0)\r
                        else if(strcmp(Pos->Cmd, "BACKCUR") == 0)\r
                        {\r
-                               if(AskShareProh() == NO)\r
+//                             if(AskShareProh() == NO)\r
+                               if(AskReuseCmdSkt() == YES && AskShareProh() == NO)\r
                                {\r
 //                                     if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0)\r
 //                                             CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile);\r
@@ -1172,8 +1185,14 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                Sleep(100);\r
                }\r
        }\r
-       if(TrnSkt != INVALID_SOCKET)\r
-               DoClose(TrnSkt);\r
+       if(AskReuseCmdSkt() == NO || ThreadCount > 0)\r
+       {\r
+               if(TrnSkt != INVALID_SOCKET)\r
+               {\r
+                       SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
+                       DoClose(TrnSkt);\r
+               }\r
+       }\r
        return 0;\r
 }\r
 \r
@@ -3722,6 +3741,59 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max)
 }\r
 \r
 \r
+// IPv6対応\r
+static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family)\r
+{\r
+       char *Pos;\r
+       char *Btm;\r
+       int Sts;\r
+\r
+       Sts = FFFTP_FAIL;\r
+\r
+       Pos = strchr(Str, '|');\r
+       if(Pos != NULL)\r
+       {\r
+               Pos++;\r
+               Btm = strchr(Pos, '|');\r
+               if(Btm != NULL)\r
+               {\r
+                       switch(atoi(Pos))\r
+                       {\r
+                       case 1:\r
+                               *Family = AF_INET;\r
+                               break;\r
+                       case 2:\r
+                               *Family = AF_INET6;\r
+                               break;\r
+                       }\r
+                       Pos = Btm + 1;\r
+                       Btm = strchr(Pos, '|');\r
+                       if(Btm != NULL)\r
+                       {\r
+                               if((Btm - Pos) <= Max)\r
+                               {\r
+                                       if((Btm - Pos) > 0)\r
+                                       {\r
+                                               strncpy(Adrs, Pos, Btm - Pos);\r
+                                               *(Adrs + (Btm - Pos)) = NUL;\r
+                                       }\r
+\r
+                                       Pos = Btm + 1;\r
+                                       Btm = strchr(Pos, '|');\r
+                                       if(Btm != NULL)\r
+                                       {\r
+                                               Btm++;\r
+                                               *Port = atoi(Pos);\r
+                                               Sts = FFFTP_SUCCESS;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return(Sts);\r
+}\r
+\r
+\r
 /*----- Windowsのスペシャルデバイスかどうかを返す -----------------------------\r
 *\r
 *      Parameter\r