2004-05-27 15:08:57 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* kill.c
|
|
|
|
* kill()
|
|
|
|
*
|
2004-08-29 06:13:13 +02:00
|
|
|
* Copyright (c) 1996-2004, PostgreSQL Global Development Group
|
2004-05-27 15:08:57 +02:00
|
|
|
*
|
|
|
|
* This is a replacement version of kill for Win32 which sends
|
|
|
|
* signals that the backend can recognize.
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2004-08-29 07:07:03 +02:00
|
|
|
* $PostgreSQL: pgsql/src/port/kill.c,v 1.5 2004/08/29 05:07:02 momjian Exp $
|
2004-05-27 15:08:57 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
2004-06-24 20:53:48 +02:00
|
|
|
#include "c.h"
|
2004-05-27 15:08:57 +02:00
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
/* signal sending */
|
|
|
|
int
|
|
|
|
pgkill(int pid, int sig)
|
|
|
|
{
|
|
|
|
char pipename[128];
|
|
|
|
BYTE sigData = sig;
|
|
|
|
BYTE sigRet = 0;
|
|
|
|
DWORD bytes;
|
|
|
|
|
2004-08-27 20:31:48 +02:00
|
|
|
/* we allow signal 0 here, but it will be ignored in pg_queue_signal */
|
|
|
|
if (sig >= PG_SIGNAL_COUNT || sig < 0)
|
2004-05-27 15:08:57 +02:00
|
|
|
{
|
|
|
|
errno = EINVAL;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (pid <= 0)
|
|
|
|
{
|
|
|
|
/* No support for process groups */
|
|
|
|
errno = EINVAL;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%i", pid);
|
|
|
|
if (!CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000))
|
|
|
|
{
|
|
|
|
if (GetLastError() == ERROR_FILE_NOT_FOUND)
|
|
|
|
errno = ESRCH;
|
|
|
|
else if (GetLastError() == ERROR_ACCESS_DENIED)
|
|
|
|
errno = EPERM;
|
|
|
|
else
|
|
|
|
errno = EINVAL;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (bytes != 1 || sigRet != sig)
|
|
|
|
{
|
|
|
|
errno = ESRCH;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2004-08-29 07:07:03 +02:00
|
|
|
|
2004-05-27 15:08:57 +02:00
|
|
|
#endif
|