Merge branch 'collectd-5.7' into collectd-5.8
[collectd.git] / src / battery.c
index 48691ce..b6dea0f 100644 (file)
 #define SYSFS_FACTOR 0.000001
 #endif /* KERNEL_LINUX */
 
+int battery_read_statefs(
+    void); /* defined in battery_statefs; used by StateFS backend */
+
 static _Bool report_percent = 0;
 static _Bool report_degraded = 0;
+static _Bool query_statefs = 0;
 
 static void battery_submit2(char const *plugin_instance, /* {{{ */
                             char const *type, char const *type_instance,
                             gauge_t value) {
-  value_t values[1];
   value_list_t vl = VALUE_LIST_INIT;
 
-  values[0].gauge = value;
-
-  vl.values = values;
+  vl.values = &(value_t){.gauge = value};
   vl.values_len = 1;
-  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
   sstrncpy(vl.plugin, "battery", sizeof(vl.plugin));
   sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
   sstrncpy(vl.type, type, sizeof(vl.type));
@@ -147,13 +147,13 @@ static double dict_get_double(CFDictionaryRef dict,
                                       kCFStringEncodingASCII);
   if (key_obj == NULL) {
     DEBUG("CFStringCreateWithCString (%s) failed.\n", key_string);
-    return (NAN);
+    return NAN;
   }
 
   if ((val_obj = CFDictionaryGetValue(dict, key_obj)) == NULL) {
     DEBUG("CFDictionaryGetValue (%s) failed.", key_string);
     CFRelease(key_obj);
-    return (NAN);
+    return NAN;
   }
   CFRelease(key_obj);
 
@@ -166,10 +166,10 @@ static double dict_get_double(CFDictionaryRef dict,
     }
   } else {
     DEBUG("CFGetTypeID (val_obj) = %i", (int)CFGetTypeID(val_obj));
-    return (NAN);
+    return NAN;
   }
 
-  return (val_double);
+  return val_double;
 } /* }}} double dict_get_double */
 
 #if HAVE_IOKIT_PS_IOPOWERSOURCES_H
@@ -316,6 +316,9 @@ static int battery_read(void) /* {{{ */
   gauge_t capacity_full = NAN;   /* Total capacity */
   gauge_t capacity_design = NAN; /* Full design capacity */
 
+  if (query_statefs)
+    return battery_read_statefs();
+
 #if HAVE_IOKIT_PS_IOPOWERSOURCES_H
   get_via_io_power_sources(&charge_rel, &current, &voltage);
 #endif
@@ -331,7 +334,7 @@ static int battery_read(void) /* {{{ */
   if (!isnan(voltage))
     battery_submit("0", "voltage", voltage);
 
-  return (0);
+  return 0;
 } /* }}} int battery_read */
 /* #endif HAVE_IOKIT_IOKITLIB_H || HAVE_IOKIT_PS_IOPOWERSOURCES_H */
 
@@ -341,43 +344,18 @@ static int battery_read(void) /* {{{ */
 static int sysfs_file_to_buffer(char const *dir, /* {{{ */
                                 char const *power_supply, char const *basename,
                                 char *buffer, size_t buffer_size) {
-  int status;
-  FILE *fp;
   char filename[PATH_MAX];
+  int status;
 
-  ssnprintf(filename, sizeof(filename), "%s/%s/%s", dir, power_supply,
-            basename);
-
-  /* No file isn't the end of the world -- not every system will be
-   * reporting the same set of statistics */
-  if (access(filename, R_OK) != 0)
-    return ENOENT;
+  snprintf(filename, sizeof(filename), "%s/%s/%s", dir, power_supply, basename);
 
-  fp = fopen(filename, "r");
-  if (fp == NULL) {
-    status = errno;
-    if (status != ENOENT) {
-      char errbuf[1024];
-      WARNING("battery plugin: fopen (%s) failed: %s", filename,
-              sstrerror(status, errbuf, sizeof(errbuf)));
-    }
+  status = (int)read_file_contents(filename, buffer, buffer_size - 1);
+  if (status < 0)
     return status;
-  }
 
-  if (fgets(buffer, buffer_size, fp) == NULL) {
-    status = errno;
-    if (status != ENODEV) {
-      char errbuf[1024];
-      WARNING("battery plugin: fgets (%s) failed: %s", filename,
-              sstrerror(status, errbuf, sizeof(errbuf)));
-    }
-    fclose(fp);
-    return status;
-  }
+  buffer[status] = '\0';
 
   strstripnewline(buffer);
-
-  fclose(fp);
   return 0;
 } /* }}} int sysfs_file_to_buffer */
 
