• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

Revision8f80974f5d481a295349fbadb559754b213347f9 (tree)
Zeit2015-08-09 23:54:55
Autors_kawamoto <s_kawamoto@user...>
Commiters_kawamoto

Log Message

Fix bugs of UPnP port mapping control.

Ändern Zusammenfassung

Diff

Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
Binary files a/FFFTP_Eng_Release_64/FFFTP.exe and b/FFFTP_Eng_Release_64/FFFTP.exe differ
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
Binary files a/Release_64/FFFTP.exe and b/Release_64/FFFTP.exe differ
--- a/common.h
+++ b/common.h
@@ -81,7 +81,7 @@
8181 // ソフトウェア自動更新
8282 // リリースバージョンはリリース予定年(10進数4桁)+月(2桁)+日(2桁)+通し番号(0スタート2桁)とする
8383 // 2014年7月31日中の30個目のリリースは2014073129
84-#define RELEASE_VERSION_NUM 2015072001 /* リリースバージョン */
84+#define RELEASE_VERSION_NUM 2015080901 /* リリースバージョン */
8585
8686
8787 // SourceForge.JPによるフォーク
@@ -117,6 +117,10 @@
117117 #define WM_REFRESH_LOCAL_FLG (WM_USER+7)
118118 #define WM_REFRESH_REMOTE_FLG (WM_USER+8)
119119
120+// UPnP対応
121+#define WM_ADDPORTMAPPING (WM_USER+9)
122+#define WM_REMOVEPORTMAPPING (WM_USER+10)
123+
120124 /*===== ホスト番号 =====*/
121125 /* ホスト番号は 0~ の値を取る */
122126
@@ -1354,6 +1358,23 @@ typedef struct {
13541358 } INTCONVTBL;
13551359
13561360
1361+// UPnP対応
1362+typedef struct
1363+{
1364+ int r;
1365+ HANDLE h;
1366+ char* Adrs;
1367+ int Port;
1368+ char* ExtAdrs;
1369+} ADDPORTMAPPINGDATA;
1370+
1371+typedef struct
1372+{
1373+ int r;
1374+ HANDLE h;
1375+ int Port;
1376+} REMOVEPORTMAPPINGDATA;
1377+
13571378 /*=================================================
13581379 * プロトタイプ
13591380 *=================================================*/
@@ -2001,7 +2022,7 @@ void RemoveReceivedData(SOCKET s);
20012022 int LoadUPnP();
20022023 void FreeUPnP();
20032024 int IsUPnPLoaded();
2004-int AddPortMapping(char* Adrs, int Port);
2025+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs);
20052026 int RemovePortMapping(int Port);
20062027 int CheckClosedAndReconnect(void);
20072028 // 同時接続対応
--- a/connect.c
+++ b/connect.c
@@ -2643,6 +2643,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
26432643 // UPnP対応
26442644 char Adrs[16];
26452645 int Port;
2646+ char ExtAdrs[40];
26462647
26472648 // ソケットにデータを付与
26482649 GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);
@@ -2755,8 +2756,11 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
27552756 // UPnP対応
27562757 if(IsUPnPLoaded() == YES && UPnPEnabled == YES)
27572758 {
2758- if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port)) == FFFTP_SUCCESS)
2759+ if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port), ExtAdrs) == FFFTP_SUCCESS)
2760+ {
2761+ saTmpAddr.sin_addr.s_addr = inet_addr(ExtAdrs);
27592762 SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin_port));
2763+ }
27602764 }
27612765 }
27622766 else
@@ -2838,6 +2842,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
28382842 char Adrs[40];
28392843 // UPnP対応
28402844 int Port;
2845+ char ExtAdrs[40];
28412846
28422847 // ソケットにデータを付与
28432848 GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);
@@ -2914,8 +2919,11 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
29142919 // UPnP対応
29152920 if(IsUPnPLoaded() == YES && UPnPEnabled == YES)
29162921 {
2917- if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port)) == FFFTP_SUCCESS)
2922+ if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port), ExtAdrs) == FFFTP_SUCCESS)
2923+ {
2924+ saTmpAddr.sin6_addr = inet6_addr(ExtAdrs);
29182925 SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin6_port));
2926+ }
29192927 }
29202928 }
29212929 else
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -3801,14 +3801,13 @@ static int RenameUnuseableName(char *Fname)
38013801 // NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用
38023802 void NoopProc(int Force)
38033803 {
3804- int CancelCheckWork;
3805- CancelCheckWork = NO;
3804+// CancelFlg = NO;
38063805 if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO))
38073806 {
38083807 if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)
38093808 {
38103809 DisableUserOpe();
3811- DoDirListCmdSkt("", "", 999, &CancelCheckWork);
3810+ DoDirListCmdSkt("", "", 999, &CancelFlg);
38123811 EnableUserOpe();
38133812 }
38143813 }
--- a/main.c
+++ b/main.c
@@ -2056,6 +2056,17 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
20562056 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);
20572057 break;
20582058
2059+ // UPnP対応
2060+ case WM_ADDPORTMAPPING :
2061+ ((ADDPORTMAPPINGDATA*)lParam)->r = AddPortMapping(((ADDPORTMAPPINGDATA*)lParam)->Adrs, ((ADDPORTMAPPINGDATA*)lParam)->Port, ((ADDPORTMAPPINGDATA*)lParam)->ExtAdrs);
2062+ SetEvent(((ADDPORTMAPPINGDATA*)lParam)->h);
2063+ break;
2064+
2065+ case WM_REMOVEPORTMAPPING :
2066+ ((REMOVEPORTMAPPINGDATA*)lParam)->r = RemovePortMapping(((REMOVEPORTMAPPINGDATA*)lParam)->Port);
2067+ SetEvent(((REMOVEPORTMAPPINGDATA*)lParam)->h);
2068+ break;
2069+
20592070 case WM_PAINT :
20602071 BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);
20612072 EndPaint(hWnd, (LPPAINTSTRUCT) &ps);
--- a/socket.c
+++ b/socket.c
@@ -1389,7 +1389,7 @@ int IsUPnPLoaded()
13891389 return Sts;
13901390 }
13911391
1392-int AddPortMapping(char* Adrs, int Port)
1392+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs)
13931393 {
13941394 int Sts;
13951395 WCHAR Tmp1[40];
@@ -1397,24 +1397,49 @@ int AddPortMapping(char* Adrs, int Port)
13971397 BSTR Tmp3;
13981398 BSTR Tmp4;
13991399 IStaticPortMapping* pPortMap;
1400+ BSTR Tmp5;
1401+ ADDPORTMAPPINGDATA Data;
14001402 Sts = FFFTP_FAIL;
1401- MtoW(Tmp1, 40, Adrs, -1);
1402- if((Tmp2 = SysAllocString(Tmp1)) != NULL)
1403+ if(IsMainThread())
14031404 {
1404- if((Tmp3 = SysAllocString(L"TCP")) != NULL)
1405+ MtoW(Tmp1, 40, Adrs, -1);
1406+ if((Tmp2 = SysAllocString(Tmp1)) != NULL)
14051407 {
1406- if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)
1408+ if((Tmp3 = SysAllocString(L"TCP")) != NULL)
14071409 {
1408- if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)
1410+ if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)
14091411 {
1410- Sts = FFFTP_SUCCESS;
1411- pPortMap->lpVtbl->Release(pPortMap);
1412+ if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)
1413+ {
1414+ if(pPortMap->lpVtbl->get_ExternalIPAddress(pPortMap, &Tmp5) == S_OK)
1415+ {
1416+ WtoM(ExtAdrs, 40, Tmp5, -1);
1417+ Sts = FFFTP_SUCCESS;
1418+ SysFreeString(Tmp5);
1419+ }
1420+ pPortMap->lpVtbl->Release(pPortMap);
1421+ }
1422+ SysFreeString(Tmp4);
14121423 }
1413- SysFreeString(Tmp4);
1424+ SysFreeString(Tmp3);
1425+ }
1426+ SysFreeString(Tmp2);
1427+ }
1428+ }
1429+ else
1430+ {
1431+ if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))
1432+ {
1433+ Data.Adrs = Adrs;
1434+ Data.Port = Port;
1435+ Data.ExtAdrs = ExtAdrs;
1436+ if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))
1437+ {
1438+ if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)
1439+ Sts = Data.r;
14141440 }
1415- SysFreeString(Tmp3);
1441+ CloseHandle(Data.h);
14161442 }
1417- SysFreeString(Tmp2);
14181443 }
14191444 return Sts;
14201445 }
@@ -1423,12 +1448,29 @@ int RemovePortMapping(int Port)
14231448 {
14241449 int Sts;
14251450 BSTR Tmp;
1451+ REMOVEPORTMAPPINGDATA Data;
14261452 Sts = FFFTP_FAIL;
1427- if((Tmp = SysAllocString(L"TCP")) != NULL)
1453+ if(IsMainThread())
14281454 {
1429- if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)
1430- Sts = FFFTP_SUCCESS;
1431- SysFreeString(Tmp);
1455+ if((Tmp = SysAllocString(L"TCP")) != NULL)
1456+ {
1457+ if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)
1458+ Sts = FFFTP_SUCCESS;
1459+ SysFreeString(Tmp);
1460+ }
1461+ }
1462+ else
1463+ {
1464+ if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))
1465+ {
1466+ Data.Port = Port;
1467+ if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))
1468+ {
1469+ if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)
1470+ Sts = Data.r;
1471+ }
1472+ CloseHandle(Data.h);
1473+ }
14321474 }
14331475 return Sts;
14341476 }