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 @@ | |||
1 | #include <sys/types.h> | ||
2 | #include <signal.h> | ||
3 | #include <errno.h> | ||
4 | #include <qdir.h> | ||
5 | #include <system.h> | ||
6 | #include <resources.h> | ||
7 | #include <netnode.h> | ||
8 | #include "GPRSrun.h" | ||
9 | |||
10 | State_t GPRSRun::detectState( void ) { | ||
11 | |||
12 | // is pppd still running ? | ||
13 | // is rfcomm still active | ||
14 | NodeCollection * NC = nodeCollection(); | ||
15 | InterfaceInfo * I = NC->assignedInterface(); | ||
16 | |||
17 | QDir D("/var/run"); | ||
18 | |||
19 | if( I ) { | ||
20 | // has some pppx attached | ||
21 | return ( I->IsUp ) ? IsUp : Available; | ||
22 | } | ||
23 | |||
24 | // check ppp itself and figure out interface | ||
25 | |||
26 | owarn << "Check for ppp " << NC->name() << oendl; | ||
27 | if( D.exists( QString("ppp-")+removeSpaces(NC->name())+".pid") ) { | ||
28 | // get pid and check if pppd is still running | ||
29 | QFile F( D.path()+"/ppp-"+removeSpaces(NC->name())+".pid"); | ||
30 | |||
31 | owarn << "PPP PID " << F.name() << oendl; | ||
32 | if( F.open( IO_ReadOnly ) ) { | ||
33 | QTextStream TS(&F); | ||
34 | QString X = TS.readLine(); | ||
35 | PPPPid = X.toULong(); | ||
36 | int rv; | ||
37 | |||
38 | rv = ::kill( PPPPid, 0 ); | ||
39 | if( rv == 0 || | ||
40 | ( rv < 0 && errno == EPERM ) | ||
41 | ) { | ||
42 | // pppd is still up | ||
43 | X = TS.readLine(); | ||
44 | I = NSResources->system().findInterface(X); | ||
45 | |||
46 | owarn << "ppp running : IFace " << X << " = " << (long)I << oendl; | ||
47 | |||
48 | if( I ) { | ||
49 | NC->assignInterface( I ); | ||
50 | return (I->IsUp) ? IsUp : Available; | ||
51 | } | ||
52 | |||
53 | return Available; | ||
54 | |||
55 | } else { | ||
56 | // pppd is down | ||
57 | PPPPid = 0; | ||
58 | } | ||
59 | } // else pppd is down | ||
60 | } | ||
61 | NC->assignInterface( 0 ); | ||
62 | return Unknown; | ||
63 | } | ||
64 | |||
65 | QString GPRSRun::setMyState( NodeCollection * NC, Action_t A , bool ) { | ||
66 | |||
67 | if( A == Up ) { | ||
68 | // start ppp on deviceFile | ||
69 | QStringList SL; | ||
70 | SL << "pon" | ||
71 | << removeSpaces( NC->name() ) | ||
72 | << NC->device()->deviceFile(); | ||
73 | |||
74 | if( ! NSResources->system().execAsUser( SL ) ) { | ||
75 | return QString("Cannot start pppd for %1").arg(NC->name()); | ||
76 | } | ||
77 | } else if ( A == Down ) { | ||
78 | if( PPPPid == 0 ) { | ||
79 | detectState(); | ||
80 | } | ||
81 | if( PPPPid ) { | ||
82 | QStringList SL; | ||
83 | |||
84 | SL << "poff" | ||
85 | << removeSpaces( NC->name() ); | ||
86 | |||
87 | if( ! NSResources->system().execAsUser( SL ) ) { | ||
88 | return QString("Cannot terminate pppd for %1").arg(NC->name()); | ||
89 | } | ||
90 | NC->assignInterface( 0 ); | ||
91 | owarn << "ppp stopped " << oendl; | ||
92 | PPPPid = 0; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | return QString(); | ||
97 | } | ||
98 | |||
99 | bool GPRSRun::handlesInterface( const QString & S ) { | ||
100 | return Pat.match( S ) >= 0; | ||
101 | } | ||
102 | |||
103 | bool GPRSRun::handlesInterface( InterfaceInfo * I ) { | ||
104 | return handlesInterface( I->Name ); | ||
105 | } | ||