From 530f5483207d094a8ce31cdbb5fa0ab137469692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 12 Aug 2010 13:30:39 +0000 Subject: [PATCH] * Implemented AddInterface(), and RemoveInterface(). * Added comment explaining why using AF_INET is not really a good idea. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38057 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/network/libnetapi/NetworkRoster.cpp | 36 +++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/kits/network/libnetapi/NetworkRoster.cpp b/src/kits/network/libnetapi/NetworkRoster.cpp index a10ba3e223..769a4ed074 100644 --- a/src/kits/network/libnetapi/NetworkRoster.cpp +++ b/src/kits/network/libnetapi/NetworkRoster.cpp @@ -15,6 +15,13 @@ #include +// TODO: using AF_INET for the socket isn't really a smart idea, as one +// could completely remove IPv4 support from the stack easily. +// Since in the stack, device_interfaces are pretty much interfaces now, we +// could get rid of them more or less, and make AF_LINK provide the same +// information as AF_INET for the interface functions mostly. + + BNetworkRoster BNetworkRoster::sDefault; @@ -101,16 +108,37 @@ BNetworkRoster::GetNextInterface(uint32* cookie, status_t BNetworkRoster::AddInterface(const BNetworkInterface& interface) { - // TODO: implement me - return B_NOT_SUPPORTED; + int socket = ::socket(AF_INET, SOCK_DGRAM, 0); + if (socket < 0) + return errno; + + ifaliasreq request; + memset(&request, 0, sizeof(ifaliasreq)); + strlcpy(request.ifra_name, interface.Name(), IF_NAMESIZE); + + if (ioctl(socket, SIOCAIFADDR, &request, sizeof(request)) != 0) + return errno; + + return B_OK; } status_t BNetworkRoster::RemoveInterface(const BNetworkInterface& interface) { - // TODO: implement me - return B_NOT_SUPPORTED; + int socket = ::socket(AF_INET, SOCK_DGRAM, 0); + if (socket < 0) + return errno; + + ifreq request; + strlcpy(request.ifr_name, interface.Name(), IF_NAMESIZE); + + request.ifr_addr.sa_family = AF_UNSPEC; + + if (ioctl(socket, SIOCDIFADDR, &request, sizeof(request)) != 0) + return errno; + + return B_OK; }