summaryrefslogtreecommitdiff
path: root/net/pppload/files/patch-ad
blob: 7e819476e22a8c9098268e6b9fc4d35a70b9aea4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
diff -u --new-file pppload-1.0/PPPStats.C ./PPPStats.C
--- pppload-1.0/PPPStats.C	Wed Sep 11 19:50:13 1996
+++ ./PPPStats.C	Fri Jan 30 20:16:04 1998
@@ -19,16 +19,22 @@
 
 extern "C" {
 #include <stdlib.h>
-#include <errno.h>
 #include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
-#include <net/if.h>
-#include <linux/ppp_defs.h>
+#include <sys/time.h>
+#include <net/if.h> 
+#include <net/if_ppp.h> 
 }
 
 #include "PPPStats.H"
 #include "Options.H"
+#include <iostream.h>
+
+void get_command(char *);
+char command[200];
 
 typedef struct
 {
@@ -53,38 +59,42 @@
 		system( (const char*)options->cmd() );
 	}
 	
-	DclPPPInfo        PPPInfo[1];
-	struct ifreq      ifreq;
+	DclPPPInfo        PPPInfo[1];           
+	struct ifpppstatsreq ifreq;            
 	struct ppp_stats* PPPStat;
-	struct ppp_stats  LastPPPStat[1];
-	
-	memset (& ifreq, 0, sizeof (ifreq));
-	sprintf (ifreq.ifr_ifrn.ifrn_name, "ppp%d", options->link());
+	struct ppp_stats  LastPPPStat[1];       
 	
-	ifreq.ifr_ifru.ifru_data = (caddr_t) PPPInfo;
+	memset (&ifreq, 0, sizeof (ifreq));
+	sprintf (ifreq.ifr_name, "%s%d",(const char*)options->device(),options->link());
+
 	PPPStat = & PPPInfo->stats;
 	memset (LastPPPStat, 0, sizeof (LastPPPStat));
 	
-	if ( (ioctl (_s, SIOCDEVPRIVATE, (caddr_t) & ifreq) < 0) ||
-		( _isUp && ( PPPStat->p.ppp_ibytes < _rxTotal ) ) ||
-		( !_isUp && ( PPPStat->p.ppp_ibytes == 0 ) )
-		) {
-		if ( _isUp ) {
-			_isUp = false;
-			emit linkDown();
-			if ( options->cmd().length() ) {
-				_retryId = startTimer( options->retry() * 1000 );
-				system( (const char*)options->cmd() );
-			}
-		}
-		PPPStat->p.ppp_ibytes = 0;
-		PPPStat->p.ppp_obytes = 0;
+	get_command(ifreq.ifr_name);
+	FILE * fptr;
+	fptr=popen(command,"r+");
+	fscanf(fptr,"%u%u",&PPPStat->p.ppp_ibytes,&PPPStat->p.ppp_obytes);
+	pclose(fptr);
+
+	if ( ( _isUp && ( PPPStat->p.ppp_ibytes < _rxTotal ) ) ||
+	     ( !_isUp && ( PPPStat->p.ppp_ibytes == 0 ))
+	     ) {
+	  if ( _isUp ) {
+	    _isUp = false;
+	    emit linkDown();
+	    if ( options->cmd().length() ) {
+			  _retryId = startTimer( options->retry() * 1000 );
+			  system( (const char*)options->cmd() );
+	    }
+	  }
+	  PPPStat->p.ppp_ibytes = 0;
+          PPPStat->p.ppp_obytes = 0;
 	} else if ( !_isUp ) {
-		_isUp = true;
-		killTimer( _retryId );
-		_retryId = -1;
+	  _isUp = true;
+	  killTimer( _retryId );
+	  _retryId = -1;
 	}
-
+	
 	unsigned int rxDelta = PPPStat->p.ppp_ibytes - _rxTotal;
 	unsigned int txDelta = PPPStat->p.ppp_obytes - _txTotal;
 	_rxTotal = PPPStat->p.ppp_ibytes;
@@ -92,4 +102,17 @@
 	if ( rxDelta == _rxTotal ) rxDelta = 0;
 	if ( txDelta == _txTotal ) txDelta = 0;
 	emit changeStats( rxDelta, txDelta, _rxTotal, _txTotal );
+	
+}
+
+void get_command(char * interface) {
+  /*"/usr/bin/netstat -b -I tun0 | /usr/bin/grep Link | awk '{print $(NF-4),$(NF-1)}' */
+  const char * netstat_command ="/usr/bin/netstat -n -b -I ";
+  const char * grep_command =" | /usr/bin/grep Link | /usr/bin/awk '{print $(NF-4),$(NF-1)}'";
+  command[0]='\0';
+  strcat(command,netstat_command);
+  strcat(command,interface);
+  strcat(command,grep_command);
 }
+
+