summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2001-01-21 00:59:26 +0000
committerTom Lane2001-01-21 00:59:26 +0000
commit023a48b811d8e0a288e2bf999bb4f3e028f5d0c9 (patch)
treea283db4d46bbd64cdaf91426b87bc4f816e5e9d0
parent37fd19845679f7648e09c61bbaf7199ca713f79b (diff)
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.
-rw-r--r--src/backend/utils/error/elog.c26
-rw-r--r--src/backend/utils/error/exc.c62
-rw-r--r--src/include/c.h6
3 files changed, 51 insertions, 43 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 2bb6cd976cf..6a842bd469f 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -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)
{
diff --git a/src/backend/utils/error/exc.c b/src/backend/utils/error/exc.c
index 16faf93530b..6f5420712e4 100644
--- a/src/backend/utils/error/exc.c
+++ b/src/backend/utils/error/exc.c
@@ -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, " (%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, "UNNAMED EXCEPTION %p", excP);
- fprintf(stderr, "\n");
+ fprintf(stderr, " (%ld) [%s]\n", detail, errorstr);
fflush(stderr);
}
diff --git a/src/include/c.h b/src/include/c.h
index 4e5c7ff95f1..73b5c5d579f 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -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
* ----------------