1#include <stdio.h>
2#include <signal.h>
3#include <time.h>
4#include <sys/time.h>
5#include <unistd.h>
6#include <stdlib.h>
7#include <sys/types.h>
8
9#include <bcmnvram.h>
10#include <shutils.h>
11#include <rc.h>
12#include <stdarg.h>
13
14static int run_wanduck(){
15	char *argv[] = {"/usr/sbin/wanduck", NULL};
16printf("--- get signal to start wanduck in wanduckmain. ---\n");
17	return _eval(argv, NULL, 0, NULL);
18}
19
20static int remove_wanduck(){
21	char *argv[] = {"killall", "wanduck", NULL};
22printf("--- get signal to stop wanduck in wanduckmain. ---\n");
23	return _eval(argv, NULL, 0, NULL);
24}
25
26static int child_dead(){
27printf("--- wanduck was dead! ---\n");
28}
29
30static int safe_leave(){
31	//char *argv[] = {"rm", "-f", "/var/run/wanduckmain.pid", NULL};
32	//int ret;
33printf("--- get signal to leave wanduckmain. ---\n");
34	//ret = _eval(argv, NULL, 0, NULL);
35	unlink("/var/run/wanduckmain.pid");	// 2008.08 James.
36	exit(0);
37}
38
39int wanduck_main(void){
40	FILE *fp;
41	int ret;
42	sigset_t sigset;
43
44	fp = fopen("/var/run/wanduckmain.pid", "w");
45	if(fp == NULL)
46		exit(0);
47
48	fprintf(fp, "%d", getpid());
49	fclose(fp);
50
51	signal(SIGUSR1, run_wanduck);
52	signal(SIGUSR2, remove_wanduck);
53	signal(SIGCHLD, child_dead);
54	signal(SIGTERM, safe_leave);
55	sigemptyset(&sigset);
56
57	while(1){
58		sigsuspend(&sigset);
59	}
60}
61