unix/minit

governor.c in master
Repositories | Summary | Log | Files | README | COPYING

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}