2007-03-01 14:15:23 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
|
|
|
|
* This file is part of SIGAR.
|
|
|
|
*
|
|
|
|
* SIGAR is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms version 2 of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation. This program is distributed
|
|
|
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
|
|
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
|
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
* details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
* USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "sigar.h"
|
|
|
|
#include "sigar_private.h"
|
|
|
|
#include "sigar_util.h"
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
#include <windows.h>
|
|
|
|
#endif
|
|
|
|
|
2007-03-04 02:21:57 +08:00
|
|
|
#include <signal.h>
|
2007-03-01 14:15:23 +08:00
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
SIGAR_DECLARE(int) sigar_proc_kill(sigar_pid_t pid, int signum)
|
|
|
|
{
|
|
|
|
#ifdef WIN32
|
|
|
|
int status = -1;
|
|
|
|
HANDLE proc =
|
|
|
|
OpenProcess(PROCESS_ALL_ACCESS,
|
|
|
|
TRUE, (DWORD)pid);
|
|
|
|
|
|
|
|
if (proc) {
|
|
|
|
switch (signum) {
|
|
|
|
case 0:
|
|
|
|
status = SIGAR_OK;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (TerminateProcess(proc, signum)) {
|
|
|
|
status = SIGAR_OK;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
CloseHandle(proc);
|
|
|
|
|
|
|
|
if (status == SIGAR_OK) {
|
|
|
|
return SIGAR_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return GetLastError();
|
|
|
|
#else
|
|
|
|
if (kill(pid, signum) == -1) {
|
|
|
|
return errno;
|
|
|
|
}
|
|
|
|
return SIGAR_OK;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
SIGAR_DECLARE(int) sigar_signum_get(char *name)
|
|
|
|
{
|
|
|
|
if (strnEQ(name, "SIG", 3)) {
|
|
|
|
name += 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (*name) {
|
|
|
|
case 'A':
|
|
|
|
#ifdef SIGABRT
|
|
|
|
if (strEQ(name, "ABRT")) return SIGABRT;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGALRM
|
|
|
|
if (strEQ(name, "ALRM")) return SIGALRM;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'B':
|
|
|
|
#ifdef SIGBUS
|
|
|
|
if (strEQ(name, "BUS")) return SIGBUS;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'C':
|
|
|
|
#ifdef SIGCONT
|
|
|
|
if (strEQ(name, "CONT")) return SIGCONT;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGCHLD
|
|
|
|
if (strEQ(name, "CHLD")) return SIGCHLD;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGCLD
|
|
|
|
if (strEQ(name, "CLD")) return SIGCLD;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'E':
|
|
|
|
#ifdef SIGEMT
|
|
|
|
if (strEQ(name, "EMT")) return SIGEMT;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'F':
|
|
|
|
#ifdef SIGFPE
|
|
|
|
if (strEQ(name, "FPE")) return SIGFPE;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'H':
|
|
|
|
#ifdef SIGHUP
|
|
|
|
if (strEQ(name, "HUP")) return SIGHUP;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'I':
|
|
|
|
#ifdef SIGINT
|
|
|
|
if (strEQ(name, "INT")) return SIGINT;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGILL
|
|
|
|
if (strEQ(name, "ILL")) return SIGILL;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGIOT
|
|
|
|
if (strEQ(name, "IOT")) return SIGIOT;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGIO
|
|
|
|
if (strEQ(name, "IO")) return SIGIO;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGINFO
|
|
|
|
if (strEQ(name, "INFO")) return SIGINFO;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'K':
|
|
|
|
#ifdef SIGKILL
|
|
|
|
if (strEQ(name, "KILL")) return SIGKILL;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'P':
|
|
|
|
#ifdef SIGPOLL
|
|
|
|
if (strEQ(name, "POLL")) return SIGPOLL;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPIPE
|
|
|
|
if (strEQ(name, "PIPE")) return SIGPIPE;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPROF
|
|
|
|
if (strEQ(name, "PROF")) return SIGPROF;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPWR
|
|
|
|
if (strEQ(name, "PWR")) return SIGPWR;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'Q':
|
|
|
|
#ifdef SIGQUIT
|
|
|
|
if (strEQ(name, "QUIT")) return SIGQUIT;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
#ifdef SIGSEGV
|
|
|
|
if (strEQ(name, "SEGV")) return SIGSEGV;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSYS
|
|
|
|
if (strEQ(name, "SYS")) return SIGSYS;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSTOP
|
|
|
|
if (strEQ(name, "STOP")) return SIGSTOP;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSTKFLT
|
|
|
|
if (strEQ(name, "STKFLT")) return SIGSTKFLT;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'T':
|
|
|
|
#ifdef SIGTRAP
|
|
|
|
if (strEQ(name, "TRAP")) return SIGTRAP;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTERM
|
|
|
|
if (strEQ(name, "TERM")) return SIGTERM;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTSTP
|
|
|
|
if (strEQ(name, "TSTP")) return SIGTSTP;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTTIN
|
|
|
|
if (strEQ(name, "TTIN")) return SIGTTIN;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTTOU
|
|
|
|
if (strEQ(name, "TTOU")) return SIGTTOU;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'U':
|
|
|
|
#ifdef SIGURG
|
|
|
|
if (strEQ(name, "URG")) return SIGURG;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGUSR1
|
|
|
|
if (strEQ(name, "USR1")) return SIGUSR1;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGUSR2
|
|
|
|
if (strEQ(name, "USR2")) return SIGUSR2;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'V':
|
|
|
|
#ifdef SIGVTALRM
|
|
|
|
if (strEQ(name, "VTALRM")) return SIGVTALRM;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
|
|
#ifdef SIGWINCH
|
|
|
|
if (strEQ(name, "WINCH")) return SIGWINCH;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case 'X':
|
|
|
|
#ifdef SIGXCPU
|
|
|
|
if (strEQ(name, "XCPU")) return SIGXCPU;
|
|
|
|
#endif
|
|
|
|
#ifdef SIGXFSZ
|
|
|
|
if (strEQ(name, "XFSZ")) return SIGXFSZ;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|