From 7720614300ff86e823735adcb96690c822dd60f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 5 Feb 2015 09:06:06 +0100 Subject: [PATCH] Revert "Move getifaddrs to libnetwork again." This reverts commit 31ea76548a64b232ed10cb444bf84ca1f7e40b0f. Adrien, please try again without clobbering the otherwise nice BNetworkInterface API! Conflicts: src/kits/network/getifaddrs.cpp --- headers/os/net/NetworkAddress.h | 2 + headers/os/net/NetworkInterface.h | 35 +++-- src/apps/networkstatus/NetworkStatusView.cpp | 9 +- src/bin/network/ifconfig/ifconfig.cpp | 16 +- src/kits/network/Jamfile | 5 - src/kits/network/NetworkInterfaceAddress.cpp | 135 ---------------- src/kits/network/getifaddrs.cpp | 144 ------------------ src/kits/network/libnetapi/AbstractSocket.cpp | 2 +- src/kits/network/libnetapi/DatagramSocket.cpp | 7 +- src/kits/network/libnetapi/Jamfile | 1 + src/kits/network/libnetapi/NetworkAddress.cpp | 12 ++ .../network/libnetapi/NetworkInterface.cpp | 128 ++++++++++++++-- src/kits/network/libnetapi/getifaddrs.cpp | 103 +++++++++++++ .../InterfacesAddOn/NetworkSettings.cpp | 8 +- src/servers/net/DHCPClient.cpp | 2 +- src/servers/net/NetServer.cpp | 14 +- src/servers/net/Services.cpp | 4 +- 17 files changed, 278 insertions(+), 349 deletions(-) delete mode 100644 src/kits/network/NetworkInterfaceAddress.cpp delete mode 100644 src/kits/network/getifaddrs.cpp create mode 100644 src/kits/network/libnetapi/getifaddrs.cpp diff --git a/headers/os/net/NetworkAddress.h b/headers/os/net/NetworkAddress.h index 207e9cf97a..865ed737c6 100644 --- a/headers/os/net/NetworkAddress.h +++ b/headers/os/net/NetworkAddress.h @@ -138,7 +138,9 @@ public: operator const sockaddr*() const; operator const sockaddr&() const; + operator const sockaddr*(); operator sockaddr*(); + operator const sockaddr&(); operator sockaddr&(); private: diff --git a/headers/os/net/NetworkInterface.h b/headers/os/net/NetworkInterface.h index a059774187..9e46cdb975 100644 --- a/headers/os/net/NetworkInterface.h +++ b/headers/os/net/NetworkInterface.h @@ -8,12 +8,11 @@ #include #include -#include #include +#include -class BNetworkAddress; class BNetworkInterface; @@ -22,20 +21,24 @@ public: BNetworkInterfaceAddress(); ~BNetworkInterfaceAddress(); - status_t SetTo(const char* interfaceName, + status_t SetTo(const BNetworkInterface& interface, int32 index); - void SetAddress(const sockaddr& address); - void SetMask(const sockaddr& mask); - void SetBroadcast(const sockaddr& broadcast); - void SetDestination(const sockaddr& destination); + void SetAddress(const BNetworkAddress& address); + void SetMask(const BNetworkAddress& mask); + void SetBroadcast(const BNetworkAddress& broadcast); + void SetDestination( + const BNetworkAddress& destination); - const sockaddr& Address() const { return (sockaddr&)fAddress; } - const sockaddr& Mask() const { return (sockaddr&)fMask; } - const sockaddr& Broadcast() const - { return (sockaddr&)fBroadcast; } - const sockaddr& Destination() const - { return (sockaddr&)fBroadcast; } + BNetworkAddress& Address() { return fAddress; } + BNetworkAddress& Mask() { return fMask; } + BNetworkAddress& Broadcast() { return fBroadcast; } + BNetworkAddress& Destination() { return fBroadcast; } + + const BNetworkAddress& Address() const { return fAddress; } + const BNetworkAddress& Mask() const { return fMask; } + const BNetworkAddress& Broadcast() const { return fBroadcast; } + const BNetworkAddress& Destination() const { return fBroadcast; } void SetFlags(uint32 flags); uint32 Flags() const { return fFlags; } @@ -44,9 +47,9 @@ public: private: int32 fIndex; - sockaddr_storage fAddress; - sockaddr_storage fMask; - sockaddr_storage fBroadcast; + BNetworkAddress fAddress; + BNetworkAddress fMask; + BNetworkAddress fBroadcast; uint32 fFlags; }; diff --git a/src/apps/networkstatus/NetworkStatusView.cpp b/src/apps/networkstatus/NetworkStatusView.cpp index 52691c5380..c678fd48b0 100644 --- a/src/apps/networkstatus/NetworkStatusView.cpp +++ b/src/apps/networkstatus/NetworkStatusView.cpp @@ -357,12 +357,9 @@ NetworkStatusView::_ShowConfiguration(BMessage* message) size_t boldLength = text.Length(); - text << "\n" << B_TRANSLATE("Address") << ": " - << BNetworkAddress(address.Address()).ToString(); - text << "\n" << B_TRANSLATE("Broadcast") << ": " - << BNetworkAddress(address.Broadcast()).ToString(); - text << "\n" << B_TRANSLATE("Netmask") << ": " - << BNetworkAddress(address.Mask()).ToString(); + text << "\n" << B_TRANSLATE("Address") << ": " << address.Address().ToString(); + text << "\n" << B_TRANSLATE("Broadcast") << ": " << address.Broadcast().ToString(); + text << "\n" << B_TRANSLATE("Netmask") << ": " << address.Mask().ToString(); BAlert* alert = new BAlert(name, text.String(), B_TRANSLATE("OK")); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); diff --git a/src/bin/network/ifconfig/ifconfig.cpp b/src/bin/network/ifconfig/ifconfig.cpp index a0815d9c07..b9c481dbc2 100644 --- a/src/bin/network/ifconfig/ifconfig.cpp +++ b/src/bin/network/ifconfig/ifconfig.cpp @@ -474,24 +474,20 @@ list_interface_addresses(BNetworkInterface& interface, uint32 flags) break; const address_family* family - = address_family_for(address.Address().sa_family); + = address_family_for(address.Address().Family()); printf("\t%s addr: %s", family->name, - BNetworkAddress(address.Address()).ToString().String()); + address.Address().ToString().String()); - if ((flags & IFF_BROADCAST) != 0) { - printf(", Bcast: %s", - BNetworkAddress(address.Broadcast()).ToString().String()); - } + if ((flags & IFF_BROADCAST) != 0) + printf(", Bcast: %s", address.Broadcast().ToString().String()); switch (family->preferred_format) { case PREFER_OUTPUT_MASK: - printf(", Mask: %s", - BNetworkAddress(address.Mask()).ToString().String()); + printf(", Mask: %s", address.Mask().ToString().String()); break; case PREFER_OUTPUT_PREFIX_LENGTH: - printf(", Prefix Length: %zu", - BNetworkAddress(address.Mask()).PrefixLength()); + printf(", Prefix Length: %zu", address.Mask().PrefixLength()); break; } diff --git a/src/kits/network/Jamfile b/src/kits/network/Jamfile index 15e78cc07e..c57bdd8a8b 100644 --- a/src/kits/network/Jamfile +++ b/src/kits/network/Jamfile @@ -11,18 +11,13 @@ for architectureObject in [ MultiArchSubDirSetup ] { local architecture = $(TARGET_PACKAGING_ARCH) ; UsePrivateSystemHeaders ; - UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ; local libnetwork = [ MultiArchDefaultGristFiles libnetwork.so ] ; SharedLibrary $(libnetwork) : - getifaddrs.cpp init.cpp interfaces.cpp socket.cpp r5_compatibility.cpp - - NetworkInterfaceAddress.cpp - : libbind.o [ TargetLibsupc++ ] diff --git a/src/kits/network/NetworkInterfaceAddress.cpp b/src/kits/network/NetworkInterfaceAddress.cpp deleted file mode 100644 index 8620f470ea..0000000000 --- a/src/kits/network/NetworkInterfaceAddress.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2010, Axel Dörfler, axeld@pinc-software.de. - * Distributed under the terms of the MIT License. - */ - - -#include - -#include -#include -#include - -#include - - -namespace BPrivate { - -int -family_from_interface_address(const BNetworkInterfaceAddress& address) -{ - if (address.Address().sa_family != AF_UNSPEC) - return address.Address().sa_family; - if (address.Mask().sa_family != AF_UNSPEC) - return address.Mask().sa_family; - if (address.Destination().sa_family != AF_UNSPEC) - return address.Destination().sa_family; - - return AF_INET; -} - - -status_t -do_ifaliasreq(const char* name, int32 option, BNetworkInterfaceAddress& address, - bool readBack = false) -{ - int family = AF_INET; - if (!readBack) - family = family_from_interface_address(address); - - int socket = ::socket(family, SOCK_DGRAM, 0); - if (socket < 0) - return errno; - - FileDescriptorCloser closer(socket); - - ifaliasreq request; - strlcpy(request.ifra_name, name, IF_NAMESIZE); - request.ifra_index = address.Index(); - request.ifra_flags = address.Flags(); - - memcpy(&request.ifra_addr, &address.Address(), - address.Address().sa_len); - memcpy(&request.ifra_mask, &address.Mask(), - address.Mask().sa_len); - memcpy(&request.ifra_broadaddr, &address.Broadcast(), - address.Broadcast().sa_len); - - if (ioctl(socket, option, &request, sizeof(struct ifaliasreq)) < 0) - return errno; - - if (readBack) { - address.SetFlags(request.ifra_flags); - address.SetAddress((sockaddr&)request.ifra_addr); - address.SetMask((sockaddr&)request.ifra_mask); - address.SetBroadcast((sockaddr&)request.ifra_broadaddr); - } - - return B_OK; -} - -}; - -using namespace BPrivate; - - -// #pragma mark - - - -BNetworkInterfaceAddress::BNetworkInterfaceAddress() - : - fIndex(-1), - fFlags(0) -{ -} - - -BNetworkInterfaceAddress::~BNetworkInterfaceAddress() -{ -} - - -status_t -BNetworkInterfaceAddress::SetTo(const char* name, int32 index) -{ - fIndex = index; - return do_ifaliasreq(name, B_SOCKET_GET_ALIAS, *this, true); -} - - -void -BNetworkInterfaceAddress::SetAddress(const sockaddr& address) -{ - memcpy(&fAddress, &address, address.sa_len); -} - - -void -BNetworkInterfaceAddress::SetMask(const sockaddr& mask) -{ - memcpy(&fMask, &mask, mask.sa_len); -} - - -void -BNetworkInterfaceAddress::SetBroadcast(const sockaddr& broadcast) -{ - memcpy(&fBroadcast, &broadcast, broadcast.sa_len); -} - - -void -BNetworkInterfaceAddress::SetDestination(const sockaddr& destination) -{ - memcpy(&fBroadcast, &destination, destination.sa_len); -} - - -void -BNetworkInterfaceAddress::SetFlags(uint32 flags) -{ - fFlags = flags; -} - - - diff --git a/src/kits/network/getifaddrs.cpp b/src/kits/network/getifaddrs.cpp deleted file mode 100644 index 94627352ed..0000000000 --- a/src/kits/network/getifaddrs.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2015, Haiku, Inc. All Rights Reserved. - * Distributed under the terms of the MIT License. - * - * Authors: - * Adrien Destugues, pulkomandy@pulkomandy.tk - */ - - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - - -// This structure has an ifaddrs and all the information it refers to. We can -// allocate this in a single call to the allocator instead of allocating each -// address, the name, and the ifaddr struct itself separately. This simplifies -// the error handling and the freeing of the structure, and reduces the stress -// on the memory allocator. -struct IfaddrContainer { - ifaddrs header; - - sockaddr_storage address; - sockaddr_storage mask; - sockaddr_storage destination; - char name[0]; -}; - - -int -getifaddrs(struct ifaddrs **ifap) -{ - if (ifap == NULL) { - errno = B_BAD_VALUE; - return -1; - } - - // get a list of all interfaces - int socket = ::socket(AF_INET, SOCK_DGRAM, 0); - if (socket < 0) - return -1; - - FileDescriptorCloser closer(socket); - - ifconf config; - config.ifc_len = sizeof(config.ifc_value); - if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0) - return -1; - - size_t count = (size_t)config.ifc_value; - if (count == 0) { - errno = B_BAD_VALUE; - return -1; - } - - char* buffer = (char*)malloc(count * sizeof(struct ifreq)); - if (buffer == NULL) { - errno = B_NO_MEMORY; - return -1; - } - - MemoryDeleter deleter(buffer); - - config.ifc_len = count * sizeof(struct ifreq); - config.ifc_buf = buffer; - if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0) - return -1; - - ifreq* interfaces = (ifreq*)buffer; - ifreq* end = (ifreq*)(buffer + config.ifc_len); - - struct ifaddrs* previous = NULL; - struct ifaddrs* current = NULL; - - for (uint32 i = 0; interfaces < end; i++) { - BNetworkInterfaceAddress address; - int32 j = 0; - - while (address.SetTo(interfaces->ifr_name, j++) == B_OK) { - IfaddrContainer* container = (IfaddrContainer*)malloc( - sizeof(IfaddrContainer) + strlen(interfaces->ifr_name) + 1); - if (container == NULL) { - freeifaddrs(previous); - errno = B_NO_MEMORY; - return -1; - } - - current = &container->header; - - strcpy(container->name, interfaces->ifr_name); - current->ifa_name = container->name; - current->ifa_flags = address.Flags(); - - memcpy(&container->address, &address.Address(), - address.Address().sa_len); - current->ifa_addr = (sockaddr*)&container->address; - - memcpy(&container->mask, &address.Mask(), address.Mask().sa_len); - current->ifa_netmask = (sockaddr*)&container->mask; - - memcpy(&container->destination, &address.Destination(), - address.Destination().sa_len); - current->ifa_dstaddr = (sockaddr*)&container->destination; - - current->ifa_data = NULL; - // Could point to extra information, if we have something to - // add. - - // Chain this interface with the next one - current->ifa_next = previous; - previous = current; - } - - interfaces = (ifreq*)((uint8*)interfaces - + _SIZEOF_ADDR_IFREQ(interfaces[0])); - } - - *ifap = current; - return B_OK; -} - - -void -freeifaddrs(struct ifaddrs *ifa) -{ - // Since each item was allocated as a single chunk using the IfaddrContainer, - // all we need to do is free that. - struct ifaddrs* next; - while (ifa != NULL) { - next = ifa->ifa_next; - free(ifa); - ifa = next; - } -} - diff --git a/src/kits/network/libnetapi/AbstractSocket.cpp b/src/kits/network/libnetapi/AbstractSocket.cpp index 7d20a5d64c..b42b4af7b4 100644 --- a/src/kits/network/libnetapi/AbstractSocket.cpp +++ b/src/kits/network/libnetapi/AbstractSocket.cpp @@ -197,7 +197,7 @@ BAbstractSocket::Connect(const BNetworkAddress& peer, int type, return fInitStatus; BNetworkAddress normalized = peer; - if (connect(fSocket, &normalized.SockAddr(), normalized.Length()) != 0) { + if (connect(fSocket, normalized, normalized.Length()) != 0) { TRACE("%p: connecting to %s: %s\n", this, normalized.ToString().c_str(), strerror(errno)); return fInitStatus = errno; diff --git a/src/kits/network/libnetapi/DatagramSocket.cpp b/src/kits/network/libnetapi/DatagramSocket.cpp index 4228b0f37e..23f59ab06c 100644 --- a/src/kits/network/libnetapi/DatagramSocket.cpp +++ b/src/kits/network/libnetapi/DatagramSocket.cpp @@ -127,10 +127,9 @@ BDatagramSocket::Write(const void* buffer, size_t size) { ssize_t bytesSent; - if (!fIsConnected) { - bytesSent = sendto(Socket(), buffer, size, 0, &fPeer.SockAddr(), - fPeer.Length()); - } else + if (!fIsConnected) + bytesSent = sendto(Socket(), buffer, size, 0, fPeer, fPeer.Length()); + else bytesSent = send(Socket(), buffer, size, 0); if (bytesSent < 0) { diff --git a/src/kits/network/libnetapi/Jamfile b/src/kits/network/libnetapi/Jamfile index 643840b78e..066ceb44c6 100644 --- a/src/kits/network/libnetapi/Jamfile +++ b/src/kits/network/libnetapi/Jamfile @@ -79,6 +79,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { HttpResult.cpp HttpTime.cpp + getifaddrs.cpp notifications.cpp $(md5Sources) diff --git a/src/kits/network/libnetapi/NetworkAddress.cpp b/src/kits/network/libnetapi/NetworkAddress.cpp index 00e24d3278..d8b1e804f4 100644 --- a/src/kits/network/libnetapi/NetworkAddress.cpp +++ b/src/kits/network/libnetapi/NetworkAddress.cpp @@ -1188,12 +1188,24 @@ BNetworkAddress::operator sockaddr*() } +BNetworkAddress::operator const sockaddr*() +{ + return (sockaddr*)&fAddress; +} + + BNetworkAddress::operator sockaddr&() { return (sockaddr&)fAddress; } +BNetworkAddress::operator const sockaddr&() +{ + return (sockaddr&)fAddress; +} + + // #pragma mark - private diff --git a/src/kits/network/libnetapi/NetworkInterface.cpp b/src/kits/network/libnetapi/NetworkInterface.cpp index 3636609754..fcb0413e8d 100644 --- a/src/kits/network/libnetapi/NetworkInterface.cpp +++ b/src/kits/network/libnetapi/NetworkInterface.cpp @@ -8,25 +8,25 @@ #include #include -#include #include #include #include #include -#include #include +static int +family_from_interface_address(const BNetworkInterfaceAddress& address) +{ + if (address.Address().Family() != AF_UNSPEC) + return address.Address().Family(); + if (address.Mask().Family() != AF_UNSPEC) + return address.Mask().Family(); + if (address.Destination().Family() != AF_UNSPEC) + return address.Destination().Family(); -namespace BPrivate { - -status_t do_ifaliasreq(const char* name, int32 option, - BNetworkInterfaceAddress& address, bool readBack = false); -int family_from_interface_address(const BNetworkInterfaceAddress& address); - -}; - -using namespace BPrivate; + return AF_INET; +} static int @@ -45,6 +45,46 @@ family_from_route(const route_entry& route) } +static status_t +do_ifaliasreq(const char* name, int32 option, BNetworkInterfaceAddress& address, + bool readBack = false) +{ + int family = AF_INET; + if (!readBack) + family = family_from_interface_address(address); + + int socket = ::socket(family, SOCK_DGRAM, 0); + if (socket < 0) + return errno; + + FileDescriptorCloser closer(socket); + + ifaliasreq request; + strlcpy(request.ifra_name, name, IF_NAMESIZE); + request.ifra_index = address.Index(); + request.ifra_flags = address.Flags(); + + memcpy(&request.ifra_addr, &address.Address().SockAddr(), + address.Address().Length()); + memcpy(&request.ifra_mask, &address.Mask().SockAddr(), + address.Mask().Length()); + memcpy(&request.ifra_broadaddr, &address.Broadcast().SockAddr(), + address.Broadcast().Length()); + + if (ioctl(socket, option, &request, sizeof(struct ifaliasreq)) < 0) + return errno; + + if (readBack) { + address.SetFlags(request.ifra_flags); + address.Address().SetTo(request.ifra_addr); + address.Mask().SetTo(request.ifra_mask); + address.Broadcast().SetTo(request.ifra_broadaddr); + } + + return B_OK; +} + + static status_t do_ifaliasreq(const char* name, int32 option, const BNetworkInterfaceAddress& address) @@ -75,6 +115,65 @@ do_request(int family, T& request, const char* name, int option) // #pragma mark - +BNetworkInterfaceAddress::BNetworkInterfaceAddress() + : + fIndex(-1), + fFlags(0) +{ +} + + +BNetworkInterfaceAddress::~BNetworkInterfaceAddress() +{ +} + + +status_t +BNetworkInterfaceAddress::SetTo(const BNetworkInterface& interface, int32 index) +{ + fIndex = index; + return do_ifaliasreq(interface.Name(), B_SOCKET_GET_ALIAS, *this, true); +} + + +void +BNetworkInterfaceAddress::SetAddress(const BNetworkAddress& address) +{ + fAddress = address; +} + + +void +BNetworkInterfaceAddress::SetMask(const BNetworkAddress& mask) +{ + fMask = mask; +} + + +void +BNetworkInterfaceAddress::SetBroadcast(const BNetworkAddress& broadcast) +{ + fBroadcast = broadcast; +} + + +void +BNetworkInterfaceAddress::SetDestination(const BNetworkAddress& destination) +{ + fBroadcast = destination; +} + + +void +BNetworkInterfaceAddress::SetFlags(uint32 flags) +{ + fFlags = flags; +} + + +// #pragma mark - + + BNetworkInterface::BNetworkInterface() { Unset(); @@ -281,7 +380,7 @@ BNetworkInterface::CountAddresses() const status_t BNetworkInterface::GetAddressAt(int32 index, BNetworkInterfaceAddress& address) { - return address.SetTo(Name(), index); + return address.SetTo(*this, index); } @@ -346,7 +445,7 @@ status_t BNetworkInterface::AddAddress(const BNetworkAddress& local) { BNetworkInterfaceAddress address; - address.SetAddress(local.SockAddr()); + address.SetAddress(local); return do_ifaliasreq(Name(), B_SOCKET_ADD_ALIAS, address); } @@ -363,7 +462,8 @@ status_t BNetworkInterface::RemoveAddress(const BNetworkInterfaceAddress& address) { ifreq request; - memcpy(&request.ifr_addr, &address.Address(), address.Address().sa_len); + memcpy(&request.ifr_addr, &address.Address().SockAddr(), + address.Address().Length()); return do_request(family_from_interface_address(address), request, Name(), B_SOCKET_REMOVE_ALIAS); diff --git a/src/kits/network/libnetapi/getifaddrs.cpp b/src/kits/network/libnetapi/getifaddrs.cpp new file mode 100644 index 0000000000..575bdd5117 --- /dev/null +++ b/src/kits/network/libnetapi/getifaddrs.cpp @@ -0,0 +1,103 @@ +/* + * Copyright 2015, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Adrien Destugues, pulkomandy@pulkomandy.tk + */ + + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "compatibility/bsd/ifaddrs.h" + + +int getifaddrs(struct ifaddrs **ifap) +{ + if (ifap == NULL) { + errno = B_BAD_VALUE; + return -1; + } + + BNetworkRoster& roster = BNetworkRoster::Default(); + + uint32 cookie; + + struct ifaddrs* previous = NULL; + struct ifaddrs* current = NULL; + BNetworkInterface* interface = new(std::nothrow) BNetworkInterface(); + if (interface == NULL) { + errno = B_NO_MEMORY; + return -1; + } + + while (roster.GetNextInterface(&cookie, *interface) == B_OK) { + BNetworkInterfaceAddress address; + int32 i = 0; + while (interface->GetAddressAt(i++, address) == B_OK) { + if (interface == NULL) { + freeifaddrs(previous); + errno = B_NO_MEMORY; + return -1; + } + + current = new(std::nothrow) ifaddrs(); + if (current == NULL) { + freeifaddrs(previous); + errno = B_NO_MEMORY; + return -1; + } + + // Chain this interface with the next one + current->ifa_next = previous; + previous = current; + + current->ifa_data = interface; + current->ifa_name = interface->Name(); + // Points to the name in the BNetworkInterface instance, which + // is added as ifa_data so freeifaddrs can release it. + current->ifa_flags = address.Flags(); + current->ifa_addr = new sockaddr(address.Address().SockAddr()); + current->ifa_netmask = new sockaddr(address.Mask().SockAddr()); + current->ifa_dstaddr = new sockaddr(address.Destination().SockAddr()); + } + + interface = new(std::nothrow) BNetworkInterface(); + } + + delete interface; + *ifap = current; + + return 0; +} + + +void +freeifaddrs(struct ifaddrs *ifa) +{ + struct ifaddrs* next; + BNetworkInterface* interface = NULL; + while (ifa != NULL) { + if (ifa->ifa_data != interface) { + interface = (BNetworkInterface*)ifa->ifa_data; + delete interface; + } + + delete ifa->ifa_addr; + delete ifa->ifa_netmask; + delete ifa->ifa_dstaddr; + + next = ifa->ifa_next; + delete ifa; + ifa = next; + } +} + diff --git a/src/preferences/network/InterfacesAddOn/NetworkSettings.cpp b/src/preferences/network/InterfacesAddOn/NetworkSettings.cpp index 067da85216..5330062849 100644 --- a/src/preferences/network/InterfacesAddOn/NetworkSettings.cpp +++ b/src/preferences/network/InterfacesAddOn/NetworkSettings.cpp @@ -297,16 +297,16 @@ NetworkSettings::SetConfiguration() BNetworkInterfaceAddress interfaceConfig; fNetworkInterface->GetAddressAt(zeroAddr, interfaceConfig); - interfaceConfig.SetAddress(fAddress[inet_id].SockAddr()); - interfaceConfig.SetMask(fNetmask[inet_id].SockAddr()); + interfaceConfig.SetAddress(fAddress[inet_id]); + interfaceConfig.SetMask(fNetmask[inet_id]); fNetworkInterface->SetAddress(interfaceConfig); } else { // TODO : test this case (no address set for this protocol) printf("no zeroAddr found for %s(%d), found %" B_PRIu32 "\n", fProtocols[index].name, inet_id, zeroAddr); BNetworkInterfaceAddress interfaceConfig; - interfaceConfig.SetAddress(fAddress[inet_id].SockAddr()); - interfaceConfig.SetMask(fNetmask[inet_id].SockAddr()); + interfaceConfig.SetAddress(fAddress[inet_id]); + interfaceConfig.SetMask(fNetmask[inet_id]); fNetworkInterface->AddAddress(interfaceConfig); } diff --git a/src/servers/net/DHCPClient.cpp b/src/servers/net/DHCPClient.cpp index f159574300..850861a4cb 100644 --- a/src/servers/net/DHCPClient.cpp +++ b/src/servers/net/DHCPClient.cpp @@ -527,7 +527,7 @@ DHCPClient::_Negotiate(dhcp_state state) option = 1; setsockopt(socket, SOL_SOCKET, SO_BROADCAST, &option, sizeof(option)); - if (bind(socket, &local.SockAddr(), local.Length()) < 0) { + if (bind(socket, local, local.Length()) < 0) { close(socket); return errno; } diff --git a/src/servers/net/NetServer.cpp b/src/servers/net/NetServer.cpp index 2950dea069..f12ee8df00 100644 --- a/src/servers/net/NetServer.cpp +++ b/src/servers/net/NetServer.cpp @@ -613,12 +613,12 @@ NetServer::_ConfigureInterface(BMessage& message) if (!address.IsEmpty() || !mask.IsEmpty() || !broadcast.IsEmpty()) { BNetworkInterfaceAddress interfaceAddress; - interfaceAddress.SetAddress(address.SockAddr()); - interfaceAddress.SetMask(mask.SockAddr()); + interfaceAddress.SetAddress(address); + interfaceAddress.SetMask(mask); if (!broadcast.IsEmpty()) - interfaceAddress.SetBroadcast(broadcast.SockAddr()); + interfaceAddress.SetBroadcast(broadcast); else if (!peer.IsEmpty()) - interfaceAddress.SetDestination(peer.SockAddr()); + interfaceAddress.SetDestination(peer); status_t status = interface.SetAddress(interfaceAddress); if (status != B_OK) { @@ -949,9 +949,9 @@ NetServer::_ConfigureIPv6LinkLocal(const char* name) } BNetworkInterfaceAddress interfaceAddress; - interfaceAddress.SetAddress(localLinkAddress.SockAddr()); - interfaceAddress.SetMask(localLinkMask.SockAddr()); - interfaceAddress.SetBroadcast(localLinkMask.SockAddr()); + interfaceAddress.SetAddress(localLinkAddress); + interfaceAddress.SetMask(localLinkMask); + interfaceAddress.SetBroadcast(localLinkMask); /* TODO: Duplicate Address Detection. (DAD) Need to blast an icmp packet over the IPv6 network from :: to ensure diff --git a/src/servers/net/Services.cpp b/src/servers/net/Services.cpp index aee0ac25ca..1ccc956b43 100644 --- a/src/servers/net/Services.cpp +++ b/src/servers/net/Services.cpp @@ -274,8 +274,8 @@ Services::_StartService(struct service& service) address.socket = socket(address.family, address.type, address.protocol); if (address.socket < 0 - || bind(address.socket, &address.address.SockAddr(), - address.address.Length()) < 0 + || bind(address.socket, address.address, address.address.Length()) + < 0 || fcntl(address.socket, F_SETFD, FD_CLOEXEC) < 0) { failed = true; break;