More Windows tweaks and a compile fix.

This commit is contained in:
Adam Ierymenko 2016-03-02 19:06:29 -08:00
parent d3cb063d13
commit b6f6ed35fc
2 changed files with 65 additions and 57 deletions

View File

@ -2299,7 +2299,7 @@ http_parse_host_char(enum http_host_state s, const char ch) {
static int static int
http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
assert(u->field_set & (1 << UF_HOST)); //assert(u->field_set & (1 << UF_HOST));
enum http_host_state s; enum http_host_state s;
const char *p; const char *p;

View File

@ -695,37 +695,39 @@ bool WindowsEthernetTap::removeIp(const InetAddress &ip)
try { try {
MIB_UNICASTIPADDRESS_TABLE *ipt = (MIB_UNICASTIPADDRESS_TABLE *)0; MIB_UNICASTIPADDRESS_TABLE *ipt = (MIB_UNICASTIPADDRESS_TABLE *)0;
if (GetUnicastIpAddressTable(AF_UNSPEC,&ipt) == NO_ERROR) { if (GetUnicastIpAddressTable(AF_UNSPEC,&ipt) == NO_ERROR) {
for(DWORD i=0;i<ipt->NumEntries;++i) { if ((ipt)&&(ipt->NumEntries > 0)) {
if (ipt->Table[i].InterfaceLuid.Value == _deviceLuid.Value) { for(DWORD i=0;i<(DWORD)ipt->NumEntries;++i) {
InetAddress addr; if (ipt->Table[i].InterfaceLuid.Value == _deviceLuid.Value) {
switch(ipt->Table[i].Address.si_family) { InetAddress addr;
case AF_INET: switch(ipt->Table[i].Address.si_family) {
addr.set(&(ipt->Table[i].Address.Ipv4.sin_addr.S_un.S_addr),4,ipt->Table[i].OnLinkPrefixLength); case AF_INET:
break; addr.set(&(ipt->Table[i].Address.Ipv4.sin_addr.S_un.S_addr),4,ipt->Table[i].OnLinkPrefixLength);
case AF_INET6: break;
addr.set(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength); case AF_INET6:
if (addr.ipScope() == InetAddress::IP_SCOPE_LINK_LOCAL) addr.set(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength);
continue; // can't remove link-local IPv6 addresses if (addr.ipScope() == InetAddress::IP_SCOPE_LINK_LOCAL)
break; continue; // can't remove link-local IPv6 addresses
}
if (addr == ip) {
DeleteUnicastIpAddressEntry(&(ipt->Table[i]));
FreeMibTable(ipt);
std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
std::string ipstr(ip.toIpString());
for(std::vector<std::string>::iterator rip(regIps.begin()),rm(regSubnetMasks.begin());((rip!=regIps.end())&&(rm!=regSubnetMasks.end()));++rip,++rm) {
if (*rip == ipstr) {
regIps.erase(rip);
regSubnetMasks.erase(rm);
_setRegistryIPv4Value("IPAddress",regIps);
_setRegistryIPv4Value("SubnetMask",regSubnetMasks);
break; break;
}
} }
if (addr == ip) {
DeleteUnicastIpAddressEntry(&(ipt->Table[i]));
FreeMibTable(ipt);
return true; std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
std::string ipstr(ip.toIpString());
for(std::vector<std::string>::iterator rip(regIps.begin()),rm(regSubnetMasks.begin());((rip!=regIps.end())&&(rm!=regSubnetMasks.end()));++rip,++rm) {
if (*rip == ipstr) {
regIps.erase(rip);
regSubnetMasks.erase(rm);
_setRegistryIPv4Value("IPAddress",regIps);
_setRegistryIPv4Value("SubnetMask",regSubnetMasks);
break;
}
}
return true;
}
} }
} }
} }
@ -746,19 +748,21 @@ std::vector<InetAddress> WindowsEthernetTap::ips() const
try { try {
MIB_UNICASTIPADDRESS_TABLE *ipt = (MIB_UNICASTIPADDRESS_TABLE *)0; MIB_UNICASTIPADDRESS_TABLE *ipt = (MIB_UNICASTIPADDRESS_TABLE *)0;
if (GetUnicastIpAddressTable(AF_UNSPEC,&ipt) == NO_ERROR) { if (GetUnicastIpAddressTable(AF_UNSPEC,&ipt) == NO_ERROR) {
for(DWORD i=0;i<ipt->NumEntries;++i) { if ((ipt)&&(ipt->NumEntries > 0)) {
if (ipt->Table[i].InterfaceLuid.Value == _deviceLuid.Value) { for(DWORD i=0;i<(DWORD)ipt->NumEntries;++i) {
switch(ipt->Table[i].Address.si_family) { if (ipt->Table[i].InterfaceLuid.Value == _deviceLuid.Value) {
case AF_INET: { switch(ipt->Table[i].Address.si_family) {
InetAddress ip(&(ipt->Table[i].Address.Ipv4.sin_addr.S_un.S_addr),4,ipt->Table[i].OnLinkPrefixLength); case AF_INET: {
if (ip != InetAddress::LO4) InetAddress ip(&(ipt->Table[i].Address.Ipv4.sin_addr.S_un.S_addr),4,ipt->Table[i].OnLinkPrefixLength);
addrs.push_back(ip); if (ip != InetAddress::LO4)
} break; addrs.push_back(ip);
case AF_INET6: { } break;
InetAddress ip(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength); case AF_INET6: {
if ((ip != linkLocalLoopback)&&(ip != InetAddress::LO6)) InetAddress ip(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength);
addrs.push_back(ip); if ((ip != linkLocalLoopback)&&(ip != InetAddress::LO6))
} break; addrs.push_back(ip);
} break;
}
} }
} }
} }
@ -767,7 +771,7 @@ std::vector<InetAddress> WindowsEthernetTap::ips() const
} catch ( ... ) {} // sanity check, shouldn't happen unless out of memory } catch ( ... ) {} // sanity check, shouldn't happen unless out of memory
std::sort(addrs.begin(),addrs.end()); std::sort(addrs.begin(),addrs.end());
std::unique(addrs.begin(),addrs.end()); addrs.erase(std::unique(addrs.begin(),addrs.end()),addrs.end());
return addrs; return addrs;
} }
@ -824,14 +828,16 @@ void WindowsEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,
unsigned char mcastbuf[TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE]; unsigned char mcastbuf[TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE];
DWORD bytesReturned = 0; DWORD bytesReturned = 0;
if (DeviceIoControl(t,TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS,(LPVOID)0,0,(LPVOID)mcastbuf,sizeof(mcastbuf),&bytesReturned,NULL)) { if (DeviceIoControl(t,TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS,(LPVOID)0,0,(LPVOID)mcastbuf,sizeof(mcastbuf),&bytesReturned,NULL)) {
MAC mac; if ((bytesReturned > 0)&&(bytesReturned <= TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE)) { // sanity check
DWORD i = 0; MAC mac;
while ((i + 6) <= bytesReturned) { DWORD i = 0;
mac.setTo(mcastbuf + i,6); while ((i + 6) <= bytesReturned) {
i += 6; mac.setTo(mcastbuf + i,6);
if ((mac.isMulticast())&&(!mac.isBroadcast())) { i += 6;
// exclude the nulls that may be returned or any other junk Windows puts in there if ((mac.isMulticast())&&(!mac.isBroadcast())) {
newGroups.push_back(MulticastGroup(mac,0)); // exclude the nulls that may be returned or any other junk Windows puts in there
newGroups.push_back(MulticastGroup(mac,0));
}
} }
} }
} }
@ -841,7 +847,7 @@ void WindowsEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,
newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip)); newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
std::sort(newGroups.begin(),newGroups.end()); std::sort(newGroups.begin(),newGroups.end());
std::unique(newGroups.begin(),newGroups.end()); newGroups.erase(std::unique(newGroups.begin(),newGroups.end()),newGroups.end());
for(std::vector<MulticastGroup>::iterator m(newGroups.begin());m!=newGroups.end();++m) { for(std::vector<MulticastGroup>::iterator m(newGroups.begin());m!=newGroups.end();++m) {
if (!std::binary_search(_multicastGroups.begin(),_multicastGroups.end(),*m)) if (!std::binary_search(_multicastGroups.begin(),_multicastGroups.end(),*m))
@ -1077,11 +1083,13 @@ NET_IFINDEX WindowsEthernetTap::_getDeviceIndex()
if (GetIfTable2Ex(MibIfTableRaw,&ift) != NO_ERROR) if (GetIfTable2Ex(MibIfTableRaw,&ift) != NO_ERROR)
throw std::runtime_error("GetIfTable2Ex() failed"); throw std::runtime_error("GetIfTable2Ex() failed");
for(ULONG i=0;i<ift->NumEntries;++i) { if (ift->NumEntries > 0) {
if (ift->Table[i].InterfaceLuid.Value == _deviceLuid.Value) { for(ULONG i=0;i<ift->NumEntries;++i) {
NET_IFINDEX idx = ift->Table[i].InterfaceIndex; if (ift->Table[i].InterfaceLuid.Value == _deviceLuid.Value) {
FreeMibTable(ift); NET_IFINDEX idx = ift->Table[i].InterfaceIndex;
return idx; FreeMibTable(ift);
return idx;
}
} }
} }