17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier
47dd7cddfSDavid du Colombier void
reboot(void)57dd7cddfSDavid du Colombier reboot(void)
67dd7cddfSDavid du Colombier {
77dd7cddfSDavid du Colombier int fd;
87dd7cddfSDavid du Colombier fd = open("/dev/reboot", OWRITE);
97dd7cddfSDavid du Colombier if(fd >= 0)
107dd7cddfSDavid du Colombier write(fd, "reboot", 6);
117dd7cddfSDavid du Colombier exits(0);
127dd7cddfSDavid du Colombier }
137dd7cddfSDavid du Colombier
147dd7cddfSDavid du Colombier char*
readenv(char * name,char * buf,int n)157dd7cddfSDavid du Colombier readenv(char *name, char *buf, int n)
167dd7cddfSDavid du Colombier {
177dd7cddfSDavid du Colombier char *ans;
187dd7cddfSDavid du Colombier int f;
197dd7cddfSDavid du Colombier char ename[200];
207dd7cddfSDavid du Colombier
217dd7cddfSDavid du Colombier ans = buf;
227dd7cddfSDavid du Colombier ename[0] = 0;
237dd7cddfSDavid du Colombier strcat(ename, "/env/");
247dd7cddfSDavid du Colombier strcat(ename, name);
257dd7cddfSDavid du Colombier f = open(ename, OREAD);
267dd7cddfSDavid du Colombier if(f < 0)
277dd7cddfSDavid du Colombier return 0;
287dd7cddfSDavid du Colombier n = read(f, ans, n-1);
297dd7cddfSDavid du Colombier if(n < 0)
307dd7cddfSDavid du Colombier ans = 0;
317dd7cddfSDavid du Colombier else
327dd7cddfSDavid du Colombier ans[n] = 0;
337dd7cddfSDavid du Colombier close(f);
347dd7cddfSDavid du Colombier return ans;
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier
377dd7cddfSDavid du Colombier int alarmed;
387dd7cddfSDavid du Colombier
397dd7cddfSDavid du Colombier void
ding(void *,char * msg)407dd7cddfSDavid du Colombier ding(void*, char*msg)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier if(strstr(msg, "alarm")){
437dd7cddfSDavid du Colombier alarmed = 1;
447dd7cddfSDavid du Colombier noted(NCONT);
457dd7cddfSDavid du Colombier }
467dd7cddfSDavid du Colombier noted(NDFLT);
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier void
main(int argc,char ** argv)507dd7cddfSDavid du Colombier main(int argc, char **argv)
517dd7cddfSDavid du Colombier {
527dd7cddfSDavid du Colombier int fd;
539a747e4fSDavid du Colombier char buf[256];
547dd7cddfSDavid du Colombier char file[128];
557dd7cddfSDavid du Colombier char *p;
569a747e4fSDavid du Colombier Dir *d;
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier if(argc > 1)
594d44ba9bSDavid du Colombier strecpy(file, file+sizeof file, argv[1]);
607dd7cddfSDavid du Colombier else{
614d44ba9bSDavid du Colombier p = readenv("cputype", buf, sizeof buf);
627dd7cddfSDavid du Colombier if(p == 0)
637dd7cddfSDavid du Colombier exits(0);
647dd7cddfSDavid du Colombier file[0] = 0;
657dd7cddfSDavid du Colombier strcat(file, "/");
667dd7cddfSDavid du Colombier strcat(file, p);
679a747e4fSDavid du Colombier strcat(file, "/lib");
687dd7cddfSDavid du Colombier }
69*bdd62a84SDavid du Colombier if (access(file, AREAD) < 0)
70*bdd62a84SDavid du Colombier sysfatal("%s not readable: %r", file);
717dd7cddfSDavid du Colombier
72*bdd62a84SDavid du Colombier switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFCFDG)){
73*bdd62a84SDavid du Colombier case 0:
74*bdd62a84SDavid du Colombier break;
75*bdd62a84SDavid du Colombier default:
76*bdd62a84SDavid du Colombier exits(0);
77*bdd62a84SDavid du Colombier }
78*bdd62a84SDavid du Colombier
79*bdd62a84SDavid du Colombier notify(ding);
807dd7cddfSDavid du Colombier fd = open(file, OREAD);
81*bdd62a84SDavid du Colombier if (fd < 0)
82*bdd62a84SDavid du Colombier exits("no file");
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier // the logic here is to make a request every 5 minutes.
857dd7cddfSDavid du Colombier // If the request alarms out, that's OK, the file server
867dd7cddfSDavid du Colombier // may just be busy. If the request fails for any other
877dd7cddfSDavid du Colombier // reason, it's probably because the connection went
887dd7cddfSDavid du Colombier // away so reboot.
897dd7cddfSDavid du Colombier for(;;){
90*bdd62a84SDavid du Colombier alarm(1000*60);
917dd7cddfSDavid du Colombier alarmed = 0;
929a747e4fSDavid du Colombier
939a747e4fSDavid du Colombier d = dirfstat(fd);
949a747e4fSDavid du Colombier free(d);
959a747e4fSDavid du Colombier if(d == nil)
967dd7cddfSDavid du Colombier if(!alarmed)
977dd7cddfSDavid du Colombier reboot();
987dd7cddfSDavid du Colombier alarm(0);
99*bdd62a84SDavid du Colombier sleep(60*1000*5);
1007dd7cddfSDavid du Colombier }
1017dd7cddfSDavid du Colombier }
102