X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fprint_cpu_temperature.c;h=8e7d7f9c4c23e0392c0e1940ec249e9b6dd24cfe;hb=794151cfe76f80fb2c7eebb8d3fbbce8fc5ccb09;hp=84f78e0269cf481ba76350bf67987094e0ede2e9;hpb=4ec02bea7bbe534ef4b610bc63d1694bf0823174;p=i3%2Fi3status diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c index 84f78e0..8e7d7f9 100644 --- a/src/print_cpu_temperature.c +++ b/src/print_cpu_temperature.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "i3status.h" @@ -14,6 +16,15 @@ #define TZ_KELVTOC(x) (((x) - TZ_ZEROC) / 10), abs(((x) - TZ_ZEROC) % 10) #endif +#if defined(__OpenBSD__) +#include +#include +#include +#include +#include +#include +#endif + static char *thermal_zone; /* @@ -21,18 +32,23 @@ static char *thermal_zone; * returns the temperature in degree celcius. * */ -void print_cpu_temperature_info(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) { +#ifdef THERMAL_ZONE const char *walk; + char *outwalk = buffer; static char buf[16]; - if (path == NULL) { + if (path == NULL) asprintf(&thermal_zone, THERMAL_ZONE, zone); - path = thermal_zone; - } + else + asprintf(&thermal_zone, path, zone); + path = thermal_zone; + + INSTANCE(path); for (walk = format; *walk != '\0'; walk++) { if (*walk != '%') { - putchar(*walk); + *(outwalk++) = *walk; continue; } @@ -40,23 +56,63 @@ void print_cpu_temperature_info(int zone, const char *path, const char *format) #if defined(LINUX) long int temp; if (!slurp(path, buf, sizeof(buf))) - die("Could not open \"%s\"\n", path); + goto error; temp = strtol(buf, NULL, 10); if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0) - (void)printf("?"); + *(outwalk++) = '?'; else - (void)printf("%ld", (temp/1000)); + outwalk += sprintf(outwalk, "%ld", (temp/1000)); #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) int sysctl_rslt; size_t sysctl_size = sizeof(sysctl_rslt); - if (sysctlbyname(path, &sysctl_rslt, &sysctl_size, NULL, 0)) { - (void)printf("No thermal zone found"); - return; - } + if (sysctlbyname(path, &sysctl_rslt, &sysctl_size, NULL, 0)) + goto error; + + outwalk += sprintf(outwalk, "%d.%d", TZ_KELVTOC(sysctl_rslt)); +#elif defined(__OpenBSD__) + struct sensordev sensordev; + struct sensor sensor; + size_t sdlen, slen; + int dev, numt, mib[5] = { CTL_HW, HW_SENSORS, 0, 0, 0 }; - (void)printf("%d.%d", TZ_KELVTOC(sysctl_rslt)); + sdlen = sizeof(sensordev); + slen = sizeof(sensor); + + for (dev = 0; ; dev++) { + mib[2] = dev; + if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) { + if (errno == ENXIO) + continue; + if (errno == ENOENT) + 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. + */ + if (strncmp(sensordev.xname, path, strlen(path)) == 0) { + mib[3] = SENSOR_TEMP; + for (numt = 0; numt < sensordev.maxnumt[SENSOR_TEMP]; numt++) { + mib[4] = numt; + if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) { + if (errno != ENOENT) + warn("sysctl"); + continue; + } + outwalk += sprintf(outwalk, "%.2f", (sensor.value - 273150000) / 1000000.0 ); + } + } + } #endif walk += strlen("degrees"); } } + 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); }