summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2002-08-14 23:55:37 (UTC)
committer mickeyl <mickeyl>2002-08-14 23:55:37 (UTC)
commitf4fb50020242275a11f4b185ff843517e0862f9b (patch) (unidiff)
tree92a0fb73206a86faea9604edcc7666b968512389
parent8951b45cfd2c0063e66d947346535f1af319d2a9 (diff)
downloadopie-f4fb50020242275a11f4b185ff843517e0862f9b.zip
opie-f4fb50020242275a11f4b185ff843517e0862f9b.tar.gz
opie-f4fb50020242275a11f4b185ff843517e0862f9b.tar.bz2
Fixed damn bug causing wirelessapplet to hang Opie if /proc/net/wireless is not found (i.e. SHARP ROM or Desktop PC)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/wirelessapplet/networkinfo.cpp28
1 files changed, 16 insertions, 12 deletions
diff --git a/noncore/applets/wirelessapplet/networkinfo.cpp b/noncore/applets/wirelessapplet/networkinfo.cpp
index dc5c3be..22d7d83 100644
--- a/noncore/applets/wirelessapplet/networkinfo.cpp
+++ b/noncore/applets/wirelessapplet/networkinfo.cpp
@@ -1,267 +1,271 @@
1/********************************************************************** 1/**********************************************************************
2** MNetwork* classes 2** MNetwork* classes
3** 3**
4** Encapsulate network information 4** Encapsulate network information
5** 5**
6** Copyright (C) 2002, Michael Lauer 6** Copyright (C) 2002, Michael Lauer
7** mickey@tm.informatik.uni-frankfurt.de 7** mickey@tm.informatik.uni-frankfurt.de
8** http://www.Vanille.de 8** http://www.Vanille.de
9** 9**
10** Based on portions of the Wireless Extensions 10** Based on portions of the Wireless Extensions
11** Copyright (c) 1997-2002 Jean Tourrilhes <jt@hpl.hp.com> 11** Copyright (c) 1997-2002 Jean Tourrilhes <jt@hpl.hp.com>
12** 12**
13** This file may be distributed and/or modified under the terms of the 13** This file may be distributed and/or modified under the terms of the
14** GNU General Public License version 2 as published by the Free Software 14** GNU General Public License version 2 as published by the Free Software
15** Foundation and appearing in the file LICENSE.GPL included in the 15** Foundation and appearing in the file LICENSE.GPL included in the
16** packaging of this file. 16** packaging of this file.
17** 17**
18** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 18** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
19** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20** 20**
21**********************************************************************/ 21**********************************************************************/
22 22
23#include "networkinfo.h" 23#include "networkinfo.h"
24 24
25#include <arpa/inet.h> 25#include <arpa/inet.h>
26#include <sys/socket.h> 26#include <sys/socket.h>
27#include <linux/if_ether.h> 27#include <linux/if_ether.h>
28#include <netinet/ip.h> 28#include <netinet/ip.h>
29#include <sys/ioctl.h> 29#include <sys/ioctl.h>
30#include <linux/wireless.h> 30#include <linux/wireless.h>
31 31
32#include <unistd.h> 32#include <unistd.h>
33#include <math.h> 33#include <math.h>
34#include <errno.h> 34#include <errno.h>
35#include <string.h> 35#include <string.h>
36 36
37#include <stdlib.h> 37#include <stdlib.h>
38 38
39#include <qstring.h> 39#include <qstring.h>
40#include <qfile.h> 40#include <qfile.h>
41#include <qtextstream.h> 41#include <qtextstream.h>
42 42
43/* estimated wireless signal strength and noise level values 43/* estimated wireless signal strength and noise level values
44 based on experimentation with Orinoco and Prism2 cards. 44 based on experimentation with Orinoco and Prism2 cards.
45 Seem to be correct, but please inform me, if you got values 45 Seem to be correct, but please inform me, if you got values
46 outside these boundaries. :Mickey: */ 46 outside these boundaries. :Mickey: */
47 47
48#define IW_UPPER 220 48#define IW_UPPER 220
49#define IW_LOWER 140 49#define IW_LOWER 140
50 50
51#define PROCNETDEV "/proc/net/dev" 51#define PROCNETDEV "/proc/net/dev"
52#define PROCNETWIRELESS "/proc/net/wireless" 52#define PROCNETWIRELESS "/proc/net/wireless"
53 53
54//--------------------------------------------------------------------------- 54//---------------------------------------------------------------------------
55// class MNetworkInterface 55// class MNetworkInterface
56// 56//
57 57
58MNetworkInterface::MNetworkInterface( const char* name ) 58MNetworkInterface::MNetworkInterface( const char* name )
59 :name( name ) 59 :name( name )
60{ 60{
61 struct ifreq ifr; 61 struct ifreq ifr;
62 struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr; 62 struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
63 fd = socket( AF_INET, SOCK_DGRAM, 0 ); 63 fd = socket( AF_INET, SOCK_DGRAM, 0 );
64} 64}
65 65
66MNetworkInterface::~MNetworkInterface() 66MNetworkInterface::~MNetworkInterface()
67{ 67{
68 if ( fd != -1 ) 68 if ( fd != -1 )
69 close( fd ); 69 close( fd );
70} 70}
71 71
72void MNetworkInterface::updateStatistics() 72void MNetworkInterface::updateStatistics()
73{ 73{
74} 74}
75 75
76//--------------------------------------------------------------------------- 76//---------------------------------------------------------------------------
77// class MWirelessNetworkInterface 77// class MWirelessNetworkInterface
78// 78//
79 79
80MWirelessNetworkInterface::MWirelessNetworkInterface( const char* n ) 80MWirelessNetworkInterface::MWirelessNetworkInterface( const char* n )
81 :MNetworkInterface( n ) 81 :MNetworkInterface( n )
82{ 82{
83 signal = 0; 83 signal = 0;
84 noise = 0; 84 noise = 0;
85 quality = 0; 85 quality = 0;
86} 86}
87 87
88MWirelessNetworkInterface::~MWirelessNetworkInterface() 88MWirelessNetworkInterface::~MWirelessNetworkInterface()
89{ 89{
90} 90}
91 91
92int MWirelessNetworkInterface::qualityPercent() 92int MWirelessNetworkInterface::qualityPercent()
93{ 93{
94 return ( quality*100 ) / 92; 94 return ( quality*100 ) / 92;
95} 95}
96 96
97int MWirelessNetworkInterface::signalPercent() 97int MWirelessNetworkInterface::signalPercent()
98{ 98{
99 return ( ( signal-IW_LOWER ) * 100 ) / IW_UPPER; 99 return ( ( signal-IW_LOWER ) * 100 ) / IW_UPPER;
100} 100}
101 101
102int MWirelessNetworkInterface::noisePercent() 102int MWirelessNetworkInterface::noisePercent()
103{ 103{
104 return ( ( noise-IW_LOWER ) * 100 ) / IW_UPPER; 104 return ( ( noise-IW_LOWER ) * 100 ) / IW_UPPER;
105} 105}
106 106
107void MWirelessNetworkInterface::updateStatistics() 107void MWirelessNetworkInterface::updateStatistics()
108{ 108{
109 MNetworkInterface::updateStatistics(); 109 MNetworkInterface::updateStatistics();
110 110
111 const char* buffer[200]; 111 const char* buffer[200];
112 112
113 struct iwreq iwr; 113 struct iwreq iwr;
114 memset( &iwr, 0, sizeof( iwr ) ); 114 memset( &iwr, 0, sizeof( iwr ) );
115 iwr.u.essid.pointer = (caddr_t) buffer; 115 iwr.u.essid.pointer = (caddr_t) buffer;
116 iwr.u.essid.length = IW_ESSID_MAX_SIZE; 116 iwr.u.essid.length = IW_ESSID_MAX_SIZE;
117 iwr.u.essid.flags = 0; 117 iwr.u.essid.flags = 0;
118 118
119 // check if it is an IEEE 802.11 standard conform 119 // check if it is an IEEE 802.11 standard conform
120 // wireless device by sending SIOCGIWESSID 120 // wireless device by sending SIOCGIWESSID
121 // which also gives back the Extended Service Set ID 121 // which also gives back the Extended Service Set ID
122 // (see IEEE 802.11 for more information) 122 // (see IEEE 802.11 for more information)
123 123
124 strcpy( iwr.ifr_ifrn.ifrn_name, (const char*) name ); 124 strcpy( iwr.ifr_ifrn.ifrn_name, (const char*) name );
125 int result = ioctl( fd, SIOCGIWESSID, &iwr ); 125 int result = ioctl( fd, SIOCGIWESSID, &iwr );
126 if ( result == 0 ) 126 if ( result == 0 )
127 { 127 {
128 hasWirelessExtensions = true; 128 hasWirelessExtensions = true;
129 iwr.u.essid.pointer[(unsigned int) iwr.u.essid.length-1] = '\0'; 129 iwr.u.essid.pointer[(unsigned int) iwr.u.essid.length-1] = '\0';
130 essid = iwr.u.essid.pointer; 130 essid = iwr.u.essid.pointer;
131 } 131 }
132 else essid = "*** Unknown ***"; 132 else essid = "*** Unknown ***";
133 133
134 // Address of associated access-point 134 // Address of associated access-point
135 135
136 result = ioctl( fd, SIOCGIWAP, &iwr ); 136 result = ioctl( fd, SIOCGIWAP, &iwr );
137 if ( result == 0 ) 137 if ( result == 0 )
138 { 138 {
139 APAddr.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", 139 APAddr.sprintf( "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
140 iwr.u.ap_addr.sa_data[0]&0xff, 140 iwr.u.ap_addr.sa_data[0]&0xff,
141 iwr.u.ap_addr.sa_data[1]&0xff, 141 iwr.u.ap_addr.sa_data[1]&0xff,
142 iwr.u.ap_addr.sa_data[2]&0xff, 142 iwr.u.ap_addr.sa_data[2]&0xff,
143 iwr.u.ap_addr.sa_data[3]&0xff, 143 iwr.u.ap_addr.sa_data[3]&0xff,
144 iwr.u.ap_addr.sa_data[4]&0xff, 144 iwr.u.ap_addr.sa_data[4]&0xff,
145 iwr.u.ap_addr.sa_data[5]&0xff ); 145 iwr.u.ap_addr.sa_data[5]&0xff );
146 } else APAddr = "*** Unknown ***"; 146 } else APAddr = "*** Unknown ***";
147 147
148 iwr.u.data.pointer = (caddr_t) buffer; 148 iwr.u.data.pointer = (caddr_t) buffer;
149 iwr.u.data.length = IW_ESSID_MAX_SIZE; 149 iwr.u.data.length = IW_ESSID_MAX_SIZE;
150 iwr.u.data.flags = 0; 150 iwr.u.data.flags = 0;
151 151
152 result = ioctl( fd, SIOCGIWNICKN, &iwr ); 152 result = ioctl( fd, SIOCGIWNICKN, &iwr );
153 if ( result == 0 ) 153 if ( result == 0 )
154 { 154 {
155 iwr.u.data.pointer[(unsigned int) iwr.u.data.length-1] = '\0'; 155 iwr.u.data.pointer[(unsigned int) iwr.u.data.length-1] = '\0';
156 nick = iwr.u.data.pointer; 156 nick = iwr.u.data.pointer;
157 } else nick = "*** Unknown ***"; 157 } else nick = "*** Unknown ***";
158 158
159 result = ioctl( fd, SIOCGIWMODE, &iwr ); 159 result = ioctl( fd, SIOCGIWMODE, &iwr );
160 if ( result == 0 ) 160 if ( result == 0 )
161 mode = ( iwr.u.mode == IW_MODE_ADHOC ) ? "Ad-Hoc" : "Managed"; 161 mode = ( iwr.u.mode == IW_MODE_ADHOC ) ? "Ad-Hoc" : "Managed";
162 else mode = "*** Unknown ***"; 162 else mode = "*** Unknown ***";
163 163
164 result = ioctl( fd, SIOCGIWFREQ, &iwr ); 164 result = ioctl( fd, SIOCGIWFREQ, &iwr );
165 if ( result == 0 ) 165 if ( result == 0 )
166 freq = double( iwr.u.freq.m ) * pow( 10, iwr.u.freq.e ) / 1000000000; 166 freq = double( iwr.u.freq.m ) * pow( 10, iwr.u.freq.e ) / 1000000000;
167 else freq = 0; 167 else freq = 0;
168 168
169 // gather link quality from /proc/net/wireless 169 // gather link quality from /proc/net/wireless
170 170
171 char c; 171 char c;
172 QString status; 172 QString status;
173 QString name; 173 QString name;
174 QFile wfile( PROCNETWIRELESS ); 174 QFile wfile( PROCNETWIRELESS );
175 wfile.open( IO_ReadOnly ); 175 bool hasFile = wfile.open( IO_ReadOnly );
176 QTextStream wstream( &wfile ); 176 QTextStream wstream( &wfile );
177 wstream.readLine(); // skip the first two lines 177 if ( hasFile )
178 wstream.readLine(); // because they only contain headers 178 {
179 179 wstream.readLine(); // skip the first two lines
180 if ( wstream.atEnd() ) 180 wstream.readLine(); // because they only contain headers
181 }
182 if ( ( !hasFile ) || ( wstream.atEnd() ) )
181 { 183 {
182 qDebug( "WIFIAPPLET: D'oh! Someone removed the card..." ); 184 qDebug( "WIFIAPPLET: D'oh! Someone removed the card..." );
183 quality = -1; 185 quality = -1;
184 signal = IW_LOWER; 186 signal = IW_LOWER;
185 noise = IW_LOWER; 187 noise = IW_LOWER;
186 return; 188 return;
187 } 189 }
188 190
189 wstream >> name >> status >> quality >> c >> signal >> c >> noise; 191 wstream >> name >> status >> quality >> c >> signal >> c >> noise;
190 192
191 if ( quality > 92 ) 193 if ( quality > 92 )
192 qDebug( "WIFIAPPLET: D'oh! Quality %d > estimated max!\n", quality ); 194 qDebug( "WIFIAPPLET: D'oh! Quality %d > estimated max!\n", quality );
193 if ( ( signal > IW_UPPER ) || ( signal < IW_LOWER ) ) 195 if ( ( signal > IW_UPPER ) || ( signal < IW_LOWER ) )
194 qDebug( "WIFIAPPLET: Doh! Strength %d > estimated max!\n", signal ); 196 qDebug( "WIFIAPPLET: Doh! Strength %d > estimated max!\n", signal );
195 if ( ( noise > IW_UPPER ) || ( noise < IW_LOWER ) ) 197 if ( ( noise > IW_UPPER ) || ( noise < IW_LOWER ) )
196 qDebug( "WIFIAPPLET: Doh! Noise %d > estimated max!\n", noise ); 198 qDebug( "WIFIAPPLET: Doh! Noise %d > estimated max!\n", noise );
197} 199}
198 200
199//--------------------------------------------------------------------------- 201//---------------------------------------------------------------------------
200// class Network 202// class Network
201// 203//
202 204
203MNetwork::MNetwork() 205MNetwork::MNetwork()
204{ 206{
205 qDebug( "MNetwork::MNetwork()" ); 207 //qDebug( "MNetwork::MNetwork()" );
206 procfile = "/proc/net/dev"; 208 procfile = PROCNETDEV;
207} 209}
208 210
209MNetwork::~MNetwork() 211MNetwork::~MNetwork()
210{ 212{
211 qDebug( "MNetwork::~MNetwork()" ); 213 //qDebug( "MNetwork::~MNetwork()" );
212} 214}
213 215
214//--------------------------------------------------------------------------- 216//---------------------------------------------------------------------------
215// class WirelessNetwork 217// class WirelessNetwork
216// 218//
217 219
218MWirelessNetwork::MWirelessNetwork() 220MWirelessNetwork::MWirelessNetwork()
219{ 221{
220 qDebug( "MWirelessNetwork::MWirelessNetwork()" ); 222 //qDebug( "MWirelessNetwork::MWirelessNetwork()" );
221 procfile = "/proc/net/wireless"; 223 procfile = PROCNETWIRELESS;
222} 224}
223 225
224MWirelessNetwork::~MWirelessNetwork() 226MWirelessNetwork::~MWirelessNetwork()
225{ 227{
226 qDebug( "MWirelessNetwork::~MWirelessNetwork()" ); 228 //qDebug( "MWirelessNetwork::~MWirelessNetwork()" );
227} 229}
228 230
229MNetworkInterface* MWirelessNetwork::createInterface( const char* n ) const 231MNetworkInterface* MWirelessNetwork::createInterface( const char* n ) const
230{ 232{
231 return new MWirelessNetworkInterface( n ); 233 return new MWirelessNetworkInterface( n );
232} 234}
233 235
234//--------------------------------------------------------------------------- 236//---------------------------------------------------------------------------
235// class NetworkInterface 237// class NetworkInterface
236// 238//
237 239
238MNetworkInterface* MNetwork::getFirstInterface() 240MNetworkInterface* MNetwork::getFirstInterface()
239{ 241{
240 enumerateInterfaces(); 242 enumerateInterfaces();
241 InterfaceMapIterator it( interfaces ); 243 InterfaceMapIterator it( interfaces );
242 return ( it.count() > 0 ) ? it.toFirst() : 0; 244 return ( it.count() > 0 ) ? it.toFirst() : 0;
243} 245}
244 246
245void MNetwork::enumerateInterfaces() 247void MNetwork::enumerateInterfaces()
246{ 248{
247 interfaces.clear(); 249 interfaces.clear();
248 QString str; 250 QString str;
249 QFile f( procfile ); 251 QFile f( procfile );
250 f.open( IO_ReadOnly ); 252 bool hasFile = f.open( IO_ReadOnly );
253 if ( !hasFile )
254 return;
251 QTextStream s( &f ); 255 QTextStream s( &f );
252 s.readLine(); 256 s.readLine();
253 s.readLine(); 257 s.readLine();
254 while ( !s.atEnd() ) 258 while ( !s.atEnd() )
255 { 259 {
256 s >> str; 260 s >> str;
257 str.truncate( str.find( ':' ) ); 261 str.truncate( str.find( ':' ) );
258 qDebug( "WIFIAPPLET: found interface '%s'", (const char*) str ); 262 qDebug( "WIFIAPPLET: found interface '%s'", (const char*) str );
259 interfaces.insert( str, createInterface( str ) ); 263 interfaces.insert( str, createInterface( str ) );
260 s.readLine(); 264 s.readLine();
261 } 265 }
262} 266}
263 267
264MNetworkInterface* MNetwork::createInterface( const char* n ) const 268MNetworkInterface* MNetwork::createInterface( const char* n ) const
265{ 269{
266 return new MNetworkInterface( n ); 270 return new MNetworkInterface( n );
267} 271}