diff options
Diffstat (limited to 'plugins/ProxySwitch/src/ip.cpp')
-rw-r--r-- | plugins/ProxySwitch/src/ip.cpp | 1338 |
1 files changed, 710 insertions, 628 deletions
diff --git a/plugins/ProxySwitch/src/ip.cpp b/plugins/ProxySwitch/src/ip.cpp index abd793e3eb..6874c2756f 100644 --- a/plugins/ProxySwitch/src/ip.cpp +++ b/plugins/ProxySwitch/src/ip.cpp @@ -17,29 +17,29 @@ the proxy settings of Miranda and Internet Explorer accordingly. NETWORK_INTERFACE_LIST NIF_List; CRITICAL_SECTION csNIF_List; char opt_hideIntf[MAX_IPLIST_LENGTH]; -void UpdateInterfacesMenu (void) { } +void UpdateInterfacesMenu(void) { } PLUGINLINK *pluginLink; int main(void) { - NETWORK_INTERFACE_LIST list; - char opt[200] = "2.252.83.0-2.252.85.0;10.100.0.0/16;2.252.83.32-38;;;32.64.128.0/255.255.255.0"; - IP_RANGE_LIST range; - InitializeCriticalSection(&csNIF_List); - lstrcpy(opt_hideIntf, "VMnet*"); - printf("Started\n"); - printf("IP Helper procs: %s\n", Load_ExIpHelper_Procedures() ? "Loaded" : "Not found"); - if ( Create_NIF_List( &list ) >=0 ) { - printf("%s\n", Print_NIF_List(list, NULL)); - - Create_Range_List( &range, opt, FALSE ); - printf("'%s' matches: %s\n", opt, Match_Range_List(range, list) ? "yes" : "no" ); - Free_Range_List( &range ); - - - Free_NIF_List( &list ); - } - DeleteCriticalSection(&csNIF_List); - printf("Finished\n"); - return 0; + NETWORK_INTERFACE_LIST list; + char opt[200] = "2.252.83.0-2.252.85.0;10.100.0.0/16;2.252.83.32-38;;;32.64.128.0/255.255.255.0"; + IP_RANGE_LIST range; + InitializeCriticalSection(&csNIF_List); + lstrcpy(opt_hideIntf, "VMnet*"); + printf("Started\n"); + printf("IP Helper procs: %s\n", Load_ExIpHelper_Procedures() ? "Loaded" : "Not found"); + if (Create_NIF_List(&list) >= 0) { + printf("%s\n", Print_NIF_List(list, NULL)); + + Create_Range_List(&range, opt, FALSE); + printf("'%s' matches: %s\n", opt, Match_Range_List(range, list) ? "yes" : "no"); + Free_Range_List(&range); + + + Free_NIF_List(&list); + } + DeleteCriticalSection(&csNIF_List); + printf("Finished\n"); + return 0; } #endif @@ -48,681 +48,763 @@ wchar_t tempstr[MAX_SECONDLINE]; /* ################################################################################ */ #ifndef IP_DEBUG -void IP_WatchDog (void *arg) { - OVERLAPPED overlap; - DWORD ret; - wchar_t msg[300]; - HANDLE event_list[2]; - HANDLE hand = WSACreateEvent(); - overlap.hEvent = WSACreateEvent(); - - for (;;) { - - ret = NotifyAddrChange(&hand, &overlap); - if (ret != NO_ERROR && WSAGetLastError() != WSA_IO_PENDING) { - wchar_t err[100]; - mir_snwprintf(err, L"NotifyAddrChange Error: %d/nRestart Miranda IM to restore IP monitor.", WSAGetLastError()); - ERRORMSG(err); - break; - } - - event_list[0] = overlap.hEvent; - event_list[1] = hEventRebound; - - ret = MsgWaitForMultipleObjectsEx( 2, event_list, INFINITE, 0, MWMO_ALERTABLE ); - if (ret == WAIT_IO_COMPLETION && Miranda_IsTerminated()) break; - if (ret == WAIT_OBJECT_0 || ret == WAIT_TIMEOUT || ret == (WAIT_OBJECT_0+1) ) { - NETWORK_INTERFACE_LIST list; - - if ( Create_NIF_List_Ex( &list ) >=0 ) { - int change = INCUPD_INTACT; - - EnterCriticalSection(&csNIF_List); - change = IncUpdate_NIF_List(&NIF_List, list); - if ( change != INCUPD_INTACT && change != INCUPD_CONN_BIND ) { - char proxy = -1; - int change_Miranda = 0; - int reset_Miranda = 0; - int change_IE = 0; - int change_Firefox = 0; - IP_RANGE_LIST range; - - if ( proxy == -1 ) { - Create_Range_List( &range, opt_useProxy, TRUE ); - if ( Match_Range_List( range, NIF_List ) ) proxy = 1; - Free_Range_List( &range ); - } - if ( proxy == -1 ) { - Create_Range_List( &range, opt_noProxy, FALSE ); - if ( Match_Range_List( range, NIF_List ) ) proxy = 0; - Free_Range_List( &range ); - } - if ( proxy == -1 ) { - Create_Range_List( &range, opt_useProxy, FALSE ); - if ( Match_Range_List( range, NIF_List ) ) proxy = 1; - Free_Range_List( &range ); - } - - if ( proxy != -1 && proxy != Get_Miranda_Proxy_Status() ) change_Miranda = reset_Miranda = opt_miranda; - if ( proxy != -1 && proxy != Get_IE_Proxy_Status() ) change_IE = opt_ie; - if ( proxy != -1 && proxy != Get_Firefox_Proxy_Status() ) change_Firefox = opt_firefox; - if ( opt_alwayReconnect ) reset_Miranda = 1; - - mir_wstrcpy(msg, L""); - if ( opt_showProxyState && change_Miranda ) { - mir_wstrcat(msg, TranslateT("\nMiranda ")); - mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); - } - if ( opt_showProxyState && change_IE ) { - mir_wstrcat(msg, TranslateT("\nExplorer ")); - mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); - } - if ( opt_showProxyState && change_Firefox ) { - mir_wstrcat(msg, TranslateT("\nFirefox ")); - mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); - } - UpdateInterfacesMenu(); - PopupMyIPAddrs(mir_wstrlen(msg) ? msg : NULL); - - if ( change_IE ) Set_IE_Proxy_Status( proxy ); - if ( change_Firefox ) Set_Firefox_Proxy_Status( proxy ); - if ( reset_Miranda ) { - PROTO_SETTINGS protocols; - Disconnect_All_Protocols( &protocols, change_Miranda ); - Sleep( 1000 ); - if ( change_Miranda ) Set_Miranda_Proxy_Status( proxy ); - Connect_All_Protocols( &protocols ); - } - } - LeaveCriticalSection(&csNIF_List); - - Free_NIF_List( &list ); - } - } - - ResetEvent(hEventRebound); - WSAResetEvent(hand); - WSAResetEvent(overlap.hEvent); - } - - WSACloseEvent(hand); - WSACloseEvent(overlap.hEvent); +void IP_WatchDog(void *arg) +{ + OVERLAPPED overlap; + DWORD ret; + wchar_t msg[300]; + HANDLE event_list[2]; + HANDLE hand = WSACreateEvent(); + overlap.hEvent = WSACreateEvent(); + + for (;;) { + + ret = NotifyAddrChange(&hand, &overlap); + if (ret != NO_ERROR && WSAGetLastError() != WSA_IO_PENDING) { + wchar_t err[100]; + mir_snwprintf(err, L"NotifyAddrChange Error: %d/nRestart Miranda IM to restore IP monitor.", WSAGetLastError()); + ERRORMSG(err); + break; + } + + event_list[0] = overlap.hEvent; + event_list[1] = hEventRebound; + + ret = MsgWaitForMultipleObjectsEx(2, event_list, INFINITE, 0, MWMO_ALERTABLE); + if (ret == WAIT_IO_COMPLETION && Miranda_IsTerminated()) + break; + if (ret == WAIT_OBJECT_0 || ret == WAIT_TIMEOUT || ret == (WAIT_OBJECT_0 + 1)) { + NETWORK_INTERFACE_LIST list; + + if (Create_NIF_List_Ex(&list) >= 0) { + int change = INCUPD_INTACT; + + EnterCriticalSection(&csNIF_List); + change = IncUpdate_NIF_List(&NIF_List, list); + if (change != INCUPD_INTACT && change != INCUPD_CONN_BIND) { + char proxy = -1; + int change_Miranda = 0; + int reset_Miranda = 0; + int change_IE = 0; + int change_Firefox = 0; + IP_RANGE_LIST range; + + if (proxy == -1) { + Create_Range_List(&range, opt_useProxy, TRUE); + if (Match_Range_List(range, NIF_List)) + proxy = 1; + Free_Range_List(&range); + } + if (proxy == -1) { + Create_Range_List(&range, opt_noProxy, FALSE); + if (Match_Range_List(range, NIF_List)) + proxy = 0; + Free_Range_List(&range); + } + if (proxy == -1) { + Create_Range_List(&range, opt_useProxy, FALSE); + if (Match_Range_List(range, NIF_List)) + proxy = 1; + Free_Range_List(&range); + } + + if (proxy != -1 && proxy != Get_Miranda_Proxy_Status()) + change_Miranda = reset_Miranda = opt_miranda; + if (proxy != -1 && proxy != Get_IE_Proxy_Status()) + change_IE = opt_ie; + if (proxy != -1 && proxy != Get_Firefox_Proxy_Status()) + change_Firefox = opt_firefox; + if (opt_alwayReconnect) + reset_Miranda = 1; + + mir_wstrcpy(msg, L""); + if (opt_showProxyState && change_Miranda) { + mir_wstrcat(msg, TranslateT("\nMiranda ")); + mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); + } + if (opt_showProxyState && change_IE) { + mir_wstrcat(msg, TranslateT("\nExplorer ")); + mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); + } + if (opt_showProxyState && change_Firefox) { + mir_wstrcat(msg, TranslateT("\nFirefox ")); + mir_wstrcat(msg, proxy ? TranslateT("Proxy") : TranslateT("Direct")); + } + UpdateInterfacesMenu(); + PopupMyIPAddrs(mir_wstrlen(msg) ? msg : NULL); + + if (change_IE) + Set_IE_Proxy_Status(proxy); + if (change_Firefox) + Set_Firefox_Proxy_Status(proxy); + if (reset_Miranda) { + PROTO_SETTINGS protocols; + Disconnect_All_Protocols(&protocols, change_Miranda); + Sleep(1000); + if (change_Miranda) + Set_Miranda_Proxy_Status(proxy); + Connect_All_Protocols(&protocols); + } + } + LeaveCriticalSection(&csNIF_List); + + Free_NIF_List(&list); + } + } + + ResetEvent(hEventRebound); + WSAResetEvent(hand); + WSAResetEvent(overlap.hEvent); + } + + WSACloseEvent(hand); + WSACloseEvent(overlap.hEvent); } #endif /* ################################################################################ */ -int Create_NIF_List_Ex (NETWORK_INTERFACE_LIST *list) { - UINT delay = 1; - int out; +int Create_NIF_List_Ex(NETWORK_INTERFACE_LIST *list) +{ + UINT delay = 1; + int out; - while ( (out = Create_NIF_List(list)) == -2 && delay < 10 ) { - Sleep(delay*50); - delay++; - } - if (out == -2) ERRORMSG(TranslateT("Cannot retrieve IP or Adapter data.")); - return out < 0 ? -1 : out; + while ((out = Create_NIF_List(list)) == -2 && delay < 10) { + Sleep(delay * 50); + delay++; + } + if (out == -2) + ERRORMSG(TranslateT("Cannot retrieve IP or Adapter data.")); + return out < 0 ? -1 : out; } -PNETWORK_INTERFACE Find_NIF_IP(NETWORK_INTERFACE_LIST list, const LONG IP) { +PNETWORK_INTERFACE Find_NIF_IP(NETWORK_INTERFACE_LIST list, const LONG IP) +{ UCHAR idx = 0; UCHAR i; while (idx < list.count) { for (i = 0; i < list.item[idx].IPcount; i++) { - if (list.item[idx].IP[i] == IP) return &(list.item[idx]); + if (list.item[idx].IP[i] == IP) + return &(list.item[idx]); } idx++; } return NULL; } -int Create_NIF_List (NETWORK_INTERFACE_LIST *list) { - - PIP_ADAPTER_INFO pAdapterInfo, pAdapt; - PIP_ADDR_STRING pAddrStr; - PIP_ADAPTER_ADDRESSES pAddresses, pAddr; - PNETWORK_INTERFACE nif; - ULONG outBufLen; - wchar_t *tmp_opt, *intf, *rest, *name; - BOOL skip; - DWORD out; - UCHAR idx; - - // prepare and load IP_ADAPTER_ADDRESSES - outBufLen = 0; - if (GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &outBufLen) == ERROR_BUFFER_OVERFLOW) { - pAddresses = (PIP_ADAPTER_ADDRESSES) malloc(outBufLen); - if (pAddresses == NULL) { - ERRORMSG(TranslateT("Cannot allocate memory for pAddresses")); - return -1; - } - if ((out = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen)) != ERROR_SUCCESS) { - free(pAddresses); - return -2; - } - } else { - ERRORMSG(TranslateT("GetAdaptersAddresses sizing failed")); - return -1; - } - - // prepare and load IP_ADAPTER_INFO - outBufLen = 0; - if (GetAdaptersInfo(NULL, &outBufLen) == ERROR_BUFFER_OVERFLOW) { - pAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen); - if (pAdapterInfo == NULL) { - ERRORMSG(TranslateT("Cannot allocate memory for pAdapterInfo")); - free(pAddresses); - return -1; - } - if (GetAdaptersInfo(pAdapterInfo, &outBufLen) != NO_ERROR) { - free(pAdapterInfo); - free(pAddresses); - return -2; - } - } else { - ERRORMSG(TranslateT("GetAdaptersInfo sizing failed")); - free(pAddresses); - return -1; - } - - ZeroMemory(list, sizeof(NETWORK_INTERFACE_LIST)); - - pAdapt = pAdapterInfo; - while (pAdapt) { - - // add a new interface into the list - list->count++; - list->item = (PNETWORK_INTERFACE)mir_realloc( list->item, list->count * sizeof(NETWORK_INTERFACE) ); - nif = &(list->item[list->count - 1]); - ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); - - // copy AdapterName - nif->AdapterName = (char*)mir_alloc(mir_strlen(pAdapt->AdapterName)+4); - nif->AdapterName = mir_strdup(pAdapt->AdapterName); - - // find its FriendlyName and copy it - pAddr = pAddresses; - while(pAddr && mir_strcmp(pAddr->AdapterName, pAdapt->AdapterName)) { - pAddr = pAddr->Next; - } - if ( pAddr ) { - nif->FriendlyName = (wchar_t*)mir_alloc(wcslen(pAddr->FriendlyName)+4); - nif->FriendlyName = mir_wstrdup(pAddr->FriendlyName); - } - - skip = FALSE; - tmp_opt = intf = rest = mir_wstrdup( opt_hideIntf ); - while ( rest && rest[0] && ! skip ) { - rest = wcschr( rest, ';' ); - if ( rest != NULL ) { - rest[0] = 0; - rest++; - } - if ( intf[0] ) { - if ( intf[mir_wstrlen(intf)-1] == '*' && mir_wstrlen(intf)-1 <= mir_wstrlen(nif->FriendlyName) ) { - intf[mir_wstrlen(intf)-1] = 0; - name = nif->FriendlyName; - skip = TRUE; - while ( intf[0] ) { - if ( intf[0] != name[0] ) { - skip = FALSE; - break; - } - intf++; - name++; - } - } - if ( mir_wstrcmp(nif->FriendlyName, intf) == 0 ) { - skip = TRUE; - } - } - intf = rest; - } - free(tmp_opt); - - if ( skip ) { - list->count--; - list->item = (PNETWORK_INTERFACE)mir_realloc( list->item, list->count * sizeof(NETWORK_INTERFACE) ); - pAdapt = pAdapt->Next; - continue; - } - - // get required size for IPstr and IP - outBufLen = 0; - pAddrStr = &(pAdapt->IpAddressList); - while(pAddrStr) { - if ( strcmp("0.0.0.0", pAddrStr->IpAddress.String) ) { - nif->IPcount++; // count IP addresses - outBufLen += strlen(pAddrStr->IpAddress.String); // count length of IPstr - } - pAddrStr = pAddrStr->Next; - if (pAddrStr) outBufLen += 2; // count length of IPstr (add ", ") - } - - // create IPstr and IP - if ( nif->IPcount ) { - nif->IPstr = (char*)mir_alloc( outBufLen+4 ); - strcpy(nif->IPstr, ""); - nif->IP = (LONG*)mir_alloc( (nif->IPcount+1) * sizeof(LONG) ); - outBufLen = 0; - pAddrStr = &(pAdapt->IpAddressList); - while(pAddrStr) { - if ( strcmp("0.0.0.0", pAddrStr->IpAddress.String) ) { - strcat( nif->IPstr, pAddrStr->IpAddress.String ); - nif->IP[outBufLen] = inet_addr( pAddrStr->IpAddress.String ); - outBufLen++; - } - pAddrStr = pAddrStr->Next; - if (pAddrStr) strcat( nif->IPstr, ", "); - } - nif->IP[outBufLen] = 0L; - } - pAdapt = pAdapt->Next; - } - - free(pAdapterInfo); - free(pAddresses); - - EnterCriticalSection(&csConnection_List); - for ( idx=0 ; idx < Connection_List.count ; idx++ ) { - nif = Find_NIF_IP( *list, Connection_List.item[idx].IP ); - if ( nif ) { - nif->Bound = 1; - } - } - LeaveCriticalSection(&csConnection_List); - - return 0; +int Create_NIF_List(NETWORK_INTERFACE_LIST *list) +{ + PIP_ADAPTER_INFO pAdapterInfo, pAdapt; + PIP_ADDR_STRING pAddrStr; + PIP_ADAPTER_ADDRESSES pAddresses, pAddr; + PNETWORK_INTERFACE nif; + ULONG outBufLen; + wchar_t *tmp_opt, *intf, *rest, *name; + BOOL skip; + DWORD out; + UCHAR idx; + + // prepare and load IP_ADAPTER_ADDRESSES + outBufLen = 0; + if (GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &outBufLen) == ERROR_BUFFER_OVERFLOW) { + pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen); + if (pAddresses == NULL) { + ERRORMSG(TranslateT("Cannot allocate memory for pAddresses")); + return -1; + } + if ((out = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen)) != ERROR_SUCCESS) { + free(pAddresses); + return -2; + } + } + else { + ERRORMSG(TranslateT("GetAdaptersAddresses sizing failed")); + return -1; + } + + // prepare and load IP_ADAPTER_INFO + outBufLen = 0; + if (GetAdaptersInfo(NULL, &outBufLen) == ERROR_BUFFER_OVERFLOW) { + pAdapterInfo = (PIP_ADAPTER_INFO)malloc(outBufLen); + if (pAdapterInfo == NULL) { + ERRORMSG(TranslateT("Cannot allocate memory for pAdapterInfo")); + free(pAddresses); + return -1; + } + if (GetAdaptersInfo(pAdapterInfo, &outBufLen) != NO_ERROR) { + free(pAdapterInfo); + free(pAddresses); + return -2; + } + } + else { + ERRORMSG(TranslateT("GetAdaptersInfo sizing failed")); + free(pAddresses); + return -1; + } + + ZeroMemory(list, sizeof(NETWORK_INTERFACE_LIST)); + + pAdapt = pAdapterInfo; + while (pAdapt) { + + // add a new interface into the list + list->count++; + list->item = (PNETWORK_INTERFACE)mir_realloc(list->item, list->count * sizeof(NETWORK_INTERFACE)); + nif = &(list->item[list->count - 1]); + ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); + + // copy AdapterName + nif->AdapterName = (char*)mir_alloc(mir_strlen(pAdapt->AdapterName) + 4); + nif->AdapterName = mir_strdup(pAdapt->AdapterName); + + // find its FriendlyName and copy it + pAddr = pAddresses; + while (pAddr && mir_strcmp(pAddr->AdapterName, pAdapt->AdapterName)) { + pAddr = pAddr->Next; + } + if (pAddr) { + nif->FriendlyName = (wchar_t*)mir_alloc(wcslen(pAddr->FriendlyName) + 4); + nif->FriendlyName = mir_wstrdup(pAddr->FriendlyName); + } + + skip = FALSE; + tmp_opt = intf = rest = mir_wstrdup(opt_hideIntf); + while (rest && rest[0] && !skip) { + rest = wcschr(rest, ';'); + if (rest != NULL) { + rest[0] = 0; + rest++; + } + if (intf[0]) { + if (intf[mir_wstrlen(intf) - 1] == '*' && mir_wstrlen(intf) - 1 <= mir_wstrlen(nif->FriendlyName)) { + intf[mir_wstrlen(intf) - 1] = 0; + name = nif->FriendlyName; + skip = TRUE; + while (intf[0]) { + if (intf[0] != name[0]) { + skip = FALSE; + break; + } + intf++; + name++; + } + } + if (mir_wstrcmp(nif->FriendlyName, intf) == 0) { + skip = TRUE; + } + } + intf = rest; + } + free(tmp_opt); + + if (skip) { + list->count--; + list->item = (PNETWORK_INTERFACE)mir_realloc(list->item, list->count * sizeof(NETWORK_INTERFACE)); + pAdapt = pAdapt->Next; + continue; + } + + // get required size for IPstr and IP + outBufLen = 0; + pAddrStr = &(pAdapt->IpAddressList); + while (pAddrStr) { + if (strcmp("0.0.0.0", pAddrStr->IpAddress.String)) { + nif->IPcount++; // count IP addresses + outBufLen += strlen(pAddrStr->IpAddress.String); // count length of IPstr + } + pAddrStr = pAddrStr->Next; + if (pAddrStr) outBufLen += 2; // count length of IPstr (add ", ") + } + + // create IPstr and IP + if (nif->IPcount) { + nif->IPstr = (char*)mir_alloc(outBufLen + 4); + strcpy(nif->IPstr, ""); + nif->IP = (LONG*)mir_alloc((nif->IPcount + 1) * sizeof(LONG)); + outBufLen = 0; + pAddrStr = &(pAdapt->IpAddressList); + while (pAddrStr) { + if (strcmp("0.0.0.0", pAddrStr->IpAddress.String)) { + strcat(nif->IPstr, pAddrStr->IpAddress.String); + nif->IP[outBufLen] = inet_addr(pAddrStr->IpAddress.String); + outBufLen++; + } + pAddrStr = pAddrStr->Next; + if (pAddrStr) + strcat(nif->IPstr, ", "); + } + nif->IP[outBufLen] = 0L; + } + pAdapt = pAdapt->Next; + } + + free(pAdapterInfo); + free(pAddresses); + + EnterCriticalSection(&csConnection_List); + for (idx = 0; idx < Connection_List.count; idx++) { + nif = Find_NIF_IP(*list, Connection_List.item[idx].IP); + if (nif) { + nif->Bound = 1; + } + } + LeaveCriticalSection(&csConnection_List); + + return 0; } /* ################################################################################ */ -PNETWORK_INTERFACE Find_NIF_AdapterName ( NETWORK_INTERFACE_LIST list, const char *AdapterName) { - UCHAR idx = 0; +PNETWORK_INTERFACE Find_NIF_AdapterName(NETWORK_INTERFACE_LIST list, const char *AdapterName) +{ + UCHAR idx = 0; - while ( idx < list.count ) { - if ( strcmp(list.item[idx].AdapterName, AdapterName) == 0 ) return &(list.item[idx]); - idx++; - } - return NULL; + while (idx < list.count) { + if (strcmp(list.item[idx].AdapterName, AdapterName) == 0) + return &(list.item[idx]); + idx++; + } + return NULL; } -PNETWORK_INTERFACE Find_NIF_MenuItem ( NETWORK_INTERFACE_LIST list, const HGENMENU MenuItem) { - UCHAR idx = 0; +PNETWORK_INTERFACE Find_NIF_MenuItem(NETWORK_INTERFACE_LIST list, const HGENMENU MenuItem) +{ + UCHAR idx = 0; - while ( idx < list.count ) { - if ( list.item[idx].MenuItem == MenuItem ) return &(list.item[idx]); - idx++; - } - return NULL; + while (idx < list.count) { + if (list.item[idx].MenuItem == MenuItem) + return &(list.item[idx]); + idx++; + } + return NULL; } /* ################################################################################ */ -BOOL Compare_NIF_Lists (NETWORK_INTERFACE_LIST list1, NETWORK_INTERFACE_LIST list2) { - UCHAR idx = 0; - - if ( list1.count != list2.count ) return 1; - while ( idx < list1.count ) { - if ( mir_strcmp(list1.item[idx].AdapterName, list2.item[idx].AdapterName) ) return 1; - if ( mir_strcmp(list1.item[idx].IPstr, list2.item[idx].IPstr) ) return 1; - if ( mir_wstrcmp(list1.item[idx].FriendlyName, list2.item[idx].FriendlyName) ) return 1; - idx++; - } - return 0; +BOOL Compare_NIF_Lists(NETWORK_INTERFACE_LIST list1, NETWORK_INTERFACE_LIST list2) +{ + UCHAR idx = 0; + + if (list1.count != list2.count) + return 1; + + while (idx < list1.count) { + if (mir_strcmp(list1.item[idx].AdapterName, list2.item[idx].AdapterName)) + return 1; + if (mir_strcmp(list1.item[idx].IPstr, list2.item[idx].IPstr)) + return 1; + if (mir_wstrcmp(list1.item[idx].FriendlyName, list2.item[idx].FriendlyName)) + return 1; + idx++; + } + return 0; } /* ################################################################################ */ -int IncUpdate_NIF_List (NETWORK_INTERFACE_LIST *trg, NETWORK_INTERFACE_LIST src) { - UCHAR idx; - PNETWORK_INTERFACE nif; - int change = INCUPD_INTACT; - - for (idx = 0 ; idx < src.count ; idx++) { - nif = Find_NIF_AdapterName( *trg, src.item[idx].AdapterName ); - if ( nif ) { - if ( nif->Disabled ) nif->Disabled = 0; - if ( strcmp(NVL(nif->IPstr), NVL(src.item[idx].IPstr)) ) { - if (nif->IPstr) free(nif->IPstr); - nif->IPstr = src.item[idx].IPstr ? mir_strdup( src.item[idx].IPstr ) : NULL; - INCUPD(change, INCUPD_UPDATED); - } - if ( mir_wstrcmp(NVLW(nif->FriendlyName), NVLW(src.item[idx].FriendlyName)) ) { - if (nif->FriendlyName) free(nif->FriendlyName); - nif->FriendlyName = src.item[idx].FriendlyName ? mir_wstrdup( src.item[idx].FriendlyName ) : NULL; - INCUPD(change, INCUPD_UPDATED); - } - if ( nif->IPcount != src.item[idx].IPcount ) { - if ( nif->IPcount > src.item[idx].IPcount && nif->Bound ) { - INCUPD(change, INCUPD_CONN_LOST ); - UnboundConnections( nif->IP, src.item[idx].IP ); - } - nif->IPcount = src.item[idx].IPcount; - if (nif->IP) free(nif->IP); - if (src.item[idx].IP) { - nif->IP = (LONG*)mir_alloc( (nif->IPcount+1) * sizeof(LONG) ); - memcpy( nif->IP, src.item[idx].IP, (nif->IPcount+1) * sizeof(LONG) ); - } else { - nif->IP = NULL; - } - INCUPD(change, INCUPD_UPDATED); - } else { - if ( nif->IPcount > 0 && memcmp( nif->IP, src.item[idx].IP, nif->IPcount * sizeof(LONG) ) ) { - free(nif->IP); - nif->IP = (LONG*)mir_alloc( (nif->IPcount+1) * sizeof(LONG) ); - memcpy( nif->IP, src.item[idx].IP, (nif->IPcount+1) * sizeof(LONG) ); - INCUPD(change, INCUPD_UPDATED); - } - } - if ( nif->Bound != src.item[idx].Bound ) { - nif->Bound = src.item[idx].Bound; - INCUPD(change, INCUPD_CONN_BIND); - } - } else { - trg->count++; - trg->item = (PNETWORK_INTERFACE)mir_realloc( trg->item, trg->count * sizeof(NETWORK_INTERFACE) ); - nif = &(trg->item[trg->count - 1]); - ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); - nif->AdapterName = src.item[idx].AdapterName ? mir_strdup( src.item[idx].AdapterName ) : NULL; - nif->FriendlyName = src.item[idx].FriendlyName ? mir_wstrdup( src.item[idx].FriendlyName ) : NULL; - nif->IPstr = src.item[idx].IPstr ? strdup( src.item[idx].IPstr ) : NULL; - nif->IPcount = src.item[idx].IPcount; - nif->Bound = src.item[idx].Bound; - if ( nif->IPcount > 0 ) { - nif->IP = (LONG*)mir_alloc( (nif->IPcount+1) * sizeof(LONG) ); - memcpy( nif->IP, src.item[idx].IP, (nif->IPcount+1) * sizeof(LONG) ); - } - INCUPD(change, INCUPD_UPDATED); - } - } - for (idx = 0 ; idx < trg->count ; idx++) { - if ( trg->item[idx].Disabled ) continue; - nif = Find_NIF_AdapterName( src, trg->item[idx].AdapterName ); - if ( ! nif ) { - if ( trg->item[idx].Bound ) { - INCUPD(change, INCUPD_CONN_LOST ); - UnboundConnections( trg->item[idx].IP, NULL ); - } else { - INCUPD(change, INCUPD_UPDATED ); - } - if (trg->item[idx].IPstr) free(trg->item[idx].IPstr); - if (trg->item[idx].IP) free(trg->item[idx].IP); - trg->item[idx].IPstr = NULL; - trg->item[idx].IPcount = 0; - trg->item[idx].IP = NULL; - trg->item[idx].Bound = FALSE; - trg->item[idx].Disabled = 1; - } - } - return change; +int IncUpdate_NIF_List(NETWORK_INTERFACE_LIST *trg, NETWORK_INTERFACE_LIST src) +{ + UCHAR idx; + PNETWORK_INTERFACE nif; + int change = INCUPD_INTACT; + + for (idx = 0; idx < src.count; idx++) { + nif = Find_NIF_AdapterName(*trg, src.item[idx].AdapterName); + if (nif) { + if (nif->Disabled) + nif->Disabled = 0; + if (strcmp(NVL(nif->IPstr), NVL(src.item[idx].IPstr))) { + if (nif->IPstr) + free(nif->IPstr); + nif->IPstr = src.item[idx].IPstr ? mir_strdup(src.item[idx].IPstr) : NULL; + INCUPD(change, INCUPD_UPDATED); + } + if (mir_wstrcmp(NVLW(nif->FriendlyName), NVLW(src.item[idx].FriendlyName))) { + if (nif->FriendlyName) + free(nif->FriendlyName); + nif->FriendlyName = src.item[idx].FriendlyName ? mir_wstrdup(src.item[idx].FriendlyName) : NULL; + INCUPD(change, INCUPD_UPDATED); + } + if (nif->IPcount != src.item[idx].IPcount) { + if (nif->IPcount > src.item[idx].IPcount && nif->Bound) { + INCUPD(change, INCUPD_CONN_LOST); + UnboundConnections(nif->IP, src.item[idx].IP); + } + nif->IPcount = src.item[idx].IPcount; + if (nif->IP) + free(nif->IP); + if (src.item[idx].IP) { + nif->IP = (LONG*)mir_alloc((nif->IPcount + 1) * sizeof(LONG)); + memcpy(nif->IP, src.item[idx].IP, (nif->IPcount + 1) * sizeof(LONG)); + } + else { + nif->IP = NULL; + } + INCUPD(change, INCUPD_UPDATED); + } + else { + if (nif->IPcount > 0 && memcmp(nif->IP, src.item[idx].IP, nif->IPcount * sizeof(LONG))) { + free(nif->IP); + nif->IP = (LONG*)mir_alloc((nif->IPcount + 1) * sizeof(LONG)); + memcpy(nif->IP, src.item[idx].IP, (nif->IPcount + 1) * sizeof(LONG)); + INCUPD(change, INCUPD_UPDATED); + } + } + if (nif->Bound != src.item[idx].Bound) { + nif->Bound = src.item[idx].Bound; + INCUPD(change, INCUPD_CONN_BIND); + } + } + else { + trg->count++; + trg->item = (PNETWORK_INTERFACE)mir_realloc(trg->item, trg->count * sizeof(NETWORK_INTERFACE)); + nif = &(trg->item[trg->count - 1]); + ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); + nif->AdapterName = src.item[idx].AdapterName ? mir_strdup(src.item[idx].AdapterName) : NULL; + nif->FriendlyName = src.item[idx].FriendlyName ? mir_wstrdup(src.item[idx].FriendlyName) : NULL; + nif->IPstr = src.item[idx].IPstr ? strdup(src.item[idx].IPstr) : NULL; + nif->IPcount = src.item[idx].IPcount; + nif->Bound = src.item[idx].Bound; + if (nif->IPcount > 0) { + nif->IP = (LONG*)mir_alloc((nif->IPcount + 1) * sizeof(LONG)); + memcpy(nif->IP, src.item[idx].IP, (nif->IPcount + 1) * sizeof(LONG)); + } + INCUPD(change, INCUPD_UPDATED); + } + } + for (idx = 0; idx < trg->count; idx++) { + if (trg->item[idx].Disabled) + continue; + nif = Find_NIF_AdapterName(src, trg->item[idx].AdapterName); + if (!nif) { + if (trg->item[idx].Bound) { + INCUPD(change, INCUPD_CONN_LOST); + UnboundConnections(trg->item[idx].IP, NULL); + } + else { + INCUPD(change, INCUPD_UPDATED); + } + if (trg->item[idx].IPstr) + free(trg->item[idx].IPstr); + if (trg->item[idx].IP) + free(trg->item[idx].IP); + trg->item[idx].IPstr = NULL; + trg->item[idx].IPcount = 0; + trg->item[idx].IP = NULL; + trg->item[idx].Bound = FALSE; + trg->item[idx].Disabled = 1; + } + } + return change; } /* ################################################################################ */ -wchar_t *Print_NIF (PNETWORK_INTERFACE nif) { - ZeroMemory( tempstr, sizeof(tempstr) ); - mir_snwprintf( tempstr, L"%s:\t%s", nif->FriendlyName, nif->IPstr ? _A2T(nif->IPstr) : TranslateT("disconnected")); - return tempstr; +wchar_t *Print_NIF(PNETWORK_INTERFACE nif) +{ + ZeroMemory(tempstr, sizeof(tempstr)); + mir_snwprintf(tempstr, L"%s:\t%s", nif->FriendlyName, nif->IPstr ? _A2T(nif->IPstr) : TranslateT("disconnected")); + return tempstr; } -wchar_t *Print_NIF_List (NETWORK_INTERFACE_LIST list, wchar_t *msg) { - UCHAR idx; - int pos = 0; - - ZeroMemory( tempstr, sizeof(tempstr) ); - for( idx = 0 ; idx < list.count ; idx++ ) { - pos += mir_snwprintf( tempstr+pos, _countof(tempstr), L"%s:\t%s%s%s\n", - list.item[idx].FriendlyName, - list.item[idx].Bound ? L"[u]":L"", - list.item[idx].IPstr ? _A2T(list.item[idx].IPstr) : TranslateT("disconnected"), - list.item[idx].Bound ? L"[/u]":L"" - ); - } - if ( msg ) mir_wstrcat(tempstr, msg); else tempstr[mir_wstrlen(tempstr)-1] = 0; - return tempstr; +wchar_t *Print_NIF_List(NETWORK_INTERFACE_LIST list, wchar_t *msg) +{ + UCHAR idx; + int pos = 0; + + ZeroMemory(tempstr, sizeof(tempstr)); + for (idx = 0; idx < list.count; idx++) { + pos += mir_snwprintf(tempstr + pos, _countof(tempstr), L"%s:\t%s%s%s\n", + list.item[idx].FriendlyName, + list.item[idx].Bound ? L"[u]" : L"", + list.item[idx].IPstr ? _A2T(list.item[idx].IPstr) : TranslateT("disconnected"), + list.item[idx].Bound ? L"[/u]" : L"" + ); + } + if (msg) + mir_wstrcat(tempstr, msg); + else + tempstr[mir_wstrlen(tempstr) - 1] = 0; + return tempstr; } /* ################################################################################ */ -void Free_NIF (PNETWORK_INTERFACE nif) { - if (nif->AdapterName) free(nif->AdapterName); - if (nif->FriendlyName) free(nif->FriendlyName); - if (nif->IPstr) free(nif->IPstr); - if (nif->IP) free(nif->IP); - ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); +void Free_NIF(PNETWORK_INTERFACE nif) +{ + if (nif->AdapterName) + free(nif->AdapterName); + if (nif->FriendlyName) + free(nif->FriendlyName); + if (nif->IPstr) + free(nif->IPstr); + if (nif->IP) + free(nif->IP); + ZeroMemory(nif, sizeof(NETWORK_INTERFACE)); } -void Free_NIF_List (NETWORK_INTERFACE_LIST *list) { - UCHAR idx; +void Free_NIF_List(NETWORK_INTERFACE_LIST *list) +{ + UCHAR idx; - for( idx = 0 ; idx < list->count ; idx++ ) { - Free_NIF( &(list->item[idx]) ); - } - free( list->item ); - ZeroMemory(list, sizeof(NETWORK_INTERFACE_LIST)); + for (idx = 0; idx < list->count; idx++) { + Free_NIF(&(list->item[idx])); + } + free(list->item); + ZeroMemory(list, sizeof(NETWORK_INTERFACE_LIST)); } /* ################################################################################ */ -void Parse_Range ( PIP_RANGE range, wchar_t *str, BOOL prioritized ) { - wchar_t *ext; - unsigned long num; - - range->cmpType = CMP_SKIP; - - if ((str[0] == '!' && ! prioritized) || (str[0] != '!' && prioritized)) { - range->mask = range->net = 0L; - return; - } - if (str[0] == '!') str++; - - // ip/mask - if ( (ext = wcschr( str, '/' )) != NULL ) { - ext[0] = 0; ext++; - - // ip/bits (10.0.0.1/16) - if ( wcsspn(ext, DIGITS) == mir_wstrlen(ext) ) { - num = _wtol(ext); - if ( num >= 0 && num <= 32 && (range->net = inet_addr(_T2A(str))) != INADDR_NONE ) { - range->cmpType = CMP_MASK; - range->mask = NETORDER(num ? ~(0xFFFFFFFF >> (num)) : ~0); - range->net = range->net & range->mask; - } - } else { - - // ip/subnet (10.0.0.1/255.255.0.0) - if ( (range->net = inet_addr(_T2A(str))) != INADDR_NONE && (range->mask = inet_addr(_T2A(ext))) != INADDR_NONE ) { - for ( num = 0 ; num < 32 ; num++ ) { - if ( range->mask == NETORDER(num ? ~(0xFFFFFFFF >> (32-num)) : ~0)) { - range->cmpType = CMP_MASK; - range->net = range->net & range->mask; - break; - } - } - }} - } else { - - // ipbegin-end - if ( (ext = wcschr( str, '-' )) != NULL ) { - ext[0] = 0; ext++; - - // ipA.B.C.D1-D2 (10.0.0.1-12) - if ( wcsspn(ext, DIGITS) == mir_wstrlen(ext) ) { - num = _wtol(ext); - if ( num > 0 && num <= 255 && (range->loIP = inet_addr(_T2A(str))) != INADDR_NONE && (range->loIP >> 24) <= num ) { - range->cmpType = CMP_SPAN; - range->hiIP = ((range->loIP & 0x00FFFFFF) | (num << 24)); - range->loIP = (range->loIP); - } - } else { - - // ipstart-ipend (10.0.0.1-10.0.10.255) - if ( (range->loIP = inet_addr(_T2A(str))) != INADDR_NONE && (range->hiIP = inet_addr(_T2A(ext))) != INADDR_NONE ) { - - range->loIP = (range->loIP); - range->hiIP = (range->hiIP); - if ( range->loIP <= range->hiIP ) { - range->cmpType = CMP_SPAN; - } - } - }} else { - - // ip - if ( mir_wstrlen(str) > 0 && (range->net = inet_addr(_T2A(str))) != INADDR_NONE ) { - range->cmpType = CMP_MASK; - range->mask = 0xFFFFFFFF; - }}} - - if ( range->cmpType == CMP_SKIP ) { - range->mask = range->net = 0L; - } -} +void Parse_Range(PIP_RANGE range, wchar_t *str, BOOL prioritized) +{ + wchar_t *ext; + unsigned long num; -int Create_Range_List ( IP_RANGE_LIST *list, wchar_t *str, BOOL prioritized ) { - wchar_t *range, *rest, *tmp; - int size, idx; + range->cmpType = CMP_SKIP; - ZeroMemory(list, sizeof(IP_RANGE_LIST)); - - // get expected number of ranges - range = str; - size = mir_wstrlen( range ) > 0 ? 1 : 0; - while ( range[0] ) { if ( range[0] == ';') size++; range++; }; + if ((str[0] == '!' && !prioritized) || (str[0] != '!' && prioritized)) { + range->mask = range->net = 0L; + return; + } + if (str[0] == '!') + str++; + + // ip/mask + if ((ext = wcschr(str, '/')) != NULL) { + ext[0] = 0; ext++; + + // ip/bits (10.0.0.1/16) + if (wcsspn(ext, DIGITS) == mir_wstrlen(ext)) { + num = _wtol(ext); + if (num >= 0 && num <= 32 && (range->net = inet_addr(_T2A(str))) != INADDR_NONE) { + range->cmpType = CMP_MASK; + range->mask = NETORDER(num ? ~(0xFFFFFFFF >> (num)) : ~0); + range->net = range->net & range->mask; + } + } + else { + + // ip/subnet (10.0.0.1/255.255.0.0) + if ((range->net = inet_addr(_T2A(str))) != INADDR_NONE && (range->mask = inet_addr(_T2A(ext))) != INADDR_NONE) { + for (num = 0; num < 32; num++) { + if (range->mask == NETORDER(num ? ~(0xFFFFFFFF >> (32 - num)) : ~0)) { + range->cmpType = CMP_MASK; + range->net = range->net & range->mask; + break; + } + } + } + } + } + else { + + // ipbegin-end + if ((ext = wcschr(str, '-')) != NULL) { + ext[0] = 0; ext++; + + // ipA.B.C.D1-D2 (10.0.0.1-12) + if (wcsspn(ext, DIGITS) == mir_wstrlen(ext)) { + num = _wtol(ext); + if (num > 0 && num <= 255 && (range->loIP = inet_addr(_T2A(str))) != INADDR_NONE && (range->loIP >> 24) <= num) { + range->cmpType = CMP_SPAN; + range->hiIP = ((range->loIP & 0x00FFFFFF) | (num << 24)); + range->loIP = (range->loIP); + } + } + else { + + // ipstart-ipend (10.0.0.1-10.0.10.255) + if ((range->loIP = inet_addr(_T2A(str))) != INADDR_NONE && (range->hiIP = inet_addr(_T2A(ext))) != INADDR_NONE) { + + range->loIP = (range->loIP); + range->hiIP = (range->hiIP); + if (range->loIP <= range->hiIP) { + range->cmpType = CMP_SPAN; + } + } + } + } + else { - if (size == 0) return 0; + // ip + if (mir_wstrlen(str) > 0 && (range->net = inet_addr(_T2A(str))) != INADDR_NONE) { + range->cmpType = CMP_MASK; + range->mask = 0xFFFFFFFF; + } + } + } - // alloc required space - list->item = (PIP_RANGE)mir_alloc( size * sizeof( IP_RANGE ) ); - ZeroMemory( list->item, size * sizeof( IP_RANGE ) ); + if (range->cmpType == CMP_SKIP) { + range->mask = range->net = 0L; + } +} - tmp = range = rest = mir_wstrdup( str ); - idx = 0; - while ( rest && rest[0] ) { - rest = wcschr( rest, ';' ); - if ( rest != NULL ) { - rest[0] = 0; - rest++; - } - Parse_Range( &(list->item[idx]), range, prioritized ); - if ( list->item[idx].cmpType != CMP_SKIP ) idx++; - range = rest; - } +int Create_Range_List(IP_RANGE_LIST *list, wchar_t *str, BOOL prioritized) +{ + wchar_t *range, *rest, *tmp; + int size, idx; + + ZeroMemory(list, sizeof(IP_RANGE_LIST)); + + // get expected number of ranges + range = str; + size = mir_wstrlen(range) > 0 ? 1 : 0; + while (range[0]) { + if (range[0] == ';') + size++; + range++; + }; + + if (size == 0) + return 0; + + // alloc required space + list->item = (PIP_RANGE)mir_alloc(size * sizeof(IP_RANGE)); + ZeroMemory(list->item, size * sizeof(IP_RANGE)); + + tmp = range = rest = mir_wstrdup(str); + idx = 0; + while (rest && rest[0]) { + rest = wcschr(rest, ';'); + if (rest != NULL) { + rest[0] = 0; + rest++; + } + Parse_Range(&(list->item[idx]), range, prioritized); + if (list->item[idx].cmpType != CMP_SKIP) + idx++; + range = rest; + } - list->count = idx; - list->item = (PIP_RANGE)mir_realloc( list->item, (idx+1) * sizeof( IP_RANGE ) ); + list->count = idx; + list->item = (PIP_RANGE)mir_realloc(list->item, (idx + 1) * sizeof(IP_RANGE)); - ZeroMemory( &(list->item[idx]), sizeof( IP_RANGE ) ); - list->item[idx].cmpType = CMP_END; + ZeroMemory(&(list->item[idx]), sizeof(IP_RANGE)); + list->item[idx].cmpType = CMP_END; - free( tmp ); + free(tmp); - return 0; + return 0; } -int Match_Range_List (IP_RANGE_LIST range, NETWORK_INTERFACE_LIST nif) { - PIP_RANGE rng; - UCHAR idx; - ULONG *ip; - - if ( range.count == 0 || nif.count == 0 ) return 0; - - rng = range.item; - while( rng->cmpType != CMP_END ) { - - switch ( rng->cmpType ) { - case CMP_SKIP: - break; - - case CMP_MASK: - for ( idx = 0 ; idx < nif.count ; idx++ ) { - ip = (ULONG *)nif.item[idx].IP; - while (ip && *ip) { - if ( (ULONG)(*ip & rng->mask) == rng->net ) return 1; - ip++; - } - } - break; - - case CMP_SPAN: - for ( idx = 0 ; idx < nif.count ; idx++ ) { - ip = (ULONG *)nif.item[idx].IP; - while (ip && *ip) { - if ( (NETORDER(rng->loIP) <= NETORDER(*ip)) && (NETORDER(*ip) <= NETORDER(rng->hiIP)) ) return 1; - ip++; - } - } - break; - } - rng++; - } - - return 0; +int Match_Range_List(IP_RANGE_LIST range, NETWORK_INTERFACE_LIST nif) +{ + PIP_RANGE rng; + UCHAR idx; + ULONG *ip; + + if (range.count == 0 || nif.count == 0) + return 0; + + rng = range.item; + while (rng->cmpType != CMP_END) { + + switch (rng->cmpType) { + case CMP_SKIP: + break; + + case CMP_MASK: + for (idx = 0; idx < nif.count; idx++) { + ip = (ULONG *)nif.item[idx].IP; + while (ip && *ip) { + if ((ULONG)(*ip & rng->mask) == rng->net) + return 1; + ip++; + } + } + break; + + case CMP_SPAN: + for (idx = 0; idx < nif.count; idx++) { + ip = (ULONG *)nif.item[idx].IP; + while (ip && *ip) { + if ((NETORDER(rng->loIP) <= NETORDER(*ip)) && (NETORDER(*ip) <= NETORDER(rng->hiIP))) + return 1; + ip++; + } + } + break; + } + rng++; + } + + return 0; } -void Free_Range_List (IP_RANGE_LIST *list) { - if ( list->item ) free( list->item ); - ZeroMemory(list, sizeof(IP_RANGE_LIST)); +void Free_Range_List(IP_RANGE_LIST *list) +{ + if (list->item) + free(list->item); + ZeroMemory(list, sizeof(IP_RANGE_LIST)); } -int ManageConnections (WPARAM wParam,LPARAM lParam) { - NETLIBCONNECTIONEVENTINFO *info = (NETLIBCONNECTIONEVENTINFO *)wParam; - int found; - UCHAR i; - - EnterCriticalSection(&csConnection_List); - found = -1; - for (i=0 ; i<Connection_List.count ; i++) { - if ( Connection_List.item[i].IP == info->local.sin_addr.s_addr && Connection_List.item[i].Port == info->local.sin_port ) { - found = i; - break; - } - } - if ( (found >= 0 && info->connected) || (found == -1 && !info->connected)) { - LeaveCriticalSection(&csConnection_List); - return 0; - } - if ( found >= 0 ) { - Connection_List.count--; - for( i=found ; i<Connection_List.count ; i++ ) memcpy( &(Connection_List.item[i]), &(Connection_List.item[i+1]), sizeof(ACTIVE_CONNECTION) ); - } else { - if ( Connection_List.count >= Connection_List._alloc ) { - Connection_List._alloc += 10; - Connection_List.item = (PACTIVE_CONNECTION)mir_realloc( Connection_List.item, Connection_List._alloc * sizeof(ACTIVE_CONNECTION) ); - } - Connection_List.item[Connection_List.count].IP = info->local.sin_addr.s_addr; - Connection_List.item[Connection_List.count].Port = info->local.sin_port; - Connection_List.count++; - } - LeaveCriticalSection(&csConnection_List); - - SetEvent( hEventRebound ); - - return 0; +int ManageConnections(WPARAM wParam, LPARAM lParam) +{ + NETLIBCONNECTIONEVENTINFO *info = (NETLIBCONNECTIONEVENTINFO *)wParam; + int found; + UCHAR i; + + EnterCriticalSection(&csConnection_List); + found = -1; + for (i = 0; i < Connection_List.count; i++) { + if (Connection_List.item[i].IP == info->local.sin_addr.s_addr && Connection_List.item[i].Port == info->local.sin_port) { + found = i; + break; + } + } + if ((found >= 0 && info->connected) || (found == -1 && !info->connected)) { + LeaveCriticalSection(&csConnection_List); + return 0; + } + if (found >= 0) { + Connection_List.count--; + for (i = found; i < Connection_List.count; i++) + memcpy(&(Connection_List.item[i]), &(Connection_List.item[i + 1]), sizeof(ACTIVE_CONNECTION)); + } + else { + if (Connection_List.count >= Connection_List._alloc) { + Connection_List._alloc += 10; + Connection_List.item = (PACTIVE_CONNECTION)mir_realloc(Connection_List.item, Connection_List._alloc * sizeof(ACTIVE_CONNECTION)); + } + Connection_List.item[Connection_List.count].IP = info->local.sin_addr.s_addr; + Connection_List.item[Connection_List.count].Port = info->local.sin_port; + Connection_List.count++; + } + LeaveCriticalSection(&csConnection_List); + + SetEvent(hEventRebound); + + return 0; } -void UnboundConnections ( LONG *OldIP, LONG *NewIP ) { - UCHAR i, j; - LONG *IP; - - while ( OldIP != NULL && *OldIP != 0 ) { - IP = NewIP; - while ( IP != NULL && *IP != 0 && *IP != *OldIP ) IP++; - if ( IP == NULL || *IP != *OldIP ) { - EnterCriticalSection(&csConnection_List); - i = 0; - while ( i < Connection_List.count ) { - if (Connection_List.item[i].IP == (ULONG)*OldIP) { - Connection_List.count--; - for( j=i ; j<Connection_List.count ; j++ ) memcpy( &(Connection_List.item[j]), &(Connection_List.item[j+1]), sizeof(ACTIVE_CONNECTION) ); - } else { - i++; - } - } - LeaveCriticalSection(&csConnection_List); - } - OldIP++; - } +void UnboundConnections(LONG *OldIP, LONG *NewIP) +{ + UCHAR i, j; + LONG *IP; + + while (OldIP != NULL && *OldIP != 0) { + IP = NewIP; + while (IP != NULL && *IP != 0 && *IP != *OldIP) + IP++; + if (IP == NULL || *IP != *OldIP) { + EnterCriticalSection(&csConnection_List); + i = 0; + while (i < Connection_List.count) { + if (Connection_List.item[i].IP == (ULONG)*OldIP) { + Connection_List.count--; + for (j = i; j < Connection_List.count; j++) + memcpy(&(Connection_List.item[j]), &(Connection_List.item[j + 1]), sizeof(ACTIVE_CONNECTION)); + } + else { + i++; + } + } + LeaveCriticalSection(&csConnection_List); + } + OldIP++; + } } |