OSDN Git Service

Change strength of hash functions for updates.
[ffftp/ffftp.git] / socket.c
index 1da9215..80f3889 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -37,6 +37,8 @@
 #include <time.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
+// UPnP対応\r
+#include <natupnp.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
@@ -71,6 +73,7 @@ typedef struct {
        struct sockaddr_in SocksAddrIPv4;\r
        struct sockaddr_in6 HostAddrIPv6;\r
        struct sockaddr_in6 SocksAddrIPv6;\r
+       int MapPort;\r
 } ASYNCSIGNAL;\r
 \r
 \r
@@ -119,6 +122,9 @@ static ASYNCSIGNALDATABASE SignalDbase[MAX_SIGNAL_ENTRY_DBASE];
 // スレッド衝突のバグ修正\r
 static HANDLE hAsyncTblAccMutex;\r
 \r
+// UPnP対応\r
+IUPnPNAT* pUPnPNAT;\r
+IStaticPortMappingCollection* pUPnPMap;\r
 \r
 \r
 \r
@@ -499,6 +505,7 @@ static int RegisterAsyncTable(SOCKET s)
                                memset(&Signal[Pos].SocksAddrIPv4, 0, sizeof(struct sockaddr_in));\r
                                memset(&Signal[Pos].HostAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
                                memset(&Signal[Pos].SocksAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
+                               Signal[Pos].MapPort = 0;\r
                                Sts = YES;\r
                                break;\r
                        }\r
@@ -699,6 +706,27 @@ int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_i
        return(Sts);\r
 }\r
 \r
+int SetAsyncTableDataMapPort(SOCKET s, int Port)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       Signal[Pos].MapPort = Port;\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
 int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)\r
 {\r
        int Sts;\r
@@ -747,6 +775,27 @@ int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_i
        return(Sts);\r
 }\r
 \r
+int GetAsyncTableDataMapPort(SOCKET s, int* Port)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       *Port = Signal[Pos].MapPort;\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
 \r
 \r
 \r
@@ -1308,6 +1357,82 @@ void RemoveReceivedData(SOCKET s)
        }\r
 }\r
 \r
+// UPnP対応\r
+int LoadUPnP()\r
+{\r
+       int Sts;\r
+       Sts = FFFTP_FAIL;\r
+       if(CoCreateInstance(&CLSID_UPnPNAT, NULL, CLSCTX_ALL, &IID_IUPnPNAT, (void**)&pUPnPNAT) == S_OK)\r
+       {\r
+               if(pUPnPNAT->lpVtbl->get_StaticPortMappingCollection(pUPnPNAT, &pUPnPMap) == S_OK)\r
+                       Sts = FFFTP_SUCCESS;\r
+       }\r
+       return Sts;\r
+}\r
+\r
+void FreeUPnP()\r
+{\r
+       if(pUPnPMap != NULL)\r
+               pUPnPMap->lpVtbl->Release(pUPnPMap);\r
+       pUPnPMap = NULL;\r
+       if(pUPnPNAT != NULL)\r
+               pUPnPNAT->lpVtbl->Release(pUPnPNAT);\r
+       pUPnPNAT = NULL;\r
+}\r
+\r
+int IsUPnPLoaded()\r
+{\r
+       int Sts;\r
+       Sts = NO;\r
+       if(pUPnPNAT != NULL && pUPnPMap != NULL)\r
+               Sts = YES;\r
+       return Sts;\r
+}\r
+\r
+int AddPortMapping(char* Adrs, int Port)\r
+{\r
+       int Sts;\r
+       WCHAR Tmp1[40];\r
+       BSTR Tmp2;\r
+       BSTR Tmp3;\r
+       BSTR Tmp4;\r
+       IStaticPortMapping* pPortMap;\r
+       Sts = FFFTP_FAIL;\r
+       MtoW(Tmp1, 40, Adrs, -1);\r
+       if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
+       {\r
+               if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
+               {\r
+                       if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
+                       {\r
+                               if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+                               {\r
+                                       Sts = FFFTP_SUCCESS;\r
+                                       pPortMap->lpVtbl->Release(pPortMap);\r
+                               }\r
+                               SysFreeString(Tmp4);\r
+                       }\r
+                       SysFreeString(Tmp3);\r
+               }\r
+               SysFreeString(Tmp2);\r
+       }\r
+       return Sts;\r
+}\r
+\r
+int RemovePortMapping(int Port)\r
+{\r
+       int Sts;\r
+       BSTR Tmp;\r
+       Sts = FFFTP_FAIL;\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
+       return Sts;\r
+}\r
+\r
 \r
 /*----- \r
 *\r