xref: /plan9/sys/src/cmd/aux/reboot.c (revision bdd62a84a206e1491ba0943e040ae63e131fbb4e)
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