1/*
2	bwdpi_check.c for keep wred / data_colld alive
3*/
4
5#include <rc.h>
6#include <bwdpi.h>
7
8static void check_wred_alive()
9{
10	debug = nvram_get_int("bwdpi_debug");
11	if(debug) dbg("[bwdpi_wred_alive] check_wred_alive...\n");
12
13	int enabled = check_bwdpi_nvram_setting();
14
15	if(enabled){
16		if(debug) dbg("[bwdpi_wred_alive] start_wrs and start_data_colld...\n");
17		// start wrs
18		start_wrs();
19		// start data_colld
20		start_dc(NULL);
21		alarm(60);
22	}
23}
24
25static int sig_cur = -1;
26
27static void catch_sig(int sig)
28{
29	sig_cur = sig;
30	debug = nvram_get_int("bwdpi_debug");
31
32	if (sig == SIGTERM)
33	{
34		remove("/var/run/bwdpi_wred_check.pid");
35		exit(0);
36	}
37	else if(sig == SIGALRM)
38	{
39		if(debug) dbg("[bwdpi_wred_alive] SIGALRM ...\n");
40		check_wred_alive();
41	}
42}
43
44int bwdpi_wred_alive_main(int argc, char **argv)
45{
46	debug = nvram_get_int("bwdpi_debug");
47	if(debug) dbg("[bwdpi_wred_alive] starting...\n");
48
49	FILE *fp;
50	sigset_t sigs_to_catch;
51
52	/* write pid */
53	if ((fp = fopen("/var/run/bwdpi_wred_alive.pid", "w")) != NULL)
54	{
55		fprintf(fp, "%d", getpid());
56		fclose(fp);
57	}
58
59	/* set the signal handler */
60	sigemptyset(&sigs_to_catch);
61	sigaddset(&sigs_to_catch, SIGTERM);
62	sigaddset(&sigs_to_catch, SIGALRM);
63	sigprocmask(SIG_UNBLOCK, &sigs_to_catch, NULL);
64
65	signal(SIGTERM, catch_sig);
66	signal(SIGALRM, catch_sig);
67
68	while(1)
69	{
70		if(debug) dbg("[bwdpi_wred_alive] set alarm 60 secs and pause...\n");
71		alarm(60);
72		pause();
73	}
74
75	return 0;
76}
77