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>
14 static LPWSTR lpEventSource
= L
"tcpsvcs";
15 static LPCWSTR lpLogFileName
= L
"C:\\tcpsvcs_log.log";
16 static HANDLE hLogFile
= NULL
;
18 static OVERLAPPED olWrite
;
23 LogToEventLog(LPCWSTR lpMsg
,
30 hEventLog
= RegisterEventSourceW(NULL
, lpEventSource
);
33 ReportEventW(hEventLog
,
34 (flags
& LOG_ERROR
) ? EVENTLOG_ERROR_TYPE
: EVENTLOG_SUCCESS
,
43 CloseEventLog(hEventLog
);
50 hLogFile
= CreateFileW(lpLogFileName
,
55 FILE_ATTRIBUTE_NORMAL
| FILE_FLAG_OVERLAPPED
,
57 if (hLogFile
== INVALID_HANDLE_VALUE
)
67 LogToFile(LPCWSTR lpMsg
,
72 LPWSTR lpFullMsg
= NULL
;
75 msgLen
= wcslen(lpMsg
) + 1;
77 if (flags
& LOG_ERROR
)
82 eMsgLen
= FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
85 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
90 msgLen
= msgLen
+ eMsgLen
+ 40;
92 lpFullMsg
= HeapAlloc(GetProcessHeap(),
94 msgLen
* sizeof(TCHAR
));
99 L
"%s : %s\tErrNum = %lu ExitCode = %lu\r\n",
113 lpFullMsg
= HeapAlloc(GetProcessHeap(),
115 msgLen
* sizeof(TCHAR
));
118 _snwprintf(lpFullMsg
,
125 /* Make sure the length in bytes doesn't overflow a DWORD */
126 msgLen
= wcslen(lpFullMsg
);
127 if (msgLen
> (MAXDWORD
/ sizeof(WCHAR
)))
129 RaiseException(EXCEPTION_INT_OVERFLOW
, 0, 0, NULL
);
138 bRet
= WriteFile(hLogFile
,
140 (DWORD
)msgLen
* sizeof(WCHAR
),
145 if (GetLastError() != ERROR_IO_PENDING
)
152 dwRet
= WaitForSingleObject(olWrite
.hEvent
, INFINITE
);
156 // event has been signaled
159 bRet
= GetOverlappedResult(hLogFile
,
167 // An error has occurred in WaitForSingleObject.
168 // This usually indicates a problem with the
169 // OVERLAPPED structure's event handle.
176 if (!bRet
|| bytesWritten
== 0)
178 LogToEventLog(L
"Failed to write to log file",
181 LOG_EVENTLOG
| LOG_ERROR
);
184 HeapFree(GetProcessHeap(),
190 ExitProcess(exitCode
);
196 LogEvent(LPCWSTR lpMsg
,
202 if (flags
& LOG_FILE
|| flags
& LOG_ERROR
)
203 LogToFile(lpMsg
, errNum
, exitCode
, flags
);
205 if (flags
& LOG_EVENTLOG
)
206 LogToEventLog(lpMsg
, errNum
, exitCode
, flags
);
215 ZeroMemory(&olWrite
, sizeof(OVERLAPPED
));
216 olWrite
.Offset
= 0xFFFFFFFF;
217 olWrite
.OffsetHigh
= 0xFFFFFFFF;
218 olWrite
.hEvent
= CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
221 DeleteFileW(lpLogFileName
);
225 WCHAR wcBom
= 0xFEFF;
228 bRet
= WriteFile(hLogFile
,
235 if (GetLastError() != ERROR_IO_PENDING
)
237 LogToEventLog(L
"Failed to write to log file",
240 LOG_EVENTLOG
| LOG_ERROR
);
261 FlushFileBuffers(hLogFile
);
262 CloseHandle(hLogFile
);
267 CloseHandle(olWrite
.hEvent
);