minit

A small yet feature-complete init (http://fefe.de/minit/)
Log | Files | Refs | README | LICENSE

governor.c (2052B)


      1 #include <unistd.h>
      2 #include <string.h>
      3 #include <fcntl.h>
      4 
      5 #include <libowfat/errmsg.h>
      6 
      7 const char acstate[]="/proc/acpi/ac_adapter/AC/state";
      8 const char sysacstate[]="/sys/class/power_supply/AC/online";
      9 char governor[]="/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor";
     10 const char powersave[]="powersave";
     11 const char performance[]="performance";
     12 const char ondemand[]="conservative";
     13 
     14 int main(int argc,char* argv[]) {
     15   char buf[1024];
     16   int fd,r;
     17   const char* s;
     18   errmsg_iam("switch_governor");
     19 
     20   if (argc<1)
     21     s="governor";
     22   else if ((s=strrchr(argv[0],'/')))
     23     ++s;
     24   else
     25     s=argv[0];
     26   if (!strcmp(s,"slow")) {
     27     s=powersave; goto writeit;
     28   } else if (!strcmp(s,"fast")) {
     29     s=performance; goto writeit;
     30   } else if (!strcmp(s,"auto")) {
     31     s=ondemand; goto writeit;
     32   }
     33 
     34   /* first try /sys, if that fails attempt /proc */
     35   if ((fd=open(sysacstate,O_RDONLY))==-1) {
     36     if ((fd=open(acstate,O_RDONLY))==-1)
     37       diesys(1,"could not open ",acstate);
     38     if ((r=read(fd,buf,sizeof(buf)))<1)
     39       diesys(1,"read error");
     40     if (r>1000)
     41       die(1,"too much data in ",acstate);
     42     buf[r]=0;
     43     close(fd);
     44     if (strstr(buf,"off-line"))
     45       s=powersave;
     46     else if (strstr(buf,"on-line"))
     47       s=ondemand;
     48     else
     49       die(1,"ac adapter neither on-line nor off-line!?");
     50   } else {
     51     if ((r=read(fd,buf,sizeof(buf)))<1)
     52       diesys(1,"read error");
     53     if (r>2)
     54       die(1,"too much data in ",sysacstate);
     55     buf[r]=0;
     56     close(fd);
     57     if (buf[0]=='0')
     58       s=powersave;
     59     else if (buf[0]=='1')
     60       s=ondemand;
     61     else
     62       die(1,"ac adapter neither on-line nor off-line!?");
     63   }
     64 writeit:
     65   {
     66     int i;
     67     char* x=strstr(governor,"cpu0");
     68     if (x) x+=3;
     69     for (i=0; i<32; ++i) {
     70       if ((fd=open(governor,O_WRONLY))==-1) {
     71 	if (x && *x=='0')
     72 	  diesys(1,"could not open ",governor);
     73 	break;
     74       }
     75       r=strlen(s);
     76       if (write(fd,s,r)!=r)
     77 	diesys(1,"write error");
     78       close(fd);
     79       if (x) ++(*x); else break;
     80     }
     81   }
     82   carp("switched cpufreq governor to ",s);
     83   return 0;
     84 }