Author: kallisti5 Date: 2011-02-08 15:52:27 +0100 (Tue, 08 Feb 2011) New Revision: 40389 Changeset: http://dev.haiku-os.org/changeset/40389 Added: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp Log: Break the Settings class away from the network Preference applet so It can be re-written without risk of breaking the current network preference applet; the InterfacesAddon is now autonomous Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp 2011-02-08 10:59:38 UTC (rev 40388) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp 2011-02-08 14:52:27 UTC (rev 40389) @@ -16,7 +16,6 @@ #include "InterfacesAddOn.h" #include "InterfacesListView.h" -#include "NetworkWindow.h" #include <stdio.h> @@ -137,8 +136,8 @@ if (!item) break; - NetworkWindow* nw = new NetworkWindow(item->GetSettings()); - nw->Show(); + //NetworkWindow* nw = new NetworkWindow(item->GetSettings()); + //nw->Show(); break; } Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp 2011-02-08 10:59:38 UTC (rev 40388) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp 2011-02-08 14:52:27 UTC (rev 40389) @@ -32,7 +32,7 @@ #include <AutoDeleter.h> -#include "Settings.h" +#include "NetworkSettings.h" // #pragma mark - @@ -192,7 +192,6 @@ list->DrawString(v4str.String(), v4addrPt); list->DrawString("IPv6: none (auto)", v6addrPt); - // TODO : where will we keep this? } owner->PopState(); @@ -202,11 +201,12 @@ void InterfaceListItem::_Init() { - fSettings = new Settings(Name()); + fSettings = new NetworkSettings(Name()); const char* mediaTypeName = NULL; int media = fInterface.Media(); + printf("%s media = 0x%x\n", Name(), media); switch (IFM_TYPE(media)) { case IFM_ETHER: Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h 2011-02-08 10:59:38 UTC (rev 40388) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h 2011-02-08 14:52:27 UTC (rev 40389) @@ -24,7 +24,7 @@ #include <NetworkInterface.h> #include <String.h> -#include "Settings.h" +#include "NetworkSettings.h" /* GCC 3.4 and onward have a built-in "population count" @@ -64,7 +64,7 @@ return fSettings->IsDisabled();} inline void SetDisabled(bool disable) { fSettings->SetDisabled(disable);} - inline Settings* GetSettings() {return fSettings;} + inline NetworkSettings* GetSettings() {return fSettings;} private: void _Init(); @@ -75,8 +75,12 @@ BBitmap* fIconPending; BBitmap* fIconOnline; + NetworkSettings* fSettings; + // Interface configuration + BNetworkInterface fInterface; - Settings* fSettings; + // Hardware Interface + float fFirstlineOffset; float fSecondlineOffset; float fThirdlineOffset; Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile 2011-02-08 10:59:38 UTC (rev 40388) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile 2011-02-08 14:52:27 UTC (rev 40389) @@ -1,7 +1,6 @@ SubDir HAIKU_TOP src tests kits net preflet InterfacesAddOn ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ] ; -SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src preferences network ] ; UseHeaders [ FDirName $(HAIKU_TOP) src tests kits net preflet ] ; UseHeaders [ FDirName $(HAIKU_TOP) src servers net ] : true ; @@ -17,12 +16,8 @@ Addon Interfaces : InterfacesAddOn.cpp InterfacesListView.cpp - NetworkWindow.cpp + NetworkSettings.cpp - # from src/preferences/network - EthernetSettingsView.cpp - Settings.cpp - # from src/apps/networkstatus RadioView.cpp WirelessNetworkMenuItem.cpp Copied: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp (from rev 40374, haiku/trunk/src/preferences/network/Settings.cpp) =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp (rev 0) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp 2011-02-08 14:52:27 UTC (rev 40389) @@ -0,0 +1,221 @@ +/* + * Copyright 2004-2010 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Andre Alves Garzia, andre@xxxxxxxxxxxxxxx + * Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx + * Vegard Wærp, vegarwa@xxxxxxxxx + */ + + +#include "NetworkSettings.h" + +#include <arpa/inet.h> +#include <errno.h> +#include <net/if.h> +#include <netinet/in.h> +#include <resolv.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <unistd.h> + +#include <driver_settings.h> +#include <File.h> +#include <FindDirectory.h> +#include <Path.h> +#include <String.h> + +#include <AutoDeleter.h> + + +NetworkSettings::NetworkSettings(const char* name) + : + fAuto(true), + fDisabled(false), + fNameServers(5, true) +{ + fSocket = socket(AF_INET, SOCK_DGRAM, 0); + + fName = name; + + ReadConfiguration(); +} + + +NetworkSettings::~NetworkSettings() +{ + close(fSocket); +} + + +bool +NetworkSettings::_PrepareRequest(struct ifreq& request) +{ + // This function is used for talking direct to the stack. + // It´s used by _ShowConfiguration. + + const char* name = fName.String(); + + if (strlen(name) > IF_NAMESIZE) + return false; + + strcpy(request.ifr_name, name); + return true; +} + + +void +NetworkSettings::ReadConfiguration() +{ + ifreq request; + if (!_PrepareRequest(request)) + return; + + BString text = "dummy"; + char address[32]; + sockaddr_in* inetAddress = NULL; + + // Obtain IP. + if (ioctl(fSocket, SIOCGIFADDR, &request, sizeof(request)) < 0) + return; + + inetAddress = (sockaddr_in*)&request.ifr_addr; + if (inet_ntop(AF_INET, &inetAddress->sin_addr, address, + sizeof(address)) == NULL) { + return; + } + + fIP = address; + + // Obtain netmask. + if (ioctl(fSocket, SIOCGIFNETMASK, &request, sizeof(request)) < 0) + return; + + inetAddress = (sockaddr_in*)&request.ifr_mask; + if (inet_ntop(AF_INET, &inetAddress->sin_addr, address, + sizeof(address)) == NULL) { + return; + } + + fNetmask = address; + + // Obtain gateway + ifconf config; + config.ifc_len = sizeof(config.ifc_value); + if (ioctl(fSocket, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0) + return; + + uint32 size = (uint32)config.ifc_value; + if (size == 0) + return; + + void* buffer = malloc(size); + if (buffer == NULL) + return; + + MemoryDeleter bufferDeleter(buffer); + config.ifc_len = size; + config.ifc_buf = buffer; + + if (ioctl(fSocket, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0) + return; + + ifreq* interface = (ifreq*)buffer; + ifreq* end = (ifreq*)((uint8*)buffer + size); + + while (interface < end) { + route_entry& route = interface->ifr_route; + + if ((route.flags & RTF_GATEWAY) != 0) { + inetAddress = (sockaddr_in*)route.gateway; + fGateway = inet_ntoa(inetAddress->sin_addr); + } + + int32 addressSize = 0; + if (route.destination != NULL) + addressSize += route.destination->sa_len; + if (route.mask != NULL) + addressSize += route.mask->sa_len; + if (route.gateway != NULL) + addressSize += route.gateway->sa_len; + + interface = (ifreq *)((addr_t)interface + IF_NAMESIZE + + sizeof(route_entry) + addressSize); + } + + uint32 flags = 0; + if (ioctl(fSocket, SIOCGIFFLAGS, &request, sizeof(struct ifreq)) == 0) + flags = request.ifr_flags; + + fAuto = (flags & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; + fDisabled = (flags & IFF_UP) == 0; + + // Read wireless network from interfaces + + fWirelessNetwork.SetTo(NULL); + + BPath path; + find_directory(B_COMMON_SETTINGS_DIRECTORY, &path); + path.Append("network"); + path.Append("interfaces"); + + void* handle = load_driver_settings(path.Path()); + if (handle != NULL) { + const driver_settings* settings = get_driver_settings(handle); + if (settings != NULL) { + for (int32 i = 0; i < settings->parameter_count; i++) { + driver_parameter& top = settings->parameters[i]; + if (!strcmp(top.name, "interface")) { + // The name of the interface can either be the value of + // the "interface" parameter, or a separate "name" parameter + const char* name = NULL; + if (top.value_count > 0) { + name = top.values[0]; + if (fName != name) + continue; + } + + // search "network" parameter + for (int32 j = 0; j < top.parameter_count; j++) { + driver_parameter& sub = top.parameters[j]; + if (name == NULL && !strcmp(sub.name, "name") + && sub.value_count > 0) { + name = sub.values[0]; + if (fName != sub.values[0]) + break; + } + + if (!strcmp(sub.name, "network") + && sub.value_count > 0) { + fWirelessNetwork.SetTo(sub.values[0]); + break; + } + } + + // We found our interface + if (fName == name) + break; + } + } + } + unload_driver_settings(handle); + } + + // read resolv.conf for the dns. + fNameServers.MakeEmpty(); + + res_init(); + res_state state = __res_state(); + + if (state != NULL) { + for (int i = 0; i < state->nscount; i++) { + fNameServers.AddItem( + new BString(inet_ntoa(state->nsaddr_list[i].sin_addr))); + } + fDomain = state->dnsrch[0]; + } +} Copied: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h (from rev 40374, haiku/trunk/src/preferences/network/Settings.h) =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h (rev 0) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h 2011-02-08 14:52:27 UTC (rev 40389) @@ -0,0 +1,66 @@ +/* + * Copyright 2004-2010 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Andre Alves Garzia, andre@xxxxxxxxxxxxxxx + * Vegard Wærp, vegarwa@xxxxxxxxx + */ +#ifndef SETTINGS_H +#define SETTINGS_H + + +#include <ObjectList.h> +#include <String.h> + + +class NetworkSettings { +public: + NetworkSettings(const char* name); + virtual ~NetworkSettings(); + + void SetIP(const BString& ip) + { fIP = ip; } + void SetGateway(const BString& ip) + { fGateway = ip; } + void SetNetmask(const BString& ip) + { fNetmask = ip; } + void SetDomain(const BString& domain) + { fDomain = domain; } + void SetAutoConfigure(bool autoConfigure) + { fAuto = autoConfigure; } + void SetDisabled(bool disabled) + { fDisabled = disabled; } + void SetWirelessNetwork(const char* name) + { fWirelessNetwork.SetTo(name); } + + const char* IP() { return fIP.String(); } + const char* Gateway() { return fGateway.String(); } + const char* Netmask() { return fNetmask.String(); } + const char* Name() { return fName.String(); } + const char* Domain() { return fDomain.String(); } + bool AutoConfigure() { return fAuto; } + bool IsDisabled() { return fDisabled; } + const BString& WirelessNetwork() { return fWirelessNetwork; } + + BObjectList<BString>& NameServers() { return fNameServers; } + + void ReadConfiguration(); + +private: + bool _PrepareRequest(struct ifreq& request); + + BString fIP; + BString fGateway; + BString fNetmask; + BString fName; + BString fDomain; + int fSocket; + bool fAuto; + bool fDisabled; + BObjectList<BString> fNameServers; + BString fWirelessNetwork; +}; + + +#endif /* SETTINGS_H */ Modified: haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp =================================================================== --- haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp 2011-02-08 10:59:38 UTC (rev 40388) +++ haiku/trunk/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp 2011-02-08 14:52:27 UTC (rev 40389) @@ -13,10 +13,10 @@ #include <GroupLayout.h> #include "EthernetSettingsView.h" -#include "Settings.h" +#include "NetworkSettings.h" -NetworkWindow::NetworkWindow(Settings* settings) +NetworkWindow::NetworkWindow(NetworkSettings* settings) : BWindow(BRect(50, 50, 269, 302), "Network", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS)