Fix problem with infinite recursion between write_syslogger_file and
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Mar 2005 01:54:44 +0000 (01:54 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 Mar 2005 01:54:44 +0000 (01:54 +0000)
elog if the former has trouble writing its file.  Code review for
Magnus' patch to redirect stderr to syslog on Windows (Bruce's version
seems right, but did some minor prettification).

Backpatch both changes to 8.0 branch.

src/backend/postmaster/syslogger.c
src/backend/utils/error/elog.c

index 87951a6961c2267c91de54a51aa0709982553914..d019127c790b17e9b9e586bf3b4331e13b8f1fc3 100644 (file)
@@ -18,7 +18,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.13 2005/03/10 07:14:03 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.14 2005/03/12 01:54:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -679,10 +679,9 @@ write_syslogger_file_binary(const char *buffer, int count)
    LeaveCriticalSection(&sysfileSection);
 #endif
 
+   /* can't use ereport here because of possible recursion */
    if (rc != count)
-       ereport(LOG,
-               (errcode_for_file_access(),
-                errmsg("could not write to log file: %m")));
+       write_stderr("could not write to log file: %s\n", strerror(errno));
 }
 
 #ifdef WIN32
index 80b222913ecff68cb89f0b4a7b35fcf95b4e1402..5dd564ef28167147dbb7fd454b38265f4bd3769a 100644 (file)
@@ -42,7 +42,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.157 2005/02/27 01:02:57 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.158 2005/03/12 01:54:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1557,7 +1557,6 @@ send_message_to_server_log(ErrorData *edata)
        appendStringInfoChar(&buf, '\n');
    }
 
-
 #ifdef HAVE_SYSLOG
    /* Write to syslog, if enabled */
    if (Log_destination & LOG_DESTINATION_SYSLOG)
@@ -1597,7 +1596,9 @@ send_message_to_server_log(ErrorData *edata)
        write_syslog(syslog_level, buf.data);
    }
 #endif   /* HAVE_SYSLOG */
+
 #ifdef WIN32
+   /* Write to eventlog, if enabled */
    if (Log_destination & LOG_DESTINATION_EVENTLOG)
    {
        int         eventlog_level;
@@ -1628,19 +1629,23 @@ send_message_to_server_log(ErrorData *edata)
        write_eventlog(eventlog_level, buf.data);
    }
 #endif   /* WIN32 */
+
    /* Write to stderr, if enabled */
    if ((Log_destination & LOG_DESTINATION_STDERR) || whereToSendOutput == Debug)
    {
 #ifdef WIN32
-       /* In a win32 service environment, there is no usable stderr. Capture
-          anything going there and write it to the eventlog instead.
-          If stderr redirection is active, leave it to stderr because the
-          logger will capture it to a file. */
+       /*
+        * In a win32 service environment, there is no usable stderr. Capture
+        * anything going there and write it to the eventlog instead.
+        *
+        * If stderr redirection is active, it's ok to write to stderr
+        * because that's really a pipe to the syslogger process.
+        */
        if ((!Redirect_stderr || am_syslogger) && pgwin32_is_service())
            write_eventlog(EVENTLOG_ERROR_TYPE, buf.data);
        else
 #endif
-       fprintf(stderr, "%s", buf.data);
+           fprintf(stderr, "%s", buf.data);
    }
 
    /* If in the syslogger process, try to write messages direct to file */