diff -u --new-file pppload-1.0/Makefile ./Makefile
--- pppload-1.0/Makefile	Wed Sep 11 19:49:33 1996
+++ ./Makefile	Sat Jan 31 16:54:54 1998
@@ -2,20 +2,20 @@
 RM=rm -f
 LN=ln -sf
 INSTALL=install
-PREFIX=/usr
+PREFIX=/usr/local
 BINDIR=$(PREFIX)/bin
 MANDIR=$(PREFIX)/man/man1
 
 ####### Directories
 
-QTDIR   =   /usr/lib/qt
+QTDIR   =   /usr/X11R6/include/X11 		#/usr/lib/qt
 BASEDIR	=	$(QTDIR)
-INCDIR	=	$(BASEDIR)/include
-LIBDIR	=	$(BASEDIR)/lib
+INCDIR	=	/usr/X11R6/include/X11/qt  	#$(BASEDIR)/include
+LIBDIR	=	/usr/X11R6/lib			#$(BASEDIR)/lib
 
 ####### Compiler
 
-CFLAGS	=	-pipe -O2 -m486 -Wall
+CFLAGS	=	 -pipe -O2 -Wall
 LFLAGS	=	-L$(LIBDIR) -lqt
 LEXTRA	= 	
 CC		=	g++
@@ -75,7 +75,7 @@
 
 doc:
 	../h2html-1.0/h2html $(HEADERS)
-	
+
 srctar:
 	make veryclean
 	make doc
@@ -107,70 +107,90 @@
 
 # DO NOT DELETE THIS LINE -- make depend depends on it.
 
