Code

Merge branch 'collectd-3.11' into collectd-4.0
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 28 Sep 2007 11:45:39 +0000 (13:45 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 28 Sep 2007 11:45:39 +0000 (13:45 +0200)
Conflicts:

ChangeLog
configure.in
src/wireless.c

ChangeLog
src/wireless.c

index a4f3fc5b6a9030be39cbd2ac8ad7a354236e8477..7d48baf0be7bae19e42ce2235b13a218bed1fd11 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -106,6 +106,10 @@ yyyy-mm-dd, Version 4.0.9
          from collectd, parses them and exits according to Nagios-standards.
        * manpages: The manpages have been improved a lot.
 
+2007-09-28, Version 3.11.7
+       * wireless plugin: Correct the handling of cards returning signal and
+         noise quality as percentage.
+
 2007-08-31, Version 3.11.6
        * processes plugin: Fix a potential segmentation fault.
 
index 81c968e8d9b4e462a57129b6c37cb7fdd05e303d..106754996c962518bc66e7348e36b2661a211562 100644 (file)
@@ -67,6 +67,15 @@ static void wireless_submit (const char *plugin_instance, const char *type,
        plugin_dispatch_values (type, &vl);
 } /* void wireless_submit */
 
+#define POWER_MIN -90.0
+#define POWER_MAX -50.0
+static double wireless_percent_to_power (double quality)
+{
+       assert ((quality >= 0.0) && (quality <= 100.0));
+
+       return ((quality * (POWER_MAX - POWER_MIN)) + POWER_MIN);
+} /* double wireless_percent_to_power */
+
 static int wireless_read (void)
 {
 #ifdef KERNEL_LINUX
@@ -96,6 +105,8 @@ static int wireless_read (void)
        devices_found = 0;
        while (fgets (buffer, sizeof (buffer), fh) != NULL)
        {
+               char *endptr;
+
                numfields = strsplit (buffer, fields, 8);
 
                if (numfields < 5)
@@ -109,19 +120,28 @@ static int wireless_read (void)
                fields[0][len] = '\0';
 
                device  = fields[0];
-               quality = atof (fields[2]);
-               power   = atof (fields[3]);
-               noise   = atof (fields[4]);
-
-               /* Fill in invalid values when conversion failed.. */
-               if (quality == 0.0)
-                       quality = -1.0; /* quality >= 0 */
-
-               if (power == 0.0)
-                       power = 1.0; /* power <= 0 */
 
-               if (noise == 0.0)
-                       noise = 1.0; /* noise <= 0 */
+               quality = strtod (fields[2], &endptr);
+               if (fields[2] == endptr)
+                       quality = -1.0; /* invalid */
+
+               /* power [dBm] < 0.0 */
+               power = strtod (fields[3], &endptr);
+               if (fields[3] == endptr)
+                       power = 1.0; /* invalid */
+               else if ((power >= 0.0) && (power <= 100.0))
+                       power = wireless_percent_to_power (power);
+               else if (power > 100.0)
+                       power = 1.0; /* invalid */
+
+               /* noise [dBm] < 0.0 */
+               noise = strtod (fields[3], &endptr);
+               if (fields[3] == endptr)
+                       noise = 1.0; /* invalid */
+               else if ((noise >= 0.0) && (noise <= 100.0))
+                       noise = wireless_percent_to_power (noise);
+               else if (noise > 100.0)
+                       noise = 1.0; /* invalid */
 
                wireless_submit (device, "signal_quality", quality);
                wireless_submit (device, "signal_power", power);