new-acpi-battery.c - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
new-acpi-battery.c (1208B)
---
1 char *
2 readfile(char *base, char *file)
3 {
4 char *path, line[513];
5 FILE *fd;
6
7 memset(line, 0, sizeof(line));
8
9 path = smprintf("%s/%s", base, file);
10 fd = fopen(path, "r");
11 if (fd == NULL)
12 return NULL;
13 free(path);
14
15 if (fgets(line, sizeof(line)-1, fd) == NULL)
16 return NULL;
17 fclose(fd);
18
19 return smprintf("%s", line);
20 }
21
22 /*
23 * Linux seems to change the filenames after suspend/hibernate
24 * according to a random scheme. So just check for both possibilities.
25 */
26 char *
27 getbattery(char *base)
28 {
29 char *co;
30 int descap, remcap;
31
32 descap = -1;
33 remcap = -1;
34
35 co = readfile(base, "present");
36 if (co == NULL || co[0] != '1') {
37 if (co != NULL) free(co);
38 return smprintf("not present");
39 }
40 free(co);
41
42 co = readfile(base, "charge_full_design");
43 if (co == NULL) {
44 co = readfile(base, "energy_full_design");
45 if (co == NULL)
46 return smprintf("");
47 }
48 sscanf(co, "%d", &descap);
49 free(co);
50
51 co = readfile(base, "charge_now");
52 if (co == NULL) {
53 co = readfile(base, "energy_now");
54 if (co == NULL)
55 return smprintf("");
56 }
57 sscanf(co, "%d", &remcap);
58 free(co);
59
60 if (remcap < 0 || descap < 0)
61 return smprintf("invalid");
62
63 return smprintf("%.0f", ((float)remcap / (float)descap) * 100);
64 }
65