xref: /plan9/sys/src/cmd/aux/watchdog.c (revision 094743981686051321c10cc7fb9d9f942f360f45)
1606e0002SDavid du Colombier #include <u.h>
2606e0002SDavid du Colombier #include <libc.h>
3606e0002SDavid du Colombier 
4606e0002SDavid du Colombier static int wdog;
5606e0002SDavid du Colombier 
6606e0002SDavid du Colombier int
procctl(int pid)7606e0002SDavid du Colombier procctl(int pid)
8606e0002SDavid du Colombier {
9606e0002SDavid du Colombier 	int ctlfd;
10606e0002SDavid du Colombier 	char *ctl;
11606e0002SDavid du Colombier 
12606e0002SDavid du Colombier 	ctl = smprint("/proc/%d/ctl", pid);
13606e0002SDavid du Colombier 	ctlfd = open(ctl, OWRITE);
14606e0002SDavid du Colombier 	if (ctlfd < 0)
15606e0002SDavid du Colombier 		sysfatal("open %s: %r", ctl);
16606e0002SDavid du Colombier 	free(ctl);
17606e0002SDavid du Colombier 	return ctlfd;
18606e0002SDavid du Colombier }
19606e0002SDavid du Colombier 
20606e0002SDavid du Colombier void
main(int,char **)21606e0002SDavid du Colombier main(int, char **)
22606e0002SDavid du Colombier {
23606e0002SDavid du Colombier 	int ctl;
24606e0002SDavid du Colombier 
25606e0002SDavid du Colombier 	wdog = open("#w/wdctl", ORDWR);
26606e0002SDavid du Colombier 	if (wdog < 0)
27606e0002SDavid du Colombier 		sysfatal("open #w/wdctl: %r");
28606e0002SDavid du Colombier 
29606e0002SDavid du Colombier 	switch(rfork(RFPROC|RFNOWAIT|RFFDG)){
30606e0002SDavid du Colombier 	case 0:
31606e0002SDavid du Colombier 		break;
32606e0002SDavid du Colombier 	default:
33606e0002SDavid du Colombier 		exits(0);
34606e0002SDavid du Colombier 	}
35606e0002SDavid du Colombier 
36606e0002SDavid du Colombier 	ctl = procctl(getpid());
37606e0002SDavid du Colombier 	fprint(ctl, "pri 18");
38606e0002SDavid du Colombier 	close(ctl);
39606e0002SDavid du Colombier 
40606e0002SDavid du Colombier 	if (fprint(wdog, "enable") < 0)
41*09474398SDavid du Colombier 		sysfatal("write #w/wdctl enable: %r");
42606e0002SDavid du Colombier 	for(;;){
43606e0002SDavid du Colombier 		sleep(300);		/* allows 4.2GHz CPU, with some slop */
44606e0002SDavid du Colombier 		seek(wdog, 0, 0);
45606e0002SDavid du Colombier 		if (fprint(wdog, "restart") < 0)
46*09474398SDavid du Colombier 			sysfatal("write #w/wdctl restart: %r");
47606e0002SDavid du Colombier 	}
48606e0002SDavid du Colombier }
49