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
,
131 bRet
= WriteFile(hLogFile
,
133 wcslen(lpFullMsg
) * sizeof(WCHAR
),
138 if (GetLastError() != ERROR_IO_PENDING
)
145 dwRet
= WaitForSingleObject(olWrite
.hEvent
, INFINITE
);
149 // event has been signaled
152 bRet
= GetOverlappedResult(hLogFile
,
160 // An error has occurred in WaitForSingleObject.
161 // This usually indicates a problem with the
162 // OVERLAPPED structure's event handle.
169 if (!bRet
|| bytesWritten
== 0)
171 LogToEventLog(L
"Failed to write to log file",
174 LOG_EVENTLOG
| LOG_ERROR
);
177 HeapFree(GetProcessHeap(),
183 ExitProcess(exitCode
);
189 LogEvent(LPCWSTR lpMsg
,
195 if (flags
& LOG_FILE
|| flags
& LOG_ERROR
)
196 LogToFile(lpMsg
, errNum
, exitCode
, flags
);
198 if (flags
& LOG_EVENTLOG
)
199 LogToEventLog(lpMsg
, errNum
, exitCode
, flags
);
208 ZeroMemory(&olWrite
, sizeof(OVERLAPPED
));
209 olWrite
.Offset
= 0xFFFFFFFF;
210 olWrite
.OffsetHigh
= 0xFFFFFFFF;
211 olWrite
.hEvent
= CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
214 DeleteFileW(lpLogFileName
);
218 WCHAR wcBom
= 0xFEFF;
221 bRet
= WriteFile(hLogFile
,
228 if (GetLastError() != ERROR_IO_PENDING
)
230 LogToEventLog(L
"Failed to write to log file",
233 LOG_EVENTLOG
| LOG_ERROR
);
254 FlushFileBuffers(hLogFile
);
255 CloseHandle(hLogFile
);
260 CloseHandle(olWrite
.hEvent
);