ReactOS 0.4.15-dev-8131-g4988de4
log.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS simple TCP/IP services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/services/tcpsvcs/log.c
5 * PURPOSE: Logging functionality for the service
6 * COPYRIGHT: Copyright 2008 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10#include "tcpsvcs.h"
11
12#define DEBUG
13
14static LPWSTR lpEventSource = L"tcpsvcs";
17
19
20
21// needs work
22static VOID
24 DWORD errNum,
25 DWORD exitCode,
26 UINT flags)
27{
28 HANDLE hEventLog;
29
31 if (hEventLog)
32 {
33 ReportEventW(hEventLog,
35 0,
36 0,
37 NULL,
38 1,
39 0,
40 &lpMsg,
41 NULL);
42
43 CloseEventLog(hEventLog);
44 }
45}
46
47static BOOL
49{
53 NULL,
56 NULL);
58 {
59 hLogFile = NULL;
60 return FALSE;
61 }
62
63 return TRUE;
64}
65
66static VOID
68 DWORD errNum,
69 DWORD exitCode,
70 UINT flags)
71{
72 LPWSTR lpFullMsg = NULL;
73 SIZE_T msgLen;
74
75 msgLen = wcslen(lpMsg) + 1;
76
77 if (flags & LOG_ERROR)
78 {
79 LPWSTR lpSysMsg;
80 DWORD eMsgLen;
81
83 NULL,
84 errNum,
86 (LPWSTR)&lpSysMsg,
87 0,
88 NULL);
89
90 msgLen = msgLen + eMsgLen + 40;
91
92 lpFullMsg = HeapAlloc(GetProcessHeap(),
93 0,
94 msgLen * sizeof(TCHAR));
95 if (lpFullMsg)
96 {
97 _snwprintf(lpFullMsg,
98 msgLen,
99 L"%s : %s\tErrNum = %lu ExitCode = %lu\r\n",
100 lpMsg,
101 lpSysMsg,
102 errNum,
103 exitCode);
104 }
105
106 LocalFree(lpSysMsg);
107
108 }
109 else
110 {
111 msgLen += 2;
112
113 lpFullMsg = HeapAlloc(GetProcessHeap(),
114 0,
115 msgLen * sizeof(TCHAR));
116 if (lpFullMsg)
117 {
118 _snwprintf(lpFullMsg,
119 msgLen,
120 L"%s\r\n",
121 lpMsg);
122 }
123 }
124
125 /* Make sure the length in bytes doesn't overflow a DWORD */
126 msgLen = wcslen(lpFullMsg);
127 if (msgLen > (MAXDWORD / sizeof(WCHAR)))
128 {
130 }
131
132 if (lpFullMsg)
133 {
135 DWORD dwRet;
136 BOOL bRet;
137
138 bRet = WriteFile(hLogFile,
139 lpFullMsg,
140 (DWORD)msgLen * sizeof(WCHAR),
142 &olWrite);
143 if (!bRet)
144 {
146 {
147 bRet = FALSE;
148 }
149 else
150 {
151 // Write is pending
153
154 switch (dwRet)
155 {
156 // event has been signaled
157 case WAIT_OBJECT_0:
158 {
160 &olWrite,
162 FALSE);
163 break;
164 }
165
166 default:
167 // An error has occurred in WaitForSingleObject.
168 // This usually indicates a problem with the
169 // OVERLAPPED structure's event handle.
170 bRet = FALSE;
171 break;
172 }
173 }
174 }
175
176 if (!bRet || bytesWritten == 0)
177 {
178 LogToEventLog(L"Failed to write to log file",
179 GetLastError(),
180 0,
182 }
183
185 0,
186 lpFullMsg);
187 }
188
189 if (exitCode > 0)
190 ExitProcess(exitCode);
191}
192
193
194
195VOID
197 DWORD errNum,
198 DWORD exitCode,
199 UINT flags)
200{
201#ifdef DEBUG
202 if (flags & LOG_FILE || flags & LOG_ERROR)
203 LogToFile(lpMsg, errNum, exitCode, flags);
204#endif
205 if (flags & LOG_EVENTLOG)
206 LogToEventLog(lpMsg, errNum, exitCode, flags);
207}
208
209BOOL
211{
212#ifdef DEBUG
213 BOOL bRet = FALSE;
214
216 {
218 }
219 StringCchCatW(szLogFileName, ARRAYSIZE(szLogFileName), L"\\tcpsvcs_log.log");
220
221 ZeroMemory(&olWrite, sizeof(OVERLAPPED));
222 olWrite.Offset = 0xFFFFFFFF;
223 olWrite.OffsetHigh = 0xFFFFFFFF;
225 if (olWrite.hEvent)
226 {
228
229 if (OpenLogFile())
230 {
231 WCHAR wcBom = 0xFEFF;
233
234 bRet = WriteFile(hLogFile,
235 &wcBom,
236 sizeof(WCHAR),
238 &olWrite);
239 if (!bRet)
240 {
242 {
243 LogToEventLog(L"Failed to write to log file",
244 GetLastError(),
245 0,
247 }
248 else
249 {
250 bRet = TRUE;
251 }
252 }
253 }
254 }
255
256 return bRet;
257#else
258 return TRUE;
259#endif
260}
261
262VOID
264{
265 if (hLogFile)
266 {
269 }
270
271 if (olWrite.hEvent)
272 {
274 }
275}
VOID UninitLogging()
Definition: log.c:263
static VOID LogToFile(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:67
static HANDLE hLogFile
Definition: log.c:16
static OVERLAPPED olWrite
Definition: log.c:18
BOOL InitLogging()
Definition: log.c:210
static WCHAR szLogFileName[MAX_PATH]
Definition: log.c:15
static LPWSTR lpEventSource
Definition: log.c:14
static BOOL OpenLogFile()
Definition: log.c:48
VOID LogEvent(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:196
static VOID LogToEventLog(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:23
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
BOOL WINAPI CloseEventLog(IN HANDLE hEventLog)
Definition: eventlog.c:427
BOOL WINAPI ReportEventW(IN HANDLE hEventLog, IN WORD wType, IN WORD wCategory, IN DWORD dwEventID, IN PSID lpUserSid, IN WORD wNumStrings, IN DWORD dwDataSize, IN LPCWSTR *lpStrings, IN LPVOID lpRawData)
Definition: eventlog.c:1516
HANDLE WINAPI RegisterEventSourceW(IN LPCWSTR lpUNCServerName, IN LPCWSTR lpSourceName)
Definition: eventlog.c:1295
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define GetEnvironmentVariableW(x, y, z)
Definition: compat.h:755
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
Definition: except.c:700
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
Definition: fileinfo.c:25
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei GLuint GLint * bytesWritten
Definition: glext.h:11123
GLbitfield flags
Definition: glext.h:7161
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
#define FILE_FLAG_OVERLAPPED
Definition: disk.h:46
#define OPEN_ALWAYS
Definition: disk.h:70
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
unsigned int UINT
Definition: ndis.h:50
#define GENERIC_WRITE
Definition: nt_native.h:90
#define MAXDWORD
#define L(x)
Definition: ntvdm.h:50
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_DEFAULT
Definition: nls.h:168
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
DWORD OffsetHigh
Definition: winbase.h:816
DWORD Offset
Definition: winbase.h:815
HANDLE hEvent
Definition: winbase.h:820
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define LOG_EVENTLOG
Definition: tcpsvcs.h:15
#define LOG_ERROR
Definition: tcpsvcs.h:16
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define EXCEPTION_INT_OVERFLOW
Definition: winbase.h:324
#define CreateEvent
Definition: winbase.h:3748
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:423
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:419
#define WAIT_OBJECT_0
Definition: winbase.h:406
#define EVENTLOG_ERROR_TYPE
Definition: winnt_old.h:2834
#define EVENTLOG_SUCCESS
Definition: winnt_old.h:2833
char TCHAR
Definition: xmlstorage.h:189
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185