Diffstat (limited to 'libopie2/opienet/onetwork.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie2/opienet/onetwork.cpp | 43 |
1 files changed, 16 insertions, 27 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index 1deb051..0649ca2 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -1,8 +1,7 @@ /* This file is part of the Opie Project - Copyright (C) 2003-2005 by Michael 'Mickey' Lauer <mickey@Vanille.de> - =. + =. Copyright (C) 2003-2005 by Michael 'Mickey' Lauer <mickey@Vanille.de> .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under @@ -84,12 +83,8 @@ ONetwork::ONetwork() void ONetwork::synchronize() { // gather available interfaces by inspecting /proc/net/dev - //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices - //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices - //FIXME: Best is use SIOCGIFCONF and if this doesn't work (result=-1), then fallback to parsing /proc/net/dev - _interfaces.clear(); QString str; QFile f( "/proc/net/dev" ); bool hasFile = f.open( IO_ReadOnly ); @@ -201,9 +196,8 @@ struct ifreq& ONetworkInterface::ifr() const void ONetworkInterface::init() { odebug << "ONetworkInterface::init()" << oendl; - memset( &_ifr, 0, sizeof( struct ifreq ) ); if ( _sfd == -1 ) { @@ -269,19 +263,12 @@ void ONetworkInterface::setIPV4Address( const QHostAddress& addr ) ioctl( SIOCSIFADDR ); } -QString ONetworkInterface::ipV4Address() const +OHostAddress ONetworkInterface::ipV4Address() const { - if ( ioctl( SIOCGIFADDR ) ) - { - struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; - //FIXME: Use QHostAddress here - return QString( inet_ntoa( sa->sin_addr ) ); - } - else - return "<unknown>"; - + struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; + return ioctl( SIOCGIFADDR ) ? OHostAddress( ntohl( sa->sin_addr.s_addr ) ) : OHostAddress(); } void ONetworkInterface::setMacAddress( const OMacAddress& addr ) @@ -314,18 +301,12 @@ void ONetworkInterface::setIPV4Netmask( const QHostAddress& addr ) ioctl( SIOCSIFNETMASK ); } -QString ONetworkInterface::ipV4Netmask() const +OHostAddress ONetworkInterface::ipV4Netmask() const { - if ( ioctl( SIOCGIFNETMASK ) ) - { - struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; - //FIXME: Use QHostAddress here - return QString( inet_ntoa( sa->sin_addr ) ); - } - else - return "<unknown>"; + struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; + return ioctl( SIOCGIFNETMASK ) ? OHostAddress( ntohl( sa->sin_addr.s_addr ) ) : OHostAddress(); } int ONetworkInterface::dataLinkType() const @@ -546,9 +527,17 @@ void OWirelessNetworkInterface::buildInformation() wrq.u.data.pointer = (caddr_t) buffer; wrq.u.data.length = sizeof buffer; wrq.u.data.flags = 0; - if ( ::ioctl( _sfd, SIOCGIWRANGE, &wrq ) == -1 ) + int result = ::ioctl( _sfd, SIOCGIWRANGE, &wrq ); + if ( result == -1 ) + { + owarn << "OWirelessNetworkInterface::buildInformation(): SIOCGIWRANGE failed (" << strerror( errno ) << ") - retrying with smaller buffer..." << oendl; + wrq.u.data.length = sizeof( struct iw_range ); + result = ::ioctl( _sfd, SIOCGIWRANGE, &wrq ); + } + + if ( result == -1 ) { owarn << "OWirelessNetworkInterface::buildInformation(): Can't get driver information (" << strerror( errno ) << ") - using default values." << oendl; _channels.insert( 2412, 1 ); // 2.412 GHz _channels.insert( 2417, 2 ); // 2.417 GHz |