summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings/mainwindowimp.cpp125
1 files changed, 71 insertions, 54 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
@@ -42,8 +42,10 @@
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()));
@@ -147,65 +149,76 @@ MainWindowImp::~MainWindowImp(){
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;
155 struct ifconf ifc; 157 QStringList ifaces;
156 ifc.ifc_len = sizeof(buf); 158 QFile procFile(QString(_PROCNETDEV));
157 ifc.ifc_req = (struct ifreq *) buf; 159 int result;
158 int result=ioctl(sockfd, SIOCGIFCONF, &ifc); 160
159 161 if (! procFile.exists()) {
160 for (char* ptr = buf; ptr < buf + ifc.ifc_len; ){ 162 struct ifreq ifrs[100];
161 struct ifreq *ifr =(struct ifreq *) ptr; 163 struct ifconf ifc;
162 int len = sizeof(struct sockaddr); 164 ifc.ifc_len = sizeof(ifrs);
163#ifdef HAVE_SOCKADDR_SA_LEN 165 ifc.ifc_req = ifrs;
164 if (ifr->ifr_addr.sa_len > len) 166 result = ioctl(sockfd, SIOCGIFCONF, &ifc);
165 len = ifr->ifr_addr.sa_len; /* length > 16 */ 167
166#endif 168 for (unsigned int i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++) {
167 ptr += sizeof(ifr->ifr_name) + len; /* for next one in buffer */ 169 struct ifreq *pifr = &ifrs[i];
170
171 ifaces += pifr->ifr_name;
172 }
173 } else {
174 procFile.open(IO_ReadOnly);
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){
173 case AF_INET:
174 sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
175 flags=0;
176
177 struct ifreq ifcopy;
178 ifcopy=*ifr;
179 result=ioctl(sockfd,SIOCGIFFLAGS,&ifcopy);
180 flags=ifcopy.ifr_flags;
181 i = new Interface(this, ifr->ifr_name, false);
182 i->setAttached(true);
183 if ((flags & IFF_UP) == IFF_UP)
184 i->setStatus(true);
185 else
186 i->setStatus(false);
187
188 if ((flags & IFF_BROADCAST) == IFF_BROADCAST)
189 i->setHardwareName("Ethernet");
190 else if ((flags & IFF_POINTOPOINT) == IFF_POINTOPOINT)
191 i->setHardwareName("Point to Point");
192 else if ((flags & IFF_MULTICAST) == IFF_MULTICAST)
193 i->setHardwareName("Multicast");
194 else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK)
195 i->setHardwareName("Loopback");
196 else
197 i->setHardwareName("Unknown");
198 191
199 interfaceNames.insert(i->getInterfaceName(), i); 192 strcpy(ifr.ifr_name, (*it).latin1());
200 updateInterface(i);
201 connect(i, SIGNAL(updateInterface(Interface *)), this, SLOT(updateInterface(Interface *)));
202 break;
203 193
204 default: 194 qWarning("ifr.ifr_name=%s\n", ifr.ifr_name);
205 qDebug(ifr->ifr_name); 195
206 qDebug(QString("%1").arg(ifr->ifr_addr.sa_family).latin1()); 196 struct ifreq ifcopy;
207 break; 197 ifcopy = ifr;
208 } 198 result = ioctl(sockfd, SIOCGIFFLAGS, &ifcopy);
199 flags = ifcopy.ifr_flags;
200 i = new Interface(this, ifr.ifr_name, false);
201 i->setAttached(true);
202 if ((flags & IFF_UP) == IFF_UP)
203 i->setStatus(true);
204 else
205 i->setStatus(false);
206
207 if ((flags & IFF_BROADCAST) == IFF_BROADCAST)
208 i->setHardwareName("Ethernet");
209 else if ((flags & IFF_POINTOPOINT) == IFF_POINTOPOINT)
210 i->setHardwareName("Point to Point");
211 else if ((flags & IFF_MULTICAST) == IFF_MULTICAST)
212 i->setHardwareName("Multicast");
213 else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK)
214 i->setHardwareName("Loopback");
215 else
216 i->setHardwareName("Unknown");
217
218 qWarning("Adding interface %s to interfaceNames\n", ifr.ifr_name);
219 interfaceNames.insert(i->getInterfaceName(), i);
220 updateInterface(i);
221 connect(i, SIGNAL(updateInterface(Interface *)), this, SLOT(updateInterface(Interface *)));
209 } 222 }
210} 223}
211 224
@@ -228,7 +241,11 @@ void MainWindowImp::loadModules(const QString &path){
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;
@@ -243,14 +260,14 @@ void MainWindowImp::loadModules(const QString &path){
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;