summaryrefslogtreecommitdiff
path: root/noncore/settings/networksettings2/gprs/GPRSrun.cpp
Side-by-side diff
Diffstat (limited to 'noncore/settings/networksettings2/gprs/GPRSrun.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/networksettings2/gprs/GPRSrun.cpp105
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 );
+}