#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int main(int argn, char **argv)
{
  FILE *pr;
  char line[1024];
  int r;
  char *ptr;

  char dev_name[33];
  unsigned long long r_bytes;

  time_t start_time, now;
  unsigned long long start_traffic = 0L;
  unsigned long long now_traffic;

  unsigned long long traffic[60];
  unsigned long long btraffic[60];

  float speed;

  float speed_s, speed_m, speed_l;

  int i;

  if(argn != 2) {
    fprintf(stderr, "Usage: %s <interface>\n", argv[0]);
    exit(-1);
  }

  pr = fopen("/proc/net/dev", "r");
  if(pr == NULL) {
    perror("fopen");
    exit(-1);
  }

  memset(traffic, 0, sizeof(traffic));

  start_time = time(NULL);

  while(1) {
    now = time(NULL);
    ptr = fgets(line, sizeof(line) - 1, pr);

    memcpy(btraffic, traffic, sizeof(traffic)); 
    memcpy(traffic + 1,
           btraffic, sizeof(traffic) - sizeof(unsigned long long));

    while(ptr) {
      while(*ptr == ' ') ptr ++;
      r = sscanf(ptr, "%32[^:]:%Ld\n", dev_name, &r_bytes);

      if(strcmp(dev_name, argv[1]) == 0) {
        if(start_traffic == 0L) { 
          start_traffic = r_bytes;
          for(i = 0; i < 60; i ++)
            traffic[i] = start_traffic;
        }

        traffic[0] = r_bytes;

        if(now - start_time != 0) {
          speed = (r_bytes - start_traffic) / (now - start_time) / 1024;

          for(i = 0; i < 5; i ++) {
            speed_s += traffic[i] - traffic[i + 1];
          }
          for(i = 0; i < 15; i ++) {
            speed_m += traffic[i] - traffic[i + 1];
          }
          for(i = 0; i < 59; i ++) {
            speed_l += traffic[i] - traffic[i + 1];
          }
          speed_s /= 5 * 1024;
          speed_m /= 15 * 1024;
          speed_l /= 60 * 1024;
        } else speed = 0.0;

        printf("%s: %4.2f KiB/s %4.2f KiB/sec %4.2f KiB/sec - %Ld bytes in %d sec\n", argv[1], speed_s, speed_m, speed_l, r_bytes - start_traffic, now - start_time);

//        printf("eth0 stats: %Ld bytes in %d sec (%4.2f KiB/sec)\n", 
//               r_bytes - start_traffic, now - start_time, speed);
        printf("\033[1A"); 
      }

      ptr = fgets(line, sizeof(line) - 1, pr);
    }

    fseek(pr, 0L, SEEK_SET);

    sleep(1);
  }
}

