| new-acpi-battery.c - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| 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 |