diff --git a/src/include/port.h b/src/include/port.h index cfe8b9b6a628c1581ec5853fab904a3810f69617..01fd9cf61dc2a84b3d37929bfe9c015be2d84cd9 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -156,11 +156,12 @@ extern unsigned char pg_tolower(unsigned char ch); extern unsigned char pg_ascii_toupper(unsigned char ch); extern unsigned char pg_ascii_tolower(unsigned char ch); +#ifdef USE_REPL_SNPRINTF + /* - * Capture macro-compatible calls to printf() and friends, and redirect them - * to wrappers that throw errors in lieu of reporting failure in a return - * value. Versions of libintl >= 0.13 similarly redirect to versions that - * understand the %$ format, so disable libintl macros first. + * Versions of libintl >= 0.13 try to replace printf() and friends with + * macros to their own versions that understand the %$ format. We do the + * same, so disable their macros, if they exist. */ #ifdef vsnprintf #undef vsnprintf @@ -168,9 +169,6 @@ extern unsigned char pg_ascii_tolower(unsigned char ch); #ifdef snprintf #undef snprintf #endif -#ifdef vsprintf -#undef vsprintf -#endif #ifdef sprintf #undef sprintf #endif @@ -184,61 +182,11 @@ extern unsigned char pg_ascii_tolower(unsigned char ch); #undef printf #endif -extern int -vsnprintf_throw_on_fail(char *str, size_t count, const char *fmt, va_list args) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0))); -extern int -snprintf_throw_on_fail(char *str, size_t count, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); -extern int -vsprintf_throw_on_fail(char *str, const char *fmt, va_list args) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0))); -extern int -sprintf_throw_on_fail(char *str, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); -extern int -vfprintf_throw_on_fail(FILE *stream, const char *fmt, va_list args) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0))); -extern int -fprintf_throw_on_fail(FILE *stream, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); -extern int -printf_throw_on_fail(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); - -/* - * The GCC-specific code below prevents the __attribute__(... 'printf') - * above from being replaced, and this is required because gcc doesn't - * know anything about printf_throw_on_fail. - */ -#ifdef __GNUC__ -#define vsnprintf(...) vsnprintf_throw_on_fail(__VA_ARGS__) -#define snprintf(...) snprintf_throw_on_fail(__VA_ARGS__) -#define vsprintf(...) vsprintf_throw_on_fail(__VA_ARGS__) -#define sprintf(...) sprintf_throw_on_fail(__VA_ARGS__) -#define vfprintf(...) vfprintf_throw_on_fail(__VA_ARGS__) -#define fprintf(...) fprintf_throw_on_fail(__VA_ARGS__) -#define printf(...) printf_throw_on_fail(__VA_ARGS__) -#else -#define vsnprintf vsnprintf_throw_on_fail -#define snprintf snprintf_throw_on_fail -#define vsprintf vsprintf_throw_on_fail -#define sprintf sprintf_throw_on_fail -#define vfprintf vfprintf_throw_on_fail -#define fprintf fprintf_throw_on_fail -#define printf printf_throw_on_fail -#endif - -#ifdef USE_REPL_SNPRINTF - -/* Code outside syswrap.c should not call these. */ - extern int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args); extern int pg_snprintf(char *str, size_t count, const char *fmt,...) /* This extension allows gcc to check the format string */ __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); -extern int pg_vsprintf(char *str, const char *fmt, va_list args); extern int pg_sprintf(char *str, const char *fmt,...) /* This extension allows gcc to check the format string */ @@ -253,6 +201,26 @@ pg_printf(const char *fmt,...) /* This extension allows gcc to check the format string */ __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +/* + * The GCC-specific code below prevents the __attribute__(... 'printf') + * above from being replaced, and this is required because gcc doesn't + * know anything about pg_printf. + */ +#ifdef __GNUC__ +#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__) +#define snprintf(...) pg_snprintf(__VA_ARGS__) +#define sprintf(...) pg_sprintf(__VA_ARGS__) +#define vfprintf(...) pg_vfprintf(__VA_ARGS__) +#define fprintf(...) pg_fprintf(__VA_ARGS__) +#define printf(...) pg_printf(__VA_ARGS__) +#else +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf +#define sprintf pg_sprintf +#define vfprintf pg_vfprintf +#define fprintf pg_fprintf +#define printf pg_printf +#endif #endif /* USE_REPL_SNPRINTF */ #if defined(WIN32) diff --git a/src/interfaces/ecpg/compatlib/Makefile b/src/interfaces/ecpg/compatlib/Makefile index 97c67e9c17620f2567e0fd443ee3bd3a09d079ba..350ee3d7c84a3fc1343b606870daa411235947b1 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -45,7 +45,6 @@ submake-pgtypeslib: # Shared library stuff include $(top_srcdir)/src/Makefile.shlib -# XXX This library uses no symbols from snprintf.c. snprintf.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . diff --git a/src/interfaces/ecpg/ecpglib/.gitignore b/src/interfaces/ecpg/ecpglib/.gitignore index 9d994c160d407d6664857733fa6cdaeb1000433d..351f43775e88f429366baa689272aa6144d3bae6 100644 --- a/src/interfaces/ecpg/ecpglib/.gitignore +++ b/src/interfaces/ecpg/ecpglib/.gitignore @@ -5,5 +5,4 @@ /path.c /pgstrcasecmp.c /strlcpy.c -/syswrap.c /thread.c diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index 51f4f5900c80fd5959136b3ff6714c3e342e160b..27d1c635f75c7dc549915309490719da00c3c6ab 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -25,7 +25,7 @@ override CFLAGS += $(PTHREAD_CFLAGS) LIBS := $(filter-out -lpgport, $(LIBS)) OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \ - connect.o misc.o path.o pgstrcasecmp.o syswrap.o \ + connect.o misc.o path.o pgstrcasecmp.o \ $(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) # thread.c is needed only for non-WIN32 implementation of path.c @@ -57,7 +57,7 @@ include $(top_srcdir)/src/Makefile.shlib # necessarily use the same object files as the backend uses. Instead, # symlink the source files in here and build our own object file. -path.c pgstrcasecmp.c snprintf.c strlcpy.c syswrap.c thread.c win32setlocale.c isinf.c: % : $(top_srcdir)/src/port/% +path.c pgstrcasecmp.c snprintf.c strlcpy.c thread.c win32setlocale.c isinf.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . misc.o: misc.c $(top_builddir)/src/port/pg_config_paths.h @@ -74,6 +74,6 @@ uninstall: uninstall-lib clean distclean: clean-lib rm -f $(OBJS) - rm -f path.c pgstrcasecmp.c snprintf.c strlcpy.c syswrap.c thread.c win32setlocale.c + rm -f path.c pgstrcasecmp.c snprintf.c strlcpy.c thread.c win32setlocale.c maintainer-clean: distclean maintainer-clean-lib diff --git a/src/interfaces/ecpg/pgtypeslib/.gitignore b/src/interfaces/ecpg/pgtypeslib/.gitignore index 4f97502100e7d5c144128caf65d66fe9082908f4..4ee58ea957eed2d6b40c2b57ae2fca40f8509284 100644 --- a/src/interfaces/ecpg/pgtypeslib/.gitignore +++ b/src/interfaces/ecpg/pgtypeslib/.gitignore @@ -3,4 +3,3 @@ /exports.list /pgstrcasecmp.c -/syswrap.c diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile index 3363ee9525527b24cfc363e392a2cdffc6380442..4158b2b666f951e7e5e824114640fec69a0de68c 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -29,7 +29,7 @@ SHLIB_LINK += -lm SHLIB_EXPORTS = exports.txt OBJS= numeric.o datetime.o common.o dt_common.o timestamp.o interval.o \ - pgstrcasecmp.o syswrap.o \ + pgstrcasecmp.o \ $(filter rint.o snprintf.o, $(LIBOBJS)) all: all-lib @@ -42,7 +42,7 @@ include $(top_srcdir)/src/Makefile.shlib # necessarily use the same object files as the backend uses. Instead, # symlink the source files in here and build our own object file. -pgstrcasecmp.c rint.c snprintf.c syswrap.c: % : $(top_srcdir)/src/port/% +pgstrcasecmp.c rint.c snprintf.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . install: all installdirs install-lib @@ -52,6 +52,6 @@ installdirs: installdirs-lib uninstall: uninstall-lib clean distclean: clean-lib - rm -f $(OBJS) pgstrcasecmp.c rint.c snprintf.c syswrap.c + rm -f $(OBJS) pgstrcasecmp.c rint.c snprintf.c maintainer-clean: distclean maintainer-clean-lib diff --git a/src/interfaces/libpq/.gitignore b/src/interfaces/libpq/.gitignore index a514b908d0f8a4523f9b290d909f67912d1e7915..1784ce11af1ca99dbd442c3b410f9f3147195ae2 100644 --- a/src/interfaces/libpq/.gitignore +++ b/src/interfaces/libpq/.gitignore @@ -11,7 +11,6 @@ /snprintf.c /strerror.c /strlcpy.c -/syswrap.c /thread.c /win32error.c /win32setlocale.c diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 2df4bc4f6343a49418877e1f21d048cbb57adb8c..0d2854946c93195262bdd12e0b5d95e818a60c10 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -35,7 +35,7 @@ OBJS= fe-auth.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o \ fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o \ libpq-events.o # libpgport C files we always use -OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o syswrap.o thread.o +OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o thread.o # libpgport C files that are needed if identified by configure OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o snprintf.o strerror.o strlcpy.o win32error.o win32setlocale.o, $(LIBOBJS)) # backend/libpq @@ -88,7 +88,7 @@ backend_src = $(top_srcdir)/src/backend # For some libpgport modules, this only happens if configure decides # the module is needed (see filter hack in OBJS, above). -chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c pgsleep.c pgstrcasecmp.c snprintf.c strerror.c strlcpy.c syswrap.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/% +chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c inet_net_ntop.c noblock.c open.c pgsleep.c pgstrcasecmp.c snprintf.c strerror.c strlcpy.c thread.c win32error.c win32setlocale.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . ip.c md5.c: % : $(backend_src)/libpq/% @@ -149,7 +149,7 @@ clean distclean: clean-lib # Might be left over from a Win32 client-only build rm -f pg_config_paths.h rm -f inet_net_ntop.c noblock.c pgstrcasecmp.c thread.c - rm -f chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c open.c snprintf.c strerror.c strlcpy.c syswrap.c win32error.c win32setlocale.c + rm -f chklocale.c crypt.c getaddrinfo.c getpeereid.c inet_aton.c open.c snprintf.c strerror.c strlcpy.c win32error.c win32setlocale.c rm -f pgsleep.c rm -f md5.c ip.c rm -f encnames.c wchar.c diff --git a/src/interfaces/libpq/bcc32.mak b/src/interfaces/libpq/bcc32.mak index 25c04f36557e678dfe4e8e6d9033f01e22b561ae..fbef737ecda72e31e793ee6098adecbc18656299 100644 --- a/src/interfaces/libpq/bcc32.mak +++ b/src/interfaces/libpq/bcc32.mak @@ -106,7 +106,6 @@ CLEAN : -@erase "$(INTDIR)\dirmod.obj" -@erase "$(INTDIR)\pgsleep.obj" -@erase "$(INTDIR)\open.obj" - -@erase "$(INTDIR)\syswrap.obj" -@erase "$(INTDIR)\win32error.obj" -@erase "$(OUTDIR)\$(OUTFILENAME).lib" -@erase "$(OUTDIR)\$(OUTFILENAME)dll.lib" @@ -150,7 +149,6 @@ LIB32_OBJS= \ "$(INTDIR)\dirmod.obj" \ "$(INTDIR)\pgsleep.obj" \ "$(INTDIR)\open.obj" \ - "$(INTDIR)\syswrap.obj" \ "$(INTDIR)\win32error.obj" \ "$(INTDIR)\pthread-win32.obj" @@ -289,11 +287,6 @@ LINK32_FLAGS = -Gn -L$(BCB)\lib;$(INTDIR); -x -Tpd -v $(CPP_PROJ) /I"." ..\..\port\open.c << -"$(INTDIR)\syswrap.obj" : ..\..\port\syswrap.c - $(CPP) @<< - $(CPP_PROJ) ..\..\port\syswrap.c -<< - "$(INTDIR)\win32error.obj" : ..\..\port\win32error.c $(CPP) @<< $(CPP_PROJ) /I"." ..\..\port\win32error.c diff --git a/src/interfaces/libpq/win32.mak b/src/interfaces/libpq/win32.mak index 9740f394ea69cbd72443fd9b22b94a2c4913ad0d..70a741a5f410e2d6b13b588401b358d8538322e7 100644 --- a/src/interfaces/libpq/win32.mak +++ b/src/interfaces/libpq/win32.mak @@ -113,7 +113,6 @@ CLEAN : -@erase "$(INTDIR)\dirmod.obj" -@erase "$(INTDIR)\pgsleep.obj" -@erase "$(INTDIR)\open.obj" - -@erase "$(INTDIR)\syswrap.obj" -@erase "$(INTDIR)\win32error.obj" -@erase "$(INTDIR)\win32setlocale.obj" -@erase "$(OUTDIR)\$(OUTFILENAME).lib" @@ -160,7 +159,6 @@ LIB32_OBJS= \ "$(INTDIR)\dirmod.obj" \ "$(INTDIR)\pgsleep.obj" \ "$(INTDIR)\open.obj" \ - "$(INTDIR)\syswrap.obj" \ "$(INTDIR)\win32error.obj" \ "$(INTDIR)\win32setlocale.obj" \ "$(INTDIR)\pthread-win32.obj" @@ -329,11 +327,6 @@ LINK32_OBJS= \ $(CPP_PROJ) /I"." ..\..\port\open.c << -"$(INTDIR)\syswrap.obj" : ..\..\port\syswrap.c - $(CPP) @<< - $(CPP_PROJ) ..\..\port\syswrap.c -<< - "$(INTDIR)\win32error.obj" : ..\..\port\win32error.c $(CPP) @<< $(CPP_PROJ) /I"." ..\..\port\win32error.c diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index 2e80ca71c5d2feeaaf0930cc6762253db3258488..85e68263056327f89e0976f91124d068086157dc 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -39,8 +39,10 @@ * So we undefine them here and redefine them after it's done its dirty deed. */ +#ifdef USE_REPL_SNPRINTF #undef snprintf #undef vsnprintf +#endif /* required for perl API */ @@ -49,6 +51,7 @@ #include "XSUB.h" /* put back our snprintf and vsnprintf */ +#ifdef USE_REPL_SNPRINTF #ifdef snprintf #undef snprintf #endif @@ -56,12 +59,13 @@ #undef vsnprintf #endif #ifdef __GNUC__ -#define vsnprintf(...) vsnprintf_throw_on_fail(__VA_ARGS__) -#define snprintf(...) snprintf_throw_on_fail(__VA_ARGS__) +#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__) +#define snprintf(...) pg_snprintf(__VA_ARGS__) #else -#define vsnprintf vsnprintf_throw_on_fail -#define snprintf snprintf_throw_on_fail +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf #endif /* __GNUC__ */ +#endif /* USE_REPL_SNPRINTF */ /* perl version and platform portability */ #define NEED_eval_pv diff --git a/src/pl/plpython/plpython.h b/src/pl/plpython/plpython.h index c5df8f8baa2b453fdc94c3f157229664a52d0413..e788cd9a897f11bd0185250ff2ca51ea583b8c1a 100644 --- a/src/pl/plpython/plpython.h +++ b/src/pl/plpython/plpython.h @@ -35,8 +35,10 @@ * So we undefine them here and redefine them after it's done its dirty deed. */ +#ifdef USE_REPL_SNPRINTF #undef snprintf #undef vsnprintf +#endif #if defined(_MSC_VER) && defined(_DEBUG) /* Python uses #pragma to bring in a non-default libpython on VC++ if @@ -122,6 +124,7 @@ typedef int Py_ssize_t; #include <eval.h> /* put back our snprintf and vsnprintf */ +#ifdef USE_REPL_SNPRINTF #ifdef snprintf #undef snprintf #endif @@ -129,12 +132,13 @@ typedef int Py_ssize_t; #undef vsnprintf #endif #ifdef __GNUC__ -#define vsnprintf(...) vsnprintf_throw_on_fail(__VA_ARGS__) -#define snprintf(...) snprintf_throw_on_fail(__VA_ARGS__) +#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__) +#define snprintf(...) pg_snprintf(__VA_ARGS__) #else -#define vsnprintf vsnprintf_throw_on_fail -#define snprintf snprintf_throw_on_fail +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf #endif /* __GNUC__ */ +#endif /* USE_REPL_SNPRINTF */ /* * Used throughout, and also by the Python 2/3 porting layer, so it's easier to diff --git a/src/port/Makefile b/src/port/Makefile index 9703cf98dc554ac8c02da88a26ead7519ce57ad3..67677ae8937c5ccd28633b402c6ec7d8435c2a6e 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -32,7 +32,7 @@ LIBS += $(PTHREAD_LIBS) OBJS = $(LIBOBJS) chklocale.o dirmod.o erand48.o exec.o fls.o inet_net_ntop.o \ noblock.o path.o pgcheckdir.o pg_crc.o pgmkdirp.o pgsleep.o \ - pgstrcasecmp.o qsort.o qsort_arg.o sprompt.o syswrap.o thread.o + pgstrcasecmp.o qsort.o qsort_arg.o sprompt.o thread.o # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND OBJS_SRV = $(OBJS:%.o=%_srv.o) diff --git a/src/port/snprintf.c b/src/port/snprintf.c index 9dfb57599eeaf1827b570429bd72b9d844c90eaa..ed48bcf44a85b8cb7c5a1faf1c4dd99b068592cf 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -99,7 +99,6 @@ /* Prevent recursion */ #undef vsnprintf #undef snprintf -#undef vsprintf #undef sprintf #undef vfprintf #undef fprintf @@ -176,7 +175,7 @@ pg_snprintf(char *str, size_t count, const char *fmt,...) return len; } -int +static int pg_vsprintf(char *str, const char *fmt, va_list args) { PrintfTarget target; diff --git a/src/port/syswrap.c b/src/port/syswrap.c deleted file mode 100644 index 8415a336303699eed799bf34ec44c18f0633a9be..0000000000000000000000000000000000000000 --- a/src/port/syswrap.c +++ /dev/null @@ -1,155 +0,0 @@ -/*------------------------------------------------------------------------- - * - * syswrap.c - * error-throwing wrappers around POSIX functions that rarely fail - * - * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group - * - * - * IDENTIFICATION - * src/port/syswrap.c - * - *------------------------------------------------------------------------- - */ - -#ifndef FRONTEND -#include "postgres.h" -#else -#include "postgres_fe.h" -#endif - -/* Prevent recursion */ -#undef vsnprintf -#undef snprintf -#undef vsprintf -#undef sprintf -#undef vfprintf -#undef fprintf -#undef printf - -/* When the libc primitives are lacking, use our own. */ -#ifdef USE_REPL_SNPRINTF -#ifdef __GNUC__ -#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__) -#define snprintf(...) pg_snprintf(__VA_ARGS__) -#define vsprintf(...) pg_vsprintf(__VA_ARGS__) -#define sprintf(...) pg_sprintf(__VA_ARGS__) -#define vfprintf(...) pg_vfprintf(__VA_ARGS__) -#define fprintf(...) pg_fprintf(__VA_ARGS__) -#define printf(...) pg_printf(__VA_ARGS__) -#else -#define vsnprintf pg_vsnprintf -#define snprintf pg_snprintf -#define vsprintf pg_vsprintf -#define sprintf pg_sprintf -#define vfprintf pg_vfprintf -#define fprintf pg_fprintf -#define printf pg_printf -#endif -#endif /* USE_REPL_SNPRINTF */ - -/* - * We abort() in the frontend, rather than exit(), because libpq in particular - * has no business calling exit(). These failures had better be rare. - */ -#ifdef FRONTEND -#define LIB_ERR(func) \ -do { \ - int discard = fprintf(stderr, "%s failed: %s\n", func, strerror(errno)); \ - (void) discard; \ - abort(); \ -} while (0) -#else -#define LIB_ERR(func) elog(ERROR, "%s failed: %m", func) -#endif - -int -vsnprintf_throw_on_fail(char *str, size_t count, const char *fmt, va_list args) -{ - int save_errno; - int ret; - - /* - * On HP-UX B.11.31, a call that truncates output returns -1 without - * setting errno. (SUSv2 allowed this until the approval of Base Working - * Group Resolution BWG98-006.) We could avoid the save and restore of - * errno on most platforms. - */ - save_errno = errno; - errno = 0; - ret = vsnprintf(str, count, fmt, args); - if (ret < 0 && errno != 0) - LIB_ERR("vsnprintf"); - errno = save_errno; - return ret; -} - -int -snprintf_throw_on_fail(char *str, size_t count, const char *fmt,...) -{ - int ret; - va_list args; - - va_start(args, fmt); - ret = vsnprintf_throw_on_fail(str, count, fmt, args); - va_end(args); - return ret; -} - -int -vsprintf_throw_on_fail(char *str, const char *fmt, va_list args) -{ - int ret; - - ret = vsprintf(str, fmt, args); - if (ret < 0) - LIB_ERR("vsprintf"); - return ret; -} - -int -sprintf_throw_on_fail(char *str, const char *fmt,...) -{ - int ret; - va_list args; - - va_start(args, fmt); - ret = vsprintf_throw_on_fail(str, fmt, args); - va_end(args); - return ret; -} - -int -vfprintf_throw_on_fail(FILE *stream, const char *fmt, va_list args) -{ - int ret; - - ret = vfprintf(stream, fmt, args); - if (ret < 0) - LIB_ERR("vfprintf"); - return ret; -} - -int -fprintf_throw_on_fail(FILE *stream, const char *fmt,...) -{ - int ret; - va_list args; - - va_start(args, fmt); - ret = vfprintf_throw_on_fail(stream, fmt, args); - va_end(args); - return ret; -} - -int -printf_throw_on_fail(const char *fmt,...) -{ - int ret; - va_list args; - - va_start(args, fmt); - ret = vfprintf_throw_on_fail(stdout, fmt, args); - va_end(args); - return ret; -} diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index bdfc90164759e78765bb08d117e7204c785a6cbb..2fafec240ccc218689938da8c23d47ab2cfdf7ea 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -60,7 +60,7 @@ sub mkvcbuild srandom.c getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c pgcheckdir.c pg_crc.c pgmkdirp.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c - sprompt.c syswrap.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c + sprompt.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c win32error.c win32setlocale.c mkdtemp.c); $libpgport = $solution->AddProject('libpgport', 'lib', 'misc');