char * readfile(char *base, char *file) { char *path, line[513]; FILE *fd; memset(line, 0, sizeof(line)); path = smprintf("%s/%s", base, file); fd = fopen(path, "r"); if (fd == NULL) return NULL; free(path); if (fgets(line, sizeof(line)-1, fd) == NULL) return NULL; fclose(fd); return smprintf("%s", line); } /* * Linux seems to change the filenames after suspend/hibernate * according to a random scheme. So just check for both possibilities. */ char * getbattery(char *base) { char *co; int descap, remcap; descap = -1; remcap = -1; co = readfile(base, "present"); if (co == NULL || co[0] != '1') { if (co != NULL) free(co); return smprintf("not present"); } free(co); co = readfile(base, "charge_full_design"); if (co == NULL) { co = readfile(base, "energy_full_design"); if (co == NULL) return smprintf(""); } sscanf(co, "%d", &descap); free(co); co = readfile(base, "charge_now"); if (co == NULL) { co = readfile(base, "energy_now"); if (co == NULL) return smprintf(""); } sscanf(co, "%d", &remcap); free(co); if (remcap < 0 || descap < 0) return smprintf("invalid"); return smprintf("%.0f", ((float)remcap / (float)descap) * 100); }