diff --git a/components/netspeeds.c b/components/netspeeds.c
index 02c030e..1814d86 100644
--- a/components/netspeeds.c
+++ b/components/netspeeds.c
@@ -1,35 +1,70 @@
 /* See LICENSE file for copyright and license details. */
 #include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
 #include <limits.h>

 #include "../util.h"

+#define NINTERFACES 2
+
 #if defined(__linux__)
        #include <stdint.h>

+       struct netspeed_xif {
+               char *iface;
+               uintmax_t xbytes;
+       };
+       int find_interface_idx(const char * interface, int * nextidx, struct
netspeed_xif * interfaces[]) {
+               int i;
+               int found = 0;
+               for (i=0; i<*nextidx; i++) {
+                       if (!strcmp(interfaces[i]->iface, interface)) {
+                               found = 1;
+                               return i;
+                       }
+               }
+               if (!found) {
+                       interfaces[*nextidx] = 
malloc(sizeof(interfaces[*nextidx]));
+                       interfaces[*nextidx]->iface = malloc(sizeof(interface));
+                       sprintf(interfaces[*nextidx]->iface, "%s", interface);
+                       interfaces[*nextidx]->xbytes = 0;
+                       i = *nextidx;
+                       *nextidx = *nextidx+1;
+                       return i;
+               }
+               return -1;
+       }
+
        const char *
        netspeed_rx(const char *interface)
        {
                uintmax_t oldrxbytes;
-               static uintmax_t rxbytes;
+               static struct netspeed_xif  * rxbytes[NINTERFACES];
+               static int rx_nextidx = 0;
+               int idx = 0;
                extern const unsigned int interval;
                char path[PATH_MAX];

-               oldrxbytes = rxbytes;
+               idx = find_interface_idx(interface, &rx_nextidx, rxbytes);
+               if (idx < 0) {
+                       return NULL;
+               }
+
+               oldrxbytes = rxbytes[idx]->xbytes;

                if (esnprintf(path, sizeof(path),
                              "/sys/class/net/%s/statistics/rx_bytes",
                              interface) < 0) {
                        return NULL;
                }
-               if (pscanf(path, "%ju", &rxbytes) != 1) {
+               if (pscanf(path, "%ju", &rxbytes[idx]->xbytes) != 1) {
                        return NULL;
                }
                if (oldrxbytes == 0) {
                        return NULL;
                }
-
-               return fmt_human((rxbytes - oldrxbytes) * 1000 / interval,
+               return fmt_human((rxbytes[idx]->xbytes - oldrxbytes) * 1000 / 
interval,
                                 1024);
        }

@@ -37,25 +72,32 @@
        netspeed_tx(const char *interface)
        {
                uintmax_t oldtxbytes;
-               static uintmax_t txbytes;
+               static struct netspeed_xif  * txbytes[NINTERFACES];
+               static int tx_nextidx = 0;
+               int idx;
                extern const unsigned int interval;
                char path[PATH_MAX];

-               oldtxbytes = txbytes;
+               idx = find_interface_idx(interface, &tx_nextidx, txbytes);
+               if (idx < 0) {
+                       return NULL;
+               }
+
+               oldtxbytes = txbytes[idx]->xbytes;

                if (esnprintf(path, sizeof(path),
                              "/sys/class/net/%s/statistics/tx_bytes",
                              interface) < 0) {
                        return NULL;
                }
-               if (pscanf(path, "%ju", &txbytes) != 1) {
+               if (pscanf(path, "%ju", &txbytes[idx]->xbytes) != 1) {
                        return NULL;
                }
                if (oldtxbytes == 0) {
                        return NULL;
                }

-               return fmt_human((txbytes - oldtxbytes) * 1000 / interval,
+               return fmt_human((txbytes[idx]->xbytes - oldtxbytes) * 1000 / 
interval,
                                 1024);
        }
 #elif defined(__OpenBSD__)

Reply via email to