openbsd-ports/x11/i3status/patches/patch-src_print_cpu_temperature_c
2012-10-09 17:12:31 +00:00

94 lines
3.3 KiB
Plaintext

$OpenBSD: patch-src_print_cpu_temperature_c,v 1.5 2012/10/09 17:12:31 jasper Exp $
- Default to acpitz(4) for temperature readings, instead of cpu(4).
The acpitz(4) values are eventually used by the kernel to determine if the machine
is getting too hot.
Other devices can be used by setting 'path' in the config file to the sysctl(3)
device node.
- Temperature sensors can now set a 'max_threshold' value to color the
output red if exceeded.
--- src/print_cpu_temperature.c.orig Wed Oct 3 13:44:44 2012
+++ src/print_cpu_temperature.c Tue Oct 9 20:36:23 2012
@@ -23,6 +23,8 @@
#include <sys/sensors.h>
#include <errno.h>
#include <err.h>
+
+#define MUKTOC(v) ((v - 273150000) / 1000000.0)
#endif
static char *thermal_zone;
@@ -32,11 +34,11 @@ static char *thermal_zone;
* 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) {
+void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int max_threshold) {
#ifdef THERMAL_ZONE
const char *walk;
char *outwalk = buffer;
- static char buf[16];
+ bool colorful_output;
if (path == NULL)
asprintf(&thermal_zone, THERMAL_ZONE, zone);
@@ -54,6 +56,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha
if (BEGINS_WITH(walk+1, "degrees")) {
#if defined(LINUX)
+ static char buf[16];
long int temp;
if (!slurp(path, buf, sizeof(buf)))
goto error;
@@ -87,21 +90,27 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha
break;
goto error;
}
- /*
- * 'path' is actually the node within the full path (eg, cpu0).
- * XXX: Extend the API to allow a string instead of just an int for path, this would
- * allow us to have a path of 'acpitz0' for example.
- */
+ /* 'path' is the node within the full path (defaults to acpitz0). */
if (strncmp(sensordev.xname, path, strlen(path)) == 0) {
mib[3] = SENSOR_TEMP;
- for (numt = 0; numt < sensordev.maxnumt[SENSOR_TEMP]; numt++) {
+ /* Limit to temo0, but should retrieve from a full path... */
+ for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) {
mib[4] = numt;
if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
- if (errno != ENOENT)
+ if (errno != ENOENT) {
warn("sysctl");
- continue;
+ continue;
+ }
}
- outwalk += sprintf(outwalk, "%.2f", (sensor.value - 273150000) / 1000000.0 );
+ if ((int)MUKTOC(sensor.value) >= max_threshold) {
+ START_COLOR("color_bad");
+ colorful_output = true;
+ }
+
+ outwalk += sprintf(outwalk, "%.2f", MUKTOC(sensor.value));
+
+ if (colorful_output)
+ END_COLOR;
}
}
}
@@ -109,9 +118,9 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha
walk += strlen("degrees");
}
}
+error:
OUTPUT_FULL_TEXT(buffer);
return;
-error:
#endif
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);