Deal with C++ incompatibility of sys_nerr declaration by taking it out

of c.h altogether, and putting it into the only places that use it
(elog.c and exc.c), instead.  Modify these routines to check for a
NULL or empty-string return from strerror, too, since some platforms
define strerror to return empty string for unknown errors (what a useless
definition that is ...).  Clean up some cruft in ExcPrint while at it.
This commit is contained in:
Tom Lane 2001-01-21 00:59:26 +00:00
parent 37fd198456
commit 023a48b811
3 changed files with 51 additions and 43 deletions

View File

@ -8,11 +8,10 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.77 2001/01/19 22:08:47 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.78 2001/01/21 00:59:26 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <time.h>
@ -44,6 +43,10 @@
extern int errno;
#ifdef HAVE_SYS_NERR
extern int sys_nerr;
#endif
extern CommandDest whereToSendOutput;
#ifdef ENABLE_SYSLOG
@ -120,10 +123,8 @@ elog(int lev, const char *fmt, ...)
char *msg_buf = msg_fixedbuf;
/* this buffer is only used for strange values of lev: */
char prefix_buf[32];
#ifdef HAVE_SYS_NERR
/* this buffer is only used if errno has a bogus value: */
char errorstr_buf[32];
#endif
const char *errorstr;
const char *prefix;
const char *cp;
@ -137,19 +138,24 @@ elog(int lev, const char *fmt, ...)
if (lev <= DEBUG && Debugfile < 0)
return; /* ignore debug msgs if noplace to send */
/* Save error str before calling any function that might change errno */
if (errno >= 0
#ifdef HAVE_SYS_NERR
/* save errno string for %m */
if (errno < sys_nerr && errno >= 0)
&& errno <= sys_nerr
#endif
)
errorstr = strerror(errno);
else
errorstr = NULL;
/*
* Some strerror()s return an empty string for out-of-range errno.
* This is ANSI C spec compliant, but not exactly useful.
*/
if (errorstr == NULL || *errorstr == '\0')
{
sprintf(errorstr_buf, "error %d", errno);
errorstr = errorstr_buf;
}
#else
/* assume strerror() will cope gracefully with bogus errno values */
errorstr = strerror(errno);
#endif
if (lev == ERROR || lev == FATAL)
{

View File

@ -8,11 +8,12 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.33 2001/01/09 18:40:14 petere Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/error/Attic/exc.c,v 1.34 2001/01/21 00:59:26 tgl Exp $
*
* NOTE
* XXX this code needs improvement--check for state violations and
* XXX reset after handling an exception.
* XXX Probably should be merged with elog.c.
*
*-------------------------------------------------------------------------
*/
@ -23,6 +24,13 @@
#include "storage/ipc.h"
#include "utils/exc.h"
extern int errno;
#ifdef HAVE_SYS_NERR
extern int sys_nerr;
#endif
static void ExcUnCaught(Exception *excP, ExcDetail detail, ExcData data,
ExcMessage message);
static void ExcPrint(Exception *excP, ExcDetail detail, ExcData data,
@ -40,8 +48,6 @@ ExcFrame *ExcCurFrameP = NULL;
static ExcProc *ExcUnCaughtP = NULL;
extern char *ProgramName;
/*
* Exported Functions
*/
@ -94,49 +100,49 @@ EnableExceptionHandling(bool on)
ExceptionHandlingEnabled = on;
}
extern int errno;
static void
ExcPrint(Exception *excP,
ExcDetail detail,
ExcData data,
ExcMessage message)
{
/* this buffer is only used if errno has a bogus value: */
char errorstr_buf[32];
const char *errorstr;
#ifdef lint
data = data;
#endif
fflush(stdout); /* In case stderr is buffered */
#if 0
if (ProgramName != NULL && *ProgramName != '\0')
fprintf(stderr, "%s: ", ProgramName);
/* Save error str before calling any function that might change errno */
if (errno >= 0
#ifdef HAVE_SYS_NERR
&& errno <= sys_nerr
#endif
)
errorstr = strerror(errno);
else
errorstr = NULL;
/*
* Some strerror()s return an empty string for out-of-range errno.
* This is ANSI C spec compliant, but not exactly useful.
*/
if (errorstr == NULL || *errorstr == '\0')
{
sprintf(errorstr_buf, "error %d", errno);
errorstr = errorstr_buf;
}
fflush(stdout); /* In case stderr is buffered */
if (message != NULL)
fprintf(stderr, "%s", message);
else if (excP->message != NULL)
fprintf(stderr, "%s", excP->message);
else
#ifdef lint
fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", excP);
#else
fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", (long) excP);
#endif
fprintf(stderr, "UNNAMED EXCEPTION %p", excP);
fprintf(stderr, " (%ld)", detail);
#ifdef HAVE_SYS_NERR
if (errno > 0 && errno < sys_nerr)
#else
if (errno > 0)
#endif
fprintf(stderr, " [%s]", strerror(errno));
else if (errno != 0)
fprintf(stderr, " [Error %d]", errno);
fprintf(stderr, "\n");
fprintf(stderr, " (%ld) [%s]\n", detail, errorstr);
fflush(stderr);
}

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: c.h,v 1.87 2001/01/09 18:40:15 petere Exp $
* $Id: c.h,v 1.88 2001/01/21 00:59:24 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -993,10 +993,6 @@ extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
#include <regex/utils.h>
#endif
#ifdef HAVE_SYS_NERR
extern int sys_nerr;
#endif
/* ----------------
* end of c.h
* ----------------