X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fbattery.c;h=b6dea0f3f14920e9b4b186d371f98002e11c6a27;hp=48691ce95bbb9021d3903d20dad1b4f85d1016ae;hb=7111bb6df7628edce3a8e538b386fbe27633a191;hpb=79963d13c1884d1d92667cc502ad20758b084a12 diff --git a/src/battery.c b/src/battery.c index 48691ce9..b6dea0f3 100644 --- a/src/battery.c +++ b/src/battery.c @@ -69,20 +69,20 @@ #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, ¤t, &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) {