blob: 66ac2f6e53ee4ed11ed720e71113f91b7864825a [file] [log] [blame] [raw]
/***************************************************************************
main.cpp
-------------------
begin : Wed Jul 25 2001
copyright : (C) 2001 by Roland Riegel
email : support@roland-riegel.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
/*
* nload
* real time monitor for network traffic
* Copyright (C) 2001 Roland Riegel <support@roland-riegel.de>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "main.h"
int main (int argc, char *argv[])
{
int sleep_interval = STANDARD_SLEEP_INTERVAL;
long bar_max_in = STANDARD_BAR_MAX_IN;
long bar_max_out = STANDARD_BAR_MAX_OUT;
int average_smoothness = STANDARD_AVERAGE_SMOOTHNESS;
bool print_only_once = false;
struct timespec wanted_time;
int index = 0;
int cur_dev = 0;
int key = 0;
network_device = (char **) malloc( sizeof( char * ) );
if ( network_device == NULL )
{
fprintf( stderr, "Running out of memory.\n\n" );
exit( EXIT_FAILURE );
}
//parse the command line
for ( int i = 1; i < argc; i++ )
{
//wants the user help?
if ( strcmp( argv[i], "-h" ) == 0 || strcmp( argv[i], "--help" ) == 0 )
{
printhelp( argv[0] );
exit(0);
}
//has the user set a non-default 100% mark for
//the incoming bandwidth bar?
else if ( strcmp( argv[i], "-i" ) == 0 )
{
if ( i < argc - 1 && isdigit( argv[ i + 1 ][0] ) != 0 )
{
bar_max_in = atol( argv[ i + 1 ] );
if ( bar_max_in == 0 ) bar_max_in = STANDARD_BAR_MAX_IN;
i++;
}
else
{
fprintf( stderr, "Wrong argument for the -i parameter.\n\n" );
printhelp( argv[0] );
exit(1);
}
}
//has the user set a non-default 100% mark for
//the outgoing bandwidth bar?
else if ( strcmp( argv[i], "-o" ) == 0)
{
if ( i < argc - 1 && isdigit( argv[ i + 1 ][0] ) != 0 )
{
bar_max_out = atol( argv[ i + 1 ] );
if ( bar_max_out == 0 ) bar_max_out = STANDARD_BAR_MAX_OUT;
i++;
}
else
{
fprintf( stderr, "Wrong argument for the -o parameter.\n\n" );
printhelp( argv[0] );
exit(1);
}
}
//has the user set a non-default refresh interval?
else if ( strcmp( argv[i], "-t" ) == 0 )
{
if ( i < argc - 1 && isdigit( argv[ i + 1 ][0] ) != 0 )
{
sleep_interval = atoi( argv[ i + 1 ] );
i++;
if ( sleep_interval == 0 )
{
print_only_once = true;
sleep_interval = STANDARD_SLEEP_INTERVAL;
}
}
else
{
fprintf( stderr, "Wrong argument for the -t parameter.\n\n" );
printhelp( argv[0] );
exit(1);
}
}
//has the user set a non-default average smoothness?
else if ( strcmp( argv[i], "-s" ) == 0 )
{
if ( i < argc - 1 && isdigit( argv[ i + 1 ][0] ) != 0 )
{
average_smoothness = atoi( argv[ i + 1 ] );
if ( average_smoothness < 1 || average_smoothness > 9 ) average_smoothness = STANDARD_AVERAGE_SMOOTHNESS;
i++;
}
else
{
fprintf( stderr, "Wrong argument for the -s parameter.\n\n" );
printhelp( argv[0] );
exit(1);
}
}
//obsolete -b option
else if ( strcmp( argv[i], "-b" ) == 0 ) {}
//assume unknown parameter to be the network device
else
{
network_device = (char **) realloc( network_device, ( index + 1 ) * sizeof( char * ) );
if ( network_device == NULL )
{
fprintf( stderr, "Running out of memory.\n\n" );
exit( EXIT_FAILURE );
}
network_device[ index++ ] = argv[i];
}
}
if ( index == 0 )
network_device[ index++ ] = STANDARD_NETWORK_DEVICE;
devs = (Dev **) malloc( index * sizeof( Dev * ) );
if ( devs == NULL )
{
fprintf( stderr, "Running out of memory.\n\n" );
exit( EXIT_FAILURE );
}
//handle interrrupt signal
signal( SIGINT, finish );
signal( SIGTERM, finish );
//initialize ncurses
WINDOW *window = initscr();
keypad( stdscr, true );
nodelay( stdscr, true );
noecho();
for ( int i = 0; i < index; i++ )
{
devs[i] = new Dev( network_device[i], bar_max_in, bar_max_out, average_smoothness, window, i + 1, index );
}
do
{
//wait sleep_interval milliseconds
wanted_time.tv_sec = sleep_interval / 1000;
wanted_time.tv_nsec = sleep_interval % 1000 * (long) 1000000;
nanosleep( &wanted_time, NULL );
//process keyboard
while( ( key = getch() ) != ERR )
switch( key )
{
case KEY_RIGHT:
if( cur_dev + 1 < index )
cur_dev++;
else
cur_dev = 0;
break;
case KEY_LEFT:
if( cur_dev >= 1 )
cur_dev--;
else
cur_dev = index - 1;
break;
case 'q':
case 'Q':
finish (0);
break;
}
//clear the screen
clear();
move( 0, 0 ); //this shouldn't be necessary at all
//update all devices and print the data of the current one
for( int i = 0; i < index; i++ )
devs[i] -> update( i == cur_dev );
//refresh the screen
refresh();
} while ( print_only_once != true ); //do this endless except the user said "-t 0"
finish(0);
}
void finish( int signal )
{
//stop ncurses
endwin();
free( network_device );
free( devs );
exit( EXIT_SUCCESS );
}
void printhelp( char *appname )
{
//print disclaimer
fprintf( stderr,
"\nnload version %s, Copyright (C) 2001 Roland Riegel <support@roland-riegel.de>\n"
"nload comes with ABSOLUTELY NO WARRANTY. This is free software, and you are\n"
"welcome to redistribute it under certain conditions. For more details see the\n"
"GNU General Public License Version 2 (http://www.gnu.org/copyleft/gpl.html).\n\n"
"Command line syntax:\n"
"%s [-i max_scaling] [-o max_scaling] [-s smoothness] [-t interval] [devices]\n"
"%s --help|-h\n\n"
"-i max_scaling specifies the 100%% mark in kBit/s of the graph indicating the\n"
" incoming bandwidth usage\n"
" ignored if max_scaling is 0\n"
" default is %i\n"
"-o max_scaling same as -i but for the graph indicating the outgoing bandwidth\n"
" usage\n"
" default is %i\n"
"-s smoothness sets the \"smoothness\" of the average in/out values\n"
" value of 1 means little smoothness (average over a short period of time)\n"
" value of 9 means high smoothness (average over a long period of time)\n"
" default is %i\n"
"-t intervall determines the refresh interval of the display in milliseconds\n"
" if 0 print net load only one time and exit\n"
" default is %i\n"
"-b obsolete - ignored\n"
"devices network devices to use\n"
" default is \"%s\"\n"
"--help\n"
"-h print this help\n\n"
"example: %s -t 200 -s 7 -i 1024 -o 128 eth0 eth1\n\n",
NLOAD_VERSION,
appname,
appname,
STANDARD_BAR_MAX_IN,
STANDARD_BAR_MAX_OUT,
STANDARD_AVERAGE_SMOOTHNESS,
STANDARD_SLEEP_INTERVAL,
STANDARD_NETWORK_DEVICE,
appname
);
}