#include #include #include #include #include int main(int argc, char *argv[]) { if(argc!=6){ printf("This program requires 5 parameters:\n 1. warning treshold\n 2. xorg server display number for warning\n 3. xorg xauthority file location\n 4. critical battery treshold\n 5. critical battery action (systemctl)\n"); return -3; } char warn_thr = atoi(argv[1]); if(warn_thr>=100||warn_thr<0){ printf("Invalid value"); return -4; } char crit_thr = atoi(argv[4]); if(crit_thr>=100||crit_thr<0){ printf("Invalid value"); return -4; } while(true){ FILE *bat_lvl_file = fopen("/sys/class/power_supply/BAT0/capacity","r"); FILE *bat_stat_file = fopen("/sys/class/power_supply/BAT0/status","r"); if (bat_lvl_file == NULL || bat_stat_file == NULL){ printf("failed to open file"); return -1; } char bat_lvl_str[4]; char bat_stat; if(fgets(bat_lvl_str, sizeof(bat_lvl_str), bat_lvl_file) != NULL && (bat_stat=fgetc(bat_stat_file))){ fclose(bat_lvl_file); fclose(bat_stat_file); char bat_lvl = atoi(bat_lvl_str); printf("Battery is at %i%% - %c\n",bat_lvl,bat_stat); if(bat_stat=='D'){ if(bat_lvl<=crit_thr){ if(fork() == 0){ char *cmd[] = {"systemctl",argv[5]}; execvp(cmd[0],cmd); } else { wait(NULL); } } else if(bat_lvl<=warn_thr){ if(fork() == 0){ //child process char *msg = malloc(16+3+1); sprintf(msg,"Battery is low: %i%%",bat_lvl); char *xdisplay = malloc(10+strlen(argv[2])); sprintf(xdisplay, "DISPLAY=:%i", atoi(argv[2])); char *xauth = malloc(12+strlen(argv[3])); sprintf(xauth,"XAUTHORITY=%s",argv[3]); char *cmd[] = {"env",xdisplay,xauth,"i3-nagbar","-t","warning","-f","Cozette 10","-m",msg,NULL}; execvp(cmd[0],cmd); free(msg); free(xdisplay); free(xauth); } else { //parent process wait(NULL); } } } } else { printf("failed to read file"); fclose(bat_lvl_file); fclose(bat_stat_file); return -2; } sleep(10); } return 0; }