From: Matthieu Baerts <matthieu.baerts@tessares.net>
Subject: [PATCH] ifstat: v1.1-8.1 from Debian

Extracted from:

  http://deb.debian.org/debian/pool/main/i/ifstat/ifstat_1.1-8.1.diff.gz

Author:
- Goswin von Brederlow <goswin-v-b@web.de>

ChangeLog:

  * snmp.c: fix 2 pointer targets differ in signedness warnings
  * Adding upport for 64bit /proc/net/dev counters.
  * Clean up compiler warnings.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 data.c                     |  4 +-
 drivers.c                  | 36 ++++++++--------
 ifstat.c                   |  5 ++-
 ifstat.h                   |  6 +--
 snmp.c                     | 12 +++---

--- a/data.c
+++ b/data.c
@@ -103,8 +103,8 @@ void ifstat_free_interface(struct ifstat
 }
 
 void ifstat_set_interface_stats(struct ifstat_data *data,
-				unsigned long bytesin,
-				unsigned long bytesout) {
+				unsigned long long bytesin,
+				unsigned long long bytesout) {
   if (data->bout > bytesout || data->bin > bytesin) {
     if (!ifstat_quiet)
       ifstat_error("warning: rollover for interface %s, reinitialising.", data->name);
--- a/drivers.c
+++ b/drivers.c
@@ -140,6 +140,7 @@ char *strchr (), *strrchr ();
 
 static void examine_interface(struct ifstat_list *ifs, char *name,
 			      int ifflags, int iftype) {
+  (void)iftype;
 #ifdef IFF_LOOPBACK
   if ((ifflags & IFF_LOOPBACK) && !(ifs->flags & IFSTAT_LOOPBACK))
     return;
@@ -242,6 +243,7 @@ static int ioctl_map_scan(int sd, struct
 static int ioctl_scan_interfaces(struct ifstat_driver *driver,
 				 struct ifstat_list *ifs) {
   int sd;
+  (void)driver;
 
   if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
     ifstat_perror("socket");
@@ -256,7 +258,7 @@ static int ioctl_scan_interfaces(struct
 #endif
 
 #ifdef USE_KSTAT
-static int get_kstat_long(kstat_t *ksp, char *name, unsigned long *value) {
+static int get_kstat_long(kstat_t *ksp, char *name, unsigned long long *value) {
   kstat_named_t *data;
 
   if ((data = kstat_data_lookup(ksp, name)) == NULL)
@@ -277,7 +279,7 @@ static int get_kstat_long(kstat_t *ksp,
     *value = data->value.ui64;
     break;
 #else
-  case KSTAT_DATA_LONGLONG:
+  case KSTAT_DATA_LONG LONGLONG:
     *value = data->value.ll;
     break;
   case KSTAT_DATA_ULONGLONG:
@@ -311,7 +313,7 @@ static int kstat_open_driver(struct ifst
 
 static int kstat_get_stats(struct ifstat_driver *driver,
 			   struct ifstat_list *ifs) {
-  unsigned long bytesin, bytesout;
+  unsigned long long bytesin, bytesout;
   struct ifstat_data *cur;
   kstat_ctl_t *kc = driver->data;
   kstat_t *ksp;
@@ -802,7 +804,7 @@ static int proc_get_stats(struct ifstat_
   char buf[1024];
   FILE *f;
   char *iface, *stats;
-  unsigned long bytesin, bytesout;
+  unsigned long long bytesin, bytesout;
   struct ifstat_data *cur;
   struct proc_driver_data *data = driver->data;
   char *file;
@@ -839,7 +841,7 @@ static int proc_get_stats(struct ifstat_
       iface++;
     if (*iface == '\0')
       continue;
-    if (sscanf(stats, "%lu %*u %*u %*u %*u %*u %*u %*u %lu %*u", &bytesin, &bytesout) != 2)
+    if (sscanf(stats, "%llu %*u %*u %*u %*u %*u %*u %*u %llu %*u", &bytesin, &bytesout) != 2)
       continue;
     
     if ((cur = ifstat_get_interface(ifs, iface)) != NULL)
@@ -1326,9 +1328,9 @@ static int win32_get_stats(struct ifstat
   for (i = 0; i < iftable->dwNumEntries; i++) {
     if ((cur = ifstat_get_interface(ifs, iftable->table[i].bDescr)) != NULL)
       ifstat_set_interface_stats(cur,
-				 (unsigned long)
+				 (unsigned long long)
 				 iftable->table[i].dwInOctets,
-				 (unsigned long)
+				 (unsigned long long)
 				 iftable->table[i].dwOutOctets);
   }
   return 1;
@@ -1346,40 +1348,40 @@ void win32_close_driver(struct ifstat_dr
 static struct ifstat_driver drivers[] = {
 #ifdef USE_KSTAT  
   { "kstat", &kstat_open_driver, &ioctl_scan_interfaces, &kstat_get_stats,
-    &kstat_close_driver },
+    &kstat_close_driver, NULL },
 #endif
 #ifdef USE_IFMIB  
-  { "ifmib", NULL, &ifmib_scan_interfaces, &ifmib_get_stats, NULL },
+  { "ifmib", NULL, &ifmib_scan_interfaces, &ifmib_get_stats, NULL, NULL },
 #endif
 #ifdef USE_IFDATA
   { "ifdata", &ifdata_open_driver, &ifdata_scan_interfaces,
-    &ifdata_get_stats, &ifdata_close_driver },
+    &ifdata_get_stats, &ifdata_close_driver, NULL },
 #endif
 #ifdef USE_ROUTE
   { "route", &route_open_driver, &route_scan_interfaces,
-    &route_get_stats, &route_close_driver },
+    &route_get_stats, &route_close_driver, NULL },
 #endif  
 #ifdef USE_KVM  
   { "kvm",  &kvm_open_driver, &kvm_scan_interfaces, &kvm_get_stats,
-    &kvm_close_driver },
+    &kvm_close_driver, NULL },
 #endif
 #ifdef USE_PROC  
   { "proc", &proc_open_driver, &ioctl_scan_interfaces, &proc_get_stats,
-    &proc_close_driver },
+    &proc_close_driver, NULL },
 #endif
 #ifdef USE_DLPI
   { "dlpi", &dlpi_open_driver, &dlpi_scan_interfaces, &dlpi_get_stats,
-    &dlpi_close_driver },
+    &dlpi_close_driver, NULL },
 #endif
 #ifdef USE_WIN32
   { "win32", &win32_open_driver, &win32_scan_interfaces,
-    &win32_get_stats, &win32_close_driver },
+    &win32_get_stats, &win32_close_driver, NULL },
 #endif  
 #ifdef USE_SNMP  
   { "snmp", &snmp_open_driver, &snmp_scan_interfaces, &snmp_get_stats,
-    &snmp_close_driver },
+    &snmp_close_driver, NULL },
 #endif  
-  { NULL } };
+  { NULL, NULL, NULL, NULL, NULL, NULL } };
   
 int ifstat_get_driver(char *name, struct ifstat_driver *driver) {
   int num = 0;
--- a/ifstat.c
+++ b/ifstat.c
@@ -215,7 +215,8 @@ static RETSIGTYPE update_termsize(int si
 int _sigcont = 0;
 #ifdef SIGCONT
 static RETSIGTYPE sigcont(int sig) {
-  _sigcont = 1;  
+  (void)sig;
+  _sigcont = 1;
   RESIGNAL(SIGCONT, &sigcont);
 }
 #endif
@@ -234,7 +235,7 @@ static RETSIGTYPE sigcont(int sig) {
 
 #define NUM "12345.12"
 #define NA  "     n/a"
-#define WIDTH (sizeof(NUM) - 1) * 2 + (sizeof(SPACE) - 1)
+#define WIDTH ((ssize_t)sizeof(NUM) - 1) * 2 + ((ssize_t)sizeof(SPACE) - 1)
 
 #define LEN(options, namelen) (((options) & OPT_FIXEDWIDTH || (namelen) < WIDTH) ? WIDTH : (namelen))
 #define FMT(n) (((n) < 1e+5) ? "%8.2f" : (((n) < 1e+6) ? "%.1f" : "%.2e"))
--- a/ifstat.h
+++ b/ifstat.h
@@ -35,7 +35,7 @@
 struct ifstat_data {
   char *name;
   int namelen;
-  unsigned long obout, obin, bout, bin;
+  unsigned long long obout, obin, bout, bin;
   int flags, index;
   struct ifstat_data *next;
 };
@@ -72,8 +72,8 @@ void ifstat_add_interface(struct ifstat_
 void ifstat_free_interface(struct ifstat_data *data);
 
 void ifstat_set_interface_stats(struct ifstat_data *data,
-				unsigned long bytesin,
-				unsigned long bytesout);
+				unsigned long long bytesin,
+				unsigned long long bytesout);
 
 void ifstat_set_interface_index(struct ifstat_data *data,
 				int index);
--- a/snmp.c
+++ b/snmp.c
@@ -91,7 +91,7 @@ static int snmp_get_ifcount(struct snmp_
 
 static int snmp_get_nextif(struct snmp_session *ss, int index) {
   oid ifindex[] = { 1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 0 };
-  int len = sizeof(ifindex) / sizeof(oid);
+  unsigned int len = sizeof(ifindex) / sizeof(oid);
   struct snmp_pdu *pdu;
   struct snmp_pdu *response = NULL;
   struct variable_list *vars;
@@ -139,7 +139,7 @@ static int snmp_get_nextif(struct snmp_s
 
 struct ifsnmp {
   char name[S_IFNAMEMAX];
-  unsigned long bout, bin;
+  unsigned long long bout, bin;
   int flags, index;
 };
 
@@ -248,7 +248,7 @@ static int snmp_get_ifinfos(struct snmp_
     if (memcmp(ifinfo, vars->name, sizeof(ifinfo) - 2 * sizeof(oid)) != 0)
       continue;
     for(i = 0; i < nifaces; i++) {
-      if (ifsnmp[i].index == vars->name[10])
+	if ((signed long long)ifsnmp[i].index == (signed long long)vars->name[10])
 	break;
     }
 
@@ -258,11 +258,11 @@ static int snmp_get_ifinfos(struct snmp_
     switch (vars->name[9]) {
     case ifDescr:
       if (vars->type == ASN_OCTET_STR) {
-        int count = vars->val_len;
+        unsigned int count = vars->val_len;
 
         if (count >= sizeof(ifsnmp[i].name))
           count = sizeof(ifsnmp[i].name) - 1;
-	strncpy(ifsnmp[i].name, vars->val.string, count);
+	strncpy(ifsnmp[i].name, (char *)vars->val.string, count);
         ifsnmp[i].name[count] = '\0';
       }
       break;
@@ -361,7 +361,7 @@ int snmp_open_driver(struct ifstat_drive
   snmp_sess_init(&session);
   session.peername = host;
   session.version = SNMP_VERSION_1;
-  session.community = community;
+  session.community = (unsigned char *)community;
   session.community_len = strlen(community);
 
   if ((data->session = snmp_open(&session)) == NULL) {
