summaryrefslogtreecommitdiff
path: root/src/print_cpu_temperature.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/print_cpu_temperature.c')
-rw-r--r--src/print_cpu_temperature.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/print_cpu_temperature.c b/src/print_cpu_temperature.c
new file mode 100644
index 0000000..d524f0b
--- /dev/null
+++ b/src/print_cpu_temperature.c
@@ -0,0 +1,59 @@
+// vim:ts=8:expandtab
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "i3status.h"
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <err.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#define TZ_ZEROC 2732
+#define TZ_KELVTOC(x) (((x) - TZ_ZEROC) / 10), abs(((x) - TZ_ZEROC) % 10)
+#endif
+
+static char *thermal_zone;
+
+/*
+ * Reads the CPU temperature from /sys/class/thermal/thermal_zone0/temp and
+ * returns the temperature in degree celcius.
+ *
+ */
+void print_cpu_temperature_info(int zone, const char *format) {
+ const char *walk;
+ static char buf[16];
+
+ asprintf(&thermal_zone, THERMAL_ZONE, zone);
+
+ for (walk = format; *walk != '\0'; walk++) {
+ if (*walk != '%') {
+ putchar(*walk);
+ continue;
+ }
+
+ if (BEGINS_WITH(walk+1, "degrees")) {
+#if defined(LINUX)
+ long int temp;
+ if (!slurp(thermal_zone, buf, sizeof(buf)))
+ die("Could not open \"%s\"\n", thermal_zone);
+ temp = strtol(buf, NULL, 10);
+ if (temp == LONG_MIN || temp == LONG_MAX || temp <= 0)
+ (void)printf("?");
+ else
+ (void)printf("%ld", (temp/1000));
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ int sysctl_rslt;
+ size_t sysctl_size = sizeof(sysctl_rslt);
+ if (sysctlbyname(thermal_zone, &sysctl_rslt, &sysctl_size, NULL, 0)) {
+ (void)printf("No thermal zone found");
+ return;
+ }
+
+ (void)printf("%d.%d", TZ_KELVTOC(sysctl_rslt));
+#endif
+ walk += strlen("degrees");
+ }
+ }
+}