@@ -387,14 +365,14 @@ static int sysfs_file_to_gauge(char const *dir, /* {{{ */
                                char const *power_supply, char const *basename,
                                gauge_t *ret_value) {
   int status;
-  char buffer[32] = "";
+  char buffer[32];
 
   status =
       sysfs_file_to_buffer(dir, power_supply, basename, buffer, sizeof(buffer));
   if (status != 0)
-    return (status);
+    return status;
 
-  return (strtogauge(buffer, ret_value));
+  return strtogauge(buffer, ret_value);
 } /* }}} sysfs_file_to_gauge */
 
 static int read_sysfs_capacity(char const *dir, /* {{{ */
@@ -408,21 +386,21 @@ static int read_sysfs_capacity(char const *dir, /* {{{ */
   status =
       sysfs_file_to_gauge(dir, power_supply, "energy_now", &capacity_charged);
   if (status != 0)
-    return (status);
+    return status;
 
   status =
       sysfs_file_to_gauge(dir, power_supply, "energy_full", &capacity_full);
   if (status != 0)
-    return (status);
+    return status;
 
   status = sysfs_file_to_gauge(dir, power_supply, "energy_full_design",
                                &capacity_design);
   if (status != 0)
-    return (status);
+    return status;
 
   submit_capacity(plugin_instance, capacity_charged * SYSFS_FACTOR,
                   capacity_full * SYSFS_FACTOR, capacity_design * SYSFS_FACTOR);
-  return (0);
+  return 0;
 } /* }}} int read_sysfs_capacity */
 
 static int read_sysfs_callback(char const *dir, /* {{{ */
@@ -439,9 +417,9 @@ static int read_sysfs_callback(char const *dir, /* {{{ */
   status =
       sysfs_file_to_buffer(dir, power_supply, "type", buffer, sizeof(buffer));
   if (status != 0)
-    return (0);
+    return 0;
   if (strcasecmp("Battery", buffer) != 0)
-    return (0);
+    return 0;
 
   (void)sysfs_file_to_buffer(dir, power_supply, "status", buffer,
                              sizeof(buffer));
@@ -472,7 +450,7 @@ static int read_sysfs_callback(char const *dir, /* {{{ */
   if (sysfs_file_to_gauge(dir, power_supply, "voltage_now", &v) == 0)
     battery_submit(plugin_instance, "voltage", v * SYSFS_FACTOR);
 
-  return (0);
+  return 0;
 } /* }}} int read_sysfs_callback */
 
 static int read_sysfs(void) /* {{{ */
@@ -481,12 +459,12 @@ static int read_sysfs(void) /* {{{ */
   int battery_counter = 0;
 
   if (access(SYSFS_PATH, R_OK) != 0)
-    return (ENOENT);
+    return ENOENT;
 
   status = walk_directory(SYSFS_PATH, read_sysfs_callback,
                           /* user_data = */ &battery_counter,
                           /* include hidden */ 0);
-  return (status);
+  return status;
 } /* }}} int read_sysfs */
 
 static int read_acpi_full_capacity(char const *dir, /* {{{ */
@@ -500,10 +478,10 @@ static int read_acpi_full_capacity(char const *dir, /* {{{ */
 
   FILE *fh;
 
-  ssnprintf(filename, sizeof(filename), "%s/%s/info", dir, power_supply);
+  snprintf(filename, sizeof(filename), "%s/%s/info", dir, power_supply);
   fh = fopen(filename, "r");
   if (fh == NULL)
-    return (errno);
+    return errno;
 
   /* last full capacity:      40090 mWh */
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -532,7 +510,7 @@ static int read_acpi_full_capacity(char const *dir, /* {{{ */
   }
 
   fclose(fh);
-  return (0);
+  return 0;
 } /* }}} int read_acpi_full_capacity */
 
 static int read_acpi_callback(char const *dir, /* {{{ */
@@ -553,13 +531,13 @@ static int read_acpi_callback(char const *dir, /* {{{ */
 
   FILE *fh;
 
-  ssnprintf(filename, sizeof(filename), "%s/%s/state", dir, power_supply);
+  snprintf(filename, sizeof(filename), "%s/%s/state", dir, power_supply);
   fh = fopen(filename, "r");
   if (fh == NULL) {
     if ((errno == EAGAIN) || (errno == EINTR) || (errno == ENOENT))
-      return (0);
+      return 0;
     else
-      return (errno);
+      return errno;
   }
 
   /*
@@ -638,12 +616,12 @@ static int read_acpi(void) /* {{{ */
   int battery_counter = 0;
 
   if (access(PROC_ACPI_PATH, R_OK) != 0)
-    return (ENOENT);
+    return ENOENT;
 
   status = walk_directory(PROC_ACPI_PATH, read_acpi_callback,
                           /* user_data = */ &battery_counter,
                           /* include hidden */ 0);
-  return (status);
+  return status;
 } /* }}} int read_acpi */
 
 static int read_pmu(void) /* {{{ */
@@ -662,11 +640,11 @@ static int read_pmu(void) /* {{{ */
     gauge_t voltage = NAN;
     gauge_t charge = NAN;
 
-    ssnprintf(filename, sizeof(filename), PROC_PMU_PATH_FORMAT, i);
+    snprintf(filename, sizeof(filename), PROC_PMU_PATH_FORMAT, i);
     if (access(filename, R_OK) != 0)
       break;
 
-    ssnprintf(plugin_instance, sizeof(plugin_instance), "%i", i);
+    snprintf(plugin_instance, sizeof(plugin_instance), "%i", i);
 
     fh = fopen(filename, "r");
     if (fh == NULL) {
@@ -675,7 +653,7 @@ static int read_pmu(void) /* {{{ */
       else if ((errno == EAGAIN) || (errno == EINTR))
         continue;
       else
-        return (errno);
+        return errno;
     }
 
     while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -703,31 +681,34 @@ static int read_pmu(void) /* {{{ */
   }
 
   if (i == 0)
-    return (ENOENT);
-  return (0);
+    return ENOENT;
+  return 0;
 } /* }}} int read_pmu */
 
 static int battery_read(void) /* {{{ */
 {
   int status;
 
+  if (query_statefs)
+    return battery_read_statefs();
+
   DEBUG("battery plugin: Trying sysfs ...");
   status = read_sysfs();
   if (status == 0)
-    return (0);
+    return 0;
 
   DEBUG("battery plugin: Trying acpi ...");
   status = read_acpi();
   if (status == 0)
-    return (0);
+    return 0;
 
   DEBUG("battery plugin: Trying pmu ...");
   status = read_pmu();
   if (status == 0)
-    return (0);
+    return 0;
 
   ERROR("battery plugin: All available input methods failed.");
-  return (-1);
+  return -1;
 } /* }}} int battery_read */
 #endif /* KERNEL_LINUX */
 
@@ -739,13 +720,15 @@ static int battery_config(oconfig_item_t *ci) {
       cf_util_get_boolean(child, &report_percent);
     else if (strcasecmp("ReportDegraded", child->key) == 0)
       cf_util_get_boolean(child, &report_degraded);
+    else if (strcasecmp("QueryStateFS", child->key) == 0)
+      cf_util_get_boolean(child, &query_statefs);
     else
       WARNING("battery plugin: Ignoring unknown "
               "configuration option \"%s\".",
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int battery_config */
 
 void module_register(void) {