123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <u.h>
- #include <libc.h>
- void
- reboot(void)
- {
- int fd;
- fd = open("/dev/reboot", OWRITE);
- if(fd >= 0)
- write(fd, "reboot", 6);
- exits(0);
- }
- char*
- readenv(char *name, char *buf, int n)
- {
- char *ans;
- int f;
- char ename[200];
- ans = buf;
- ename[0] = 0;
- strcat(ename, "/env/");
- strcat(ename, name);
- f = open(ename, OREAD);
- if(f < 0)
- return 0;
- n = read(f, ans, n-1);
- if(n < 0)
- ans = 0;
- else
- ans[n] = 0;
- close(f);
- return ans;
- }
- int alarmed;
- void
- ding(void*, char*msg)
- {
- if(strstr(msg, "alarm")){
- alarmed = 1;
- noted(NCONT);
- }
- noted(NDFLT);
- }
- void
- main(int argc, char **argv)
- {
- int fd;
- char buf[256];
- char file[128];
- char *p;
- Dir *d;
- if(argc > 1)
- strecpy(file, file+sizeof file, argv[1]);
- else{
- p = readenv("cputype", buf, sizeof buf);
- if(p == 0)
- exits(0);
- file[0] = 0;
- strcat(file, "/");
- strcat(file, p);
- strcat(file, "/lib");
- }
- if (access(file, AREAD) < 0)
- sysfatal("%s not readable: %r", file);
- switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFCFDG)){
- case 0:
- break;
- default:
- exits(0);
- }
- notify(ding);
- fd = open(file, OREAD);
- if (fd < 0)
- exits("no file");
- // the logic here is to make a request every 5 minutes.
- // If the request alarms out, that's OK, the file server
- // may just be busy. If the request fails for any other
- // reason, it's probably because the connection went
- // away so reboot.
- for(;;){
- alarm(1000*60);
- alarmed = 0;
- d = dirfstat(fd);
- free(d);
- if(d == nil)
- if(!alarmed)
- reboot();
- alarm(0);
- sleep(60*1000*5);
- }
- }
|