* 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:
@@ -788,14 +788,24 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option,
|
|||||||
address = interface->FirstForFamily(
|
address = interface->FirstForFamily(
|
||||||
protocol->domain->family);
|
protocol->domain->family);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
request.ifra_index = interface->IndexOfAddress(address);
|
||||||
} else
|
} else
|
||||||
address = interface->AddressAt(request.ifra_index);
|
address = interface->AddressAt(request.ifra_index);
|
||||||
if (address == NULL)
|
if (address == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
status_t status = fill_address(address->local,
|
// Copy index (in case none was specified)
|
||||||
(sockaddr*)&((struct ifaliasreq*)argument)->ifra_addr,
|
status_t status = user_memcpy(
|
||||||
sizeof(sockaddr_storage));
|
&((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) {
|
if (status == B_OK) {
|
||||||
status = fill_address(address->mask,
|
status = fill_address(address->mask,
|
||||||
(sockaddr*)&((struct ifaliasreq*)argument)->ifra_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
|
size_t
|
||||||
Interface::CountAddresses()
|
Interface::CountAddresses()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ public:
|
|||||||
void RemoveAddress(InterfaceAddress* address);
|
void RemoveAddress(InterfaceAddress* address);
|
||||||
bool GetNextAddress(InterfaceAddress** _address);
|
bool GetNextAddress(InterfaceAddress** _address);
|
||||||
InterfaceAddress* AddressAt(size_t index);
|
InterfaceAddress* AddressAt(size_t index);
|
||||||
|
int32 IndexOfAddress(InterfaceAddress* address);
|
||||||
size_t CountAddresses();
|
size_t CountAddresses();
|
||||||
void RemoveAddresses();
|
void RemoveAddresses();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user