unix/minit

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

powersave.c (2231B) download


 1#define _GNU_SOURCE
 2#include <sys/types.h>
 3#include <string.h>
 4#include <stdlib.h>
 5#include <dirent.h>
 6#include <netinet/in.h>
 7#include <sys/socket.h>
 8#include <net/if.h>
 9#include <sys/ioctl.h>
10
11#include <libowfat/open.h>
12
13int write_to(const char* filename,const char* string) {
14  int fd=open_write(filename);
15  if (fd!=-1) {
16    write(fd,string,strlen(string));
17    fd=close(fd);
18  }
19  return fd;
20}
21
22void handle(const char* s) {
23  size_t l=strlen(s);
24  char* x=alloca(l+20);
25  strcpy(x,s);
26  strcpy(x+l,"/power/control");
27  write_to(x,"auto");
28}
29
30void dwim(const char* name) {
31  DIR* D;
32  struct dirent* d;
33  if (chdir(name)) return;
34  if (!(D=opendir("."))) return;
35  while ((d=readdir(D))) {
36//    puts(d->d_name);
37    handle(d->d_name);
38  }
39  closedir(D);
40}
41
42void pci() {
43  dwim("/sys/bus/pci/devices");
44}
45
46void usb() {
47  dwim("/sys/bus/usb/devices");
48}
49
50void wakeonlan(const char* interface) {
51  struct ethtool_wolinfo {
52   uint32_t cmd,supported,wolopts;
53   char sopass[6];
54  } wol;
55  int fd=socket(PF_INET,SOCK_DGRAM,0);
56  struct ifreq ifr;
57  if (strlen(interface) > IFNAMSIZ)
58    return;
59  memset(&ifr,0,sizeof(ifr));
60  strncpy(ifr.ifr_name,interface,sizeof(ifr.ifr_name));
61  ifr.ifr_data=(void*)&wol;
62  memset(&wol,0,sizeof(wol));
63  wol.cmd=6;	// ETHTOOL_SWOL
64  wol.wolopts=0;
65  ioctl(fd,SIOCETHTOOL,&ifr);
66  close(fd);
67}
68
69int main() {
70  write_to("/sys/class/scsi_host/host0/link_power_management_policy","min_power");
71  write_to("/sys/class/scsi_host/host1/link_power_management_policy","min_power");
72  write_to("/sys/class/scsi_host/host2/link_power_management_policy","min_power");
73  write_to("/sys/class/scsi_host/host3/link_power_management_policy","min_power");
74  write_to("/sys/class/scsi_host/host4/link_power_management_policy","min_power");
75  write_to("/sys/class/scsi_host/host5/link_power_management_policy","min_power");
76  write_to("/sys/class/scsi_host/host6/link_power_management_policy","min_power");
77  write_to("/sys/module/snd_hda_intel/parameters/power_save","1");
78  write_to("/sys/bus/usb/devices/1-3/power/control","auto");
79  write_to("/sys/bus/usb/devices/1-4/power/control","auto");
80  write_to("/proc/sys/vm/dirty_writeback_centisecs","1500");
81  pci();
82  wakeonlan("eth0");
83//  usb();
84  return 0;
85}