governor.c (2052B) download
1#include <unistd.h>
2#include <string.h>
3#include <fcntl.h>
4
5#include <libowfat/errmsg.h>
6
7const char acstate[]="/proc/acpi/ac_adapter/AC/state";
8const char sysacstate[]="/sys/class/power_supply/AC/online";
9char governor[]="/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor";
10const char powersave[]="powersave";
11const char performance[]="performance";
12const char ondemand[]="conservative";
13
14int 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 }
64writeit:
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}