OSDN Git Service

Fix bugs of UPnP port mapping control.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 9 Aug 2015 14:54:55 +0000 (23:54 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 9 Aug 2015 14:54:55 +0000 (23:54 +0900)
FFFTP_Eng_Release/FFFTP.exe
FFFTP_Eng_Release_64/FFFTP.exe
Release/FFFTP.exe
Release_64/FFFTP.exe
common.h
connect.c
ftpproc.c
main.c
socket.c

index 2c9fed3..b8f8a52 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 4e6f74f..333aca4 100644 (file)
Binary files a/FFFTP_Eng_Release_64/FFFTP.exe and b/FFFTP_Eng_Release_64/FFFTP.exe differ
index c05d6b6..2ba6443 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index 0fc224e..bf369e7 100644 (file)
Binary files a/Release_64/FFFTP.exe and b/Release_64/FFFTP.exe differ
index 41e2256..c410dd8 100644 (file)
--- a/common.h
+++ b/common.h
@@ -81,7 +81,7 @@
 // ソフトウェア自動更新\r
 // リリースバージョンはリリース予定年(10進数4桁)+月(2桁)+日(2桁)+通し番号(0スタート2桁)とする\r
 // 2014年7月31日中の30個目のリリースは2014073129\r
-#define RELEASE_VERSION_NUM            2015072001      /* リリースバージョン */\r
+#define RELEASE_VERSION_NUM            2015080901      /* リリースバージョン */\r
 \r
 \r
 // SourceForge.JPによるフォーク\r
 #define WM_REFRESH_LOCAL_FLG   (WM_USER+7)\r
 #define WM_REFRESH_REMOTE_FLG  (WM_USER+8)\r
 \r
+// UPnP対応\r
+#define WM_ADDPORTMAPPING      (WM_USER+9)\r
+#define WM_REMOVEPORTMAPPING   (WM_USER+10)\r
+\r
 /*===== ホスト番号 =====*/\r
 /* ホスト番号は 0~ の値を取る */\r
 \r
@@ -1354,6 +1358,23 @@ typedef struct {
 } INTCONVTBL;\r
 \r
 \r
+// UPnP対応\r
+typedef struct\r
+{\r
+       int r;\r
+       HANDLE h;\r
+       char* Adrs;\r
+       int Port;\r
+       char* ExtAdrs;\r
+} ADDPORTMAPPINGDATA;\r
+\r
+typedef struct\r
+{\r
+       int r;\r
+       HANDLE h;\r
+       int Port;\r
+} REMOVEPORTMAPPINGDATA;\r
+\r
 /*=================================================\r
 *              プロトタイプ\r
 *=================================================*/\r
@@ -2001,7 +2022,7 @@ void RemoveReceivedData(SOCKET s);
 int LoadUPnP();\r
 void FreeUPnP();\r
 int IsUPnPLoaded();\r
-int AddPortMapping(char* Adrs, int Port);\r
+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs);\r
 int RemovePortMapping(int Port);\r
 int CheckClosedAndReconnect(void);\r
 // 同時接続対応\r
index a26039d..88c33e3 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -2643,6 +2643,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
        // UPnP対応\r
        char Adrs[16];\r
        int Port;\r
+       char ExtAdrs[40];\r
 \r
        // ソケットにデータを付与\r
        GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
@@ -2755,8 +2756,11 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                                                // UPnP対応\r
                                                if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
                                                {\r
-                                                       if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port)) == FFFTP_SUCCESS)\r
+                                                       if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port), ExtAdrs) == FFFTP_SUCCESS)\r
+                                                       {\r
+                                                               saTmpAddr.sin_addr.s_addr = inet_addr(ExtAdrs);\r
                                                                SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin_port));\r
+                                                       }\r
                                                }\r
                                        }\r
                                        else\r
@@ -2838,6 +2842,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
        char Adrs[40];\r
        // UPnP対応\r
        int Port;\r
+       char ExtAdrs[40];\r
 \r
        // ソケットにデータを付与\r
        GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
@@ -2914,8 +2919,11 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                                                // UPnP対応\r
                                                if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
                                                {\r
-                                                       if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port)) == FFFTP_SUCCESS)\r
+                                                       if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port), ExtAdrs) == FFFTP_SUCCESS)\r
+                                                       {\r
+                                                               saTmpAddr.sin6_addr = inet6_addr(ExtAdrs);\r
                                                                SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin6_port));\r
+                                                       }\r
                                                }\r
                                        }\r
                                        else\r
