From 089e68bcf40a48a029e7b8cf785731888e3daa0c Mon Sep 17 00:00:00 2001 From: Simon Dassow Date: Sat, 15 Aug 2026 12:35:14 +0200 Subject: [PATCH] Use apm(8) on OpenBSD for charger and battery status --- battery_bsd.go | 4 ++-- battery_openbsd.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 battery_openbsd.go diff --git a/battery_bsd.go b/battery_bsd.go index 561502c..076d7c1 100644 --- a/battery_bsd.go +++ b/battery_bsd.go @@ -1,5 +1,5 @@ -//go:build openbsd || freebsd || netbsd -// +build openbsd freebsd netbsd +//go:build freebsd || netbsd +// +build freebsd netbsd package dryvers diff --git a/battery_openbsd.go b/battery_openbsd.go new file mode 100644 index 0000000..a72aa17 --- /dev/null +++ b/battery_openbsd.go @@ -0,0 +1,48 @@ +//go:build openbsd +// +build openbsd + +package dryvers + +import ( + "errors" + "os/exec" +) + +var errNoApmOutput = errors.New("failed to find apm output") + +const apmBin = "/usr/sbin/apm" + +func (b *Battery) PluggedIn() (bool, error) { + cmd := exec.Command(apmBin, "-a") + val, err := cmd.CombinedOutput() + if err != nil { + return false, err + } + + if len(val) == 0 { + return false, errNoApmOutput + } + + return val[0] == 1, nil +} + +// Get returns the current battery level (between 0 and 1) or +// an error if there was a problem. +func (b *Battery) Get() (float64, error) { + cmd := exec.Command(apmBin, "-l") + val, err := cmd.CombinedOutput() + if err != nil { + return 0, err + } + + if len(val) == 0 { + return 0, errNoApmOutput + } + + percent := int(val[0]) + if percent == 0 { // avoid 0/100 below + return 0, nil + } + + return float64(percent) / 100, nil +}