/* * (c) 2005 Nico Schottelius (nico-linux at schottelius.org) * terminate: terminate our watching pid * part of cinit */ #include #include #include #include #include #include #include #include "cinit.h" /* ********************************************************************** * terminate the watching service */ void sig_terminate(int signal) { struct timespec ts; int status; if( kill(cpid,SIGTERM) == -1) { if(errno != ESRCH) { perror(MSG_TERMKILL); } } /* variabel delay */ if(sock > 0) { ts.tv_sec = sock; } else { ts.tv_sec = SLEEP_KILL_SVC; /* defined in conf/sleep_kill_svc */ } /* if it still exists... */ if(kill(cpid,0) != -1) { /* kill if there is a delay */ if(sock != 0) { nanosleep(&ts,NULL); if( kill(cpid,SIGKILL) == -1) { perror(MSG_TERMKILL); } } } /* remove zombie if killed, if delay is zero wait for it */ waitpid(cpid,&status,0); /* reset the watching pid to zero (NOT THE WATCHER's!) */ cpid = 0; return; }