pcs         97/12/07 07:48:01

  Modified:    src/main http_log.c http_log.h
  Log:
  The current aplog_error() function cannot report on errors returned by
  Win32 functions. These functions do not bother setting errno - instead,
  you have to make a call to GetLastError() to get the error code, then call
  FormatMessage() to get the corresponding string. I already added code to
  do this in os/win32/service.c, but this was specific to reporting errors
  to standard error during apache -i or -u calls.
  
  The patch below updates aplog_error() to enable generic logging of
  Win32 errors to the same place as other errors. It adds a new flag,
  APLOG_WIN32ERROR which if given in the _second_ argument to aplog_error()
  causes the Win32 error code and error string to be logged. Here is an
  example call (this is from worker_main()):
  
          if (SetEvent(ev[i]) == 0)
              aplog_error(APLOG_MARK,APLOG_WIN32ERROR, server_conf,
                  "SetEvent for child process in slot #%d", i);
  
  Reviewed by:  Ben Laurie, Martin Kraemer
  
  Revision  Changes    Path
  1.44      +43 -0     apachen/src/main/http_log.c
  
  Index: http_log.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_log.c,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- http_log.c        1997/11/06 21:54:08     1.43
  +++ http_log.c        1997/12/07 15:47:59     1.44
  @@ -319,6 +319,49 @@
        len += ap_snprintf(errstr + len, sizeof(errstr) - len,
                "(%d)%s: ", save_errno, strerror(save_errno));
       }
  +#ifdef WIN32
  +    if (level & APLOG_WIN32ERROR) {
  +     int nChars;
  +     int nErrorCode;
  +
  +     nErrorCode = GetLastError();
  +     len += ap_snprintf(errstr + len, sizeof(errstr) - len,
  +         "(%d)", nErrorCode);
  +
  +     nChars = FormatMessage( 
  +         FORMAT_MESSAGE_FROM_SYSTEM,
  +         NULL,
  +         nErrorCode,
  +         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  +         (LPTSTR) errstr + len,
  +         sizeof(errstr) - len,
  +         NULL 
  +     );
  +     len += nChars;
  +     if (nChars == 0) {
  +         /* Um, error occurred, but we can't recurse to log it again
  +          * (and it would probably only fail anyway), so lets just
  +          * log the numeric value.
  +          */
  +         nErrorCode = GetLastError();
  +         len += ap_snprintf(errstr + len, sizeof(errstr) - len,
  +             "(FormatMessage failed with code %d): ", nErrorCode);
  +     }
  +     else {
  +         /* FormatMessage put the message in the buffer, but it may
  +          * have appended a newline (\r\n). So remove it and use
  +          * ": " instead like the Unix errors. The error may also
  +          * end with a . before the return - if so, trash it.
  +          */
  +         if (len > 1 && errstr[len-2] == '\r' && errstr[len-1] == '\n') {
  +             if (len > 2 && errstr[len-3] == '.')
  +                 len--;
  +             errstr[len-2] = ':';
  +             errstr[len-1] = ' ';
  +         }
  +     }
  +    }
  +#endif
   
       va_start(args, fmt);
       len += ap_vsnprintf(errstr + len, sizeof(errstr) - len, fmt, args);
  
  
  
  1.20      +5 -0      apachen/src/main/http_log.h
  
  Index: http_log.h
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_log.h,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- http_log.h        1997/10/22 20:29:39     1.19
  +++ http_log.h        1997/12/07 15:48:00     1.20
  @@ -81,6 +81,11 @@
   #endif
   
   #define APLOG_NOERRNO                (APLOG_LEVELMASK + 1)
  +#ifdef WIN32
  +/* Set to indicate that error msg should come from Win32's GetLastError(),
  + * not errno. */
  +#define APLOG_WIN32ERROR     ((APLOG_LEVELMASK+1) * 2)
  +#endif
   
   #ifndef DEFAULT_LOGLEVEL
   #define DEFAULT_LOGLEVEL     APLOG_ERR
  
  
  

Reply via email to