xref: /plan9/sys/src/cmd/aux/watchdog.c (revision 094743981686051321c10cc7fb9d9f942f360f45)
1 #include <u.h>
2 #include <libc.h>
3 
4 static int wdog;
5 
6 int
procctl(int pid)7 procctl(int pid)
8 {
9 	int ctlfd;
10 	char *ctl;
11 
12 	ctl = smprint("/proc/%d/ctl", pid);
13 	ctlfd = open(ctl, OWRITE);
14 	if (ctlfd < 0)
15 		sysfatal("open %s: %r", ctl);
16 	free(ctl);
17 	return ctlfd;
18 }
19 
20 void
main(int,char **)21 main(int, char **)
22 {
23 	int ctl;
24 
25 	wdog = open("#w/wdctl", ORDWR);
26 	if (wdog < 0)
27 		sysfatal("open #w/wdctl: %r");
28 
29 	switch(rfork(RFPROC|RFNOWAIT|RFFDG)){
30 	case 0:
31 		break;
32 	default:
33 		exits(0);
34 	}
35 
36 	ctl = procctl(getpid());
37 	fprint(ctl, "pri 18");
38 	close(ctl);
39 
40 	if (fprint(wdog, "enable") < 0)
41 		sysfatal("write #w/wdctl enable: %r");
42 	for(;;){
43 		sleep(300);		/* allows 4.2GHz CPU, with some slop */
44 		seek(wdog, 0, 0);
45 		if (fprint(wdog, "restart") < 0)
46 			sysfatal("write #w/wdctl restart: %r");
47 	}
48 }
49