[hackers] [slstatus][PATCH] Add FreeBSD support for temperature and battery components

From: Michael Buch <michaelbuch12_AT_gmail.com>
Date: Sun, 27 Jan 2019 15:44:39 +0000

---
 Includes a port of two of the slstatus components.
 Both use sysctl to provide the necessary information.
 Currently implemented as another #ifdef in the source files.
 Another option could be to recreate OS specific directories,
 but then it might get more tedious to build the tool.
 components/battery.c     | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
 components/temperature.c | 22 ++++++++++++++++++++
 config.def.h             |  8 +++++---
 3 files changed, 80 insertions(+), 3 deletions(-)
diff --git a/components/battery.c b/components/battery.c
index 1178f20..07b6ac1 100644
--- a/components/battery.c
+++ b/components/battery.c
_AT_@ -195,4 +195,57 @@
 
 		return NULL;
 	}
+#elif defined(__FreeBSD__)
+	#include <sys/sysctl.h>
+
+	const char *
+	battery_perc(const char *unused)
+	{
+		int cap;
+		size_t len;
+
+		len = sizeof(cap);
+		if (sysctlbyname("hw.acpi.battery.life", &cap, &len, NULL, 0) == -1
+				|| !len)
+			return NULL;
+
+		return bprintf("%d", cap);
+	}
+
+	const char *
+	battery_state(const char *unused)
+	{
+		int state;
+		size_t len;
+
+		len = sizeof(state);
+		if (sysctlbyname("hw.acpi.battery.state", &state, &len, NULL, 0) == -1
+				|| !len)
+			return NULL;
+
+		switch(state) {
+			case 0:
+			case 2:
+				return "+";
+			case 1:
+				return "-";
+			default:
+				return "?";
+		}
+	}
+
+	const char *
+	battery_remaining(const char *unused)
+	{
+		int rem;
+		size_t len;
+
+		len = sizeof(rem);
+		if (sysctlbyname("hw.acpi.battery.time", &rem, &len, NULL, 0) == -1
+				|| !len
+				|| rem == -1)
+			return NULL;
+
+		return bprintf("%uh %02um", rem / 60, rem % 60);
+	}
 #endif
diff --git a/components/temperature.c b/components/temperature.c
index d56cc0e..8462d0f 100644
--- a/components/temperature.c
+++ b/components/temperature.c
_AT_@ -3,6 +3,7 @@
 
 #include "../util.h"
 
+
 #if defined(__linux__)
 	#include <stdint.h>
 
_AT_@ -46,4 +47,25 @@
 		/* kelvin to celsius */
 		return bprintf("%d", (temp.value - 273150000) / 1E6);
 	}
+#elif defined(__FreeBSD__)
+	#include <stdio.h>
+	#include <stdlib.h>
+	#include <sys/sysctl.h>
+
+	const char *
+	temp(const char *zone)
+	{
+		char buf[256];
+		int temp;
+		size_t len;
+
+		len = sizeof(temp);
+		snprintf(buf, sizeof(buf), "hw.acpi.thermal.%s.temperature", zone);
+		if (sysctlbyname(buf, &temp, &len, NULL, 0) == -1
+				|| !len)
+			return NULL;
+
+		/* kelvin to decimal celcius */
+		return bprintf("%d.%d", (temp - 2731) / 10, abs((temp - 2731) % 10));
+	}
 #endif
diff --git a/config.def.h b/config.def.h
index ccc2aee..e06be66 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -13,11 +13,11 @@ static const char unknown_str[] = "n/a";
  * function            description                     argument (example)
  *
  * battery_perc        battery percentage              battery name (BAT0)
- *                                                     NULL on OpenBSD
+ *                                                     NULL on OpenBSD/FreeBSD
  * battery_state       battery charging state          battery name (BAT0)
- *                                                     NULL on OpenBSD
+ *                                                     NULL on OpenBSD/FreeBSD
  * battery_remaining   battery remaining HH:MM         battery name (BAT0)
- *                                                     NULL on OpenBSD
+ *                                                     NULL on OpenBSD/FreeBSD
  * cpu_perc            cpu usage in percent            NULL
  * cpu_freq            cpu frequency in MHz            NULL
  * datetime            date and time                   format string (%F %T)
_AT_@ -52,6 +52,8 @@ static const char unknown_str[] = "n/a";
  * temp                temperature in degree celsius   sensor file
  *                                                     (/sys/class/thermal/...)
  *                                                     NULL on OpenBSD
+ *                                                     thermal zone on FreeBSD
+ *                                                     (tz0, tz1, etc.)
  * uid                 UID of current user             NULL
  * uptime              system uptime                   NULL
  * username            username of current user        NULL
-- 
2.7.4
Received on Sun Jan 27 2019 - 16:44:39 CET

This archive was generated by hypermail 2.3.0 : Sun Jan 27 2019 - 16:48:24 CET