summaryrefslogtreecommitdiff
authorkergoth <kergoth>2003-04-14 17:14:45 (UTC)
committer kergoth <kergoth>2003-04-14 17:14:45 (UTC)
commit4c0ff8a1bdc4750ee36c713392d0842e9eb9eeb3 (patch) (unidiff)
tree86648bb91854c4c94ddabff7c4b57aa5215a1073
parent1b4605559dfb77f2bb69903d7e6a982c764aadbe (diff)
downloadopie-4c0ff8a1bdc4750ee36c713392d0842e9eb9eeb3.zip
opie-4c0ff8a1bdc4750ee36c713392d0842e9eb9eeb3.tar.gz
opie-4c0ff8a1bdc4750ee36c713392d0842e9eb9eeb3.tar.bz2
BUGFIX: obtaining a network interface list via an ioctl does not always
return all available interfaces. Per busybox ifconfig, use /proc/net/dev as a preferred interface list if it exists, and fall back to the ioctl method if it does not.
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/settings/networksettings/mainwindowimp.cpp79
1 files changed, 48 insertions, 31 deletions
diff --git a/noncore/settings/networksettings/mainwindowimp.cpp b/noncore/settings/networksettings/mainwindowimp.cpp
index 765b522..50131d8 100644
--- a/noncore/settings/networksettings/mainwindowimp.cpp
+++ b/noncore/settings/networksettings/mainwindowimp.cpp
@@ -39,14 +39,16 @@
39#include <qfile.h> 39#include <qfile.h>
40#include <qtextstream.h> 40#include <qtextstream.h>
41#include <qregexp.h> 41#include <qregexp.h>
42 42
43#include <net/if.h> 43#include <net/if.h>
44#include <sys/ioctl.h> 44#include <sys/ioctl.h>
45#include <sys/socket.h>
45 46
46#define DEFAULT_SCHEME "/var/lib/pcmcia/scheme" 47#define DEFAULT_SCHEME "/var/lib/pcmcia/scheme"
48#define _PROCNETDEV "/proc/net/dev"
47 49
48MainWindowImp::MainWindowImp(QWidget *parent, const char *name) : MainWindow(parent, name), advancedUserMode(true), scheme(DEFAULT_SCHEME){ 50MainWindowImp::MainWindowImp(QWidget *parent, const char *name) : MainWindow(parent, name), advancedUserMode(true), scheme(DEFAULT_SCHEME){
49 connect(addConnectionButton, SIGNAL(clicked()), this, SLOT(addClicked())); 51 connect(addConnectionButton, SIGNAL(clicked()), this, SLOT(addClicked()));
50 connect(removeConnectionButton, SIGNAL(clicked()), this, SLOT(removeClicked())); 52 connect(removeConnectionButton, SIGNAL(clicked()), this, SLOT(removeClicked()));
51 connect(informationConnectionButton, SIGNAL(clicked()), this, SLOT(informationClicked())); 53 connect(informationConnectionButton, SIGNAL(clicked()), this, SLOT(informationClicked()));
52 connect(configureConnectionButton, SIGNAL(clicked()), this, SLOT(configureClicked())); 54 connect(configureConnectionButton, SIGNAL(clicked()), this, SLOT(configureClicked()));
@@ -144,44 +146,61 @@ MainWindowImp::~MainWindowImp(){
144} 146}
145 147
146/** 148/**
147 * Query the kernel for all of the interfaces. 149 * Query the kernel for all of the interfaces.
148 */ 150 */
149void MainWindowImp::getAllInterfaces(){ 151void MainWindowImp::getAllInterfaces(){
150 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 152 int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
151 if(sockfd == -1) 153 if(sockfd == -1)
152 return; 154 return;
153 155
154 char buf[8*1024]; 156 struct ifreq ifr;
157 QStringList ifaces;
158 QFile procFile(QString(_PROCNETDEV));
159 int result;
160
161 if (! procFile.exists()) {
162 struct ifreq ifrs[100];
155 struct ifconf ifc; 163 struct ifconf ifc;
156 ifc.ifc_len = sizeof(buf); 164 ifc.ifc_len = sizeof(ifrs);
157 ifc.ifc_req = (struct ifreq *) buf; 165 ifc.ifc_req = ifrs;
158 int result=ioctl(sockfd, SIOCGIFCONF, &ifc); 166 result = ioctl(sockfd, SIOCGIFCONF, &ifc);
159 167
160 for (char* ptr = buf; ptr < buf + ifc.ifc_len; ){ 168 for (unsigned int i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++) {
161 struct ifreq *ifr =(struct ifreq *) ptr; 169 struct ifreq *pifr = &ifrs[i];
162 int len = sizeof(struct sockaddr); 170
163#ifdef HAVE_SOCKADDR_SA_LEN 171 ifaces += pifr->ifr_name;
164 if (ifr->ifr_addr.sa_len > len) 172 }
165 len = ifr->ifr_addr.sa_len; /* length > 16 */ 173 } else {
166#endif 174 procFile.open(IO_ReadOnly);
167 ptr += sizeof(ifr->ifr_name) + len; /* for next one in buffer */ 175 QString line;
176 QTextStream procTs(&procFile);
177 int loc = -1;
178
179 procTs.readLine(); // eat a line
180 procTs.readLine(); // eat a line
181 while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) {
182 if((loc = line.find(":")) != -1) {
183 ifaces += line.left(loc);
184 }
185 }
186 }
168 187
169 int flags; 188 for (QStringList::Iterator it = ifaces.begin(); it != ifaces.end(); ++it) {
170 struct sockaddr_in *sinptr; 189 int flags = 0, family;
171 Interface *i = NULL; 190 Interface *i = NULL;
172 switch (ifr->ifr_addr.sa_family){ 191
173 case AF_INET: 192 strcpy(ifr.ifr_name, (*it).latin1());
174 sinptr = (struct sockaddr_in *) &ifr->ifr_addr; 193
175 flags=0; 194 qWarning("ifr.ifr_name=%s\n", ifr.ifr_name);
176 195
177 struct ifreq ifcopy; 196 struct ifreq ifcopy;
178 ifcopy=*ifr; 197 ifcopy = ifr;
179 result=ioctl(sockfd,SIOCGIFFLAGS,&ifcopy); 198 result=ioctl(sockfd,SIOCGIFFLAGS,&ifcopy);
180 flags=ifcopy.ifr_flags; 199 flags=ifcopy.ifr_flags;
181 i = new Interface(this, ifr->ifr_name, false); 200 i = new Interface(this, ifr.ifr_name, false);
182 i->setAttached(true); 201 i->setAttached(true);
183 if ((flags & IFF_UP) == IFF_UP) 202 if ((flags & IFF_UP) == IFF_UP)
184 i->setStatus(true); 203 i->setStatus(true);
185 else 204 else
186 i->setStatus(false); 205 i->setStatus(false);
187 206
@@ -193,22 +212,16 @@ void MainWindowImp::getAllInterfaces(){
193 i->setHardwareName("Multicast"); 212 i->setHardwareName("Multicast");
194 else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK) 213 else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK)
195 i->setHardwareName("Loopback"); 214 i->setHardwareName("Loopback");
196 else 215 else
197 i->setHardwareName("Unknown"); 216 i->setHardwareName("Unknown");
198 217
218 qWarning("Adding interface %s to interfaceNames\n", ifr.ifr_name);
199 interfaceNames.insert(i->getInterfaceName(), i); 219 interfaceNames.insert(i->getInterfaceName(), i);
200 updateInterface(i); 220 updateInterface(i);
201 connect(i, SIGNAL(updateInterface(Interface *)), this, SLOT(updateInterface(Interface *))); 221 connect(i, SIGNAL(updateInterface(Interface *)), this, SLOT(updateInterface(Interface *)));
202 break;
203
204 default:
205 qDebug(ifr->ifr_name);
206 qDebug(QString("%1").arg(ifr->ifr_addr.sa_family).latin1());
207 break;
208 }
209 } 222 }
210} 223}
211 224
212/** 225/**
213 * Load all modules that are found in the path 226 * Load all modules that are found in the path
214 * @param path a directory that is scaned for any plugins that can be loaded 227 * @param path a directory that is scaned for any plugins that can be loaded
@@ -225,13 +238,17 @@ void MainWindowImp::loadModules(const QString &path){
225 // Don't want sym links 238 // Don't want sym links
226 d.setFilter( QDir::Files | QDir::NoSymLinks ); 239 d.setFilter( QDir::Files | QDir::NoSymLinks );
227 const QFileInfoList *list = d.entryInfoList(); 240 const QFileInfoList *list = d.entryInfoList();
228 QFileInfoListIterator it( *list ); 241 QFileInfoListIterator it( *list );
229 QFileInfo *fi; 242 QFileInfo *fi;
230 while ( (fi=it.current()) ) { 243 while ( (fi=it.current()) ) {
244#ifdef QWS
245 if(fi->fileName().contains(".so")){
246#else
231 if(fi->fileName().contains(".so") && fi->fileName().contains("networksettings_")){ 247 if(fi->fileName().contains(".so") && fi->fileName().contains("networksettings_")){
248#endif
232 loadPlugin(path + "/" + fi->fileName()); 249 loadPlugin(path + "/" + fi->fileName());
233 } 250 }
234 ++it; 251 ++it;
235 } 252 }
236} 253}
237 254
@@ -240,20 +257,20 @@ void MainWindowImp::loadModules(const QString &path){
240 * @param pluginFileName - the name of the file in which to attempt to load 257 * @param pluginFileName - the name of the file in which to attempt to load
241 * @param resolveString - function pointer to resolve 258 * @param resolveString - function pointer to resolve
242 * @return pointer to the function with name resolveString or NULL 259 * @return pointer to the function with name resolveString or NULL
243 */ 260 */
244Module* MainWindowImp::loadPlugin(const QString &pluginFileName, const QString &resolveString){ 261Module* MainWindowImp::loadPlugin(const QString &pluginFileName, const QString &resolveString){
245#ifdef DEBUG 262#ifdef DEBUG
246 qDebug("MainWindowImp::loadPlugin: %s", pluginFileName.latin1()); 263 qDebug("MainWindowImp::loadPlugin: %s: resolving %s", pluginFileName.latin1(), resolveString.latin1());
247#endif 264#endif
248#ifdef QWS 265#ifdef QWS
249 QLibrary *lib = new QLibrary(pluginFileName); 266 QLibrary *lib = new QLibrary(pluginFileName);
250 void *functionPointer = lib->resolve(resolveString); 267 void *functionPointer = lib->resolve(resolveString);
251 if( !functionPointer ){ 268 if( !functionPointer ){
252#ifdef DEBUG 269#ifdef DEBUG
253 qDebug("MainWindowImp::loadPlugin: File: %s is not a plugin, but though was.", pluginFileName.latin1()); 270 qDebug("MainWindowImp::loadPlugin: Warning: %s is not a plugin", pluginFileName.latin1());
254#endif 271#endif
255 delete lib; 272 delete lib;
256 return NULL; 273 return NULL;
257 } 274 }
258 // Try to get an object. 275 // Try to get an object.
259 Module *object = ((Module* (*)()) functionPointer)(); 276 Module *object = ((Module* (*)()) functionPointer)();