diff options
Diffstat (limited to 'fsbm.cpp')
-rw-r--r-- | fsbm.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/fsbm.cpp b/fsbm.cpp new file mode 100644 index 0000000..1daa239 --- /dev/null +++ b/fsbm.cpp @@ -0,0 +1,133 @@ +#include "config.h" +#include "statistics.hpp" +#include <algorithm> +#include <cstdlib> +#include <cstring> +#include <iomanip> +#include <iostream> +#include <sstream> + +#include <curses.h> +#include <getopt.h> +#include <signal.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <net/if.h> +#include <unistd.h> + +#define PACKAGE "yo" +#define PACKAGE_STRING "yo mamma" + +// Externs +extern int optind, opterr, optopt; + +volatile bool quit = false; + +void endHandler(int signum) { + quit = true; +} + +void formatBandwidth(double bytesPerSecond, bool showBits) { + const char* prefixes[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y" }; + + // Calculate the value + double value; + const char* unit; + if (showBits){ + value = bytesPerSecond * 8; + unit = "b/s"; + } + else { + value = bytesPerSecond; + unit = "B/s"; + } + + // Choose the prefix + unsigned prefix = 0; + while (prefix < (sizeof(prefixes) / sizeof(const char*)) && value > 1000.) { + value /= 1000.; + ++prefix; + } + + // Format the string + std::cout << std::setprecision(2) << value << " " << prefixes[prefix] << unit; + +} + +int main(int argc, char **argv) { + int retval = EXIT_SUCCESS; + + // parse the command line + int c; + + bool useBits = false; + int interval = 10 * 100000; + + while ((c = getopt (argc, argv, "bi:hv")) != -1) + switch (c) + { + case 'b': + useBits = true; + break; + case 'i': + // Magic numbers? fuck it that's not a magic number, that's a 'real' number. + interval = atoi(optarg) * 100000; + break; + case 'h': + std::cout << "USAGE: fsbm, -b specifies bits, -i sets interval in 10ths of seconds, 1 sec default\n"; + exit(EXIT_SUCCESS); + break; + case 'v': + std::cout << "Version 1\n"; + exit(EXIT_SUCCESS); + break; + case '?': + std::cerr << "bad flag\n"; + break; + default: + exit(EXIT_FAILURE); + } + + // Catch SIGINT + signal(SIGINT, endHandler); + + + + // Create a socket (for ioctls) + int sock = socket(AF_INET, SOCK_DGRAM, 0); + if (!sock) { + std::cerr << "cannot open socket\n"; + exit(EXIT_FAILURE); + } + + // Initialize curses + + statistics::Reader statisticsReader; + statisticsReader.update(); + while (!quit) { + + // Update the statistics + statisticsReader.update(); + + for (statistics::Reader::Interfaces::const_iterator + interface = statisticsReader.getInterfaces().begin(); + interface != statisticsReader.getInterfaces().end(); + ++interface) { + + std::cout << interface->getName() << " ("; + formatBandwidth(interface->getReceiveSpeed(), useBits); + std::cout << ", "; + formatBandwidth(interface->getTransmitSpeed(), useBits); + std::cout << ")"; + + } + std::cout << "\n"; + usleep(interval); + + + + } + return retval; +} |