+int killpid(pid_t pid, int sig)
+{
+ int ret = -1;
+ debug(D_EXIT, "Request to kill pid %d", pid);
+
+ errno = 0;
+ if(kill(pid, 0) == -1) {
+ switch(errno) {
+ case ESRCH:
+ error("Request to kill pid %d, but it is not running.", pid);
+ break;
+
+ case EPERM:
+ error("Request to kill pid %d, but I do not have enough permissions.", pid);
+ break;
+
+ default:
+ error("Request to kill pid %d, but I received an error.", pid);
+ break;
+ }
+ }
+ else {
+ errno = 0;
+
+ void (*old)(int);
+ old = signal(sig, SIG_IGN);
+ if(old == SIG_ERR) {
+ error("Cannot overwrite signal handler for signal %d", sig);
+ old = sig_handler;
+ }
+
+ ret = kill(pid, sig);
+
+ if(signal(sig, old) == SIG_ERR)
+ error("Cannot restore signal handler for signal %d", sig);
+
+ if(ret == -1) {
+ switch(errno) {
+ case ESRCH:
+ error("Cannot kill pid %d, but it is not running.", pid);
+ break;
+
+ case EPERM:
+ error("Cannot kill pid %d, but I do not have enough permissions.", pid);
+ break;
+
+ default:
+ error("Cannot kill pid %d, but I received an error.", pid);
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+