#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\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; }