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 }