-pppload.o: /usr/lib/qt/include/qapp.h /usr/lib/qt/include/qwidget.h
-pppload.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
-pppload.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qobject.h
-pppload.o: /usr/lib/qt/include/qstring.h /usr/lib/qt/include/qarray.h
-pppload.o: /usr/lib/qt/include/qgarray.h /usr/lib/qt/include/qshared.h
-pppload.o: /usr/lib/qt/include/qgeneric.h /usr/include/string.h
-pppload.o: /usr/include/features.h /usr/include/sys/cdefs.h
-pppload.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
-pppload.o: /usr/lib/qt/include/qevent.h /usr/lib/qt/include/qrect.h
-pppload.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
-pppload.o: /usr/lib/qt/include/qpaintd.h /usr/lib/qt/include/qpalette.h
-pppload.o: /usr/lib/qt/include/qcolor.h /usr/lib/qt/include/qcursor.h
-pppload.o: /usr/lib/qt/include/qfont.h /usr/lib/qt/include/qfontmet.h
-pppload.o: /usr/lib/qt/include/qfontinf.h PPPStats.H MainWindow.H
-pppload.o: /usr/lib/qt/include/qpixmap.h Options.H
-PPPStats.o: /usr/include/stdlib.h /usr/include/features.h
-PPPStats.o: /usr/include/sys/cdefs.h
-PPPStats.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
-PPPStats.o: /usr/include/errno.h /usr/include/linux/errno.h
-PPPStats.o: /usr/include/asm/errno.h /usr/include/alloca.h
-PPPStats.o: /usr/include/stdio.h /usr/include/libio.h
-PPPStats.o: /usr/include/_G_config.h /usr/include/sys/ioctl.h
-PPPStats.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-PPPStats.o: /usr/include/sys/termios.h /usr/include/sys/socketio.h
-PPPStats.o: /usr/include/linux/sockios.h /usr/include/asm/sockios.h
-PPPStats.o: /usr/include/sys/socket.h /usr/include/linux/socket.h
-PPPStats.o: /usr/include/asm/socket.h /usr/include/linux/uio.h
-PPPStats.o: /usr/include/sys/types.h /usr/include/linux/types.h
-PPPStats.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
-PPPStats.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
-PPPStats.o: /usr/include/net/if.h /usr/include/linux/if.h
-PPPStats.o: /usr/include/linux/ppp_defs.h PPPStats.H
-PPPStats.o: /usr/lib/qt/include/qobject.h /usr/lib/qt/include/qobjdefs.h
-PPPStats.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qstring.h
-PPPStats.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
-PPPStats.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
-PPPStats.o: /usr/include/string.h /usr/lib/qt/include/qevent.h
-PPPStats.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qrect.h
-PPPStats.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
-PPPStats.o: Options.H /usr/lib/qt/include/qcolor.h
-MainWindow.o: /usr/lib/qt/include/qpainter.h /usr/lib/qt/include/qpaintd.h
-MainWindow.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
-MainWindow.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qrect.h
-MainWindow.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
-MainWindow.o: /usr/lib/qt/include/qcolor.h /usr/lib/qt/include/qfontmet.h
-MainWindow.o: /usr/lib/qt/include/qfont.h /usr/lib/qt/include/qstring.h
-MainWindow.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
-MainWindow.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
-MainWindow.o: /usr/include/string.h /usr/include/features.h
-MainWindow.o: /usr/include/sys/cdefs.h
-MainWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
-MainWindow.o: /usr/lib/qt/include/qfontinf.h /usr/lib/qt/include/qregion.h
-MainWindow.o: /usr/lib/qt/include/qpen.h /usr/lib/qt/include/qbrush.h
-MainWindow.o: /usr/lib/qt/include/qpntarry.h /usr/lib/qt/include/qwmatrix.h
-MainWindow.o: MainWindow.H /usr/lib/qt/include/qwidget.h
-MainWindow.o: /usr/lib/qt/include/qobject.h /usr/lib/qt/include/qevent.h
-MainWindow.o: /usr/lib/qt/include/qpalette.h /usr/lib/qt/include/qcursor.h
-MainWindow.o: /usr/lib/qt/include/qpixmap.h Options.H
-Options.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
-Options.o: Options.H /usr/lib/qt/include/qcolor.h
-Options.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
-Options.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qstring.h
-Options.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
-Options.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
-Options.o: /usr/include/string.h /usr/include/features.h
-Options.o: /usr/include/sys/cdefs.h
-Options.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
+pppload.o: /usr/X11R6/include/X11/qt/qapp.h
+pppload.o: /usr/X11R6/include/X11/qt/qwidget.h
+pppload.o: /usr/X11R6/include/X11/qt/qwindefs.h
+pppload.o: /usr/X11R6/include/X11/qt/qobjdefs.h
+pppload.o: /usr/X11R6/include/X11/qt/qglobal.h
+pppload.o: /usr/X11R6/include/X11/qt/qobject.h
+pppload.o: /usr/X11R6/include/X11/qt/qstring.h
+pppload.o: /usr/X11R6/include/X11/qt/qarray.h
+pppload.o: /usr/X11R6/include/X11/qt/qgarray.h
+pppload.o: /usr/X11R6/include/X11/qt/qshared.h
+pppload.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
+pppload.o: /usr/include/machine/ansi.h /usr/include/sys/cdefs.h
+pppload.o: /usr/X11R6/include/X11/qt/qevent.h
+pppload.o: /usr/X11R6/include/X11/qt/qrect.h
+pppload.o: /usr/X11R6/include/X11/qt/qsize.h
+pppload.o: /usr/X11R6/include/X11/qt/qpoint.h
+pppload.o: /usr/X11R6/include/X11/qt/qpaintd.h
+pppload.o: /usr/X11R6/include/X11/qt/qpalette.h
+pppload.o: /usr/X11R6/include/X11/qt/qcolor.h
+pppload.o: /usr/X11R6/include/X11/qt/qcursor.h
+pppload.o: /usr/X11R6/include/X11/qt/qfont.h
+pppload.o: /usr/X11R6/include/X11/qt/qfontmet.h
+pppload.o: /usr/X11R6/include/X11/qt/qfontinf.h PPPStats.H MainWindow.H
+pppload.o: /usr/X11R6/include/X11/qt/qpixmap.h Options.H
+PPPStats.o: /usr/include/stdlib.h /usr/include/machine/ansi.h
+PPPStats.o: /usr/include/machine/types.h /usr/include/sys/cdefs.h
+PPPStats.o: /usr/include/stdio.h /usr/include/sys/types.h
+PPPStats.o: /usr/include/machine/endian.h /usr/include/sys/select.h
+PPPStats.o: /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h
+PPPStats.o: /usr/include/sys/ioccom.h /usr/include/sys/filio.h
+PPPStats.o: /usr/include/sys/sockio.h /usr/include/sys/socket.h
+PPPStats.o: /usr/include/sys/time.h /usr/include/time.h /usr/include/net/if.h
+PPPStats.o: /usr/include/net/if_ppp.h /usr/include/net/ppp_defs.h PPPStats.H
+PPPStats.o: /usr/X11R6/include/X11/qt/qobject.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qobjdefs.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qglobal.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qstring.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qarray.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qgarray.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qshared.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qevent.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qwindefs.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qrect.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qsize.h
+PPPStats.o: /usr/X11R6/include/X11/qt/qpoint.h Options.H
+PPPStats.o: /usr/X11R6/include/X11/qt/qcolor.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpainter.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpaintd.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qwindefs.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qobjdefs.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qglobal.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qrect.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qsize.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpoint.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qcolor.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qfontmet.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qfont.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qstring.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qarray.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qgarray.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qshared.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
+MainWindow.o: /usr/include/machine/ansi.h /usr/include/sys/cdefs.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qfontinf.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qregion.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpen.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qbrush.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpntarry.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qwmatrix.h MainWindow.H
+MainWindow.o: /usr/X11R6/include/X11/qt/qwidget.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qobject.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qevent.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpalette.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qcursor.h
+MainWindow.o: /usr/X11R6/include/X11/qt/qpixmap.h Options.H
+Options.o: /usr/include/stdio.h /usr/include/sys/cdefs.h
+Options.o: /usr/include/machine/ansi.h Options.H
+Options.o: /usr/X11R6/include/X11/qt/qcolor.h
+Options.o: /usr/X11R6/include/X11/qt/qwindefs.h
+Options.o: /usr/X11R6/include/X11/qt/qobjdefs.h
+Options.o: /usr/X11R6/include/X11/qt/qglobal.h
+Options.o: /usr/X11R6/include/X11/qt/qstring.h
+Options.o: /usr/X11R6/include/X11/qt/qarray.h
+Options.o: /usr/X11R6/include/X11/qt/qgarray.h
+Options.o: /usr/X11R6/include/X11/qt/qshared.h
+Options.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
diff -u --new-file pppload-1.0/Options.C ./Options.C
--- pppload-1.0/Options.C	Tue Sep 10 16:55:27 1996
+++ ./Options.C	Fri Jan 30 20:01:38 1998
@@ -24,7 +24,7 @@
 #include "Options.H"
 
 Options::Options( int argc, char* argv[] )
