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