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