index f1fa2ea..2aa7074 100644 (file)
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -3801,14 +3801,13 @@ static int RenameUnuseableName(char *Fname)
 // NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用\r
 void NoopProc(int Force)\r
 {\r
-       int CancelCheckWork;\r
-       CancelCheckWork = NO;\r
+//     CancelFlg = NO;\r
        if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO))\r
        {\r
                if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)\r
                {\r
                        DisableUserOpe();\r
-                       DoDirListCmdSkt("", "", 999, &CancelCheckWork);\r
+                       DoDirListCmdSkt("", "", 999, &CancelFlg);\r
                        EnableUserOpe();\r
                }\r
        }\r
diff --git a/main.c b/main.c
index e8b7190..0cd893a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -2056,6 +2056,17 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
                        break;\r
 \r
+               // UPnP対応\r
+               case WM_ADDPORTMAPPING :\r
+                       ((ADDPORTMAPPINGDATA*)lParam)->r = AddPortMapping(((ADDPORTMAPPINGDATA*)lParam)->Adrs, ((ADDPORTMAPPINGDATA*)lParam)->Port, ((ADDPORTMAPPINGDATA*)lParam)->ExtAdrs);\r
+                       SetEvent(((ADDPORTMAPPINGDATA*)lParam)->h);\r
+                       break;\r
+\r
+               case WM_REMOVEPORTMAPPING :\r
+                       ((REMOVEPORTMAPPINGDATA*)lParam)->r = RemovePortMapping(((REMOVEPORTMAPPINGDATA*)lParam)->Port);\r
+                       SetEvent(((REMOVEPORTMAPPINGDATA*)lParam)->h);\r
+                       break;\r
+\r
                case WM_PAINT :\r
                    BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
                    EndPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
index 80f3889..7d5c170 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -1389,7 +1389,7 @@ int IsUPnPLoaded()
        return Sts;\r
 }\r
 \r
-int AddPortMapping(char* Adrs, int Port)\r
+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs)\r
 {\r
        int Sts;\r
        WCHAR Tmp1[40];\r
@@ -1397,24 +1397,49 @@ int AddPortMapping(char* Adrs, int Port)
        BSTR Tmp3;\r
        BSTR Tmp4;\r
        IStaticPortMapping* pPortMap;\r
+       BSTR Tmp5;\r
+       ADDPORTMAPPINGDATA Data;\r
        Sts = FFFTP_FAIL;\r
-       MtoW(Tmp1, 40, Adrs, -1);\r
-       if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
+       if(IsMainThread())\r
        {\r
-               if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
+               MtoW(Tmp1, 40, Adrs, -1);\r
+               if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
                {\r
-                       if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
+                       if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
                        {\r
-                               if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+                               if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
                                {\r
-                                       Sts = FFFTP_SUCCESS;\r
-                                       pPortMap->lpVtbl->Release(pPortMap);\r
+                                       if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+                                       {\r
+                                               if(pPortMap->lpVtbl->get_ExternalIPAddress(pPortMap, &Tmp5) == S_OK)\r
+                                               {\r
+                                                       WtoM(ExtAdrs, 40, Tmp5, -1);\r
+                                                       Sts = FFFTP_SUCCESS;\r
+                                                       SysFreeString(Tmp5);\r
+                                               }\r
+                                               pPortMap->lpVtbl->Release(pPortMap);\r
+                                       }\r
+                                       SysFreeString(Tmp4);\r
                                }\r
-                               SysFreeString(Tmp4);\r
+                               SysFreeString(Tmp3);\r
+                       }\r
+                       SysFreeString(Tmp2);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))\r
+               {\r
+                       Data.Adrs = Adrs;\r
+                       Data.Port = Port;\r
+                       Data.ExtAdrs = ExtAdrs;\r
+                       if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))\r
+                       {\r
+                               if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)\r
+                                       Sts = Data.r;\r
                        }\r
-                       SysFreeString(Tmp3);\r
+                       CloseHandle(Data.h);\r
                }\r
-               SysFreeString(Tmp2);\r
        }\r
        return Sts;\r
 }\r
@@ -1423,12 +1448,29 @@ int RemovePortMapping(int Port)
 {\r
        int Sts;\r
        BSTR Tmp;\r
+       REMOVEPORTMAPPINGDATA Data;\r
        Sts = FFFTP_FAIL;\r
-       if((Tmp = SysAllocString(L"TCP")) != NULL)\r
+       if(IsMainThread())\r
        {\r
-               if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)\r
-                       Sts = FFFTP_SUCCESS;\r
-               SysFreeString(Tmp);\r
+               if((Tmp = SysAllocString(L"TCP")) != NULL)\r
+               {\r
+                       if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)\r
+                               Sts = FFFTP_SUCCESS;\r
+                       SysFreeString(Tmp);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))\r
+               {\r
+                       Data.Port = Port;\r
+                       if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))\r
+                       {\r
+                               if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)\r
+                                       Sts = Data.r;\r
+                       }\r
+                       CloseHandle(Data.h);\r
+               }\r
        }\r
        return Sts;\r
 }\r