it* dwmstatus for OpenBSD Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/dwmstatus-sdk URL:git://git.codevoid.de/dwmstatus-sdk codevoid.de 70 1Log /git/dwmstatus-sdk/log.gph codevoid.de 70 1Files /git/dwmstatus-sdk/files.gph codevoid.de 70 1Refs /git/dwmstatus-sdk/refs.gph codevoid.de 70 1LICENSE /git/dwmstatus-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit a1751622782eb9d3d9bfae56b75b857d8cbd0c6c /git/dwmstatus-sdk/commit/a1751622782eb9d3d9bfae56b75b857d8cbd0c6c.gph codevoid.de 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net codevoid.de 70 iDate: Sun, 10 Sep 2017 19:28:54 +0200 Err codevoid.de 70 i Err codevoid.de 70 iInitial commit. Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i A LICENSE | 21 +++++++++++++++++++++ Err codevoid.de 70 i A Makefile | 49 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A config.mk | 30 ++++++++++++++++++++++++++++++ Err codevoid.de 70 i A dwmstatus-temperature.c | 15 +++++++++++++++ Err codevoid.de 70 i A dwmstatus.c | 229 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A dwmstatus.o | 0 Err codevoid.de 70 i A new-acpi-battery.c | 55 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i Err codevoid.de 70 i7 files changed, 399 insertions(+), 0 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/LICENSE b/LICENSE /git/dwmstatus-sdk/file/LICENSE.gph codevoid.de 70 it@@ -0,0 +1,21 @@ Err codevoid.de 70 i+MIT/X Consortium License Err codevoid.de 70 i+ Err codevoid.de 70 i+© 2011 Christoph Lohmann <20h@r-36.net> Err codevoid.de 70 i+ Err codevoid.de 70 i+Permission is hereby granted, free of charge, to any person obtaining a Err codevoid.de 70 i+copy of this software and associated documentation files (the "Software"), Err codevoid.de 70 i+to deal in the Software without restriction, including without limitation Err codevoid.de 70 i+the rights to use, copy, modify, merge, publish, distribute, sublicense, Err codevoid.de 70 i+and/or sell copies of the Software, and to permit persons to whom the Err codevoid.de 70 i+Software is furnished to do so, subject to the following conditions: Err codevoid.de 70 i+ Err codevoid.de 70 i+The above copyright notice and this permission notice shall be included in Err codevoid.de 70 i+all copies or substantial portions of the Software. Err codevoid.de 70 i+ Err codevoid.de 70 i+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR Err codevoid.de 70 i+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, Err codevoid.de 70 i+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL Err codevoid.de 70 i+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER Err codevoid.de 70 i+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING Err codevoid.de 70 i+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER Err codevoid.de 70 i+DEALINGS IN THE SOFTWARE. Err codevoid.de 70 1diff --git a/Makefile b/Makefile /git/dwmstatus-sdk/file/Makefile.gph codevoid.de 70 it@@ -0,0 +1,49 @@ Err codevoid.de 70 i+# See LICENSE file for copyright and license details. Err codevoid.de 70 i+ Err codevoid.de 70 i+include config.mk Err codevoid.de 70 i+ Err codevoid.de 70 i+SRC = ${NAME}.c Err codevoid.de 70 i+OBJ = ${SRC:.c=.o} Err codevoid.de 70 i+ Err codevoid.de 70 i+all: options ${NAME} Err codevoid.de 70 i+ Err codevoid.de 70 i+options: Err codevoid.de 70 i+ @echo ${NAME} build options: Err codevoid.de 70 i+ @echo "CFLAGS = ${CFLAGS}" Err codevoid.de 70 i+ @echo "LDFLAGS = ${LDFLAGS}" Err codevoid.de 70 i+ @echo "CC = ${CC}" Err codevoid.de 70 i+ Err codevoid.de 70 i+.c.o: Err codevoid.de 70 i+ @echo CC $< Err codevoid.de 70 i+ @${CC} -c ${CFLAGS} $< Err codevoid.de 70 i+ Err codevoid.de 70 i+${OBJ}: config.mk Err codevoid.de 70 i+ Err codevoid.de 70 i+${NAME}: ${OBJ} Err codevoid.de 70 i+ @echo CC -o $@ Err codevoid.de 70 i+ @${CC} -o $@ ${OBJ} ${LDFLAGS} Err codevoid.de 70 i+ Err codevoid.de 70 i+clean: Err codevoid.de 70 i+ @echo cleaning Err codevoid.de 70 i+ @rm -f ${NAME} ${OBJ} ${NAME}-${VERSION}.tar.gz Err codevoid.de 70 i+ Err codevoid.de 70 i+dist: clean Err codevoid.de 70 i+ @echo creating dist tarball Err codevoid.de 70 i+ @mkdir -p ${NAME}-${VERSION} Err codevoid.de 70 i+ @cp -R Makefile LICENSE config.mk \ Err codevoid.de 70 i+ ${SRC} ${NAME}-${VERSION} Err codevoid.de 70 i+ @tar -cf ${NAME}-${VERSION}.tar ${NAME}-${VERSION} Err codevoid.de 70 i+ @gzip ${NAME}-${VERSION}.tar Err codevoid.de 70 i+ @rm -rf ${NAME}-${VERSION} Err codevoid.de 70 i+ Err codevoid.de 70 i+install: all Err codevoid.de 70 i+ @echo installing executable file to ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ @mkdir -p ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ @cp -f ${NAME} ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ @chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME} Err codevoid.de 70 i+ Err codevoid.de 70 i+uninstall: Err codevoid.de 70 i+ @echo removing executable file from ${DESTDIR}${PREFIX}/bin Err codevoid.de 70 i+ @rm -f ${DESTDIR}${PREFIX}/bin/${NAME} Err codevoid.de 70 i+ Err codevoid.de 70 i+.PHONY: all options clean dist install uninstall Err codevoid.de 70 1diff --git a/config.mk b/config.mk /git/dwmstatus-sdk/file/config.mk.gph codevoid.de 70 it@@ -0,0 +1,30 @@ Err codevoid.de 70 i+NAME = dwmstatus Err codevoid.de 70 i+VERSION = 1.0 Err codevoid.de 70 i+ Err codevoid.de 70 i+# Customize below to fit your system Err codevoid.de 70 i+ Err codevoid.de 70 i+# paths Err codevoid.de 70 i+PREFIX = /usr Err codevoid.de 70 i+MANPREFIX = ${PREFIX}/share/man Err codevoid.de 70 i+ Err codevoid.de 70 i+X11INC = /usr/X11R6/include Err codevoid.de 70 i+X11LIB = /usr/X11R6/lib Err codevoid.de 70 i+ Err codevoid.de 70 i+# includes and libs Err codevoid.de 70 i+INCS = -I. -I/usr/include -I${X11INC} Err codevoid.de 70 i+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 Err codevoid.de 70 i+ Err codevoid.de 70 i+# flags Err codevoid.de 70 i+CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE Err codevoid.de 70 i+CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} Err codevoid.de 70 i+#CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} Err codevoid.de 70 i+LDFLAGS = -g ${LIBS} Err codevoid.de 70 i+#LDFLAGS = -s ${LIBS} Err codevoid.de 70 i+ Err codevoid.de 70 i+# Solaris Err codevoid.de 70 i+#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" Err codevoid.de 70 i+#LDFLAGS = ${LIBS} Err codevoid.de 70 i+ Err codevoid.de 70 i+# compiler and linker Err codevoid.de 70 i+CC = cc Err codevoid.de 70 i+ Err codevoid.de 70 1diff --git a/dwmstatus-temperature.c b/dwmstatus-temperature.c /git/dwmstatus-sdk/file/dwmstatus-temperature.c.gph codevoid.de 70 it@@ -0,0 +1,15 @@ Err codevoid.de 70 i+/* Err codevoid.de 70 i+ * gettemperature("/sys/class/hwmon/hwmon0/device", "temp1_input"); Err codevoid.de 70 i+ */ Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+gettemperature(char *base, char *sensor) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *co; Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, sensor); Err codevoid.de 70 i+ if (co == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ return smprintf("%02.0f°C", atof(co) / 1000); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 1diff --git a/dwmstatus.c b/dwmstatus.c /git/dwmstatus-sdk/file/dwmstatus.c.gph codevoid.de 70 it@@ -0,0 +1,229 @@ Err codevoid.de 70 i+/* Err codevoid.de 70 i+ * Copy me if you can. Err codevoid.de 70 i+ * by 20h Err codevoid.de 70 i+ */ Err codevoid.de 70 i+ Err codevoid.de 70 i+#define _BSD_SOURCE Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+ Err codevoid.de 70 i+#include Err codevoid.de 70 i+ Err codevoid.de 70 i+char *tzargentina = "America/Buenos_Aires"; Err codevoid.de 70 i+char *tzutc = "UTC"; Err codevoid.de 70 i+char *tzberlin = "Europe/Berlin"; Err codevoid.de 70 i+ Err codevoid.de 70 i+static Display *dpy; Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+smprintf(char *fmt, ...) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ va_list fmtargs; Err codevoid.de 70 i+ char *ret; Err codevoid.de 70 i+ int len; Err codevoid.de 70 i+ Err codevoid.de 70 i+ va_start(fmtargs, fmt); Err codevoid.de 70 i+ len = vsnprintf(NULL, 0, fmt, fmtargs); Err codevoid.de 70 i+ va_end(fmtargs); Err codevoid.de 70 i+ Err codevoid.de 70 i+ ret = malloc(++len); Err codevoid.de 70 i+ if (ret == NULL) { Err codevoid.de 70 i+ perror("malloc"); Err codevoid.de 70 i+ exit(1); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ va_start(fmtargs, fmt); Err codevoid.de 70 i+ vsnprintf(ret, len, fmt, fmtargs); Err codevoid.de 70 i+ va_end(fmtargs); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return ret; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+settz(char *tzname) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ setenv("TZ", tzname, 1); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+mktimes(char *fmt, char *tzname) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char buf[129]; Err codevoid.de 70 i+ time_t tim; Err codevoid.de 70 i+ struct tm *timtm; Err codevoid.de 70 i+ Err codevoid.de 70 i+ settz(tzname); Err codevoid.de 70 i+ tim = time(NULL); Err codevoid.de 70 i+ timtm = localtime(&tim); Err codevoid.de 70 i+ if (timtm == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!strftime(buf, sizeof(buf)-1, fmt, timtm)) { Err codevoid.de 70 i+ fprintf(stderr, "strftime == 0\n"); Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%s", buf); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+setstatus(char *str) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ XStoreName(dpy, DefaultRootWindow(dpy), str); Err codevoid.de 70 i+ XSync(dpy, False); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+loadavg(void) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ double avgs[3]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (getloadavg(avgs, 3) < 0) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%.2f %.2f %.2f", avgs[0], avgs[1], avgs[2]); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+readfile(char *base, char *file) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *path, line[513]; Err codevoid.de 70 i+ FILE *fd; Err codevoid.de 70 i+ Err codevoid.de 70 i+ memset(line, 0, sizeof(line)); Err codevoid.de 70 i+ Err codevoid.de 70 i+ path = smprintf("%s/%s", base, file); Err codevoid.de 70 i+ fd = fopen(path, "r"); Err codevoid.de 70 i+ free(path); Err codevoid.de 70 i+ if (fd == NULL) Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (fgets(line, sizeof(line)-1, fd) == NULL) Err codevoid.de 70 i+ return NULL; Err codevoid.de 70 i+ fclose(fd); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%s", line); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+getbattery(char *base) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *co, status; Err codevoid.de 70 i+ int descap, remcap; Err codevoid.de 70 i+ Err codevoid.de 70 i+ descap = -1; Err codevoid.de 70 i+ remcap = -1; Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "present"); Err codevoid.de 70 i+ if (co == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ if (co[0] != '1') { Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ return smprintf("not present"); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "charge_full_design"); Err codevoid.de 70 i+ if (co == NULL) { Err codevoid.de 70 i+ co = readfile(base, "energy_full_design"); Err codevoid.de 70 i+ if (co == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ sscanf(co, "%d", &descap); Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "charge_now"); Err codevoid.de 70 i+ if (co == NULL) { Err codevoid.de 70 i+ co = readfile(base, "energy_now"); Err codevoid.de 70 i+ if (co == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ sscanf(co, "%d", &remcap); Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "status"); Err codevoid.de 70 i+ if (!strncmp(co, "Discharging", 11)) { Err codevoid.de 70 i+ status = '-'; Err codevoid.de 70 i+ } else if(!strncmp(co, "Charging", 8)) { Err codevoid.de 70 i+ status = '+'; Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ status = '?'; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (remcap < 0 || descap < 0) Err codevoid.de 70 i+ return smprintf("invalid"); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%.0f%%%c", ((float)remcap / (float)descap) * 100, status); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+gettemperature(char *base, char *sensor) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *co; Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, sensor); Err codevoid.de 70 i+ if (co == NULL) Err codevoid.de 70 i+ return smprintf(""); Err codevoid.de 70 i+ return smprintf("%02.0f°C", atof(co) / 1000); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+int Err codevoid.de 70 i+main(void) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *status; Err codevoid.de 70 i+ char *avgs; Err codevoid.de 70 i+ char *bat; Err codevoid.de 70 i+ char *bat1; Err codevoid.de 70 i+ char *tmar; Err codevoid.de 70 i+ char *tmutc; Err codevoid.de 70 i+ char *tmbln; Err codevoid.de 70 i+ char *t0, *t1, *t2, *t3; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!(dpy = XOpenDisplay(NULL))) { Err codevoid.de 70 i+ fprintf(stderr, "dwmstatus: cannot open display.\n"); Err codevoid.de 70 i+ return 1; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (;;sleep(60)) { Err codevoid.de 70 i+ avgs = loadavg(); Err codevoid.de 70 i+ bat = getbattery("/sys/class/power_supply/BAT0"); Err codevoid.de 70 i+ bat1 = getbattery("/sys/class/power_supply/BAT1"); Err codevoid.de 70 i+ tmar = mktimes("%H:%M", tzargentina); Err codevoid.de 70 i+ tmutc = mktimes("%H:%M", tzutc); Err codevoid.de 70 i+ tmbln = mktimes("KW %W %a %d %b %H:%M %Z %Y", tzberlin); Err codevoid.de 70 i+ t0 = gettemperature("/sys/devices/virtual/hwmon/hwmon1", "temp1_input"); Err codevoid.de 70 i+ t1 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp1_input"); Err codevoid.de 70 i+ t2 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp2_input"); Err codevoid.de 70 i+ t3 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp3_input"); Err codevoid.de 70 i+ Err codevoid.de 70 i+ status = smprintf("T:%s|%s|%s|%s L:%s B:%s|%s A:%s U:%s %s", Err codevoid.de 70 i+ t0, t1, t2, t3, avgs, bat, bat1, tmar, tmutc, Err codevoid.de 70 i+ tmbln); Err codevoid.de 70 i+ setstatus(status); Err codevoid.de 70 i+ Err codevoid.de 70 i+ free(t0); Err codevoid.de 70 i+ free(t1); Err codevoid.de 70 i+ free(t2); Err codevoid.de 70 i+ free(t3); Err codevoid.de 70 i+ free(avgs); Err codevoid.de 70 i+ free(bat); Err codevoid.de 70 i+ free(bat1); Err codevoid.de 70 i+ free(tmar); Err codevoid.de 70 i+ free(tmutc); Err codevoid.de 70 i+ free(tmbln); Err codevoid.de 70 i+ free(status); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ XCloseDisplay(dpy); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 1diff --git a/dwmstatus.o b/dwmstatus.o /git/dwmstatus-sdk/file/dwmstatus.o.gph codevoid.de 70 iBinary files differ. Err codevoid.de 70 1diff --git a/new-acpi-battery.c b/new-acpi-battery.c /git/dwmstatus-sdk/file/new-acpi-battery.c.gph codevoid.de 70 it@@ -0,0 +1,55 @@ Err codevoid.de 70 i+char * Err codevoid.de 70 i+readfile(char *base, char *file) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *path, line[513]; Err codevoid.de 70 i+ FILE *fd; Err codevoid.de 70 i+ Err codevoid.de 70 i+ memset(line, 0, sizeof(line)); Err codevoid.de 70 i+ Err codevoid.de 70 i+ path = smprintf("%s/%s", base, file); Err codevoid.de 70 i+ fd = fopen(path, "r"); Err codevoid.de 70 i+ if (fd == NULL) { Err codevoid.de 70 i+ perror("fopen"); Err codevoid.de 70 i+ exit(1); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ free(path); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (fgets(line, sizeof(line)-1, fd) == NULL) { Err codevoid.de 70 i+ perror("fgets"); Err codevoid.de 70 i+ exit(1); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ fclose(fd); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%s", line); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+char * Err codevoid.de 70 i+getbattery(char *base) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ char *co; Err codevoid.de 70 i+ int descap, remcap; Err codevoid.de 70 i+ Err codevoid.de 70 i+ descap = -1; Err codevoid.de 70 i+ remcap = -1; Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "present"); Err codevoid.de 70 i+ if (co[0] != '1') { Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ return smprintf("not present"); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "charge_full_design"); Err codevoid.de 70 i+ sscanf(co, "%d", &descap); Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ co = readfile(base, "charge_now"); Err codevoid.de 70 i+ sscanf(co, "%d", &remcap); Err codevoid.de 70 i+ free(co); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (remcap < 0 || descap < 0) Err codevoid.de 70 i+ return smprintf("invalid"); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return smprintf("%.0f", ((float)remcap / (float)descap) * 100); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 .