@@ -6,11 +6,14 @@
add_executable(openvpnserv)
+set(MC_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/mc)
+
target_include_directories(openvpnserv PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/../../
../../include/
../openvpn/
../compat/
+ ${MC_GEN_DIR}
)
target_sources(openvpnserv PRIVATE
common.c
@@ -32,3 +35,34 @@
target_compile_options(openvpnserv PRIVATE -municode)
target_link_options(openvpnserv PRIVATE -municode)
endif ()
+
+# below we generate a DLL which contains an event source for event log messages from eventmsg.mc template
+file(MAKE_DIRECTORY ${MC_GEN_DIR})
+set(MC_FILE ${CMAKE_CURRENT_SOURCE_DIR}/eventmsg.mc)
+
+find_program(MC_COMPILER NAMES mc mc.exe x86_64-w64-mingw32-windmc i686-w64-mingw32-windmc windmc)
+
+if (NOT MC_COMPILER)
+ message(FATAL_ERROR "No message compiler found.")
+endif()
+
+add_custom_command(
+ OUTPUT ${MC_GEN_DIR}/eventmsg.rc ${MC_GEN_DIR}/eventmsg.h
+ COMMAND ${MC_COMPILER} -U -h ${MC_GEN_DIR} -r ${MC_GEN_DIR} ${MC_FILE}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/eventmsg.mc
+ VERBATIM
+ )
+
+# generate rc file for DLL and header for the service binary
+add_custom_target(msg_mc_gen ALL DEPENDS ${MC_GEN_DIR}/eventmsg.rc ${MC_GEN_DIR}/eventmsg.h)
+
+add_library(openvpnservmsg SHARED ${MC_GEN_DIR}/eventmsg.rc)
+
+if (MSVC)
+ set_target_properties(openvpnservmsg PROPERTIES LINK_FLAGS "/NOENTRY")
+else()
+ target_link_options(openvpnservmsg PRIVATE "-Wl,--no-entry")
+endif()
+
+add_dependencies(openvpnservmsg msg_mc_gen)
+add_dependencies(openvpnserv msg_mc_gen)
@@ -23,6 +23,7 @@
#include "service.h"
#include "validate.h"
+#include "eventmsg.h"
LPCTSTR service_instance = TEXT("");
static wchar_t win_sys_path[MAX_PATH];
@@ -219,24 +220,28 @@
LPTSTR tmp = NULL;
error = GetLastError();
- len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
- NULL, error, LANG_NEUTRAL, tmp, 0, NULL);
+ len = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM| FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&tmp, 0, NULL);
- if (len == 0 || (long) _countof(buf) < (long) len + 14)
+ if (!len || !tmp)
{
- buf[0] = TEXT('\0');
- }
- else
- {
- tmp[wcslen(tmp) - 2] = TEXT('\0'); /* remove CR/LF characters */
- openvpn_swprintf(buf, _countof(buf), TEXT("%ls (0x%x)"), tmp, error);
+ openvpn_swprintf(buf, _countof(buf), TEXT("Unknown error (0x%lx)"), error);
+ if (tmp)
+ {
+ LocalFree(tmp);
+ }
+ return buf;
}
- if (tmp)
+ /* trim trailing CR / LF / spaces safely */
+ while (len && (tmp[len - 1] == TEXT('\r') || tmp[len - 1] == TEXT('\n') || tmp[len - 1] == TEXT(' ')))
{
- LocalFree(tmp);
+ tmp[--len] = TEXT('\0');
}
+ openvpn_swprintf(buf, _countof(buf), TEXT("%ls (0x%lx)"), tmp, error);
+
+ LocalFree(tmp);
return buf;
}
@@ -268,9 +273,15 @@
va_end(arglist);
const TCHAR *mesg[] = { msg[0], msg[1] };
- ReportEvent(hEventSource, flags & MSG_FLAGS_ERROR ?
- EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE,
- 0, 0, NULL, 2, 0, mesg, NULL);
+ ReportEvent(hEventSource,
+ flags & MSG_FLAGS_ERROR ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE,
+ 0,
+ EVT_TEXT_2,
+ NULL,
+ 2,
+ 0,
+ mesg,
+ NULL);
DeregisterEventSource(hEventSource);
}
new file mode 100644
@@ -0,0 +1,23 @@
+MessageIdTypedef=DWORD
+
+SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
+ Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
+ Warning=0x2:STATUS_SEVERITY_WARNING
+ Error=0x3:STATUS_SEVERITY_ERROR
+ )
+
+FacilityNames=(System=0x0:FACILITY_SYSTEM
+ Runtime=0x2:FACILITY_RUNTIME
+ Stubs=0x3:FACILITY_STUBS
+ Io=0x4:FACILITY_IO_ERROR_CODE
+)
+
+LanguageNames=(English=0x409:MSG00409)
+
+MessageId=0x1
+Severity=Error
+Facility=Runtime
+SymbolicName=EVT_TEXT_2
+Language=English
+%1%n%2
+.