]> granicus.if.org Git - postgresql/blob - src/port/kill.c
Move pgkill out into /port so pg_ctl can use it on Win32.
[postgresql] / src / port / kill.c
1 /*-------------------------------------------------------------------------
2  *
3  * kill.c
4  *        kill()
5  *
6  * Copyright (c) 1996-2003, PostgreSQL Global Development Group
7  *
8  *      This is a replacement version of kill for Win32 which sends
9  *      signals that the backend can recognize.
10  *
11  * IDENTIFICATION
12  *        $PostgreSQL: pgsql/src/port/kill.c,v 1.1 2004/05/27 13:08:57 momjian Exp $
13  *
14  *-------------------------------------------------------------------------
15  */
16
17 #include "postgres.h"
18
19 #ifdef WIN32
20 /* signal sending */
21 int
22 pgkill(int pid, int sig)
23 {
24         char            pipename[128];
25         BYTE            sigData = sig;
26         BYTE            sigRet = 0;
27         DWORD           bytes;
28
29         if (sig >= PG_SIGNAL_COUNT || sig <= 0)
30         {
31                 errno = EINVAL;
32                 return -1;
33         }
34         if (pid <= 0)
35         {
36                 /* No support for process groups */
37                 errno = EINVAL;
38                 return -1;
39         }
40         wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%i", pid);
41         if (!CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000))
42         {
43                 if (GetLastError() == ERROR_FILE_NOT_FOUND)
44                         errno = ESRCH;
45                 else if (GetLastError() == ERROR_ACCESS_DENIED)
46                         errno = EPERM;
47                 else
48                         errno = EINVAL;
49                 return -1;
50         }
51         if (bytes != 1 || sigRet != sig)
52         {
53                 errno = ESRCH;
54                 return -1;
55         }
56
57         return 0;
58 }
59 #endif