aboutsummaryrefslogtreecommitdiff
path: root/cbm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cbm.cpp')
-rw-r--r--cbm.cpp133
1 files changed, 133 insertions, 0 deletions
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 <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");
+ 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;
+}