ReactOS 0.4.16-dev-1946-g52006dd
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#define STATUS_INTEGER_OVERFLOW ((DWORD)0xC0000095)
21
22// needs work
23static VOID
25 DWORD errNum,
26 DWORD exitCode,
27 UINT flags)
28{
29 HANDLE hEventLog;
30
32 if (hEventLog)
33 {
34 ReportEventW(hEventLog,
36 0,
37 0,
38 NULL,
39 1,
40 0,
41 &lpMsg,
42 NULL);
43
44 CloseEventLog(hEventLog);
45 }
46}
47
48static BOOL
50{
54 NULL,
57 NULL);
59 {
60 hLogFile = NULL;
61 return FALSE;
62 }
63
64 return TRUE;
65}
66
67static VOID
69 DWORD errNum,
70 DWORD exitCode,
71 UINT flags)
72{
73 LPWSTR lpFullMsg = NULL;
74 SIZE_T msgLen;
75
76 msgLen = wcslen(lpMsg) + 1;
77
78 if (flags & LOG_ERROR)
79 {
80 LPWSTR lpSysMsg;
81 DWORD eMsgLen;
82
84 NULL,
85 errNum,
87 (LPWSTR)&lpSysMsg,
88 0,
89 NULL);
90
91 msgLen = msgLen + eMsgLen + 40;
92
93 lpFullMsg = HeapAlloc(GetProcessHeap(),
94 0,
95 msgLen * sizeof(TCHAR));
96 if (lpFullMsg)
97 {
98 _snwprintf(lpFullMsg,
99 msgLen,
100 L"%s : %s\tErrNum = %lu ExitCode = %lu\r\n",
101 lpMsg,
102 lpSysMsg,
103 errNum,
104 exitCode);
105 }
106
107 LocalFree(lpSysMsg);
108
109 }
110 else
111 {
112 msgLen += 2;
113
114 lpFullMsg = HeapAlloc(GetProcessHeap(),
115 0,
116 msgLen * sizeof(TCHAR));
117 if (lpFullMsg)
118 {
119 _snwprintf(lpFullMsg,
120 msgLen,
121 L"%s\r\n",
122 lpMsg);
123 }
124 }
125
126 /* Make sure the length in bytes doesn't overflow a DWORD */
127 msgLen = wcslen(lpFullMsg);
128 if (msgLen > (MAXDWORD / sizeof(WCHAR)))
129 {
131 }
132
133 if (lpFullMsg)
134 {
136 DWORD dwRet;
137 BOOL bRet;
138
139 bRet = WriteFile(hLogFile,
140 lpFullMsg,
141 (DWORD)msgLen * sizeof(WCHAR),
143 &olWrite);
144 if (!bRet)
145 {
147 {
148 bRet = FALSE;
149 }
150 else
151 {
152 // Write is pending
154
155 switch (dwRet)
156 {
157 // event has been signaled
158 case WAIT_OBJECT_0:
159 {
161 &olWrite,
163 FALSE);
164 break;
165 }
166
167 default:
168 // An error has occurred in WaitForSingleObject.
169 // This usually indicates a problem with the
170 // OVERLAPPED structure's event handle.
171 bRet = FALSE;
172 break;
173 }
174 }
175 }
176
177 if (!bRet || bytesWritten == 0)
178 {
179 LogToEventLog(L"Failed to write to log file",
180 GetLastError(),
181 0,
183 }
184
186 0,
187 lpFullMsg);
188 }
189
190 if (exitCode > 0)
191 ExitProcess(exitCode);
192}
193
194
195
196VOID
198 DWORD errNum,
199 DWORD exitCode,
200 UINT flags)
201{
202#ifdef DEBUG
203 if (flags & LOG_FILE || flags & LOG_ERROR)
204 LogToFile(lpMsg, errNum, exitCode, flags);
205#endif
206 if (flags & LOG_EVENTLOG)
207 LogToEventLog(lpMsg, errNum, exitCode, flags);
208}
209
210BOOL
212{
213#ifdef DEBUG
214 BOOL bRet = FALSE;
215
217 {
219 }
220 StringCchCatW(szLogFileName, ARRAYSIZE(szLogFileName), L"\\tcpsvcs_log.log");
221
222 ZeroMemory(&olWrite, sizeof(OVERLAPPED));
223 olWrite.Offset = 0xFFFFFFFF;
224 olWrite.OffsetHigh = 0xFFFFFFFF;
226 if (olWrite.hEvent)
227 {
229
230 if (OpenLogFile())
231 {
232 WCHAR wcBom = 0xFEFF;
234
235 bRet = WriteFile(hLogFile,
236 &wcBom,
237 sizeof(WCHAR),
239 &olWrite);
240 if (!bRet)
241 {
243 {
244 LogToEventLog(L"Failed to write to log file",
245 GetLastError(),
246 0,
248 }
249 else
250 {
251 bRet = TRUE;
252 }
253 }
254 }
255 }
256
257 return bRet;
258#else
259 return TRUE;
260#endif
261}
262
263VOID
265{
266 if (hLogFile)
267 {
270 }
271
272 if (olWrite.hEvent)
273 {
275 }
276}
VOID UninitLogging()
Definition: log.c:264
static VOID LogToFile(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:68
static HANDLE hLogFile
Definition: log.c:16
static OVERLAPPED olWrite
Definition: log.c:18
BOOL InitLogging()
Definition: log.c:211
static WCHAR szLogFileName[MAX_PATH]
Definition: log.c:15
static LPWSTR lpEventSource
Definition: log.c:14
static BOOL OpenLogFile()
Definition: log.c:49
VOID LogEvent(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:197
static VOID LogToEventLog(LPCWSTR lpMsg, DWORD errNum, DWORD exitCode, UINT flags)
Definition: log.c:24
#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:1489
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 L(x)
Definition: resources.c:13
#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 ZeroMemory
Definition: minwinbase.h:31
#define EXCEPTION_INT_OVERFLOW
Definition: minwinbase.h:57
#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 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: minwinbase.h:226
DWORD Offset
Definition: minwinbase.h:225
HANDLE hEvent
Definition: minwinbase.h:230
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
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CreateEvent
Definition: winbase.h:3497
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:400
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define EVENTLOG_ERROR_TYPE
Definition: winnt_old.h:3057
#define EVENTLOG_SUCCESS
Definition: winnt_old.h:3056
char TCHAR
Definition: xmlstorage.h:189
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184