* Also report the address index back to the userland.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38059 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2010-08-12 13:45:18 +00:00
parent 14d0b44b79
commit 2c12b8a334
3 changed files with 33 additions and 3 deletions

View File

@ -788,14 +788,24 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option,
address = interface->FirstForFamily(
protocol->domain->family);
}
request.ifra_index = interface->IndexOfAddress(address);
} else
address = interface->AddressAt(request.ifra_index);
if (address == NULL)
return B_BAD_VALUE;
status_t status = fill_address(address->local,
(sockaddr*)&((struct ifaliasreq*)argument)->ifra_addr,
sizeof(sockaddr_storage));
// Copy index (in case none was specified)
status_t status = user_memcpy(
&((struct ifaliasreq*)argument)->ifra_index,
&request.ifra_index, sizeof(request.ifra_index));
// Copy address info
if (status == B_OK) {
status = fill_address(address->local,
(sockaddr*)&((struct ifaliasreq*)argument)->ifra_addr,
sizeof(sockaddr_storage));
}
if (status == B_OK) {
status = fill_address(address->mask,
(sockaddr*)&((struct ifaliasreq*)argument)->ifra_mask,

View File

@ -638,6 +638,25 @@ Interface::AddressAt(size_t index)
}
int32
Interface::IndexOfAddress(InterfaceAddress* address)
{
RecursiveLocker locker(fLock);
AddressList::Iterator iterator = fAddresses.GetIterator();
int32 index = 0;
while (iterator.HasNext()) {
if (address == iterator.Next())
return index;
index++;
}
return -1;
}
size_t
Interface::CountAddresses()
{

View File

@ -129,6 +129,7 @@ public:
void RemoveAddress(InterfaceAddress* address);
bool GetNextAddress(InterfaceAddress** _address);
InterfaceAddress* AddressAt(size_t index);
int32 IndexOfAddress(InterfaceAddress* address);
size_t CountAddresses();
void RemoveAddresses();