Various plugins: Convert more plugins to use "derive" instead of "counter".
[collectd.git] / src / madwifi.c
index e46420c..13301ff 100644 (file)
@@ -561,20 +561,20 @@ static void submit (const char *dev, const char *type, const char *ti1,
        plugin_dispatch_values (&vl);
 }
 
-static void submit_counter (const char *dev, const char *type, const char *ti1,
-                               const char *ti2, counter_t val)
+static void submit_derive (const char *dev, const char *type, const char *ti1,
+                               const char *ti2, derive_t val)
 {
        value_t item;
-       item.counter = val;
+       item.derive = val;
        submit (dev, type, ti1, ti2, &item, 1);
 }
 
-static void submit_counter2 (const char *dev, const char *type, const char *ti1,
-                               const char *ti2, counter_t val1, counter_t val2)
+static void submit_derive2 (const char *dev, const char *type, const char *ti1,
+                               const char *ti2, derive_t val1, derive_t val2)
 {
        value_t items[2];
-       items[0].counter = val1;
-       items[1].counter = val2;
+       items[0].derive = val1;
+       items[1].derive = val2;
        submit (dev, type, ti1, ti2, items, 2);
 }
 
@@ -597,9 +597,9 @@ static void submit_antx (const char *dev, const char *name,
                if (vals[i] == 0)
                        continue;
 
-               ssnprintf (ti2, sizeof (ti2), "antenna%i", i);
-               submit_counter (dev, "ath_stat", name, ti2,
-                               (counter_t) vals[i]);
+               ssnprintf (ti2, sizeof (ti2), "%i", i);
+               submit_derive (dev, "ath_stat", name, ti2,
+                               (derive_t) vals[i]);
        }
 }
 
@@ -625,18 +625,18 @@ process_stat_struct (int which, const void *ptr, const char *dev, const char *ma
                uint32_t val = *(uint32_t *)(((char *) ptr) + specs[i].offset) ;
 
                if (item_watched (i) && (val != 0))
-                       submit_counter (dev, type_name, specs[i].name, mac, val);
+                       submit_derive (dev, type_name, specs[i].name, mac, val);
 
                if (item_summed (i))
                        misc += val;
        }
        
        if (misc != 0)
-               submit_counter (dev, type_name, misc_name, mac, misc);
+               submit_derive (dev, type_name, misc_name, mac, misc);
 
 }
 
-static void
+static int
 process_athstats (int sk, const char *dev)
 {
        struct ifreq ifr;
@@ -653,7 +653,7 @@ process_athstats (int sk, const char *dev)
                                "SIOCGATHSTATS to device %s "
                                "failed with status %i.",
                                dev, status);
-               return;
+               return (status);
        }
 
        /* These stats are handled as a special case, because they are
@@ -669,9 +669,10 @@ process_athstats (int sk, const char *dev)
 
        /* All other ath statistics */
        process_stat_struct (ATH_STAT, &stats, dev, NULL, "ath_stat", "ast_misc");
+       return (0);
 }
 
-static void
+static int
 process_80211stats (int sk, const char *dev)
 {
        struct ifreq ifr;
@@ -688,14 +689,15 @@ process_80211stats (int sk, const char *dev)
                                "SIOCG80211STATS to device %s "
                                "failed with status %i.",
                                dev, status);
-               return;
+               return (status);
        }
 
        process_stat_struct (IFA_STAT, &stats, dev, NULL, "ath_stat", "is_misc");
+       return (0);
 }
 
 
-static void
+static int
 process_station (int sk, const char *dev, struct ieee80211req_sta_info *si)
 {
        struct iwreq iwr;
@@ -726,26 +728,27 @@ process_station (int sk, const char *dev, struct ieee80211req_sta_info *si)
                                "IEEE80211_IOCTL_STA_STATS to device %s "
                                "failed with status %i.",
                                dev, status);
-               return;
+               return (status);
        }
 
        /* These two stats are handled as a special case as they are
           a pair of 64bit values */
        if (item_watched (STAT_NODE_OCTETS))
