ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

log.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.