FFFTPのソースコードです。
Revisão | 8f80974f5d481a295349fbadb559754b213347f9 (tree) |
---|---|
Hora | 2015-08-09 23:54:55 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of UPnP port mapping control.
@@ -81,7 +81,7 @@ | ||
81 | 81 | // ソフトウェア自動更新 |
82 | 82 | // リリースバージョンはリリース予定年(10進数4桁)+月(2桁)+日(2桁)+通し番号(0スタート2桁)とする |
83 | 83 | // 2014年7月31日中の30個目のリリースは2014073129 |
84 | -#define RELEASE_VERSION_NUM 2015072001 /* リリースバージョン */ | |
84 | +#define RELEASE_VERSION_NUM 2015080901 /* リリースバージョン */ | |
85 | 85 | |
86 | 86 | |
87 | 87 | // SourceForge.JPによるフォーク |
@@ -117,6 +117,10 @@ | ||
117 | 117 | #define WM_REFRESH_LOCAL_FLG (WM_USER+7) |
118 | 118 | #define WM_REFRESH_REMOTE_FLG (WM_USER+8) |
119 | 119 | |
120 | +// UPnP対応 | |
121 | +#define WM_ADDPORTMAPPING (WM_USER+9) | |
122 | +#define WM_REMOVEPORTMAPPING (WM_USER+10) | |
123 | + | |
120 | 124 | /*===== ホスト番号 =====*/ |
121 | 125 | /* ホスト番号は 0~ の値を取る */ |
122 | 126 |
@@ -1354,6 +1358,23 @@ typedef struct { | ||
1354 | 1358 | } INTCONVTBL; |
1355 | 1359 | |
1356 | 1360 | |
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 | + | |
1357 | 1378 | /*================================================= |
1358 | 1379 | * プロトタイプ |
1359 | 1380 | *=================================================*/ |
@@ -2001,7 +2022,7 @@ void RemoveReceivedData(SOCKET s); | ||
2001 | 2022 | int LoadUPnP(); |
2002 | 2023 | void FreeUPnP(); |
2003 | 2024 | int IsUPnPLoaded(); |
2004 | -int AddPortMapping(char* Adrs, int Port); | |
2025 | +int AddPortMapping(char* Adrs, int Port, char* ExtAdrs); | |
2005 | 2026 | int RemovePortMapping(int Port); |
2006 | 2027 | int CheckClosedAndReconnect(void); |
2007 | 2028 | // 同時接続対応 |
@@ -2643,6 +2643,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2643 | 2643 | // UPnP対応 |
2644 | 2644 | char Adrs[16]; |
2645 | 2645 | int Port; |
2646 | + char ExtAdrs[40]; | |
2646 | 2647 | |
2647 | 2648 | // ソケットにデータを付与 |
2648 | 2649 | GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr); |
@@ -2755,8 +2756,11 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2755 | 2756 | // UPnP対応 |
2756 | 2757 | if(IsUPnPLoaded() == YES && UPnPEnabled == YES) |
2757 | 2758 | { |
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); | |
2759 | 2762 | SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin_port)); |
2763 | + } | |
2760 | 2764 | } |
2761 | 2765 | } |
2762 | 2766 | else |
@@ -2838,6 +2842,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2838 | 2842 | char Adrs[40]; |
2839 | 2843 | // UPnP対応 |
2840 | 2844 | int Port; |
2845 | + char ExtAdrs[40]; | |
2841 | 2846 | |
2842 | 2847 | // ソケットにデータを付与 |
2843 | 2848 | GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr); |
@@ -2914,8 +2919,11 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2914 | 2919 | // UPnP対応 |
2915 | 2920 | if(IsUPnPLoaded() == YES && UPnPEnabled == YES) |
2916 | 2921 | { |
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); | |
2918 | 2925 | SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin6_port)); |
2926 | + } | |
2919 | 2927 | } |
2920 | 2928 | } |
2921 | 2929 | else |
@@ -3801,14 +3801,13 @@ static int RenameUnuseableName(char *Fname) | ||
3801 | 3801 | // NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用 |
3802 | 3802 | void NoopProc(int Force) |
3803 | 3803 | { |
3804 | - int CancelCheckWork; | |
3805 | - CancelCheckWork = NO; | |
3804 | +// CancelFlg = NO; | |
3806 | 3805 | if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO)) |
3807 | 3806 | { |
3808 | 3807 | if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO) |
3809 | 3808 | { |
3810 | 3809 | DisableUserOpe(); |
3811 | - DoDirListCmdSkt("", "", 999, &CancelCheckWork); | |
3810 | + DoDirListCmdSkt("", "", 999, &CancelFlg); | |
3812 | 3811 | EnableUserOpe(); |
3813 | 3812 | } |
3814 | 3813 | } |
@@ -2056,6 +2056,17 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA | ||
2056 | 2056 | PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0); |
2057 | 2057 | break; |
2058 | 2058 | |
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 | + | |
2059 | 2070 | case WM_PAINT : |
2060 | 2071 | BeginPaint(hWnd, (LPPAINTSTRUCT) &ps); |
2061 | 2072 | EndPaint(hWnd, (LPPAINTSTRUCT) &ps); |
@@ -1389,7 +1389,7 @@ int IsUPnPLoaded() | ||
1389 | 1389 | return Sts; |
1390 | 1390 | } |
1391 | 1391 | |
1392 | -int AddPortMapping(char* Adrs, int Port) | |
1392 | +int AddPortMapping(char* Adrs, int Port, char* ExtAdrs) | |
1393 | 1393 | { |
1394 | 1394 | int Sts; |
1395 | 1395 | WCHAR Tmp1[40]; |
@@ -1397,24 +1397,49 @@ int AddPortMapping(char* Adrs, int Port) | ||
1397 | 1397 | BSTR Tmp3; |
1398 | 1398 | BSTR Tmp4; |
1399 | 1399 | IStaticPortMapping* pPortMap; |
1400 | + BSTR Tmp5; | |
1401 | + ADDPORTMAPPINGDATA Data; | |
1400 | 1402 | Sts = FFFTP_FAIL; |
1401 | - MtoW(Tmp1, 40, Adrs, -1); | |
1402 | - if((Tmp2 = SysAllocString(Tmp1)) != NULL) | |
1403 | + if(IsMainThread()) | |
1403 | 1404 | { |
1404 | - if((Tmp3 = SysAllocString(L"TCP")) != NULL) | |
1405 | + MtoW(Tmp1, 40, Adrs, -1); | |
1406 | + if((Tmp2 = SysAllocString(Tmp1)) != NULL) | |
1405 | 1407 | { |
1406 | - if((Tmp4 = SysAllocString(L"FFFTP")) != NULL) | |
1408 | + if((Tmp3 = SysAllocString(L"TCP")) != NULL) | |
1407 | 1409 | { |
1408 | - if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK) | |
1410 | + if((Tmp4 = SysAllocString(L"FFFTP")) != NULL) | |
1409 | 1411 | { |
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); | |
1412 | 1423 | } |
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; | |
1414 | 1440 | } |
1415 | - SysFreeString(Tmp3); | |
1441 | + CloseHandle(Data.h); | |
1416 | 1442 | } |
1417 | - SysFreeString(Tmp2); | |
1418 | 1443 | } |
1419 | 1444 | return Sts; |
1420 | 1445 | } |
@@ -1423,12 +1448,29 @@ int RemovePortMapping(int Port) | ||
1423 | 1448 | { |
1424 | 1449 | int Sts; |
1425 | 1450 | BSTR Tmp; |
1451 | + REMOVEPORTMAPPINGDATA Data; | |
1426 | 1452 | Sts = FFFTP_FAIL; |
1427 | - if((Tmp = SysAllocString(L"TCP")) != NULL) | |
1453 | + if(IsMainThread()) | |
1428 | 1454 | { |
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 | + } | |
1432 | 1474 | } |
1433 | 1475 | return Sts; |
1434 | 1476 | } |