summaryrefslogtreecommitdiffstats
path: root/src/bin/pgevent
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pgevent')
-rw-r--r--src/bin/pgevent/MSG00001.binbin0 -> 28 bytes
-rw-r--r--src/bin/pgevent/Makefile38
-rw-r--r--src/bin/pgevent/README20
-rw-r--r--src/bin/pgevent/exports.txt3
-rw-r--r--src/bin/pgevent/pgevent.c160
-rw-r--r--src/bin/pgevent/pgevent.def5
-rw-r--r--src/bin/pgevent/pgmsgevent.h46
-rw-r--r--src/bin/pgevent/pgmsgevent.mc5
-rw-r--r--src/bin/pgevent/pgmsgevent.rc4
9 files changed, 281 insertions, 0 deletions
diff --git a/src/bin/pgevent/MSG00001.bin b/src/bin/pgevent/MSG00001.bin
new file mode 100644
index 0000000..6ac08e5
--- /dev/null
+++ b/src/bin/pgevent/MSG00001.bin
Binary files differ
diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile
new file mode 100644
index 0000000..dea79d3
--- /dev/null
+++ b/src/bin/pgevent/Makefile
@@ -0,0 +1,38 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pgevent
+#
+# Copyright (c) 1996-2022, PostgreSQL Global Development Group
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "Eventlog message formatter"
+PGAPPICON=win32
+
+subdir = src/bin/pgevent
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+ifeq ($(PORTNAME), win32)
+
+OBJS = \
+ pgevent.o \
+ pgmsgevent.o
+NAME=pgevent
+
+SHLIB_LINK =
+SHLIB_EXPORTS = exports.txt
+
+all: all-lib
+
+install: all install-lib
+
+include $(top_srcdir)/src/Makefile.shlib
+
+pgmsgevent.o: pgmsgevent.rc win32ver.rc
+ $(WINDRES) $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(top_srcdir)/src/include --include-dir=$(srcdir) --include-dir=.
+
+clean distclean: clean-lib
+ rm -f $(OBJS) win32ver.rc
+
+endif
diff --git a/src/bin/pgevent/README b/src/bin/pgevent/README
new file mode 100644
index 0000000..10ec8d2
--- /dev/null
+++ b/src/bin/pgevent/README
@@ -0,0 +1,20 @@
+src/bin/pgevent/README
+
+pgevent
+=======
+
+MSG00001.bin is a binary file, result of Microsoft MC compiler. MC compiler
+can be downloaded for free with MS Core SDK but it is not included with MSYS
+tools and I didn't find an alternative way to compile MC file.
+
+To summarize: the command "MC pgmsgevent.mc" generates pgmsgevent.h,
+pgmsgevent.rc, and MSG00001.bin files. In MC file, we declare a string
+with %s format, so we can write anything we want in the future without
+needing to change the definition of this string.
+
+To finish, because DllUnregisterServer and DllRegisterServer are system
+defined entry points, we need to export these two functions with their names
+without "decoration", so we cannot use auto generated .def files without
+handy modifications.
+
+Laurent Ballester
diff --git a/src/bin/pgevent/exports.txt b/src/bin/pgevent/exports.txt
new file mode 100644
index 0000000..8facaed
--- /dev/null
+++ b/src/bin/pgevent/exports.txt
@@ -0,0 +1,3 @@
+ DllUnregisterServer@0 ;
+ DllRegisterServer@0 ;
+ DllInstall ;
diff --git a/src/bin/pgevent/pgevent.c b/src/bin/pgevent/pgevent.c
new file mode 100644
index 0000000..807a2c9
--- /dev/null
+++ b/src/bin/pgevent/pgevent.c
@@ -0,0 +1,160 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgevent.c
+ * Defines the entry point for pgevent dll.
+ * The DLL defines event source for backend
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pgevent/pgevent.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <olectl.h>
+
+/* Global variables */
+HANDLE g_module = NULL; /* hModule of DLL */
+
+/*
+ * The event source is stored as a registry key.
+ * The maximum length of a registry key is 255 characters.
+ * http://msdn.microsoft.com/en-us/library/ms724872(v=vs.85).aspx
+ */
+char event_source[256] = DEFAULT_EVENT_SOURCE;
+
+/* Prototypes */
+HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
+STDAPI DllRegisterServer(void);
+STDAPI DllUnregisterServer(void);
+BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved);
+
+/*
+ * DllInstall --- Passes the command line argument to DLL
+ */
+
+HRESULT
+DllInstall(BOOL bInstall,
+ LPCWSTR pszCmdLine)
+{
+ if (pszCmdLine && *pszCmdLine != '\0')
+ wcstombs(event_source, pszCmdLine, sizeof(event_source));
+
+ /*
+ * This is an ugly hack due to the strange behavior of "regsvr32 /i".
+ *
+ * When installing, regsvr32 calls DllRegisterServer before DllInstall.
+ * When uninstalling (i.e. "regsvr32 /u /i"), on the other hand, regsvr32
+ * calls DllInstall and then DllUnregisterServer as expected.
+ *
+ * This strange behavior forces us to specify -n (i.e. "regsvr32 /n /i").
+ * Without -n, DllRegisterServer called before DllInstall would mistakenly
+ * overwrite the default "PostgreSQL" event source registration.
+ */
+ if (bInstall)
+ DllRegisterServer();
+ return S_OK;
+}
+
+/*
+ * DllRegisterServer --- Instructs DLL to create its registry entries
+ */
+
+STDAPI
+DllRegisterServer(void)
+{
+ HKEY key;
+ DWORD data;
+ char buffer[_MAX_PATH];
+ char key_name[400];
+
+ /* Set the name of DLL full path name. */
+ if (!GetModuleFileName((HMODULE) g_module, buffer, sizeof(buffer)))
+ {
+ MessageBox(NULL, "Could not retrieve DLL filename", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /*
+ * Add PostgreSQL source name as a subkey under the Application key in the
+ * EventLog registry key.
+ */
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegCreateKey(HKEY_LOCAL_MACHINE, key_name, &key))
+ {
+ MessageBox(NULL, "Could not create the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Add the name to the EventMessageFile subkey. */
+ if (RegSetValueEx(key,
+ "EventMessageFile",
+ 0,
+ REG_EXPAND_SZ,
+ (LPBYTE) buffer,
+ strlen(buffer) + 1))
+ {
+ MessageBox(NULL, "Could not set the event message file.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Set the supported event types in the TypesSupported subkey. */
+ data = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+
+ if (RegSetValueEx(key,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (LPBYTE) &data,
+ sizeof(DWORD)))
+ {
+ MessageBox(NULL, "Could not set the supported types.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ RegCloseKey(key);
+ return S_OK;
+}
+
+/*
+ * DllUnregisterServer --- Instructs DLL to remove only those entries created through DllRegisterServer
+ */
+
+STDAPI
+DllUnregisterServer(void)
+{
+ char key_name[400];
+
+ /*
+ * Remove PostgreSQL source name as a subkey under the Application key in
+ * the EventLog registry key.
+ */
+
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegDeleteKey(HKEY_LOCAL_MACHINE, key_name))
+ {
+ MessageBox(NULL, "Could not delete the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+ return S_OK;
+}
+
+/*
+ * DllMain --- is an optional entry point into a DLL.
+ */
+
+BOOL WINAPI
+DllMain(HANDLE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+)
+{
+ if (ul_reason_for_call == DLL_PROCESS_ATTACH)
+ g_module = hModule;
+ return TRUE;
+}
diff --git a/src/bin/pgevent/pgevent.def b/src/bin/pgevent/pgevent.def
new file mode 100644
index 0000000..6b4d44a
--- /dev/null
+++ b/src/bin/pgevent/pgevent.def
@@ -0,0 +1,5 @@
+; dlltool --output-def pgevent.def pgevent.o pgmsgevent.o
+EXPORTS
+ DllUnregisterServer ;
+ DllRegisterServer ;
+ DllInstall ;
diff --git a/src/bin/pgevent/pgmsgevent.h b/src/bin/pgevent/pgmsgevent.h
new file mode 100644
index 0000000..aba71e4
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.h
@@ -0,0 +1,46 @@
+/* src/bin/pgevent/pgmsgevent.h */
+
+/* */
+/* Values are 32 bit values laid out as follows: */
+/* */
+/* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 */
+/* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* |Sev|C|R| Facility | Code | */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* */
+/* where */
+/* */
+/* Sev - is the severity code */
+/* */
+/* 00 - Success */
+/* 01 - Informational */
+/* 10 - Warning */
+/* 11 - Error */
+/* */
+/* C - is the Customer code flag */
+/* */
+/* R - is a reserved bit */
+/* */
+/* Facility - is the facility code */
+/* */
+/* Code - is the facility's status code */
+/* */
+/* */
+/* Define the facility codes */
+/* */
+
+
+/* */
+/* Define the severity codes */
+/* */
+
+
+/* */
+/* MessageId: PGWIN32_EVENTLOG_MSG */
+/* */
+/* MessageText: */
+/* */
+/* %1 */
+/* */
+#define PGWIN32_EVENTLOG_MSG 0x00000000L
diff --git a/src/bin/pgevent/pgmsgevent.mc b/src/bin/pgevent/pgmsgevent.mc
new file mode 100644
index 0000000..5d16e3e
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.mc
@@ -0,0 +1,5 @@
+MessageId=0
+SymbolicName=PGWIN32_EVENTLOG_MSG
+Language=English
+%1
+.
diff --git a/src/bin/pgevent/pgmsgevent.rc b/src/bin/pgevent/pgmsgevent.rc
new file mode 100644
index 0000000..e69862e
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.rc
@@ -0,0 +1,4 @@
+LANGUAGE 0x9,0x1
+1 11 MSG00001.bin
+
+#include "win32ver.rc"