-               submit_counter2 (dev, "node_octets", mac, NULL,
+               submit_derive2 (dev, "node_octets", mac, NULL,
                        ns->ns_rx_bytes, ns->ns_tx_bytes);
 
        /* This stat is handled as a special case, because it is stored
           as uin64_t, but we will ignore upper half */
        if (item_watched (STAT_NS_RX_BEACONS))
-               submit_counter (dev, "node_stat", "ns_rx_beacons", mac,
+               submit_derive (dev, "node_stat", "ns_rx_beacons", mac,
                        (ns->ns_rx_beacons & 0xFFFFFFFF));
 
        /* All other node statistics */
        process_stat_struct (NOD_STAT, ns, dev, mac, "node_stat", "ns_misc");
+       return (0);
 }
 
-static void
+static int
 process_stations (int sk, const char *dev)
 {
        uint8_t buf[24*1024];
@@ -767,7 +770,7 @@ process_stations (int sk, const char *dev)
                                "IEEE80211_IOCTL_STA_INFO to device %s "
                                "failed with status %i.",
                                dev, status);
-               return;
+               return (status);
        }
 
        len = iwr.u.data.length;
@@ -785,14 +788,28 @@ process_stations (int sk, const char *dev)
 
        if (item_watched (STAT_ATH_NODES))
                submit_gauge (dev, "ath_nodes", NULL, NULL, nodes);
+       return (0);
 }
 
-static void
+static int
 process_device (int sk, const char *dev)
 {
-       process_athstats (sk, dev);
-       process_80211stats (sk, dev);
-       process_stations (sk, dev);
+       int num_success = 0;
+       int status;
+
+       status = process_athstats (sk, dev);
+       if (status == 0)
+               num_success++;
+
+       status = process_80211stats (sk, dev);
+       if (status == 0)
+               num_success++;
+
+       status = process_stations (sk, dev);
+       if (status == 0)
+               num_success++;
+
+       return ((num_success == 0) ? -1 : 0);
 }
 
 static int
@@ -822,22 +839,46 @@ static int
 sysfs_iterate(int sk)
 {
        struct dirent *de;
+       DIR *nets;
+       int status;
+       int num_success;
+       int num_fail;
 
-       DIR *nets = opendir ("/sys/class/net/");
+       nets = opendir ("/sys/class/net/");
        if (nets == NULL)
        {
                WARNING ("madwifi plugin: opening /sys/class/net failed");
                return (-1);
        }
 
+       num_success = 0;
+       num_fail = 0;
        while ((de = readdir (nets)))
-               if (check_devname (de->d_name) &&
-                   (ignorelist_match (ignorelist, de->d_name) == 0))
-                       process_device (sk, de->d_name);
+       {
+               if (check_devname (de->d_name) == 0)
+                       continue;
+
+               if (ignorelist_match (ignorelist, de->d_name) != 0)
+                       continue;
+
+               status = process_device (sk, de->d_name);
+               if (status != 0)
+               {
+                       ERROR ("madwifi plugin: Processing interface "
+                                       "%s failed.", de->d_name);
+                       num_fail++;
+               }
+               else
+               {
+                       num_success++;
+               }
+       } /* while (readdir) */
 
        closedir(nets);
 
-       return 0;
+       if ((num_success == 0) && (num_fail != 0))
+               return (-1);
+       return (0);
 }
 
 static int
@@ -846,6 +887,9 @@ procfs_iterate(int sk)
        char buffer[1024];
        char *device, *dummy;
        FILE *fh;
+       int status;
+       int num_success;
+       int num_fail;
        
        if ((fh = fopen ("/proc/net/dev", "r")) == NULL)
        {
@@ -853,6 +897,8 @@ procfs_iterate(int sk)
                return (-1);
        }
 
+       num_success = 0;
+       num_fail = 0;
        while (fgets (buffer, sizeof (buffer), fh) != NULL)
        {
                dummy = strchr(buffer, ':');
@@ -867,11 +913,26 @@ procfs_iterate(int sk)
                if (device[0] == 0)
                        continue;
 
-               if (ignorelist_match (ignorelist, device) == 0)
-                       process_device (sk, device);
-       }
+               if (ignorelist_match (ignorelist, device) != 0)
+                       continue;
+
+               status = process_device (sk, device);
+               if (status != 0)
+               {
+                       ERROR ("madwifi plugin: Processing interface "
+                                       "%s failed.", device);
+                       num_fail++;
+               }
+               else
+               {
+                       num_success++;
+               }
+       } /* while (fgets) */
 
        fclose(fh);
+
+       if ((num_success == 0) && (num_fail != 0))
+               return (-1);
        return 0;
 }