summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2003-04-04 23:20:06 (UTC)
committer mickeyl <mickeyl>2003-04-04 23:20:06 (UTC)
commite4c19111590664371c359878e5c79428bc7b02c9 (patch) (unidiff)
tree359c86228f9587415e60ffa1f6614e7e2cbc0153
parent998e0da2ba2823f6048f420d69386b2265247e81 (diff)
downloadopie-e4c19111590664371c359878e5c79428bc7b02c9.zip
opie-e4c19111590664371c359878e5c79428bc7b02c9.tar.gz
opie-e4c19111590664371c359878e5c79428bc7b02c9.tar.bz2
fix segfault due to giving a QString as opposed to a char* as the Qbject name
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/onetwork.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index 6a363d7..f52279a 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -1,371 +1,371 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34/* OPIE */ 34/* OPIE */
35 35
36#include <opie2/onetwork.h> 36#include <opie2/onetwork.h>
37 37
38/* QT */ 38/* QT */
39 39
40#include <qfile.h> 40#include <qfile.h>
41#include <qtextstream.h> 41#include <qtextstream.h>
42 42
43/* UNIX */ 43/* UNIX */
44 44
45#include <arpa/inet.h> 45#include <arpa/inet.h>
46#include <cerrno> 46#include <cerrno>
47#include <cstring> 47#include <cstring>
48#include <cstdlib> 48#include <cstdlib>
49#include <math.h> 49#include <math.h>
50#include <sys/ioctl.h> 50#include <sys/ioctl.h>
51#include <sys/socket.h> 51#include <sys/socket.h>
52#include <sys/types.h> 52#include <sys/types.h>
53#include <unistd.h> 53#include <unistd.h>
54#include <linux/sockios.h> 54#include <linux/sockios.h>
55#include <net/if_arp.h> 55#include <net/if_arp.h>
56#include <stdarg.h> 56#include <stdarg.h>
57 57
58using namespace std; 58using namespace std;
59 59
60/*====================================================================================== 60/*======================================================================================
61 * ONetwork 61 * ONetwork
62 *======================================================================================*/ 62 *======================================================================================*/
63 63
64ONetwork* ONetwork::_instance = 0; 64ONetwork* ONetwork::_instance = 0;
65 65
66ONetwork::ONetwork() 66ONetwork::ONetwork()
67{ 67{
68 qDebug( "ONetwork::ONetwork()" ); 68 qDebug( "ONetwork::ONetwork()" );
69 synchronize(); 69 synchronize();
70} 70}
71 71
72void ONetwork::synchronize() 72void ONetwork::synchronize()
73{ 73{
74 // gather available interfaces by inspecting /proc/net/dev 74 // gather available interfaces by inspecting /proc/net/dev
75 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices 75 //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices
76 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices 76 //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices
77 77
78 _interfaces.clear(); 78 _interfaces.clear();
79 QString str; 79 QString str;
80 QFile f( "/proc/net/dev" ); 80 QFile f( "/proc/net/dev" );
81 bool hasFile = f.open( IO_ReadOnly ); 81 bool hasFile = f.open( IO_ReadOnly );
82 if ( !hasFile ) 82 if ( !hasFile )
83 { 83 {
84 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" ); 84 qDebug( "ONetwork: /proc/net/dev not existing. No network devices available" );
85 return; 85 return;
86 } 86 }
87 QTextStream s( &f ); 87 QTextStream s( &f );
88 s.readLine(); 88 s.readLine();
89 s.readLine(); 89 s.readLine();
90 while ( !s.atEnd() ) 90 while ( !s.atEnd() )
91 { 91 {
92 s >> str; 92 s >> str;
93 str.truncate( str.find( ':' ) ); 93 str.truncate( str.find( ':' ) );
94 qDebug( "ONetwork: found interface '%s'", (const char*) str ); 94 qDebug( "ONetwork: found interface '%s'", (const char*) str );
95 ONetworkInterface* iface; 95 ONetworkInterface* iface;
96 if ( isWirelessInterface( str ) ) 96 if ( isWirelessInterface( str ) )
97 { 97 {
98 iface = new OWirelessNetworkInterface( this, str ); 98 iface = new OWirelessNetworkInterface( this, (const char*) str );
99 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); 99 qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str );
100 } 100 }
101 else 101 else
102 { 102 {
103 iface = new ONetworkInterface( this, str ); 103 iface = new ONetworkInterface( this, (const char*) str );
104 } 104 }
105 _interfaces.insert( str, iface ); 105 _interfaces.insert( str, iface );
106 s.readLine(); 106 s.readLine();
107 } 107 }
108} 108}
109 109
110 110
111ONetworkInterface* ONetwork::interface( QString iface ) const 111ONetworkInterface* ONetwork::interface( QString iface ) const
112{ 112{
113 return _interfaces[iface]; 113 return _interfaces[iface];
114} 114}
115 115
116 116
117ONetwork* ONetwork::instance() 117ONetwork* ONetwork::instance()
118{ 118{
119 if ( !_instance ) _instance = new ONetwork(); 119 if ( !_instance ) _instance = new ONetwork();
120 return _instance; 120 return _instance;
121} 121}
122 122
123 123
124ONetwork::InterfaceIterator ONetwork::iterator() const 124ONetwork::InterfaceIterator ONetwork::iterator() const
125{ 125{
126 return ONetwork::InterfaceIterator( _interfaces ); 126 return ONetwork::InterfaceIterator( _interfaces );
127} 127}
128 128
129 129
130bool ONetwork::isWirelessInterface( const char* name ) const 130bool ONetwork::isWirelessInterface( const char* name ) const
131{ 131{
132 int sfd = socket( AF_INET, SOCK_STREAM, 0 ); 132 int sfd = socket( AF_INET, SOCK_STREAM, 0 );
133 struct iwreq iwr; 133 struct iwreq iwr;
134 memset( &iwr, 0, sizeof( struct iwreq ) ); 134 memset( &iwr, 0, sizeof( struct iwreq ) );
135 strcpy( (char*) &iwr.ifr_name, name ); 135 strcpy( (char*) &iwr.ifr_name, name );
136 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr ); 136 int result = ::ioctl( sfd, SIOCGIWNAME, &iwr );
137 return result != -1; 137 return result != -1;
138} 138}
139 139
140/*====================================================================================== 140/*======================================================================================
141 * ONetworkInterface 141 * ONetworkInterface
142 *======================================================================================*/ 142 *======================================================================================*/
143 143
144ONetworkInterface::ONetworkInterface( QObject* parent, const char* name ) 144ONetworkInterface::ONetworkInterface( QObject* parent, const char* name )
145 :QObject( parent, name ), 145 :QObject( parent, name ),
146 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 ) 146 _sfd( socket( AF_INET, SOCK_DGRAM, 0 ) ), _mon( 0 )
147{ 147{
148 qDebug( "ONetworkInterface::ONetworkInterface()" ); 148 qDebug( "ONetworkInterface::ONetworkInterface()" );
149 init(); 149 init();
150} 150}
151 151
152 152
153struct ifreq& ONetworkInterface::ifr() const 153struct ifreq& ONetworkInterface::ifr() const
154{ 154{
155 return _ifr; 155 return _ifr;
156} 156}
157 157
158 158
159void ONetworkInterface::init() 159void ONetworkInterface::init()
160{ 160{
161 qDebug( "ONetworkInterface::init()" ); 161 qDebug( "ONetworkInterface::init()" );
162 162
163 memset( &_ifr, 0, sizeof( struct ifreq ) ); 163 memset( &_ifr, 0, sizeof( struct ifreq ) );
164 164
165 if ( _sfd == -1 ) 165 if ( _sfd == -1 )
166 { 166 {
167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", name() ); 167 qDebug( "ONetworkInterface::init(): Warning - can't get socket for device '%s'", name() );
168 return; 168 return;
169 } 169 }
170} 170}
171 171
172 172
173bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const 173bool ONetworkInterface::ioctl( int call, struct ifreq& ifreq ) const
174{ 174{
175 int result = ::ioctl( _sfd, call, &ifreq ); 175 int result = ::ioctl( _sfd, call, &ifreq );
176 if ( result == -1 ) 176 if ( result == -1 )
177 qDebug( "ONetworkInterface::ioctl(): Call %d - Status: Failed: %d (%s)", call, result, strerror( errno ) ); 177 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) );
178 else 178 else
179 qDebug( "ONetworkInterface::ioctl(): Call %d - Status: Ok.", call ); 179 qDebug( "ONetworkInterface::ioctl (%s) call %d - Status: Ok.", name(), call );
180 return ( result != -1 ); 180 return ( result != -1 );
181} 181}
182 182
183 183
184bool ONetworkInterface::ioctl( int call ) const 184bool ONetworkInterface::ioctl( int call ) const
185{ 185{
186 strcpy( _ifr.ifr_name, name() ); 186 strcpy( _ifr.ifr_name, name() );
187 return ioctl( call, _ifr ); 187 return ioctl( call, _ifr );
188} 188}
189 189
190 190
191bool ONetworkInterface::isLoopback() const 191bool ONetworkInterface::isLoopback() const
192{ 192{
193 ioctl( SIOCGIFFLAGS ); 193 ioctl( SIOCGIFFLAGS );
194 return _ifr.ifr_flags & IFF_LOOPBACK; 194 return _ifr.ifr_flags & IFF_LOOPBACK;
195} 195}
196 196
197 197
198bool ONetworkInterface::setUp( bool b ) 198bool ONetworkInterface::setUp( bool b )
199{ 199{
200 ioctl( SIOCGIFFLAGS ); 200 ioctl( SIOCGIFFLAGS );
201 if ( b ) _ifr.ifr_flags |= IFF_UP; 201 if ( b ) _ifr.ifr_flags |= IFF_UP;
202 else _ifr.ifr_flags &= (~IFF_UP); 202 else _ifr.ifr_flags &= (~IFF_UP);
203 return ioctl( SIOCSIFFLAGS ); 203 return ioctl( SIOCSIFFLAGS );
204} 204}
205 205
206 206
207bool ONetworkInterface::isUp() const 207bool ONetworkInterface::isUp() const
208{ 208{
209 ioctl( SIOCGIFFLAGS ); 209 ioctl( SIOCGIFFLAGS );
210 return _ifr.ifr_flags & IFF_UP; 210 return _ifr.ifr_flags & IFF_UP;
211} 211}
212 212
213 213
214QString ONetworkInterface::ipV4Address() const 214QString ONetworkInterface::ipV4Address() const
215{ 215{
216 if ( ioctl( SIOCGIFADDR ) ) 216 if ( ioctl( SIOCGIFADDR ) )
217 { 217 {
218 struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; 218 struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr;
219 //FIXME: Use QHostAddress here 219 //FIXME: Use QHostAddress here
220 return QString( inet_ntoa( sa->sin_addr ) ); 220 return QString( inet_ntoa( sa->sin_addr ) );
221 } 221 }
222 else 222 else
223 return "<unknown>"; 223 return "<unknown>";
224} 224}
225 225
226 226
227OMacAddress ONetworkInterface::macAddress() const 227OMacAddress ONetworkInterface::macAddress() const
228{ 228{
229 if ( ioctl( SIOCGIFHWADDR ) ) 229 if ( ioctl( SIOCGIFHWADDR ) )
230 { 230 {
231 return OMacAddress( _ifr ); 231 return OMacAddress( _ifr );
232 } 232 }
233 else 233 else
234 { 234 {
235 return OMacAddress::unknown; 235 return OMacAddress::unknown;
236 } 236 }
237} 237}
238 238
239 239
240int ONetworkInterface::dataLinkType() const 240int ONetworkInterface::dataLinkType() const
241{ 241{
242 if ( ioctl( SIOCGIFHWADDR ) ) 242 if ( ioctl( SIOCGIFHWADDR ) )
243 { 243 {
244 return _ifr.ifr_hwaddr.sa_family; 244 return _ifr.ifr_hwaddr.sa_family;
245 } 245 }
246 else 246 else
247 { 247 {
248 return -1; 248 return -1;
249 } 249 }
250} 250}
251 251
252 252
253void ONetworkInterface::setMonitoring( OMonitoringInterface* m ) 253void ONetworkInterface::setMonitoring( OMonitoringInterface* m )
254{ 254{
255 _mon = m; 255 _mon = m;
256 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), name() ); 256 qDebug( "ONetwork::setMonitoring(): Installed monitoring driver '%s' on interface '%s'", (const char*) m->name(), name() );
257} 257}
258 258
259 259
260OMonitoringInterface* ONetworkInterface::monitoring() const 260OMonitoringInterface* ONetworkInterface::monitoring() const
261{ 261{
262 return _mon; 262 return _mon;
263} 263}
264 264
265 265
266ONetworkInterface::~ONetworkInterface() 266ONetworkInterface::~ONetworkInterface()
267{ 267{
268 qDebug( "ONetworkInterface::~ONetworkInterface()" ); 268 qDebug( "ONetworkInterface::~ONetworkInterface()" );
269 if ( _sfd != -1 ) ::close( _sfd ); 269 if ( _sfd != -1 ) ::close( _sfd );
270} 270}
271 271
272 272
273bool ONetworkInterface::setPromiscuousMode( bool b ) 273bool ONetworkInterface::setPromiscuousMode( bool b )
274{ 274{
275 ioctl( SIOCGIFFLAGS ); 275 ioctl( SIOCGIFFLAGS );
276 if ( b ) _ifr.ifr_flags |= IFF_PROMISC; 276 if ( b ) _ifr.ifr_flags |= IFF_PROMISC;
277 else _ifr.ifr_flags &= (~IFF_PROMISC); 277 else _ifr.ifr_flags &= (~IFF_PROMISC);
278 return ioctl( SIOCSIFFLAGS ); 278 return ioctl( SIOCSIFFLAGS );
279} 279}
280 280
281 281
282bool ONetworkInterface::promiscuousMode() const 282bool ONetworkInterface::promiscuousMode() const
283{ 283{
284 ioctl( SIOCGIFFLAGS ); 284 ioctl( SIOCGIFFLAGS );
285 return _ifr.ifr_flags & IFF_PROMISC; 285 return _ifr.ifr_flags & IFF_PROMISC;
286} 286}
287 287
288 288
289bool ONetworkInterface::isWireless() const 289bool ONetworkInterface::isWireless() const
290{ 290{
291 return ioctl( SIOCGIWNAME ); 291 return ioctl( SIOCGIWNAME );
292} 292}
293 293
294 294
295/*====================================================================================== 295/*======================================================================================
296 * OChannelHopper 296 * OChannelHopper
297 *======================================================================================*/ 297 *======================================================================================*/
298 298
299OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface ) 299OChannelHopper::OChannelHopper( OWirelessNetworkInterface* iface )
300 :QObject( 0, "Mickey's funky hopper" ), 300 :QObject( 0, "Mickey's funky hopper" ),
301 _iface( iface ), _interval( 0 ), _tid( 0 ) 301 _iface( iface ), _interval( 0 ), _tid( 0 )
302{ 302{
303 int _maxChannel = iface->channels()+1; 303 int _maxChannel = iface->channels()+1;
304 // generate fancy hopping sequence honoring the device capabilities 304 // generate fancy hopping sequence honoring the device capabilities
305 if ( _maxChannel >= 1 ) _channels.append( 1 ); 305 if ( _maxChannel >= 1 ) _channels.append( 1 );
306 if ( _maxChannel >= 7 ) _channels.append( 7 ); 306 if ( _maxChannel >= 7 ) _channels.append( 7 );
307 if ( _maxChannel >= 13 ) _channels.append( 13 ); 307 if ( _maxChannel >= 13 ) _channels.append( 13 );
308 if ( _maxChannel >= 2 ) _channels.append( 2 ); 308 if ( _maxChannel >= 2 ) _channels.append( 2 );
309 if ( _maxChannel >= 8 ) _channels.append( 8 ); 309 if ( _maxChannel >= 8 ) _channels.append( 8 );
310 if ( _maxChannel >= 3 ) _channels.append( 3 ); 310 if ( _maxChannel >= 3 ) _channels.append( 3 );
311 if ( _maxChannel >= 14 ) _channels.append( 14 ); 311 if ( _maxChannel >= 14 ) _channels.append( 14 );
312 if ( _maxChannel >= 9 ) _channels.append( 9 ); 312 if ( _maxChannel >= 9 ) _channels.append( 9 );
313 if ( _maxChannel >= 4 ) _channels.append( 4 ); 313 if ( _maxChannel >= 4 ) _channels.append( 4 );
314 if ( _maxChannel >= 10 ) _channels.append( 10 ); 314 if ( _maxChannel >= 10 ) _channels.append( 10 );
315 if ( _maxChannel >= 5 ) _channels.append( 5 ); 315 if ( _maxChannel >= 5 ) _channels.append( 5 );
316 if ( _maxChannel >= 11 ) _channels.append( 11 ); 316 if ( _maxChannel >= 11 ) _channels.append( 11 );
317 if ( _maxChannel >= 6 ) _channels.append( 6 ); 317 if ( _maxChannel >= 6 ) _channels.append( 6 );
318 if ( _maxChannel >= 12 ) _channels.append( 12 ); 318 if ( _maxChannel >= 12 ) _channels.append( 12 );
319 _channel = _channels.begin(); 319 _channel = _channels.begin();
320 320
321} 321}
322 322
323 323
324OChannelHopper::~OChannelHopper() 324OChannelHopper::~OChannelHopper()
325{ 325{
326} 326}
327 327
328 328
329bool OChannelHopper::isActive() const 329bool OChannelHopper::isActive() const
330{ 330{
331 return _tid; 331 return _tid;
332} 332}
333 333
334 334
335int OChannelHopper::channel() const 335int OChannelHopper::channel() const
336{ 336{
337 return *_channel; 337 return *_channel;
338} 338}
339 339
340 340
341void OChannelHopper::timerEvent( QTimerEvent* ) 341void OChannelHopper::timerEvent( QTimerEvent* )
342{ 342{
343 _iface->setChannel( *_channel ); 343 _iface->setChannel( *_channel );
344 qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'", 344 qDebug( "OChannelHopper::timerEvent(): set channel %d on interface '%s'",
345 *_channel, (const char*) _iface->name() ); 345 *_channel, (const char*) _iface->name() );
346 if ( ++_channel == _channels.end() ) _channel = _channels.begin(); 346 if ( ++_channel == _channels.end() ) _channel = _channels.begin();
347} 347}
348 348
349 349
350void OChannelHopper::setInterval( int interval ) 350void OChannelHopper::setInterval( int interval )
351{ 351{
352 if ( interval == _interval ) 352 if ( interval == _interval )
353 return; 353 return;
354 354
355 if ( _interval ) 355 if ( _interval )
356 killTimer( _tid ); 356 killTimer( _tid );
357 357
358 _tid = 0; 358 _tid = 0;
359 _interval = interval; 359 _interval = interval;
360 360
361 if ( _interval ) 361 if ( _interval )
362 { 362 {
363 _tid = startTimer( interval ); 363 _tid = startTimer( interval );
364 } 364 }
365} 365}
366 366
367 367
368int OChannelHopper::interval() const 368int OChannelHopper::interval() const
369{ 369{
370 return _interval; 370 return _interval;
371} 371}
@@ -489,387 +489,387 @@ void OWirelessNetworkInterface::buildChannelList()
489 489
490 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." ); 490 qDebug( "OWirelessNetworkInterface::buildChannelList(): Channel list constructed." );
491 free(buffer); 491 free(buffer);
492} 492}
493 493
494 494
495void OWirelessNetworkInterface::buildPrivateList() 495void OWirelessNetworkInterface::buildPrivateList()
496{ 496{
497 qDebug( "OWirelessNetworkInterface::buildPrivateList()" ); 497 qDebug( "OWirelessNetworkInterface::buildPrivateList()" );
498 498
499 struct iw_priv_args priv[IW_MAX_PRIV_DEF]; 499 struct iw_priv_args priv[IW_MAX_PRIV_DEF];
500 500
501 _iwr.u.data.pointer = (char*) &priv; 501 _iwr.u.data.pointer = (char*) &priv;
502 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself 502 _iwr.u.data.length = IW_MAX_PRIV_DEF; // length in terms of number of (sizeof iw_priv_args), not (sizeof iw_priv_args) itself
503 _iwr.u.data.flags = 0; 503 _iwr.u.data.flags = 0;
504 504
505 if ( !wioctl( SIOCGIWPRIV ) ) 505 if ( !wioctl( SIOCGIWPRIV ) )
506 { 506 {
507 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) ); 507 qDebug( "OWirelessNetworkInterface::buildPrivateList(): SIOCGIWPRIV failed (%s) - can't get private ioctl information.", strerror( errno ) );
508 return; 508 return;
509 } 509 }
510 510
511 for ( int i = 0; i < _iwr.u.data.length; ++i ) 511 for ( int i = 0; i < _iwr.u.data.length; ++i )
512 { 512 {
513 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args ); 513 new OPrivateIOCTL( this, priv[i].name, priv[i].cmd, priv[i].get_args, priv[i].set_args );
514 } 514 }
515 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." ); 515 qDebug( "OWirelessNetworkInterface::buildPrivateList(): Private IOCTL list constructed." );
516} 516}
517 517
518 518
519int OWirelessNetworkInterface::channel() const 519int OWirelessNetworkInterface::channel() const
520{ 520{
521 //FIXME: When monitoring enabled, then use it 521 //FIXME: When monitoring enabled, then use it
522 //FIXME: to gather the current RF channel 522 //FIXME: to gather the current RF channel
523 //FIXME: Until then, get active channel from hopper. 523 //FIXME: Until then, get active channel from hopper.
524 if ( _hopper && _hopper->isActive() ) 524 if ( _hopper && _hopper->isActive() )
525 return _hopper->channel(); 525 return _hopper->channel();
526 526
527 if ( !wioctl( SIOCGIWFREQ ) ) 527 if ( !wioctl( SIOCGIWFREQ ) )
528 { 528 {
529 return -1; 529 return -1;
530 } 530 }
531 else 531 else
532 { 532 {
533 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ]; 533 return _channels[ static_cast<int>(double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000) ];
534 } 534 }
535} 535}
536 536
537 537
538void OWirelessNetworkInterface::setChannel( int c ) const 538void OWirelessNetworkInterface::setChannel( int c ) const
539{ 539{
540 if ( !_mon ) 540 if ( !_mon )
541 { 541 {
542 memset( &_iwr, 0, sizeof( struct iwreq ) ); 542 memset( &_iwr, 0, sizeof( struct iwreq ) );
543 _iwr.u.freq.m = c; 543 _iwr.u.freq.m = c;
544 _iwr.u.freq.e = 0; 544 _iwr.u.freq.e = 0;
545 wioctl( SIOCSIWFREQ ); 545 wioctl( SIOCSIWFREQ );
546 } 546 }
547 else 547 else
548 { 548 {
549 _mon->setChannel( c ); 549 _mon->setChannel( c );
550 } 550 }
551} 551}
552 552
553 553
554double OWirelessNetworkInterface::frequency() const 554double OWirelessNetworkInterface::frequency() const
555{ 555{
556 if ( !wioctl( SIOCGIWFREQ ) ) 556 if ( !wioctl( SIOCGIWFREQ ) )
557 { 557 {
558 return -1.0; 558 return -1.0;
559 } 559 }
560 else 560 else
561 { 561 {
562 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0; 562 return double( _iwr.u.freq.m ) * pow( 10.0, _iwr.u.freq.e ) / 1000000000.0;
563 } 563 }
564} 564}
565 565
566 566
567int OWirelessNetworkInterface::channels() const 567int OWirelessNetworkInterface::channels() const
568{ 568{
569 return _channels.count(); 569 return _channels.count();
570} 570}
571 571
572 572
573void OWirelessNetworkInterface::setChannelHopping( int interval ) 573void OWirelessNetworkInterface::setChannelHopping( int interval )
574{ 574{
575 if ( !_hopper ) _hopper = new OChannelHopper( this ); 575 if ( !_hopper ) _hopper = new OChannelHopper( this );
576 _hopper->setInterval( interval ); 576 _hopper->setInterval( interval );
577 //FIXME: When and by whom will the channel hopper be deleted? 577 //FIXME: When and by whom will the channel hopper be deleted?
578 //TODO: rely on QObject hierarchy 578 //TODO: rely on QObject hierarchy
579} 579}
580 580
581 581
582int OWirelessNetworkInterface::channelHopping() const 582int OWirelessNetworkInterface::channelHopping() const
583{ 583{
584 return _hopper->interval(); 584 return _hopper->interval();
585} 585}
586 586
587 587
588void OWirelessNetworkInterface::setMonitorMode( bool b ) 588void OWirelessNetworkInterface::setMonitorMode( bool b )
589{ 589{
590 if ( _mon ) 590 if ( _mon )
591 _mon->setEnabled( b ); 591 _mon->setEnabled( b );
592 else 592 else
593 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" ); 593 qDebug( "ONetwork(): can't switch monitor mode without installed monitoring interface" );
594} 594}
595 595
596 596
597bool OWirelessNetworkInterface::monitorMode() const 597bool OWirelessNetworkInterface::monitorMode() const
598{ 598{
599 qDebug( "dataLinkType = %d", dataLinkType() ); 599 qDebug( "dataLinkType = %d", dataLinkType() );
600 return dataLinkType() == ARPHRD_IEEE80211; 600 return dataLinkType() == ARPHRD_IEEE80211;
601} 601}
602 602
603 603
604QString OWirelessNetworkInterface::nickName() const 604QString OWirelessNetworkInterface::nickName() const
605{ 605{
606 char str[IW_ESSID_MAX_SIZE]; 606 char str[IW_ESSID_MAX_SIZE];
607 _iwr.u.data.pointer = &str[0]; 607 _iwr.u.data.pointer = &str[0];
608 _iwr.u.data.length = IW_ESSID_MAX_SIZE; 608 _iwr.u.data.length = IW_ESSID_MAX_SIZE;
609 if ( !wioctl( SIOCGIWNICKN ) ) 609 if ( !wioctl( SIOCGIWNICKN ) )
610 { 610 {
611 return "<unknown>"; 611 return "<unknown>";
612 } 612 }
613 else 613 else
614 { 614 {
615 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string 615 str[_iwr.u.data.length] = 0x0; // some drivers (e.g. wlan-ng) don't zero-terminate the string
616 return str; 616 return str;
617 } 617 }
618} 618}
619 619
620 620
621void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... ) 621void OWirelessNetworkInterface::setPrivate( const QString& call, int numargs, ... )
622{ 622{
623 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) ); 623 OPrivateIOCTL* priv = static_cast<OPrivateIOCTL*>( child( (const char*) call ) );
624 if ( !priv ) 624 if ( !priv )
625 { 625 {
626 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call ); 626 qDebug( "OWirelessNetworkInterface::setPrivate(): interface '%s' does not support private ioctl '%s'", name(), (const char*) call );
627 return; 627 return;
628 } 628 }
629 if ( priv->numberSetArgs() != numargs ) 629 if ( priv->numberSetArgs() != numargs )
630 { 630 {
631 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs ); 631 qDebug( "OWirelessNetworkInterface::setPrivate(): parameter count not matching. '%s' expects %d arguments, but got %d", (const char*) call, priv->numberSetArgs(), numargs );
632 return; 632 return;
633 } 633 }
634 634
635 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() ); 635 qDebug( "OWirelessNetworkInterface::setPrivate(): about to call '%s' on interface '%s'", (const char*) call, name() );
636 memset( &_iwr, 0, sizeof _iwr ); 636 memset( &_iwr, 0, sizeof _iwr );
637 va_list argp; 637 va_list argp;
638 va_start( argp, numargs ); 638 va_start( argp, numargs );
639 for ( int i = 0; i < numargs; ++i ) 639 for ( int i = 0; i < numargs; ++i )
640 { 640 {
641 priv->setParameter( i, va_arg( argp, int ) ); 641 priv->setParameter( i, va_arg( argp, int ) );
642 } 642 }
643 va_end( argp ); 643 va_end( argp );
644 priv->invoke(); 644 priv->invoke();
645} 645}
646 646
647 647
648void OWirelessNetworkInterface::getPrivate( const QString& call ) 648void OWirelessNetworkInterface::getPrivate( const QString& call )
649{ 649{
650} 650}
651 651
652 652
653QString OWirelessNetworkInterface::SSID() const 653QString OWirelessNetworkInterface::SSID() const
654{ 654{
655 char str[IW_ESSID_MAX_SIZE]; 655 char str[IW_ESSID_MAX_SIZE];
656 _iwr.u.essid.pointer = &str[0]; 656 _iwr.u.essid.pointer = &str[0];
657 _iwr.u.essid.length = IW_ESSID_MAX_SIZE; 657 _iwr.u.essid.length = IW_ESSID_MAX_SIZE;
658 if ( !wioctl( SIOCGIWESSID ) ) 658 if ( !wioctl( SIOCGIWESSID ) )
659 { 659 {
660 return "<unknown>"; 660 return "<unknown>";
661 } 661 }
662 else 662 else
663 { 663 {
664 return str; 664 return str;
665 } 665 }
666} 666}
667 667
668 668
669void OWirelessNetworkInterface::setSSID( const QString& ssid ) 669void OWirelessNetworkInterface::setSSID( const QString& ssid )
670{ 670{
671 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid ); 671 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
672 _iwr.u.essid.length = ssid.length(); 672 _iwr.u.essid.length = ssid.length();
673 wioctl( SIOCSIWESSID ); 673 wioctl( SIOCSIWESSID );
674} 674}
675 675
676 676
677bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const 677bool OWirelessNetworkInterface::wioctl( int call, struct iwreq& iwreq ) const
678{ 678{
679 int result = ::ioctl( _sfd, call, &iwreq ); 679 int result = ::ioctl( _sfd, call, &iwreq );
680 if ( result == -1 ) 680 if ( result == -1 )
681 qDebug( "ONetworkInterface::wioctl(): Call %d - Status: Failed: %d (%s)", call, result, strerror( errno ) ); 681 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Failed: %d (%s)", name(), call, result, strerror( errno ) );
682 else 682 else
683 qDebug( "ONetworkInterface::wioctl(): Call %d - Status: Ok.", call ); 683 qDebug( "ONetworkInterface::wioctl (%s) call %d - Status: Ok.", name(), call );
684 return ( result != -1 ); 684 return ( result != -1 );
685} 685}
686 686
687 687
688bool OWirelessNetworkInterface::wioctl( int call ) const 688bool OWirelessNetworkInterface::wioctl( int call ) const
689{ 689{
690 strcpy( _iwr.ifr_name, name() ); 690 strcpy( _iwr.ifr_name, name() );
691 return wioctl( call, _iwr ); 691 return wioctl( call, _iwr );
692} 692}
693 693
694 694
695/*====================================================================================== 695/*======================================================================================
696 * OMonitoringInterface 696 * OMonitoringInterface
697 *======================================================================================*/ 697 *======================================================================================*/
698 698
699OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface ) 699OMonitoringInterface::OMonitoringInterface( ONetworkInterface* iface )
700 :_if( static_cast<OWirelessNetworkInterface*>( iface ) ) 700 :_if( static_cast<OWirelessNetworkInterface*>( iface ) )
701{ 701{
702} 702}
703 703
704 704
705OMonitoringInterface::~OMonitoringInterface() 705OMonitoringInterface::~OMonitoringInterface()
706{ 706{
707} 707}
708 708
709 709
710void OMonitoringInterface::setChannel( int c ) 710void OMonitoringInterface::setChannel( int c )
711{ 711{
712 // use standard WE channel switching protocol 712 // use standard WE channel switching protocol
713 memset( &_if->_iwr, 0, sizeof( struct iwreq ) ); 713 memset( &_if->_iwr, 0, sizeof( struct iwreq ) );
714 _if->_iwr.u.freq.m = c; 714 _if->_iwr.u.freq.m = c;
715 _if->_iwr.u.freq.e = 0; 715 _if->_iwr.u.freq.e = 0;
716 _if->wioctl( SIOCSIWFREQ ); 716 _if->wioctl( SIOCSIWFREQ );
717} 717}
718 718
719 719
720bool OMonitoringInterface::enabled() const 720bool OMonitoringInterface::enabled() const
721{ 721{
722 return _if->monitorMode(); 722 return _if->monitorMode();
723} 723}
724 724
725 725
726void OMonitoringInterface::setEnabled( bool b ) 726void OMonitoringInterface::setEnabled( bool b )
727{ 727{
728} 728}
729 729
730 730
731/*====================================================================================== 731/*======================================================================================
732 * OCiscoMonitoringInterface 732 * OCiscoMonitoringInterface
733 *======================================================================================*/ 733 *======================================================================================*/
734 734
735OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface ) 735OCiscoMonitoringInterface::OCiscoMonitoringInterface( ONetworkInterface* iface )
736 :OMonitoringInterface( iface ) 736 :OMonitoringInterface( iface )
737{ 737{
738 iface->setMonitoring( this ); 738 iface->setMonitoring( this );
739} 739}
740 740
741 741
742OCiscoMonitoringInterface::~OCiscoMonitoringInterface() 742OCiscoMonitoringInterface::~OCiscoMonitoringInterface()
743{ 743{
744} 744}
745 745
746 746
747void OCiscoMonitoringInterface::setEnabled( bool b ) 747void OCiscoMonitoringInterface::setEnabled( bool b )
748{ 748{
749 QString fname; 749 QString fname;
750 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() ); 750 fname.sprintf( "/proc/driver/aironet/%s", (const char*) _if->name() );
751 QFile f( fname ); 751 QFile f( fname );
752 if ( !f.exists() ) return; 752 if ( !f.exists() ) return;
753 753
754 if ( f.open( IO_WriteOnly ) ) 754 if ( f.open( IO_WriteOnly ) )
755 { 755 {
756 QTextStream s( &f ); 756 QTextStream s( &f );
757 s << "Mode: r"; 757 s << "Mode: r";
758 s << "Mode: y"; 758 s << "Mode: y";
759 s << "XmitPower: 1"; 759 s << "XmitPower: 1";
760 } 760 }
761 761
762 // flushing and closing will be done automatically when f goes out of scope 762 // flushing and closing will be done automatically when f goes out of scope
763} 763}
764 764
765 765
766QString OCiscoMonitoringInterface::name() const 766QString OCiscoMonitoringInterface::name() const
767{ 767{
768 return "cisco"; 768 return "cisco";
769} 769}
770 770
771 771
772void OCiscoMonitoringInterface::setChannel( int ) 772void OCiscoMonitoringInterface::setChannel( int )
773{ 773{
774 // cisco devices automatically switch channels when in monitor mode 774 // cisco devices automatically switch channels when in monitor mode
775} 775}
776 776
777 777
778/*====================================================================================== 778/*======================================================================================
779 * OWlanNGMonitoringInterface 779 * OWlanNGMonitoringInterface
780 *======================================================================================*/ 780 *======================================================================================*/
781 781
782 782
783OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface ) 783OWlanNGMonitoringInterface::OWlanNGMonitoringInterface( ONetworkInterface* iface )
784 :OMonitoringInterface( iface ) 784 :OMonitoringInterface( iface )
785{ 785{
786 iface->setMonitoring( this ); 786 iface->setMonitoring( this );
787} 787}
788 788
789 789
790OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface() 790OWlanNGMonitoringInterface::~OWlanNGMonitoringInterface()
791{ 791{
792} 792}
793 793
794 794
795void OWlanNGMonitoringInterface::setEnabled( bool b ) 795void OWlanNGMonitoringInterface::setEnabled( bool b )
796{ 796{
797 //FIXME: do nothing if its already in the same mode 797 //FIXME: do nothing if its already in the same mode
798 798
799 QString enable = b ? "true" : "false"; 799 QString enable = b ? "true" : "false";
800 QString cmd; 800 QString cmd;
801 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable ); 801 cmd.sprintf( "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=%s", (const char*) _if->name(), 1, (const char*) enable );
802 system( cmd ); 802 system( cmd );
803} 803}
804 804
805 805
806QString OWlanNGMonitoringInterface::name() const 806QString OWlanNGMonitoringInterface::name() const
807{ 807{
808 return "wlan-ng"; 808 return "wlan-ng";
809} 809}
810 810
811 811
812void OWlanNGMonitoringInterface::setChannel( int ) 812void OWlanNGMonitoringInterface::setChannel( int )
813{ 813{
814 // wlan-ng devices automatically switch channels when in monitor mode 814 // wlan-ng devices automatically switch channels when in monitor mode
815} 815}
816 816
817 817
818/*====================================================================================== 818/*======================================================================================
819 * OHostAPMonitoringInterface 819 * OHostAPMonitoringInterface
820 *======================================================================================*/ 820 *======================================================================================*/
821 821
822OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface ) 822OHostAPMonitoringInterface::OHostAPMonitoringInterface( ONetworkInterface* iface )
823 :OMonitoringInterface( iface ) 823 :OMonitoringInterface( iface )
824{ 824{
825 iface->setMonitoring( this ); 825 iface->setMonitoring( this );
826} 826}
827 827
828OHostAPMonitoringInterface::~OHostAPMonitoringInterface() 828OHostAPMonitoringInterface::~OHostAPMonitoringInterface()
829{ 829{
830} 830}
831 831
832void OHostAPMonitoringInterface::setEnabled( bool b ) 832void OHostAPMonitoringInterface::setEnabled( bool b )
833{ 833{
834 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15 834 // IW_MODE_MONITOR was introduced in Wireless Extensions Version 15
835 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring 835 // Wireless Extensions < Version 15 need iwpriv commandos for monitoring
836 836
837 if ( b ) 837 if ( b )
838 { 838 {
839 #if WIRELESS_EXT > 14 839 #if WIRELESS_EXT > 14
840 _if->_iwr.u.mode = IW_MODE_MONITOR; 840 _if->_iwr.u.mode = IW_MODE_MONITOR;
841 _if->wioctl( SIOCSIWMODE ); 841 _if->wioctl( SIOCSIWMODE );
842 #else 842 #else
843 int* args = (int*) &_if->_iwr.u.name; 843 int* args = (int*) &_if->_iwr.u.name;
844 args[0] = 2; 844 args[0] = 2;
845 args[1] = 0; 845 args[1] = 0;
846 _if->wioctl( SIOCDEVPRIVATE ); 846 _if->wioctl( SIOCDEVPRIVATE );
847 #endif 847 #endif
848 } 848 }
849 else 849 else
850 { 850 {
851 #if WIRELESS_EXT > 14 851 #if WIRELESS_EXT > 14
852 _if->_iwr.u.mode = IW_MODE_INFRA; 852 _if->_iwr.u.mode = IW_MODE_INFRA;
853 _if->wioctl( SIOCSIWMODE ); 853 _if->wioctl( SIOCSIWMODE );
854 #else 854 #else
855 int* args = (int*) &_if->_iwr.u.name; 855 int* args = (int*) &_if->_iwr.u.name;
856 args[0] = 0; 856 args[0] = 0;
857 args[1] = 0; 857 args[1] = 0;
858 _if->wioctl( SIOCDEVPRIVATE ); 858 _if->wioctl( SIOCDEVPRIVATE );
859 #endif 859 #endif
860 } 860 }
861} 861}
862 862
863 863
864QString OHostAPMonitoringInterface::name() const 864QString OHostAPMonitoringInterface::name() const
865{ 865{
866 return "hostap"; 866 return "hostap";
867} 867}
868 868
869 869
870/*====================================================================================== 870/*======================================================================================
871 * OOrinocoNetworkInterface 871 * OOrinocoNetworkInterface
872 *======================================================================================*/ 872 *======================================================================================*/
873 873
874OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface ) 874OOrinocoMonitoringInterface::OOrinocoMonitoringInterface( ONetworkInterface* iface )
875 :OMonitoringInterface( iface ) 875 :OMonitoringInterface( iface )