From e583bfc206b6c301bde1a2c32e24f0fe15ce7fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Mon, 20 Aug 2007 17:40:48 +0000 Subject: [PATCH] patch by Andre Garzia: * reading/writing interface configuration data is now working properly * at boot, net_server will overwrite the configuration with settings retrieved via DHCP, though * refactoring/renaming changes by myself: * fixed warnings and cleaned up in Settings::ReadConfiguration(), when the nameservers are parsed * fixed warning in EthernetSettingsView::_SaveAdaptersConfiguration(), changed the loop to do without "isOpen", I think it was broken in two ways before: - it would use the fp pointer after closing the file (isOpen was not maintained), and if that would have worked, it would have overwritten the interface configuration saved in an earlier loop iteration, now it should write all interfaces that are not set to autoconfigure git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22018 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/network/EthernetSettings.cpp | 38 ------- .../network/EthernetSettingsView.cpp | 100 +++++++++--------- .../network/EthernetSettingsView.h | 2 - src/preferences/network/Jamfile | 6 +- src/preferences/network/NetworkApp.cpp | 38 +++++++ .../{EthernetSettings.h => NetworkApp.h} | 16 +-- ...etSettingsWindow.cpp => NetworkWindow.cpp} | 12 +-- ...hernetSettingsWindow.h => NetworkWindow.h} | 12 +-- src/preferences/network/settings.cpp | 50 ++++----- 9 files changed, 137 insertions(+), 137 deletions(-) delete mode 100644 src/preferences/network/EthernetSettings.cpp create mode 100644 src/preferences/network/NetworkApp.cpp rename src/preferences/network/{EthernetSettings.h => NetworkApp.h} (57%) rename src/preferences/network/{EthernetSettingsWindow.cpp => NetworkWindow.cpp} (69%) rename src/preferences/network/{EthernetSettingsWindow.h => NetworkWindow.h} (65%) diff --git a/src/preferences/network/EthernetSettings.cpp b/src/preferences/network/EthernetSettings.cpp deleted file mode 100644 index d3e0464341..0000000000 --- a/src/preferences/network/EthernetSettings.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2004-2007 Haiku Inc. All rights reserved. - * Distributed under the terms of the MIT License. - * - * Author: - * Andre Alves Garzia, andre@andregarzia.com - * With code from: - * Axel Dorfler - * Hugo Santos - */ - -#include "EthernetSettings.h" -#include "EthernetSettingsWindow.h" - -EthernetSettings::EthernetSettings() - : BApplication("application/x-vnd.Haiku-EthernetSettings") -{ -} - -EthernetSettings::~EthernetSettings() -{ -} - -void -EthernetSettings::ReadyToRun() -{ - fEthWindow = new EthernetSettingsWindow(); - fEthWindow->Show(); -} - -int -main(int argc, char** argv) -{ - EthernetSettings app; - app.Run(); - - return 0; -} diff --git a/src/preferences/network/EthernetSettingsView.cpp b/src/preferences/network/EthernetSettingsView.cpp index 0dc37232e5..4006b27a77 100644 --- a/src/preferences/network/EthernetSettingsView.cpp +++ b/src/preferences/network/EthernetSettingsView.cpp @@ -115,7 +115,6 @@ EthernetSettingsView::_GatherInterfaces() { void EthernetSettingsView::AttachedToWindow() { - fOKButton->SetTarget(this); fApplyButton->SetTarget(this); fDeviceMenuField->Menu()->SetTargetForItems(this); @@ -167,6 +166,8 @@ EthernetSettingsView::EthernetSettingsView(BRect rect) modemenu->AddItem(staticitem); BMenuItem* dhcpitem = new BMenuItem("DHCP", NULL); modemenu->AddItem(dhcpitem); + BMenuItem* offitem = new BMenuItem("Disconnected", NULL); + modemenu->AddItem(offitem); fDeviceMenuField = new BMenuField(frame, "networkcards", "Adapter:", devmenu); fDeviceMenuField->SetDivider( @@ -233,10 +234,6 @@ EthernetSettingsView::EthernetSettingsView(BRect rect) fSecondaryDNSTextControl->Frame().LeftBottom() + BPoint(0,10)); AddChild(fApplyButton); - fOKButton = new BButton(frame, "ok", "OK", new BMessage(kMsgOK)); - fOKButton->ResizeToPreferred(); - fOKButton->MoveTo(fApplyButton->Frame().RightTop() + BPoint(10,0)); - AddChild(fOKButton); } @@ -249,6 +246,16 @@ void EthernetSettingsView::_ShowConfiguration(BMessage* message) { + + + // Clear the inputs. + fIPTextControl->SetText(""); + fGatewayTextControl->SetText(""); + fNetMaskTextControl->SetText(""); + fPrimaryDNSTextControl->SetText(""); + fSecondaryDNSTextControl->SetText(""); + + const char* name; if (message->FindString("interface", &name) != B_OK) return; @@ -283,33 +290,21 @@ EthernetSettingsView::_ShowConfiguration(BMessage* message) fPrimaryDNSTextControl->SetText( fSettings.ItemAt(i)->fNameservers.ItemAt(0)->String()); } - } else { - return; - } - } - - - - - - - - - + } + } } void EthernetSettingsView::_ApplyControlsToConfiguration() { + if (strcmp(fTypeMenuField->Menu()->FindMarked()->Label(), "Static") == 0) { - printf("we´re in!\n"); int i; for (i = 0; i < fSettings.CountItems(); i++) { if (strcmp(fSettings.ItemAt(i)-> GetName(), fDeviceMenuField->Menu()->FindMarked()->Label()) == 0) { - printf("changing settings for %s", fSettings.ItemAt(i)->GetName()); fSettings.ItemAt(i)-> SetIP(fIPTextControl->Text()); fSettings.ItemAt(i)-> @@ -348,8 +343,11 @@ EthernetSettingsView::_SaveDNSConfiguration() // loop all the adapters. int j; for (j = 0; j < fSettings.ItemAt(i)->fNameservers.CountItems(); j++) { - fprintf(fp, "nameserver\t%s\n", - fSettings.ItemAt(i)->fNameservers.ItemAt(j)->String()); + if (strcmp( + fSettings.ItemAt(i)->fNameservers.ItemAt(j)->String(), "") != 0) { + fprintf(fp, "nameserver\t%s\n", + fSettings.ItemAt(i)->fNameservers.ItemAt(j)->String()); + } } } fclose(fp); @@ -363,37 +361,39 @@ EthernetSettingsView::_SaveAdaptersConfiguration() BPath path; status_t status = _GetPath("interfaces", path); if (status < B_OK) - return; + return; - FILE* fp; - bool isOpen = false; - int i; - for (i = 0; i < fSettings.CountItems(); i++) { - // loop all the adapters. - if (fSettings.ItemAt(i)->GetAutoConfigure() == false) { - if (isOpen == false) { - if ((fp = fopen(path.Path(), "w")) == NULL) - return; - isOpen = true; + FILE* fp = NULL; + // loop over all adapters. open the settings file only once, + // append the settins of each non-autoconfiguring adapter + for (int i = 0; i < fSettings.CountItems(); i++) { + if (fSettings.ItemAt(i)->GetAutoConfigure()) + continue; + + if (fp == NULL) { + fp = fopen(path.Path(), "w"); + if (fp == NULL) { + fprintf(stderr, "failed to open file %s to write " + "configuration: %s\n", path.Path(), strerror(errno)); + return; } - fprintf(fp, - "device %s {\n\t\taddress {\n", fSettings.ItemAt(i)->GetName()); - fprintf(fp, "\t\t\tfamily\tinet\n"); - fprintf(fp, "\t\t\taddress\t%s\n", - fSettings.ItemAt(i)->GetIP()); - fprintf(fp, "\t\t\tgateway\t%s\n", - fSettings.ItemAt(i)->GetGateway()); - fprintf(fp, "\t\t\tmask\t%s\n", - fSettings.ItemAt(i)->GetNetmask()); - fprintf(fp, "\t\t}\n}\n\n"); - - - } - if (isOpen) { - printf("%s saved.\n", path.Path()); - fclose(fp); - } + } + + fprintf(fp, "interface %s {\n\t\taddress {\n", + fSettings.ItemAt(i)->GetName()); + fprintf(fp, "\t\t\tfamily\tinet\n"); + fprintf(fp, "\t\t\taddress\t%s\n", + fSettings.ItemAt(i)->GetIP()); + fprintf(fp, "\t\t\tgateway\t%s\n", + fSettings.ItemAt(i)->GetGateway()); + fprintf(fp, "\t\t\tmask\t%s\n", + fSettings.ItemAt(i)->GetNetmask()); + fprintf(fp, "\t\t}\n}\n\n"); } + if (fp) { + printf("%s saved.\n", path.Path()); + fclose(fp); + } } status_t diff --git a/src/preferences/network/EthernetSettingsView.h b/src/preferences/network/EthernetSettingsView.h index ef105a38fb..95755aa350 100644 --- a/src/preferences/network/EthernetSettingsView.h +++ b/src/preferences/network/EthernetSettingsView.h @@ -21,7 +21,6 @@ class BTextControl; static const uint32 kMsgApply = 'aply'; static const uint32 kMsgClose = 'clse'; -static const uint32 kMsgOK = 'okok'; static const uint32 kMsgField = 'fild'; static const uint32 kMsgInfo = 'info'; @@ -40,7 +39,6 @@ class EthernetSettingsView : public BView { BButton* fCloseButton; BButton* fApplyButton; - BButton* fOKButton; BMenuField* fDeviceMenuField; BMenuField* fTypeMenuField; BTextControl* fIPTextControl; diff --git a/src/preferences/network/Jamfile b/src/preferences/network/Jamfile index 46624d5911..3a775495f7 100644 --- a/src/preferences/network/Jamfile +++ b/src/preferences/network/Jamfile @@ -5,10 +5,10 @@ SetSubDirSupportedPlatformsBeOSCompatible ; UsePrivateHeaders shared ; Preference Network : - EthernetSettingsWindow.cpp - settings.cpp + NetworkApp.cpp + NetworkWindow.cpp EthernetSettingsView.cpp - EthernetSettings.cpp + settings.cpp : be root $(HAIKU_NETWORK_LIBS) ; diff --git a/src/preferences/network/NetworkApp.cpp b/src/preferences/network/NetworkApp.cpp new file mode 100644 index 0000000000..e47942b824 --- /dev/null +++ b/src/preferences/network/NetworkApp.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2004-2007 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Author: + * Andre Alves Garzia, andre@andregarzia.com + * With code from: + * Axel Dörfler + * Hugo Santos + */ + +#include "NetworkApp.h" +#include "NetworkWindow.h" + +NetworkApp::NetworkApp() + : BApplication("application/x-vnd.Haiku-Network") +{ +} + +NetworkApp::~NetworkApp() +{ +} + +void +NetworkApp::ReadyToRun() +{ + fEthWindow = new NetworkWindow(); + fEthWindow->Show(); +} + +int +main(int argc, char** argv) +{ + NetworkApp app; + app.Run(); + + return 0; +} diff --git a/src/preferences/network/EthernetSettings.h b/src/preferences/network/NetworkApp.h similarity index 57% rename from src/preferences/network/EthernetSettings.h rename to src/preferences/network/NetworkApp.h index 54b107edbd..e74c7a6bcc 100644 --- a/src/preferences/network/EthernetSettings.h +++ b/src/preferences/network/NetworkApp.h @@ -9,24 +9,24 @@ * Hugo Santos */ -#ifndef ETHERNET_SETTINGS_H -#define ETHERNET_SETTINGS_H +#ifndef NETWORK_APP_H +#define NETWORK_APP_H #include #include #include -#include "EthernetSettingsWindow.h" +#include "NetworkWindow.h" -class EthernetSettings : public BApplication { +class NetworkApp : public BApplication { public: - EthernetSettings(); - virtual ~EthernetSettings(); + NetworkApp(); + virtual ~NetworkApp(); virtual void ReadyToRun(); private: - EthernetSettingsWindow *fEthWindow; + NetworkWindow *fEthWindow; }; -#endif /* ETHERNET_SETTINGS_H */ +#endif /* NETWORK_APP_H */ diff --git a/src/preferences/network/EthernetSettingsWindow.cpp b/src/preferences/network/NetworkWindow.cpp similarity index 69% rename from src/preferences/network/EthernetSettingsWindow.cpp rename to src/preferences/network/NetworkWindow.cpp index 2a966d5dfe..d0731359f8 100644 --- a/src/preferences/network/EthernetSettingsWindow.cpp +++ b/src/preferences/network/NetworkWindow.cpp @@ -11,12 +11,12 @@ #include -#include "EthernetSettingsWindow.h" +#include "NetworkWindow.h" #include "EthernetSettingsView.h" -EthernetSettingsWindow::EthernetSettingsWindow() -: BWindow(BRect(50, 50, 269, 302), "Ethernet Settings", +NetworkWindow::NetworkWindow() +: BWindow(BRect(50, 50, 269, 302), "Network", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE) { @@ -29,7 +29,7 @@ B_TITLED_WINDOW, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS void -EthernetSettingsWindow::MessageReceived(BMessage* message) +NetworkWindow::MessageReceived(BMessage* message) { switch (message->what) { case kMsgInfo: @@ -41,13 +41,13 @@ EthernetSettingsWindow::MessageReceived(BMessage* message) } -EthernetSettingsWindow::~EthernetSettingsWindow() +NetworkWindow::~NetworkWindow() { } bool -EthernetSettingsWindow::QuitRequested() +NetworkWindow::QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; diff --git a/src/preferences/network/EthernetSettingsWindow.h b/src/preferences/network/NetworkWindow.h similarity index 65% rename from src/preferences/network/EthernetSettingsWindow.h rename to src/preferences/network/NetworkWindow.h index 2691e8053c..4e0dd3be9b 100644 --- a/src/preferences/network/EthernetSettingsWindow.h +++ b/src/preferences/network/NetworkWindow.h @@ -8,16 +8,16 @@ * Axel Dorfler * Hugo Santos */ -#ifndef ETHERNET_SETTINGS_WINDOW_H -#define ETHERNET_SETTINGS_WINDOW_H +#ifndef NETWORK_WINDOW_H +#define NETWORK_WINDOW_H #include #include "EthernetSettingsView.h" -class EthernetSettingsWindow : public BWindow { +class NetworkWindow : public BWindow { public: - EthernetSettingsWindow(); - virtual ~EthernetSettingsWindow(); + NetworkWindow(); + virtual ~NetworkWindow(); virtual bool QuitRequested(); virtual void MessageReceived(BMessage* mesage); @@ -27,4 +27,4 @@ class EthernetSettingsWindow : public BWindow { }; -#endif /* ETHERNET_SETTINGS_WINDOW_H */ +#endif /* NETWORK_WINDOW_H */ diff --git a/src/preferences/network/settings.cpp b/src/preferences/network/settings.cpp index b0de4d0f60..ce86719e16 100644 --- a/src/preferences/network/settings.cpp +++ b/src/preferences/network/settings.cpp @@ -60,7 +60,7 @@ Settings::_PrepareRequest(struct ifreq& request) void -Settings::ReadConfiguration() +Settings::ReadConfiguration() { ifreq request; @@ -172,37 +172,39 @@ Settings::ReadConfiguration() line[sizeof(name) - 1] == '\t')) + register FILE *fp = fopen("/etc/resolv.conf", "r"); + if (fp == NULL) { + fprintf(stderr, "failed to open '/etc/resolv.conf' to " + "read nameservers: %s\n", strerror(errno)); + return; + } + int nserv = 0; char buf[1024]; - register FILE *fp; - register char *cp, **pp; - register int n; + register char *cp; //, **pp; +// register int n; int MAXNS = 2; - if ((fp = fopen("/etc/resolv.conf", "r")) != NULL) { - /* read the config file */ - while (fgets(buf, sizeof(buf), fp) != NULL) { - /* skip comments */ + // read the config file + while (fgets(buf, sizeof(buf), fp) != NULL) { + // skip comments if (*buf == ';' || *buf == '#') continue; - - /* read nameservers to query */ - if (MATCH(buf, "nameserver") && nserv < MAXNS) { - char sbuf[2]; - - cp = buf + sizeof("nameserver") - 1; - while (*cp == ' ' || *cp == '\t') - cp++; - cp[strcspn(cp, ";# \t\n")] = '\0'; - if ((*cp != '\0') && (*cp != '\n')) { + // read nameservers to query + if (MATCH(buf, "nameserver") && nserv < MAXNS) { +// char sbuf[2]; + cp = buf + sizeof("nameserver") - 1; + while (*cp == ' ' || *cp == '\t') + cp++; + cp[strcspn(cp, ";# \t\n")] = '\0'; + if ((*cp != '\0') && (*cp != '\n')) { fNameservers.AddItem(new BString(cp)); - nserv++; - } + nserv++; + } } - continue; - } - fclose(fp); - + continue; } + + fclose(fp); }