From 71d3b718ba0f1f4c3a7aad11b5c297ead5cfd95a Mon Sep 17 00:00:00 2001 From: Calvin Morrison Date: Fri, 31 Oct 2014 16:45:55 -0400 Subject: initial commit, still sucks --- cbm.cpp | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 cbm.cpp (limited to 'cbm.cpp') diff --git a/cbm.cpp b/cbm.cpp new file mode 100644 index 0000000..4668534 --- /dev/null +++ b/cbm.cpp @@ -0,0 +1,133 @@ +#include "config.h" +#include "statistics.hpp" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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"); + 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; +} -- cgit v1.2.3