*
* kill.cpp
* kill
*
* Copyright (c) 1996-2012, PostgreSQL Global Development Group
*
* This is a replacement version of kill for Win32 which sends
* signals that the backend can recognize.
*
* IDENTIFICATION
* src/port/kill.cpp
*
* -------------------------------------------------------------------------
*/
#include "c.h"
#include "securec.h"
#include "utils/elog.h"
#ifdef WIN32
int pgkill(int pid, int sig)
{
char pipename[128];
BYTE sigData = sig;
BYTE sigRet = 0;
DWORD bytes;
if (sig >= PG_SIGNAL_COUNT || sig < 0) {
errno = EINVAL;
return -1;
}
if (pid <= 0) {
errno = EINVAL;
return -1;
}
int rc = snprintf_s(pipename, sizeof(pipename), sizeof(pipename) - 1, "\\\\.\\pipe\\pgsignal_%u", pid);
securec_check_ss(rc, "\0", "\0");
if (CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000)) {
if (bytes != 1 || sigRet != sig) {
errno = ESRCH;
return -1;
}
return 0;
}
if (GetLastError() == ERROR_FILE_NOT_FOUND)
errno = ESRCH;
else if (GetLastError() == ERROR_ACCESS_DENIED)
errno = EPERM;
else
errno = EINVAL;
return -1;
}
#endif