-: _divider( 512 ), _interval( 5 ), _link( 0 ), _period( 60 ), _retry( 60 ), _showTx( true ), _showRx( true ), _txColor( "forestgreen" ), _rxColor( "red" )
+: _divider( 512 ), _interval( 5 ),  _device("tun"), _link( 0 ), _period( 60 ), _retry( 60 ), _showTx( true ), _showRx( true ), _txColor( "forestgreen" ), _rxColor( "red" )
 {
 	for ( int i = 1; i < argc; i++ ) {
 		if ( !strcmp( argv[i], "-cmd" ) ) {
@@ -33,6 +33,8 @@
 			sscanf( argv[++i], "%d", &_divider );
 		} else if ( !strcmp( argv[i], "-i" ) ) {
 			sscanf( argv[++i], "%d", &_interval );
+		} else if ( !strcmp( argv[i], "-device" ) ) {
+			 strcpy(_device,argv[++i]);
 		} else if ( !strcmp( argv[i], "-link" ) ) {
 			sscanf( argv[++i], "%d", &_link );
 		} else if ( !strcmp( argv[i], "-p" ) ) {
@@ -60,6 +62,7 @@
 			fprintf( stderr, "-d n            Horizontal divider spacing in bytes per second (default: %d).\n", divider() );
 			fprintf( stderr, "-h              Print this help.\n" );
 			fprintf( stderr, "-i interval     Set the polling interval to be 'interval' seconds (default: %d).\n", interval() );
+			fprintf( stderr, "-device name    Name of the device to monitor (default is tun). \n");
 			fprintf( stderr, "-link link      The PPP link number to monitor (default: %d).\n", link() );
 			fprintf( stderr, "-p period       Set the load averaging period to be 'period seconds (default: %d).\n", period() );
 			fprintf( stderr, "-retry interval Time between retries when dialling PPP link (default: %d).\n", retry() );
@@ -74,7 +77,7 @@
 			fprintf( stderr, "pppload comes with ABSOLUTELY NO WARRANTY; for details see the LICENSE file.\n" );
 			fprintf( stderr, "This is free software, and you are welcome to redistribute it\n" );
 			fprintf( stderr, "under certain conditions; see the LICENSE file for details.\n" );
-
+			fprintf( stderr, "Modified for FreeBSD 1998 \n");
 			exit( 1 );
 		}
 	}
diff -u --new-file pppload-1.0/Options.H ./Options.H
--- pppload-1.0/Options.H	Tue Sep 10 16:53:36 1996
+++ ./Options.H	Thu Jan 29 21:12:01 1998
@@ -31,6 +31,8 @@
 	int     _divider;
 	//: Statistics polling interval in seconds.
 	int     _interval;
+        //: Network device to monitor
+        char  _device[4];
 	//: PPP link number to monitor.
 	int     _link;
 	//: Load averaging interval in seconds.
@@ -49,9 +51,12 @@
 	//: Extract command line opotions from argc and argv.
 	Options( int argc, char* argv[] );
 
-    //: Return the PPP command.
-    QString& cmd()      { return _cmd;      }
+        //: Return the PPP command.
+        QString& cmd()      { return _cmd;      }
 	
+        //: Return the name of the device being monitored
+        char *  device() { return _device; }
+
 	//: Return the spacing between horizontal dividers.
 	int      divider()  { return _divider;  }
 
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);
 }
