summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarco Hunsicker <i3@hunsicker.de>2014-02-25 20:43:48 +0100
committerMichael Stapelberg <michael@stapelberg.de>2014-02-26 22:32:32 +0100
commit26faed4c2f2c23f17b0c9170a4a72bb018931ed8 (patch)
tree4d763f8501882e73a1e6932fbdf25e4d77d50b12 /src
parent530c82edfd13e78463eb7e5beda9db8124e3147b (diff)
i3status: Bugfix: Reading multiple temperature sensors not possible
This patch inlines the creation of the thermal zone string in order to force computation on each invocation. This is necessary to be able to read the values of several temperature sensors.
Diffstat (limited to 'src')
-rw-r--r--src/print_cpu_temperature.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c
index 6b8aa59..306ad1d 100644
--- a/src/print_cpu_temperature.c
+++ b/src/print_cpu_temperature.c
@@ -37,11 +37,9 @@
#endif
-static char *thermal_zone;
-
/*
- * Reads the CPU temperature from /sys/class/thermal/thermal_zone0/temp and
- * returns the temperature in degree celcius.
+ * Reads the CPU temperature from /sys/class/thermal/thermal_zone%d/temp (or
+ * the user provided path) and returns the temperature in degree celcius.
*
*/
void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int max_threshold) {
@@ -49,16 +47,14 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
#ifdef THERMAL_ZONE
const char *walk;
bool colorful_output = false;
+ char *thermal_zone;
- if (thermal_zone == NULL) {
- if (path == NULL)
- asprintf(&thermal_zone, THERMAL_ZONE, zone);
- else
- asprintf(&thermal_zone, path, zone);
- }
- path = thermal_zone;
+ if (path == NULL)
+ asprintf(&thermal_zone, THERMAL_ZONE, zone);
+ else
+ asprintf(&thermal_zone, path, zone);
- INSTANCE(path);
+ INSTANCE(thermal_zone);
for (walk = format; *walk != '\0'; walk++) {
if (*walk != '%') {
@@ -70,7 +66,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
#if defined(LINUX)
static char buf[16];
long int temp;
- if (!slurp(path, buf, sizeof(buf)))
+ if (!slurp(thermal_zone, buf, sizeof(buf)))
goto error;
temp = strtol(buf, NULL, 10);
if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
@@ -89,7 +85,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
int sysctl_rslt;
size_t sysctl_size = sizeof(sysctl_rslt);
- if (sysctlbyname(path, &sysctl_rslt, &sysctl_size, NULL, 0))
+ if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0))
goto error;
if (TZ_AVG(sysctl_rslt) >= max_threshold) {
@@ -121,7 +117,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
goto error;
}
/* 'path' is the node within the full path (defaults to acpitz0). */
- if (strncmp(sensordev.xname, path, strlen(path)) == 0) {
+ if (strncmp(sensordev.xname, thermal_zone, strlen(thermal_zone)) == 0) {
mib[3] = SENSOR_TEMP;
/* Limit to temo0, but should retrieve from a full path... */
for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
@@ -195,7 +191,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const
while ((obj2 = prop_object_iterator_next(iter2)) != NULL) {
obj3 = prop_dictionary_get(obj2, "description");
if (obj3 &&
- strcmp(path, prop_string_cstring_nocopy(obj3)) == 0)
+ strcmp(thermal_zone, prop_string_cstring_nocopy(obj3)) == 0)
{
obj3 = prop_dictionary_get(obj2, "cur-value");
float temp = MUKTOC(prop_number_integer_value(obj3));
@@ -230,10 +226,15 @@ error_netbsd1:
walk += strlen("degrees");
}
}
+
+ free(thermal_zone);
+
OUTPUT_FULL_TEXT(buffer);
return;
error:
#endif
+ free(thermal_zone);
+
OUTPUT_FULL_TEXT("cant read temp");
(void)fputs("i3status: Cannot read temperature. Verify that you have a thermal zone in /sys/class/thermal or disable the cpu_temperature module in your i3status config.\n", stderr);
}