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