www.nico.schottelius.org/software/cinit/browse_source/cinit-0.0.8/client/sig_terminate.c

56 lines
1.1 KiB
C
Raw Normal View History

/*
* (c) 2005 Nico Schottelius (nico-linux at schottelius.org)
* terminate: terminate our watching pid
* part of cinit
*/
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>
#include <stdio.h>
#include <errno.h>
#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;
}