* 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:
parent
14d0b44b79
commit
2c12b8a334
@ -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,
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user