aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fsbm.c302
1 files changed, 151 insertions, 151 deletions
diff --git a/fsbm.c b/fsbm.c
index 1769370..06918c8 100644
--- a/fsbm.c
+++ b/fsbm.c
@@ -15,10 +15,10 @@
#define PROC_NET_DEV "/proc/net/dev"
struct iface {
- char interface[IFNAMSIZ];
- struct timeval timestamp;
- unsigned long long rx_bytes;
- unsigned long long tx_bytes;
+ char interface[IFNAMSIZ];
+ struct timeval timestamp;
+ unsigned long long rx_bytes;
+ unsigned long long tx_bytes;
};
@@ -28,175 +28,175 @@ struct iface *interfaces = NULL;
size_t no_iface = 0;
void endHandler(int signum) {
- q = true;
+ q = true;
}
void print_bps(double bytesPerSecond) {
- const char* prefixes[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y" };
-
- // Calculate the value
- double value;
- const char* unit;
- if(use_bits) {
- 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
- printf("%.2f %s%s", value, prefixes[prefix], unit);
+ const char* prefixes[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y" };
+
+ // Calculate the value
+ double value;
+ const char* unit;
+ if(use_bits) {
+ 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
+ printf("%.2f %s%s", value, prefixes[prefix], unit);
}
void print_stats() {
- // Open /proc/net/dev
- FILE *dev = fopen(PROC_NET_DEV, "r");
- if (!dev) {
- fprintf(stderr, "cannot open %s - %s\n", PROC_NET_DEV, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- // Read /proc/dev/net
- while (!feof(dev)) {
- char buf[512];
- char *name, *statistics_string;
- long long unsigned rx_bytes, tx_bytes;
- struct timezone unused_timezone;
- struct timeval timestamp;
-
- // Read a line
- fgets(buf, sizeof(buf), dev);
-
- // get timestamp
- gettimeofday(&timestamp, &unused_timezone);
-
- // Find the colon separating the name from the statistics
- statistics_string = strchr(buf, ':');
- if (!statistics_string) continue;
-
- // Get a pointer to the statistics
- *statistics_string = 0;
- ++statistics_string;
-
- // Remove leading whitespace from the name
- name = buf;
- ptrdiff_t len = 0;
- while (*name == ' ' || *name == '\t') {
- ++name;
+ // Open /proc/net/dev
+ FILE *dev = fopen(PROC_NET_DEV, "r");
+ if (!dev) {
+ fprintf(stderr, "cannot open %s - %s\n", PROC_NET_DEV, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ // Read /proc/dev/net
+ while (!feof(dev)) {
+ char buf[512];
+ char *name, *statistics_string;
+ long long unsigned rx_bytes, tx_bytes;
+ struct timezone unused_timezone;
+ struct timeval timestamp;
+
+ // Read a line
+ fgets(buf, sizeof(buf), dev);
+
+ // get timestamp
+ gettimeofday(&timestamp, &unused_timezone);
+
+ // Find the colon separating the name from the statistics
+ statistics_string = strchr(buf, ':');
+ if (!statistics_string) continue;
+
+ // Get a pointer to the statistics
+ *statistics_string = 0;
+ ++statistics_string;
+
+ // Remove leading whitespace from the name
+ name = buf;
+ ptrdiff_t len = 0;
+ while (*name == ' ' || *name == '\t') {
+ ++name;
+ }
+ len = name - buf;
+
+ // Parse the statistics, alls well, then get this shit going, otherwise f it.
+ if (sscanf(statistics_string, "%Lu %*Lu %*Lu %*Lu %*Lu %*Lu %*Lu %*Lu %Lu",
+ &rx_bytes, &tx_bytes) == 2) {
+
+ size_t i = 0;
+ bool found = false;
+ if(interfaces == NULL) {
+ goto skip;
+ }
+ for(i = 0; i < no_iface; i++) {
+ // if it exists in our interfaces, great. reuse the iface struct
+ if(strncmp(name, interfaces[i].interface, len) == 0) {
+ found = true;
+ break;
}
- len = name - buf;
-
- // Parse the statistics, alls well, then get this shit going, otherwise f it.
- if (sscanf(statistics_string, "%Lu %*Lu %*Lu %*Lu %*Lu %*Lu %*Lu %*Lu %Lu",
- &rx_bytes, &tx_bytes) == 2) {
-
- size_t i = 0;
- bool found = false;
- if(interfaces == NULL) {
- goto skip;
- }
- for(i = 0; i < no_iface; i++) {
- // if it exists in our interfaces, great. reuse the iface struct
- if(strncmp(name, interfaces[i].interface, len) == 0) {
- found = true;
- break;
- }
- }
- skip:
- if(found) {
- double timeDelta, rx_speed, tx_speed = 0;
-
- // print our new speeds
- timeDelta = (timestamp.tv_sec - interfaces[i].timestamp.tv_sec) * 1.0 +
- (timestamp.tv_usec - interfaces[i].timestamp.tv_usec) * .000001;
-
- rx_speed = (rx_bytes - interfaces[i].rx_bytes) / timeDelta;
- tx_speed = (tx_bytes - interfaces[i].tx_bytes) / timeDelta;
-
- printf("%s (", interfaces[i].interface);
- print_bps(rx_speed);
- printf(", ");
- print_bps(tx_speed);
- printf(")\t");
-
- // update our interface
- strcpy(interfaces[i].interface, name);
- interfaces[i].rx_bytes = rx_bytes;
- interfaces[i].timestamp = timestamp;
- interfaces[i].tx_bytes = tx_bytes;
- }
- else {
- interfaces = realloc(interfaces, sizeof(struct iface) * (no_iface + 1));
- if(interfaces == NULL) {
- fprintf(stderr, "Error: %s\n", strerror(errno));
- exit(1);
- }
- strcpy(interfaces[no_iface].interface, name);
- interfaces[no_iface].rx_bytes = rx_bytes;
- interfaces[no_iface].tx_bytes = tx_bytes;
- no_iface++;
- }
-
+ }
+skip:
+ if(found) {
+ double timeDelta, rx_speed, tx_speed = 0;
+
+ // print our new speeds
+ timeDelta = (timestamp.tv_sec - interfaces[i].timestamp.tv_sec) * 1.0 +
+ (timestamp.tv_usec - interfaces[i].timestamp.tv_usec) * .000001;
+
+ rx_speed = (rx_bytes - interfaces[i].rx_bytes) / timeDelta;
+ tx_speed = (tx_bytes - interfaces[i].tx_bytes) / timeDelta;
+
+ printf("%s (", interfaces[i].interface);
+ print_bps(rx_speed);
+ printf(", ");
+ print_bps(tx_speed);
+ printf(")\t");
+
+ // update our interface
+ strcpy(interfaces[i].interface, name);
+ interfaces[i].rx_bytes = rx_bytes;
+ interfaces[i].timestamp = timestamp;
+ interfaces[i].tx_bytes = tx_bytes;
+ }
+ else {
+ interfaces = realloc(interfaces, sizeof(struct iface) * (no_iface + 1));
+ if(interfaces == NULL) {
+ fprintf(stderr, "Error: %s\n", strerror(errno));
+ exit(1);
}
+ strcpy(interfaces[no_iface].interface, name);
+ interfaces[no_iface].rx_bytes = rx_bytes;
+ interfaces[no_iface].tx_bytes = tx_bytes;
+ no_iface++;
+ }
}
- // Close the file
- fclose(dev);
+
+ }
+ // Close the file
+ fclose(dev);
}
int main(int argc, char **argv) {
// parse the command line
- int c;
-
- int interval = 10 * 100000;
-
- while ((c = getopt (argc, argv, "bi:hv")) != -1)
- switch (c)
- {
- case 'b':
- use_bits = 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':
- printf("USAGE: fsbm, -b specifies bits, -i sets interval in 10ths of seconds, 1 sec default\n");
- exit(EXIT_SUCCESS);
- break;
- case 'v':
- printf("Version 1\n");
- exit(EXIT_SUCCESS);
- break;
- case '?':
- fprintf(stderr,"bad flag\n");
- break;
- default:
- exit(EXIT_FAILURE);
- }
-
+ int c;
+
+ int interval = 10 * 100000;
+
+ while ((c = getopt (argc, argv, "bi:hv")) != -1)
+ switch (c)
+ {
+ case 'b':
+ use_bits = 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':
+ printf("USAGE: fsbm, -b specifies bits, -i sets interval in 10ths of seconds, 1 sec default\n");
+ exit(EXIT_SUCCESS);
+ break;
+ case 'v':
+ printf("Version 1\n");
+ exit(EXIT_SUCCESS);
+ break;
+ case '?':
+ fprintf(stderr,"bad flag\n");
+ break;
+ default:
+ exit(EXIT_FAILURE);
+ }
+
// Catch SIGINT
signal(SIGINT, endHandler);
// populate first.
print_stats();
while (!q) {
- print_stats();
- printf("\n");
- usleep(interval);
- }
+ print_stats();
+ printf("\n");
+ usleep(interval);
+ }
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}