From 023a48b811d8e0a288e2bf999bb4f3e028f5d0c9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 21 Jan 2001 00:59:26 +0000 Subject: [PATCH] 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. --- src/backend/utils/error/elog.c | 26 ++++++++------ src/backend/utils/error/exc.c | 62 +++++++++++++++++++--------------- src/include/c.h | 6 +--- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 2bb6cd976c..6a842bd469 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 @@ -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 16faf93530..6f5420712e 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 4e5c7ff95f..73b5c5d579 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 #endif -#ifdef HAVE_SYS_NERR -extern int sys_nerr; -#endif - /* ---------------- * end of c.h * ---------------- -- 2.40.0