Author: axeld Date: 2010-08-12 15:45:18 +0200 (Thu, 12 Aug 2010) New Revision: 38059 Changeset: http://dev.haiku-os.org/changeset/38059 Modified: haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h Log: * Also report the address index back to the userland. Modified: haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp 2010-08-12 13:38:52 UTC (rev 38058) +++ haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp 2010-08-12 13:45:18 UTC (rev 38059) @@ -788,15 +788,25 @@ 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, sizeof(sockaddr_storage)); Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-08-12 13:38:52 UTC (rev 38058) +++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-08-12 13:45:18 UTC (rev 38059) @@ -638,6 +638,25 @@ } +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() { Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h =================================================================== --- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h 2010-08-12 13:38:52 UTC (rev 38058) +++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h 2010-08-12 13:45:18 UTC (rev 38059) @@ -129,6 +129,7 @@ void RemoveAddress(InterfaceAddress* address); bool GetNextAddress(InterfaceAddress** _address); InterfaceAddress* AddressAt(size_t index); + int32 IndexOfAddress(InterfaceAddress* address); size_t CountAddresses(); void RemoveAddresses();