+
+
diff -u --new-file pppload-1.0/PPPStats.C.ppp ./PPPStats.C.ppp
--- pppload-1.0/PPPStats.C.ppp	Wed Dec 31 16:00:00 1969
+++ ./PPPStats.C.ppp	Wed Jan 28 18:27:30 1998
@@ -0,0 +1,120 @@
+// pppload - A PPP Load Monitor
+// Copyright (C) 1996  Sean Vyain
+// svyain@mail.tds.net
+// smvyain@softart.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+extern "C" {
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <net/if.h> 
+#include <net/if_ppp.h> 
+#include <net/if_var.h>
+#include <net/if_tun.h>
+}
+
+#include "PPPStats.H"
+#include "Options.H"
+#include <iostream.h>
+
+
+typedef struct
+{
+  struct ppp_stats  stats;
+} DclPPPInfo;
+
+PPPStats::PPPStats()
+: _rxTotal( 0 ), _txTotal( 0 ), _isUp( true ), _retryId( -1 )
+{
+	if ((_s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+        perror("couldn't create IP socket");
+        exit(1);
+    }
+
+	startTimer( options->interval() * 1000 );
+}
+
+void PPPStats::timerEvent( QTimerEvent* e )
+{
+	if ( e->timerId() == _retryId )
+	{
+		system( (const char*)options->cmd() );
+	}
+	
+	DclPPPInfo        PPPInfo[1];           // what is this var for?
+	struct ifpppstatsreq ifreq;             // ifreq      ifreq; 
+	struct ppp_stats* PPPStat;
+	struct ppp_stats  LastPPPStat[1];       // what is this var for?
+	
+	memset (&ifreq, 0, sizeof (ifreq));
+//	sprintf (ifreq.ifr_ifrn.ifrn_name, "ppp%d", options->link());
+	sprintf (ifreq.ifr_name, "tun%d", options->link());
+
+//	ifreq.ifr_ifru.ifru_data = (caddr_t) PPPInfo;
+
+	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 ( (ioctl (_s, SIOCGPPPSTATS ,  &ifreq) < 0) ||
+	     ( _isUp && ( ifreq.stats.p.ppp_ibytes < _rxTotal ) ) ||
+	     ( !_isUp && ( ifreq.stats.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;
+	}
+
+ PPPStat->p.ppp_ibytes=ifreq.stats.p.ppp_ibytes;	
+ PPPStat->p.ppp_obytes=ifreq.stats.p.ppp_obytes;
+	
+
+cout<<ifreq.stats.p.ppp_ibytes<<" "<<ifreq.stats.p.ppp_ipackets<<" "
+    <<ifreq.stats.p.ppp_ierrors<<" "<<ifreq.stats.p.ppp_obytes <<" "
+    <<ifreq.stats.p.ppp_opackets<<" "<<ifreq.stats.p.ppp_oerrors<<endl
+    <<PPPStat->p.ppp_ibytes<<" "<<PPPStat->p.ppp_ipackets<<" "
+    <<PPPStat->p.ppp_ierrors<<" "<<PPPStat->p.ppp_obytes <<" "
+    <<PPPStat->p.ppp_opackets<<" "<<PPPStat->p.ppp_oerrors<<endl;
+	unsigned int rxDelta = PPPStat->p.ppp_ibytes - _rxTotal;
+	unsigned int txDelta = PPPStat->p.ppp_obytes - _txTotal;
+	_rxTotal = PPPStat->p.ppp_ibytes;
+	_txTotal = PPPStat->p.ppp_obytes;
+	if ( rxDelta == _rxTotal ) rxDelta = 0;
+	if ( txDelta == _txTotal ) txDelta = 0;
+	emit changeStats( rxDelta, txDelta, _rxTotal, _txTotal );
+
+}
+
diff -u --new-file pppload-1.0/README.freebsd ./README.freebsd
--- pppload-1.0/README.freebsd	Wed Dec 31 16:00:00 1969
+++ ./README.freebsd	Fri Jan 30 20:14:36 1998
@@ -0,0 +1,45 @@
+PPPLoad is designed to display the current throughput of a particular
+PPP link in a format that is similar to xload. Written by Sean Vyain. 
+
+This is a FreeBSD port of the linux program called pppload, available at
+http://sunsite.unc.edu/pub/Linux/system/network/serial/ppp/pppload-1.0.tar.gz
+
+Original program homepage at:
+http://www.geocities.com/SiliconValley/Pines/1029/pppload.html
+
+I have modified the FreeBSD port to be able to show the throughput of
+any network device that will work with netstat, e.g. tun, ppp, ed,
+etc.  I just wanted a program to nicely display throughput
+statistics for the tun device.
+
+ Examples of usage:
+For tun0 (tun is the default device,0 is the default link number):
+% pppload &
+
+For first ne2000 clone:
+% pppload -device ed -link 0 &
+
+for ppp2:
+% pppload -device ppp -link 2 &
+
+BUGS
+Command line is awkward with -device and -link.
+
+Can't detect whether the network device is up or not, so any command
+line options like -cmd -percmd -retry probably don't work.  This is
+different that the original linux version.
+
+Keeps track of all packets network device has ever used, even if it
+has gone down then up again.  This is also different than the linux
+version. 
+
+Requires awk, grep, and netstat to get the data.  Very short polling
+time are definitely not recommended.
+
+Network interface names are limited to a total of 4 characters or less
+at the moment, e.g. ppp0 ed3 ze1.
+
+
+Documentation of this FreeBSD port is not complete.
+
+
Common subdirectories: pppload-1.0/backup and ./backup
diff -u --new-file pppload-1.0/patch ./patch
--- pppload-1.0/patch	Wed Dec 31 16:00:00 1969
+++ ./patch	Sat Jan 31 16:54:56 1998
@@ -0,0 +1,561 @@
+diff -u --new-file pppload-1.0/Makefile ./Makefile
+--- pppload-1.0/Makefile	Wed Sep 11 19:49:33 1996
++++ ./Makefile	Sat Jan 31 16:54:54 1998
+@@ -2,20 +2,20 @@
+ RM=rm -f
+ LN=ln -sf
+ INSTALL=install
+-PREFIX=/usr
++PREFIX=/usr/local
+ BINDIR=$(PREFIX)/bin
+ MANDIR=$(PREFIX)/man/man1
+ 
+ ####### Directories
+ 
+-QTDIR   =   /usr/lib/qt
++QTDIR   =   /usr/X11R6/include/X11 		#/usr/lib/qt
+ BASEDIR	=	$(QTDIR)
+-INCDIR	=	$(BASEDIR)/include
+-LIBDIR	=	$(BASEDIR)/lib
++INCDIR	=	/usr/X11R6/include/X11/qt  	#$(BASEDIR)/include
++LIBDIR	=	/usr/X11R6/lib			#$(BASEDIR)/lib
+ 
+ ####### Compiler
+ 
+-CFLAGS	=	-pipe -O2 -m486 -Wall
++CFLAGS	=	 -pipe -O2 -Wall
+ LFLAGS	=	-L$(LIBDIR) -lqt
+ LEXTRA	= 	
+ CC		=	g++
+@@ -75,7 +75,7 @@
+ 
+ doc:
+ 	../h2html-1.0/h2html $(HEADERS)
+-	
++
+ srctar:
+ 	make veryclean
+ 	make doc
+@@ -90,8 +90,8 @@
+ 	cd ..; tar -zcvf pppload-$(VERSION)-bin.tar.gz pppload-$(VERSION)
+ 
+ install:
+-	$(INSTALL) -s pppload $(BINDIR)
+-	$(INSTALL) pppload.1 $(MANDIR)
++#	$(INSTALL) -c pppload $(BINDIR)
++#	$(INSTALL) -c pppload.1 $(MANDIR)
+ 
+ uninstall:
+ 	$(RM) $(BINDIR)/pppload
+@@ -107,70 +107,90 @@
+ 
+ # DO NOT DELETE THIS LINE -- make depend depends on it.
+ 
+-pppload.o: /usr/lib/qt/include/qapp.h /usr/lib/qt/include/qwidget.h
+-pppload.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
+-pppload.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qobject.h
+-pppload.o: /usr/lib/qt/include/qstring.h /usr/lib/qt/include/qarray.h
+-pppload.o: /usr/lib/qt/include/qgarray.h /usr/lib/qt/include/qshared.h
+-pppload.o: /usr/lib/qt/include/qgeneric.h /usr/include/string.h
+-pppload.o: /usr/include/features.h /usr/include/sys/cdefs.h
+-pppload.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
+-pppload.o: /usr/lib/qt/include/qevent.h /usr/lib/qt/include/qrect.h
+-pppload.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
+-pppload.o: /usr/lib/qt/include/qpaintd.h /usr/lib/qt/include/qpalette.h
+-pppload.o: /usr/lib/qt/include/qcolor.h /usr/lib/qt/include/qcursor.h
+-pppload.o: /usr/lib/qt/include/qfont.h /usr/lib/qt/include/qfontmet.h
+-pppload.o: /usr/lib/qt/include/qfontinf.h PPPStats.H MainWindow.H
+-pppload.o: /usr/lib/qt/include/qpixmap.h Options.H
+-PPPStats.o: /usr/include/stdlib.h /usr/include/features.h
+-PPPStats.o: /usr/include/sys/cdefs.h
+-PPPStats.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
+-PPPStats.o: /usr/include/errno.h /usr/include/linux/errno.h
+-PPPStats.o: /usr/include/asm/errno.h /usr/include/alloca.h
+-PPPStats.o: /usr/include/stdio.h /usr/include/libio.h
+-PPPStats.o: /usr/include/_G_config.h /usr/include/sys/ioctl.h
+-PPPStats.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
+-PPPStats.o: /usr/include/sys/termios.h /usr/include/sys/socketio.h
+-PPPStats.o: /usr/include/linux/sockios.h /usr/include/asm/sockios.h
+-PPPStats.o: /usr/include/sys/socket.h /usr/include/linux/socket.h
+-PPPStats.o: /usr/include/asm/socket.h /usr/include/linux/uio.h
+-PPPStats.o: /usr/include/sys/types.h /usr/include/linux/types.h
+-PPPStats.o: /usr/include/linux/posix_types.h /usr/include/asm/posix_types.h
+-PPPStats.o: /usr/include/asm/types.h /usr/include/sys/bitypes.h
+-PPPStats.o: /usr/include/net/if.h /usr/include/linux/if.h
+-PPPStats.o: /usr/include/linux/ppp_defs.h PPPStats.H
+-PPPStats.o: /usr/lib/qt/include/qobject.h /usr/lib/qt/include/qobjdefs.h
+-PPPStats.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qstring.h
+-PPPStats.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
+-PPPStats.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
+-PPPStats.o: /usr/include/string.h /usr/lib/qt/include/qevent.h
+-PPPStats.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qrect.h
+-PPPStats.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
+-PPPStats.o: Options.H /usr/lib/qt/include/qcolor.h
+-MainWindow.o: /usr/lib/qt/include/qpainter.h /usr/lib/qt/include/qpaintd.h
+-MainWindow.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
+-MainWindow.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qrect.h
+-MainWindow.o: /usr/lib/qt/include/qsize.h /usr/lib/qt/include/qpoint.h
+-MainWindow.o: /usr/lib/qt/include/qcolor.h /usr/lib/qt/include/qfontmet.h
+-MainWindow.o: /usr/lib/qt/include/qfont.h /usr/lib/qt/include/qstring.h
+-MainWindow.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
+-MainWindow.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
+-MainWindow.o: /usr/include/string.h /usr/include/features.h
+-MainWindow.o: /usr/include/sys/cdefs.h
+-MainWindow.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
+-MainWindow.o: /usr/lib/qt/include/qfontinf.h /usr/lib/qt/include/qregion.h
+-MainWindow.o: /usr/lib/qt/include/qpen.h /usr/lib/qt/include/qbrush.h
+-MainWindow.o: /usr/lib/qt/include/qpntarry.h /usr/lib/qt/include/qwmatrix.h
+-MainWindow.o: MainWindow.H /usr/lib/qt/include/qwidget.h
+-MainWindow.o: /usr/lib/qt/include/qobject.h /usr/lib/qt/include/qevent.h
+-MainWindow.o: /usr/lib/qt/include/qpalette.h /usr/lib/qt/include/qcursor.h
+-MainWindow.o: /usr/lib/qt/include/qpixmap.h Options.H
+-Options.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
+-Options.o: Options.H /usr/lib/qt/include/qcolor.h
+-Options.o: /usr/lib/qt/include/qwindefs.h /usr/lib/qt/include/qobjdefs.h
+-Options.o: /usr/lib/qt/include/qglobal.h /usr/lib/qt/include/qstring.h
+-Options.o: /usr/lib/qt/include/qarray.h /usr/lib/qt/include/qgarray.h
+-Options.o: /usr/lib/qt/include/qshared.h /usr/lib/qt/include/qgeneric.h
+-Options.o: /usr/include/string.h /usr/include/features.h
+-Options.o: /usr/include/sys/cdefs.h
+-Options.o: /usr/lib/gcc-lib/i486-linux/2.7.2/include/stddef.h
++pppload.o: /usr/X11R6/include/X11/qt/qapp.h
++pppload.o: /usr/X11R6/include/X11/qt/qwidget.h
++pppload.o: /usr/X11R6/include/X11/qt/qwindefs.h
++pppload.o: /usr/X11R6/include/X11/qt/qobjdefs.h
++pppload.o: /usr/X11R6/include/X11/qt/qglobal.h
++pppload.o: /usr/X11R6/include/X11/qt/qobject.h
++pppload.o: /usr/X11R6/include/X11/qt/qstring.h
++pppload.o: /usr/X11R6/include/X11/qt/qarray.h
++pppload.o: /usr/X11R6/include/X11/qt/qgarray.h
++pppload.o: /usr/X11R6/include/X11/qt/qshared.h
++pppload.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
++pppload.o: /usr/include/machine/ansi.h /usr/include/sys/cdefs.h
++pppload.o: /usr/X11R6/include/X11/qt/qevent.h
++pppload.o: /usr/X11R6/include/X11/qt/qrect.h
++pppload.o: /usr/X11R6/include/X11/qt/qsize.h
++pppload.o: /usr/X11R6/include/X11/qt/qpoint.h
++pppload.o: /usr/X11R6/include/X11/qt/qpaintd.h
++pppload.o: /usr/X11R6/include/X11/qt/qpalette.h
++pppload.o: /usr/X11R6/include/X11/qt/qcolor.h
++pppload.o: /usr/X11R6/include/X11/qt/qcursor.h
++pppload.o: /usr/X11R6/include/X11/qt/qfont.h
++pppload.o: /usr/X11R6/include/X11/qt/qfontmet.h
++pppload.o: /usr/X11R6/include/X11/qt/qfontinf.h PPPStats.H MainWindow.H
++pppload.o: /usr/X11R6/include/X11/qt/qpixmap.h Options.H
++PPPStats.o: /usr/include/stdlib.h /usr/include/machine/ansi.h
++PPPStats.o: /usr/include/machine/types.h /usr/include/sys/cdefs.h
++PPPStats.o: /usr/include/stdio.h /usr/include/sys/types.h
++PPPStats.o: /usr/include/machine/endian.h /usr/include/sys/select.h
++PPPStats.o: /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h
++PPPStats.o: /usr/include/sys/ioccom.h /usr/include/sys/filio.h
++PPPStats.o: /usr/include/sys/sockio.h /usr/include/sys/socket.h
++PPPStats.o: /usr/include/sys/time.h /usr/include/time.h /usr/include/net/if.h
++PPPStats.o: /usr/include/net/if_ppp.h /usr/include/net/ppp_defs.h PPPStats.H
++PPPStats.o: /usr/X11R6/include/X11/qt/qobject.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qobjdefs.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qglobal.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qstring.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qarray.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qgarray.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qshared.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qevent.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qwindefs.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qrect.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qsize.h
++PPPStats.o: /usr/X11R6/include/X11/qt/qpoint.h Options.H
++PPPStats.o: /usr/X11R6/include/X11/qt/qcolor.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpainter.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpaintd.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qwindefs.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qobjdefs.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qglobal.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qrect.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qsize.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpoint.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qcolor.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qfontmet.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qfont.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qstring.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qarray.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qgarray.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qshared.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
++MainWindow.o: /usr/include/machine/ansi.h /usr/include/sys/cdefs.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qfontinf.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qregion.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpen.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qbrush.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpntarry.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qwmatrix.h MainWindow.H
++MainWindow.o: /usr/X11R6/include/X11/qt/qwidget.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qobject.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qevent.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpalette.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qcursor.h
++MainWindow.o: /usr/X11R6/include/X11/qt/qpixmap.h Options.H
++Options.o: /usr/include/stdio.h /usr/include/sys/cdefs.h
++Options.o: /usr/include/machine/ansi.h Options.H
++Options.o: /usr/X11R6/include/X11/qt/qcolor.h
++Options.o: /usr/X11R6/include/X11/qt/qwindefs.h
++Options.o: /usr/X11R6/include/X11/qt/qobjdefs.h
++Options.o: /usr/X11R6/include/X11/qt/qglobal.h
++Options.o: /usr/X11R6/include/X11/qt/qstring.h
++Options.o: /usr/X11R6/include/X11/qt/qarray.h
++Options.o: /usr/X11R6/include/X11/qt/qgarray.h
++Options.o: /usr/X11R6/include/X11/qt/qshared.h
++Options.o: /usr/X11R6/include/X11/qt/qgeneric.h /usr/include/string.h
+diff -u --new-file pppload-1.0/Options.C ./Options.C
+--- pppload-1.0/Options.C	Tue Sep 10 16:55:27 1996
++++ ./Options.C	Fri Jan 30 20:01:38 1998
+@@ -24,7 +24,7 @@
+ #include "Options.H"
+ 
+ Options::Options( int argc, char* argv[] )
+-: _divider( 512 ), _interval( 5 ), _link( 0 ), _period( 60 ), _retry( 60 ), _showTx( true ), _showRx( true ), _txColor( "forestgreen" ), _rxColor( "red" )
++: _divider( 512 ), _interval( 5 ),  _device("tun"), _link( 0 ), _period( 60 ), _retry( 60 ), _showTx( true ), _showRx( true ), _txColor( "forestgreen" ), _rxColor( "red" )
+ {
+ 	for ( int i = 1; i < argc; i++ ) {
+ 		if ( !strcmp( argv[i], "-cmd" ) ) {
+@@ -33,6 +33,8 @@
+ 			sscanf( argv[++i], "%d", &_divider );
+ 		} else if ( !strcmp( argv[i], "-i" ) ) {
+ 			sscanf( argv[++i], "%d", &_interval );
++		} else if ( !strcmp( argv[i], "-device" ) ) {
++			 strcpy(_device,argv[++i]);
+ 		} else if ( !strcmp( argv[i], "-link" ) ) {
+ 			sscanf( argv[++i], "%d", &_link );
+ 		} else if ( !strcmp( argv[i], "-p" ) ) {
+@@ -60,6 +62,7 @@
+ 			fprintf( stderr, "-d n            Horizontal divider spacing in bytes per second (default: %d).\n", divider() );
+ 			fprintf( stderr, "-h              Print this help.\n" );
+ 			fprintf( stderr, "-i interval     Set the polling interval to be 'interval' seconds (default: %d).\n", interval() );
++			fprintf( stderr, "-device name    Name of the device to monitor (default is tun). \n");
+ 			fprintf( stderr, "-link link      The PPP link number to monitor (default: %d).\n", link() );
+ 			fprintf( stderr, "-p period       Set the load averaging period to be 'period seconds (default: %d).\n", period() );
+ 			fprintf( stderr, "-retry interval Time between retries when dialling PPP link (default: %d).\n", retry() );
+@@ -74,7 +77,7 @@
+ 			fprintf( stderr, "pppload comes with ABSOLUTELY NO WARRANTY; for details see the LICENSE file.\n" );
+ 			fprintf( stderr, "This is free software, and you are welcome to redistribute it\n" );
+ 			fprintf( stderr, "under certain conditions; see the LICENSE file for details.\n" );
+-
++			fprintf( stderr, "Modified for FreeBSD 1998 \n");
+ 			exit( 1 );
+ 		}
+ 	}
+diff -u --new-file pppload-1.0/Options.H ./Options.H
+--- pppload-1.0/Options.H	Tue Sep 10 16:53:36 1996
++++ ./Options.H	Thu Jan 29 21:12:01 1998
+@@ -31,6 +31,8 @@
+ 	int     _divider;
+ 	//: Statistics polling interval in seconds.
+ 	int     _interval;
++        //: Network device to monitor
++        char  _device[4];
+ 	//: PPP link number to monitor.
+ 	int     _link;
+ 	//: Load averaging interval in seconds.
+@@ -49,9 +51,12 @@
+ 	//: Extract command line opotions from argc and argv.
+ 	Options( int argc, char* argv[] );
+ 
+-    //: Return the PPP command.
+-    QString& cmd()      { return _cmd;      }
++        //: Return the PPP command.
++        QString& cmd()      { return _cmd;      }
+ 	
++        //: Return the name of the device being monitored
++        char *  device() { return _device; }
++
+ 	//: Return the spacing between horizontal dividers.
+ 	int      divider()  { return _divider;  }
+ 
+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);
+ }
++
++
+diff -u --new-file pppload-1.0/PPPStats.C.ppp ./PPPStats.C.ppp
+--- pppload-1.0/PPPStats.C.ppp	Wed Dec 31 16:00:00 1969
++++ ./PPPStats.C.ppp	Wed Jan 28 18:27:30 1998
+@@ -0,0 +1,120 @@
++// pppload - A PPP Load Monitor
++// Copyright (C) 1996  Sean Vyain
++// svyain@mail.tds.net
++// smvyain@softart.com
++//
++// This program is free software; you can redistribute it and/or modify
++// it under the terms of the GNU General Public License as published by
++// the Free Software Foundation; either version 2 of the License, or
++// (at your option) any later version.
++//
++// This program is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++//
++// You should have received a copy of the GNU General Public License
++// along with this program; if not, write to the Free Software
++// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++extern "C" {
++#include <stdlib.h>
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/select.h>
++#include <sys/ioctl.h>
++#include <sys/socket.h>
++#include <sys/time.h>
++#include <net/if.h> 
++#include <net/if_ppp.h> 
++#include <net/if_var.h>
++#include <net/if_tun.h>
++}
++
++#include "PPPStats.H"
++#include "Options.H"
++#include <iostream.h>
++
++
++typedef struct
++{
++  struct ppp_stats  stats;
++} DclPPPInfo;
++
++PPPStats::PPPStats()
++: _rxTotal( 0 ), _txTotal( 0 ), _isUp( true ), _retryId( -1 )
++{
++	if ((_s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
++        perror("couldn't create IP socket");
++        exit(1);
++    }
++
++	startTimer( options->interval() * 1000 );
++}
++
++void PPPStats::timerEvent( QTimerEvent* e )
++{
++	if ( e->timerId() == _retryId )
++	{
++		system( (const char*)options->cmd() );
++	}
++	
++	DclPPPInfo        PPPInfo[1];           // what is this var for?
++	struct ifpppstatsreq ifreq;             // ifreq      ifreq; 
++	struct ppp_stats* PPPStat;
++	struct ppp_stats  LastPPPStat[1];       // what is this var for?
++	
++	memset (&ifreq, 0, sizeof (ifreq));
++//	sprintf (ifreq.ifr_ifrn.ifrn_name, "ppp%d", options->link());
++	sprintf (ifreq.ifr_name, "tun%d", options->link());
++
++//	ifreq.ifr_ifru.ifru_data = (caddr_t) PPPInfo;
++
++	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 ( (ioctl (_s, SIOCGPPPSTATS ,  &ifreq) < 0) ||
++	     ( _isUp && ( ifreq.stats.p.ppp_ibytes < _rxTotal ) ) ||
++	     ( !_isUp && ( ifreq.stats.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;
++	}
++
++ PPPStat->p.ppp_ibytes=ifreq.stats.p.ppp_ibytes;	
++ PPPStat->p.ppp_obytes=ifreq.stats.p.ppp_obytes;
++	
++
++cout<<ifreq.stats.p.ppp_ibytes<<" "<<ifreq.stats.p.ppp_ipackets<<" "
++    <<ifreq.stats.p.ppp_ierrors<<" "<<ifreq.stats.p.ppp_obytes <<" "
++    <<ifreq.stats.p.ppp_opackets<<" "<<ifreq.stats.p.ppp_oerrors<<endl
++    <<PPPStat->p.ppp_ibytes<<" "<<PPPStat->p.ppp_ipackets<<" "
++    <<PPPStat->p.ppp_ierrors<<" "<<PPPStat->p.ppp_obytes <<" "
++    <<PPPStat->p.ppp_opackets<<" "<<PPPStat->p.ppp_oerrors<<endl;
++	unsigned int rxDelta = PPPStat->p.ppp_ibytes - _rxTotal;
++	unsigned int txDelta = PPPStat->p.ppp_obytes - _txTotal;
++	_rxTotal = PPPStat->p.ppp_ibytes;
++	_txTotal = PPPStat->p.ppp_obytes;
++	if ( rxDelta == _rxTotal ) rxDelta = 0;
++	if ( txDelta == _txTotal ) txDelta = 0;
++	emit changeStats( rxDelta, txDelta, _rxTotal, _txTotal );
++
++}
++
+diff -u --new-file pppload-1.0/README.freebsd ./README.freebsd
+--- pppload-1.0/README.freebsd	Wed Dec 31 16:00:00 1969
++++ ./README.freebsd	Fri Jan 30 20:14:36 1998
+@@ -0,0 +1,45 @@
++PPPLoad is designed to display the current throughput of a particular
++PPP link in a format that is similar to xload. Written by Sean Vyain. 
++
++This is a FreeBSD port of the linux program called pppload, available at
++http://sunsite.unc.edu/pub/Linux/system/network/serial/ppp/pppload-1.0.tar.gz
++
++Original program homepage at:
++http://www.geocities.com/SiliconValley/Pines/1029/pppload.html
++
++I have modified the FreeBSD port to be able to show the throughput of
++any network device that will work with netstat, e.g. tun, ppp, ed,
++etc.  I just wanted a program to nicely display throughput
++statistics for the tun device.
++
++ Examples of usage:
++For tun0 (tun is the default device,0 is the default link number):
++% pppload &
++
++For first ne2000 clone:
++% pppload -device ed -link 0 &
++
++for ppp2:
++% pppload -device ppp -link 2 &
++
++BUGS
++Command line is awkward with -device and -link.
++
++Can't detect whether the network device is up or not, so any command
++line options like -cmd -percmd -retry probably don't work.  This is
++different that the original linux version.
++
++Keeps track of all packets network device has ever used, even if it
++has gone down then up again.  This is also different than the linux
++version. 
++
++Requires awk, grep, and netstat to get the data.  Very short polling
++time are definitely not recommended.
++
++Network interface names are limited to a total of 4 characters or less
++at the moment, e.g. ppp0 ed3 ze1.
++
++
++Documentation of this FreeBSD port is not complete.
++
++
+Common subdirectories: pppload-1.0/backup and ./backup
Binary files pppload-1.0/pppload and ./pppload differ
Common subdirectories: pppload-1.0/pppload-1.0 and ./pppload-1.0
diff -u --new-file pppload-1.0/pppload.1 ./pppload.1
--- pppload-1.0/pppload.1	Tue Sep 10 16:56:20 1996
+++ ./pppload.1	Fri Jan 30 21:35:55 1998
@@ -3,7 +3,7 @@
 pppload \- display an xload-style graph of PPP activity
 .SH SYNOPSIS
 .B pppload
-[\-cmd ppp_cmd] [\-i interval] [\-p period] [\-retry interval] [\-rx] [\-norx]
+[\-cmd ppp_cmd] [\-i interval] [\-device name] [\-p period] [\-retry interval] [\-rx] [\-norx]
 [\-rxcolor color] [\-tx] [\-notx] [\-txcolor color]
 .SH DESCRIPTION
 .BR pppload
@@ -28,6 +28,9 @@
 .I "\-h"
 Print command line usage.
 .TP
+.I "\-device name"
+Network device to monitor (default: tun)
+.TP
 .I "\-i interval"
 The statistics polling interval in seconds (default: 5).
 .TP
@@ -60,3 +63,41 @@
 The name of the color to draw transmit rates in (default: red).
 .SH AUTHOR
 Sean Vyain <svyain@mail.tds.net, smvyain@softart.com>
+www.geocities.com/SiliconValley/Pines/1029/pppload.html
+
+.SH FREEBSD PORT
+Examples of usage for the FreeBSD port:
+
+For tun0 (tun is the default device,0 is the default link number):
+
+% pppload &
+
+For the first ne2000 ethernet card:
+
+% pppload -device ed -link 0 &
+
+for the third ppp device:
+
+% pppload -device ppp -link 2 &
+
+.SH BUGS
+The port to FreeBSD can't determine when the link is up or down, so 
+some of the command line options like
+.I "\-cmd" 
+.I "\-percmd"
+may not work.
+
+Command line is awkward with -device and -link.
+
+Keeps track of all packets network device has ever used, even if it
+has gone down then up again.  This is different than the linux
+version. 
+
+Requires awk, grep, and netstat to get the data.  Very short polling
+times are definitely not recommended.
+
+Network interface names are limited to a total of 4 characters or less
+at the moment, e.g. ppp0 ed3 ze1.
+
+ 
+Modified January 1998
diff -u --new-file pppload-1.0/pppload.C ./pppload.C
--- pppload-1.0/pppload.C	Wed Sep 11 19:56:40 1996
+++ ./pppload.C	Fri Jan 30 14:33:07 1998
@@ -27,6 +27,7 @@
 int main(int   argc,
 		 char* argv[])
 {
+
 	QApplication a( argc, argv );
 	options              = new Options( argc, argv );
 	MainWindow* mw       = new MainWindow;
@@ -39,3 +40,4 @@
 	mw->show();
 	return a.exec();
 }
+
