Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenlog.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS simple TCP/IP services 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: /base/services/tcpsvcs/log.c 00005 * PURPOSE: Logging functionality for the service 00006 * COPYRIGHT: Copyright 2008 Ged Murphy <gedmurphy@reactos.org> 00007 * 00008 */ 00009 00010 #include "tcpsvcs.h" 00011 00012 #define DEBUG 00013 00014 static LPWSTR lpEventSource = L"tcpsvcs"; 00015 static LPCWSTR lpLogFileName = L"C:\\tcpsvcs_log.log"; 00016 static HANDLE hLogFile = NULL; 00017 00018 static OVERLAPPED olWrite; 00019 00020 00021 // needs work 00022 static VOID 00023 LogToEventLog(LPCWSTR lpMsg, 00024 DWORD errNum, 00025 DWORD exitCode, 00026 UINT flags) 00027 { 00028 HANDLE hEventLog; 00029 00030 hEventLog = RegisterEventSourceW(NULL, lpEventSource); 00031 if (hEventLog) 00032 { 00033 ReportEventW(hEventLog, 00034 (flags & LOG_ERROR) ? EVENTLOG_ERROR_TYPE : EVENTLOG_SUCCESS, 00035 0, 00036 0, 00037 NULL, 00038 1, 00039 0, 00040 &lpMsg, 00041 NULL); 00042 00043 CloseEventLog(hEventLog); 00044 } 00045 } 00046 00047 static BOOL 00048 OpenLogFile() 00049 { 00050 hLogFile = CreateFileW(lpLogFileName, 00051 GENERIC_WRITE, 00052 FILE_SHARE_READ, 00053 NULL, 00054 OPEN_ALWAYS, 00055 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 00056 NULL); 00057 if (hLogFile == INVALID_HANDLE_VALUE) 00058 { 00059 hLogFile = NULL; 00060 return FALSE; 00061 } 00062 00063 return TRUE; 00064 } 00065 00066 static VOID 00067 LogToFile(LPCWSTR lpMsg, 00068 DWORD errNum, 00069 DWORD exitCode, 00070 UINT flags) 00071 { 00072 LPWSTR lpFullMsg = NULL; 00073 DWORD msgLen; 00074 00075 msgLen = wcslen(lpMsg) + 1; 00076 00077 if (flags & LOG_ERROR) 00078 { 00079 LPVOID lpSysMsg; 00080 DWORD eMsgLen; 00081 00082 eMsgLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 00083 NULL, 00084 errNum, 00085 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 00086 (LPTSTR)&lpSysMsg, 00087 0, 00088 NULL); 00089 00090 msgLen = msgLen + eMsgLen + 40; 00091 00092 lpFullMsg = HeapAlloc(GetProcessHeap(), 00093 0, 00094 msgLen * sizeof(TCHAR)); 00095 if (lpFullMsg) 00096 { 00097 _snwprintf(lpFullMsg, 00098 msgLen, 00099 L"%s : %s\tErrNum = %lu ExitCode = %lu\r\n", 00100 lpMsg, 00101 lpSysMsg, 00102 errNum, 00103 exitCode); 00104 } 00105 00106 LocalFree(lpSysMsg); 00107 00108 } 00109 else 00110 { 00111 msgLen += 2; 00112 00113 lpFullMsg = HeapAlloc(GetProcessHeap(), 00114 0, 00115 msgLen * sizeof(TCHAR)); 00116 if (lpFullMsg) 00117 { 00118 _snwprintf(lpFullMsg, 00119 msgLen, 00120 L"%s\r\n", 00121 lpMsg); 00122 } 00123 } 00124 00125 if (lpFullMsg) 00126 { 00127 DWORD bytesWritten; 00128 DWORD dwRet; 00129 BOOL bRet; 00130 00131 bRet = WriteFile(hLogFile, 00132 lpFullMsg, 00133 wcslen(lpFullMsg) * sizeof(WCHAR), 00134 &bytesWritten, 00135 &olWrite); 00136 if (!bRet) 00137 { 00138 if (GetLastError() != ERROR_IO_PENDING) 00139 { 00140 bRet = FALSE; 00141 } 00142 else 00143 { 00144 // Write is pending 00145 dwRet = WaitForSingleObject(olWrite.hEvent, INFINITE); 00146 00147 switch (dwRet) 00148 { 00149 // event has been signaled 00150 case WAIT_OBJECT_0: 00151 { 00152 bRet = GetOverlappedResult(hLogFile, 00153 &olWrite, 00154 &bytesWritten, 00155 FALSE); 00156 break; 00157 } 00158 00159 default: 00160 // An error has occurred in WaitForSingleObject. 00161 // This usually indicates a problem with the 00162 // OVERLAPPED structure's event handle. 00163 bRet = FALSE; 00164 break; 00165 } 00166 } 00167 } 00168 00169 if (!bRet || bytesWritten == 0) 00170 { 00171 LogToEventLog(L"Failed to write to log file", 00172 GetLastError(), 00173 0, 00174 LOG_EVENTLOG | LOG_ERROR); 00175 } 00176 00177 HeapFree(GetProcessHeap(), 00178 0, 00179 lpFullMsg); 00180 } 00181 00182 if (exitCode > 0) 00183 ExitProcess(exitCode); 00184 } 00185 00186 00187 00188 VOID 00189 LogEvent(LPCWSTR lpMsg, 00190 DWORD errNum, 00191 DWORD exitCode, 00192 UINT flags) 00193 { 00194 #ifdef DEBUG 00195 if (flags & LOG_FILE || flags & LOG_ERROR) 00196 LogToFile(lpMsg, errNum, exitCode, flags); 00197 #endif 00198 if (flags & LOG_EVENTLOG) 00199 LogToEventLog(lpMsg, errNum, exitCode, flags); 00200 } 00201 00202 BOOL 00203 InitLogging() 00204 { 00205 #ifdef DEBUG 00206 BOOL bRet = FALSE; 00207 00208 ZeroMemory(&olWrite, sizeof(OVERLAPPED)); 00209 olWrite.Offset = 0xFFFFFFFF; 00210 olWrite.OffsetHigh = 0xFFFFFFFF; 00211 olWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 00212 if (olWrite.hEvent) 00213 { 00214 DeleteFileW(lpLogFileName); 00215 00216 if (OpenLogFile()) 00217 { 00218 WCHAR wcBom = 0xFEFF; 00219 DWORD bytesWritten; 00220 00221 bRet = WriteFile(hLogFile, 00222 &wcBom, 00223 sizeof(WCHAR), 00224 &bytesWritten, 00225 &olWrite); 00226 if (!bRet) 00227 { 00228 if (GetLastError() != ERROR_IO_PENDING) 00229 { 00230 LogToEventLog(L"Failed to write to log file", 00231 GetLastError(), 00232 0, 00233 LOG_EVENTLOG | LOG_ERROR); 00234 } 00235 else 00236 { 00237 bRet = TRUE; 00238 } 00239 } 00240 } 00241 } 00242 00243 return bRet; 00244 #else 00245 return TRUE; 00246 #endif 00247 } 00248 00249 VOID 00250 UninitLogging() 00251 { 00252 if (hLogFile) 00253 { 00254 FlushFileBuffers(hLogFile); 00255 CloseHandle(hLogFile); 00256 } 00257 00258 if (olWrite.hEvent) 00259 { 00260 CloseHandle(olWrite.hEvent); 00261 } 00262 } Generated on Sun May 27 2012 04:17:54 for ReactOS by
1.7.6.1
|