From 3bc6bdf322ea625c23b15caa97daba6f43cfcc7f Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 11 Mar 2005 17:20:35 +0000
Subject: [PATCH] Define snprintf() to call pg_snprintf() so our own
 snprintf-like implementation doesn't export out via libpq and get used by a
 user application.

---
 configure                  |  5 +++++
 configure.in               |  3 ++-
 src/bin/pg_ctl/pg_ctl.c    | 10 +++++++---
 src/bin/psql/command.c     | 10 +++++-----
 src/include/pg_config.h.in |  3 +++
 src/include/port.h         | 22 +++++++++++++++++++++-
 src/port/snprintf.c        | 22 +++++++++-------------
 7 files changed, 52 insertions(+), 23 deletions(-)

diff --git a/configure b/configure
index a53bc247060..22a2ca9a62e 100755
--- a/configure
+++ b/configure
@@ -14973,6 +14973,11 @@ _ACEOF
 
 # Now we have checked all the reasons to replace snprintf
 if test $pgac_need_repl_snprintf = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SNPRINTF 1
+_ACEOF
+
   LIBOBJS="$LIBOBJS snprintf.$ac_objext"
 fi
 
diff --git a/configure.in b/configure.in
index 6e36e045db1..ffc118ea8b7 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl $PostgreSQL: pgsql/configure.in,v 1.405 2005/03/02 15:42:35 momjian Exp $
+dnl $PostgreSQL: pgsql/configure.in,v 1.406 2005/03/11 17:20:33 momjian Exp $
 dnl
 dnl Developers, please strive to achieve this order:
 dnl
@@ -1143,6 +1143,7 @@ AC_DEFINE_UNQUOTED(UINT64_FORMAT, $UINT64_FORMAT,
 
 # Now we have checked all the reasons to replace snprintf
 if test $pgac_need_repl_snprintf = yes; then
+  AC_DEFINE(USE_SNPRINTF, 1, [Use replacement snprintf() functions.])
   AC_LIBOBJ(snprintf)
 fi
 
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 8564bd76e91..a73ddffd323 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.54 2005/02/22 04:39:22 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.55 2005/03/11 17:20:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -337,19 +337,23 @@ start_postmaster(void)
 	if (log_file != NULL)
 #ifndef WIN32	/* Cygwin doesn't have START */
 		snprintf(cmd, MAXPGPATH, "%s\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1 &%s",
+				 SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
+				 DEVNULL, log_file, SYSTEMQUOTE);
 #else
 		snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s%s < \"%s\" >> \"%s\" 2>&1%s",
-#endif
 				 SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
 				 DEVNULL, log_file, SYSTEMQUOTE);
+#endif
 	else
 #ifndef WIN32	/* Cygwin doesn't have START */
 		snprintf(cmd, MAXPGPATH, "%s\"%s\" %s%s < \"%s\" 2>&1 &%s",
+				 SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
+				 DEVNULL, SYSTEMQUOTE);
 #else
 		snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s%s < \"%s\" 2>&1%s",
-#endif
 				 SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts,
 				 DEVNULL, SYSTEMQUOTE);
+#endif
 
 	return system(cmd);
 }
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index fb918bdc058..01ff7fb3957 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.140 2005/02/22 04:40:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.141 2005/03/11 17:20:34 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -1175,13 +1175,13 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf)
 		 *	supplied path unless we use only backslashes, so we do that.
 		 */
 #endif
-		snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d", tmpdir,
 #ifndef WIN32
-				"/",
+		snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d", tmpdir,
+				"/", (int)getpid());
 #else
-				"",	/* trailing separator already present */
+		snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d", tmpdir,
+				"" /* trailing separator already present */, (int)getpid());
 #endif
-				(int)getpid());
 
 		fname = (const char *) fnametmp;
 
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 279b6b539c8..08cbc4bb2e3 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -648,6 +648,9 @@
 /* Define to 1 to build with Rendezvous support. (--with-rendezvous) */
 #undef USE_RENDEZVOUS
 
+/* Use replacement snprintf() functions. */
+#undef USE_SNPRINTF
+
 /* Define to build with (Open)SSL support. (--with-openssl) */
 #undef USE_SSL
 
diff --git a/src/include/port.h b/src/include/port.h
index cd21976041a..5a2953ce600 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/port.h,v 1.70 2005/02/27 00:53:29 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.71 2005/03/11 17:20:34 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -107,6 +107,26 @@ extern int	pg_strncasecmp(const char *s1, const char *s2, size_t n);
 extern unsigned char pg_toupper(unsigned char ch);
 extern unsigned char pg_tolower(unsigned char ch);
 
+#ifdef USE_SNPRINTF
+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(printf, 3, 4)));
+extern int pg_printf(const char *fmt,...)
+/* This extension allows gcc to check the format string */
+__attribute__((format(printf, 1, 2)));
+
+#ifdef __GNUC__
+#define vsnprintf(...)	pg_vsnprintf(__VA_ARGS__)
+#define snprintf(...)	pg_snprintf(__VA_ARGS__)
+#define printf(...)		pg_printf(__VA_ARGS__)
+#else
+#define vsnprintf		pg_vsnprintf
+#define snprintf		pg_snprintf
+#define printf			pg_printf
+#endif
+#endif
+
 /* Portable prompt handling */
 extern char *simple_prompt(const char *prompt, int maxlen, bool echo);
 
diff --git a/src/port/snprintf.c b/src/port/snprintf.c
index 2f75651c3c9..1d85c8d830e 100644
--- a/src/port/snprintf.c
+++ b/src/port/snprintf.c
@@ -65,19 +65,15 @@
  * causing nasty effects.
  **************************************************************/
 
-/*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.16 2005/03/02 23:56:53 momjian Exp $";*/
+/*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.17 2005/03/11 17:20:35 momjian Exp $";*/
 
-int			snprintf(char *str, size_t count, const char *fmt,...);
-int			vsnprintf(char *str, size_t count, const char *fmt, va_list args);
-int			printf(const char *format, ...);
+int			pg_snprintf(char *str, size_t count, const char *fmt,...);
+int			pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
+int			pg_printf(const char *format, ...);
 static void dopr(char *buffer, const char *format, va_list args, char *end);
 
-/*
- *	If vsnprintf() is not before snprintf() in this file, snprintf()
- *	will call the system vsnprintf() on MinGW.
- */
 int
-vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
 {
 	char *end;
 	str[0] = '\0';
@@ -89,19 +85,19 @@ vsnprintf(char *str, size_t count, const char *fmt, va_list args)
 }
 
 int
-snprintf(char *str, size_t count, const char *fmt,...)
+pg_snprintf(char *str, size_t count, const char *fmt,...)
 {
 	int			len;
 	va_list		args;
 
 	va_start(args, fmt);
-	len = vsnprintf(str, count, fmt, args);
+	len = pg_vsnprintf(str, count, fmt, args);
 	va_end(args);
 	return len;
 }
 
 int
-printf(const char *fmt,...)
+pg_printf(const char *fmt,...)
 {
 	int			len;
 	va_list			args;
@@ -109,7 +105,7 @@ printf(const char *fmt,...)
 	char*			p;
 
 	va_start(args, fmt);
-	len = vsnprintf((char*)buffer, (size_t)4096, fmt, args);
+	len = pg_vsnprintf((char*)buffer, (size_t)4096, fmt, args);
 	va_end(args);
 	p = (char*)buffer;
 	for(;*p;p++)
-- 
GitLab