Diffstat (limited to 'noncore/settings/networksettings2/gprs/GPRSrun.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/settings/networksettings2/gprs/GPRSrun.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/noncore/settings/networksettings2/gprs/GPRSrun.cpp b/noncore/settings/networksettings2/gprs/GPRSrun.cpp new file mode 100644 index 0000000..e842b99 --- a/dev/null +++ b/noncore/settings/networksettings2/gprs/GPRSrun.cpp @@ -0,0 +1,105 @@ +#include <sys/types.h> +#include <signal.h> +#include <errno.h> +#include <qdir.h> +#include <system.h> +#include <resources.h> +#include <netnode.h> +#include "GPRSrun.h" + +State_t GPRSRun::detectState( void ) { + + // is pppd still running ? + // is rfcomm still active + NodeCollection * NC = nodeCollection(); + InterfaceInfo * I = NC->assignedInterface(); + + QDir D("/var/run"); + + if( I ) { + // has some pppx attached + return ( I->IsUp ) ? IsUp : Available; + } + + // check ppp itself and figure out interface + + owarn << "Check for ppp " << NC->name() << oendl; + if( D.exists( QString("ppp-")+removeSpaces(NC->name())+".pid") ) { + // get pid and check if pppd is still running + QFile F( D.path()+"/ppp-"+removeSpaces(NC->name())+".pid"); + + owarn << "PPP PID " << F.name() << oendl; + if( F.open( IO_ReadOnly ) ) { + QTextStream TS(&F); + QString X = TS.readLine(); + PPPPid = X.toULong(); + int rv; + + rv = ::kill( PPPPid, 0 ); + if( rv == 0 || + ( rv < 0 && errno == EPERM ) + ) { + // pppd is still up + X = TS.readLine(); + I = NSResources->system().findInterface(X); + + owarn << "ppp running : IFace " << X << " = " << (long)I << oendl; + + if( I ) { + NC->assignInterface( I ); + return (I->IsUp) ? IsUp : Available; + } + + return Available; + + } else { + // pppd is down + PPPPid = 0; + } + } // else pppd is down + } + NC->assignInterface( 0 ); + return Unknown; +} + +QString GPRSRun::setMyState( NodeCollection * NC, Action_t A , bool ) { + + if( A == Up ) { + // start ppp on deviceFile + QStringList SL; + SL << "pon" + << removeSpaces( NC->name() ) + << NC->device()->deviceFile(); + + if( ! NSResources->system().execAsUser( SL ) ) { + return QString("Cannot start pppd for %1").arg(NC->name()); + } + } else if ( A == Down ) { + if( PPPPid == 0 ) { + detectState(); + } + if( PPPPid ) { + QStringList SL; + + SL << "poff" + << removeSpaces( NC->name() ); + + if( ! NSResources->system().execAsUser( SL ) ) { + return QString("Cannot terminate pppd for %1").arg(NC->name()); + } + NC->assignInterface( 0 ); + owarn << "ppp stopped " << oendl; + PPPPid = 0; + } + } + + return QString(); +} + +bool GPRSRun::handlesInterface( const QString & S ) { + return Pat.match( S ) >= 0; +} + +bool GPRSRun::handlesInterface( InterfaceInfo * I ) { + return handlesInterface( I->Name ); +} |