From 60ff2fdd9970ba29f5267317a5e7354d2658c1e5 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 15 Feb 2014 14:31:30 -0500
Subject: [PATCH] Centralize getopt-related declarations in a new header file
 pg_getopt.h.

We used to have externs for getopt() and its API variables scattered
all over the place.  Now that we find we're going to need to tweak the
variable declarations for Cygwin, it seems like a good idea to have
just one place to tweak.

In this commit, the variables are declared "#ifndef HAVE_GETOPT_H".
That may or may not work everywhere, but we'll soon find out.

Andres Freund
---
 contrib/oid2name/oid2name.c                   |  8 +---
 contrib/pg_archivecleanup/pg_archivecleanup.c | 13 +-----
 contrib/pg_standby/pg_standby.c               | 13 +-----
 contrib/pg_upgrade/option.c                   |  2 +-
 contrib/pgbench/pgbench.c                     |  8 ----
 contrib/vacuumlo/vacuumlo.c                   |  5 +--
 src/backend/bootstrap/bootstrap.c             |  7 +---
 src/backend/postmaster/postmaster.c           | 13 +-----
 src/backend/tcop/postgres.c                   | 12 +-----
 src/bin/pg_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump/pg_restore.c                  |  8 +---
 src/bin/pg_resetxlog/pg_resetxlog.c           |  7 +---
 src/bin/psql/startup.c                        |  2 -
 src/include/getopt_long.h                     | 10 +----
 src/include/pg_getopt.h                       | 42 +++++++++++++++++++
 src/include/port.h                            |  4 --
 src/port/getopt.c                             |  9 +---
 src/test/isolation/isolationtester.c          | 14 +------
 src/timezone/zic.c                            |  6 +--
 19 files changed, 57 insertions(+), 130 deletions(-)
 create mode 100644 src/include/pg_getopt.h

diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c
index 67d79346b22..d8565941f90 100644
--- a/contrib/oid2name/oid2name.c
+++ b/contrib/oid2name/oid2name.c
@@ -9,14 +9,8 @@
  */
 #include "postgres_fe.h"
 
-#include <unistd.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
-extern char *optarg;
-
 #include "libpq-fe.h"
+#include "pg_getopt.h"
 
 /* an extensible array to keep track of elements to show */
 typedef struct
diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c
index f12331a62ec..7b5484bb6ac 100644
--- a/contrib/pg_archivecleanup/pg_archivecleanup.c
+++ b/contrib/pg_archivecleanup/pg_archivecleanup.c
@@ -17,20 +17,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#else							/* WIN32 */
-extern int	getopt(int argc, char *const argv[], const char *optstring);
-#endif   /* ! WIN32 */
 
-extern char *optarg;
-extern int	optind;
+#include "pg_getopt.h"
 
 const char *progname;
 
diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index 059c8205279..144edd8a072 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -28,20 +28,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
-
-#ifdef WIN32
-int			getopt(int argc, char *const argv[], const char *optstring);
-#else
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#endif   /* ! WIN32 */
 
-extern char *optarg;
-extern int	optind;
+#include "pg_getopt.h"
 
 const char *progname;
 
diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
index 4c08e94ffd0..cd9f66dd117 100644
--- a/contrib/pg_upgrade/option.c
+++ b/contrib/pg_upgrade/option.c
@@ -10,10 +10,10 @@
 #include "postgres_fe.h"
 
 #include "miscadmin.h"
+#include "getopt_long.h"
 
 #include "pg_upgrade.h"
 
-#include <getopt_long.h>
 #include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
index 16b7ab5ddc7..a836acfae98 100644
--- a/contrib/pgbench/pgbench.c
+++ b/contrib/pgbench/pgbench.c
@@ -40,12 +40,7 @@
 #include <ctype.h>
 #include <math.h>
 #include <signal.h>
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-#endif   /* ! WIN32 */
-
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -89,9 +84,6 @@ static int	pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start
 static int	pthread_join(pthread_t th, void **thread_return);
 #endif
 
-extern char *optarg;
-extern int	optind;
-
 
 /********************************************************************
  * some configurable parameters */
diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 3981dd6260f..c2e5bad438b 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -22,15 +22,12 @@
 #endif
 
 #include "libpq-fe.h"
+#include "pg_getopt.h"
 
 #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
 #define BUFSIZE			1024
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
 enum trivalue
 {
 	TRI_DEFAULT,
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index ef6311b075b..c36e71d8066 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -17,9 +17,6 @@
 #include <time.h>
 #include <unistd.h>
 #include <signal.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #include "access/htup_details.h"
 #include "bootstrap/bootstrap.h"
@@ -29,6 +26,7 @@
 #include "libpq/pqsignal.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
+#include "pg_getopt.h"
 #include "postmaster/bgwriter.h"
 #include "postmaster/startup.h"
 #include "postmaster/walwriter.h"
@@ -46,9 +44,6 @@
 #include "utils/relmapper.h"
 #include "utils/tqual.h"
 
-extern int	optind;
-extern char *optarg;
-
 uint32		bootstrap_data_checksum_version = 0;		/* No checksum */
 
 
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 7adc410b43a..6bb2a474857 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -83,10 +83,6 @@
 #include <sys/select.h>
 #endif
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
 #ifdef USE_BONJOUR
 #include <dns_sd.h>
 #endif
@@ -101,6 +97,7 @@
 #include "libpq/libpq.h"
 #include "libpq/pqsignal.h"
 #include "miscadmin.h"
+#include "pg_getopt.h"
 #include "pgstat.h"
 #include "postmaster/autovacuum.h"
 #include "postmaster/bgworker_internals.h"
@@ -352,14 +349,6 @@ static volatile bool HaveCrashedWorker = false;
 static unsigned int random_seed = 0;
 static struct timeval random_start_time;
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
-#ifdef HAVE_INT_OPTRESET
-extern int	optreset;			/* might not be declared by system headers */
-#endif
-
 #ifdef USE_BONJOUR
 static DNSServiceRef bonjour_sdref = NULL;
 #endif
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b7612b9b5f7..a230d7eda69 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -32,9 +32,6 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #endif
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #ifndef HAVE_GETRUSAGE
 #include "rusagestub.h"
@@ -55,6 +52,7 @@
 #include "pg_trace.h"
 #include "parser/analyze.h"
 #include "parser/parser.h"
+#include "pg_getopt.h"
 #include "postmaster/autovacuum.h"
 #include "postmaster/postmaster.h"
 #include "replication/walsender.h"
@@ -77,14 +75,6 @@
 #include "mb/pg_wchar.h"
 
 
-extern char *optarg;
-extern int	optind;
-
-#ifdef HAVE_INT_OPTRESET
-extern int	optreset;			/* might not be declared by system headers */
-#endif
-
-
 /* ----------------
  *		global variables
  * ----------------
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 458a118dc02..2ce8e6dd00f 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -63,10 +63,6 @@
 #include "dumputils.h"
 #include "parallel.h"
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
 
 typedef struct
 {
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index bb652538a44..df9477b69fa 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -43,6 +43,7 @@
 #include "pg_backup_utils.h"
 #include "dumputils.h"
 #include "parallel.h"
+#include "getopt_long.h"
 
 #include <ctype.h>
 
@@ -50,13 +51,6 @@
 #include <termios.h>
 #endif
 
-#include <unistd.h>
-
-#include "getopt_long.h"
-
-extern char *optarg;
-extern int	optind;
-
 #ifdef ENABLE_NLS
 #include <locale.h>
 #endif
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 03f2fad3f72..54690af0311 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -44,9 +44,6 @@
 #include <sys/time.h>
 #include <time.h>
 #include <unistd.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #include "access/transam.h"
 #include "access/tuptoaster.h"
@@ -55,9 +52,7 @@
 #include "catalog/catversion.h"
 #include "catalog/pg_control.h"
 #include "common/fe_memutils.h"
-
-extern int	optind;
-extern char *optarg;
+#include "pg_getopt.h"
 
 
 static ControlFileData ControlFile;		/* pg_control values */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 91948014e5a..106199273f0 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -386,8 +386,6 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 	};
 
 	int			optindex;
-	extern char *optarg;
-	extern int	optind;
 	int			c;
 
 	memset(options, 0, sizeof *options);
diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h
index 563719b3f7c..e23c21f333c 100644
--- a/src/include/getopt_long.h
+++ b/src/include/getopt_long.h
@@ -9,15 +9,7 @@
 #ifndef GETOPT_LONG_H
 #define GETOPT_LONG_H
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
-/* These are picked up from the system's getopt() facility. */
-extern int	opterr;
-extern int	optind;
-extern int	optopt;
-extern char *optarg;
+#include "pg_getopt.h"
 
 #ifndef HAVE_STRUCT_OPTION
 
diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h
new file mode 100644
index 00000000000..648800414e3
--- /dev/null
+++ b/src/include/pg_getopt.h
@@ -0,0 +1,42 @@
+/*
+ * Portions Copyright (c) 1987, 1993, 1994
+ * The Regents of the University of California.  All rights reserved.
+ *
+ * Portions Copyright (c) 2003-2014, PostgreSQL Global Development Group
+ *
+ * src/include/pg_getopt.h
+ */
+#ifndef PG_GETOPT_H
+#define PG_GETOPT_H
+
+/* POSIX says getopt() is provided by unistd.h */
+#include <unistd.h>
+
+/* rely on the system's getopt.h if present */
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+/*
+ * If we have <getopt.h>, assume it declares these variables, else do that
+ * ourselves.  (We used to just declare them unconditionally, but Cygwin
+ * doesn't like that.)
+ */
+#ifndef HAVE_GETOPT_H
+
+extern char *optarg;
+extern int	optind;
+extern int	opterr;
+extern int	optopt;
+
+#ifdef HAVE_INT_OPTRESET
+extern int	optreset;
+#endif
+
+#endif   /* HAVE_GETOPT_H */
+
+#ifndef HAVE_GETOPT
+extern int	getopt(int nargc, char *const * nargv, const char *ostr);
+#endif
+
+#endif   /* PG_GETOPT_H */
diff --git a/src/include/port.h b/src/include/port.h
index f50fbecf010..aeb7754cb09 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -382,10 +382,6 @@ extern int	fls(int mask);
 #define ftello(a)		ftell(a)
 #endif
 
-#ifndef HAVE_GETOPT
-extern int	getopt(int nargc, char *const * nargv, const char *ostr);
-#endif
-
 #if !defined(HAVE_GETPEEREID) && !defined(WIN32)
 extern int	getpeereid(int sock, uid_t *uid, gid_t *gid);
 #endif
diff --git a/src/port/getopt.c b/src/port/getopt.c
index eb50cba1ca4..b81fba14b07 100644
--- a/src/port/getopt.c
+++ b/src/port/getopt.c
@@ -32,6 +32,8 @@
 
 #include "c.h"
 
+#include "pg_getopt.h"
+
 #if defined(LIBC_SCCS) && !defined(lint)
 static char sccsid[] = "@(#)getopt.c	8.3 (Berkeley) 4/27/95";
 #endif   /* LIBC_SCCS and not lint */
@@ -49,20 +51,13 @@ int			opterr = 1,			/* if error message should be printed */
 			optind = 1,			/* index into parent argv vector */
 			optopt;				/* character checked for validity */
 char	   *optarg;				/* argument associated with option */
-#else
 
-extern int	opterr;
-extern int	optind;
-extern int	optopt;
-extern char *optarg;
 #endif
 
 #define BADCH	(int)'?'
 #define BADARG	(int)':'
 #define EMSG	""
 
-int			getopt(int nargc, char *const * nargv, const char *ostr);
-
 /*
  * getopt
  *	Parse argc/argv argument vector.
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index e936c01532f..ad6732aee78 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -10,29 +10,17 @@
 #ifdef WIN32
 #include <windows.h>
 #endif
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#else
-int			getopt(int argc, char *const argv[], const char *optstring);
-#endif   /* ! WIN32 */
-
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
 
 #include "libpq-fe.h"
 #include "pqexpbuffer.h"
+#include "pg_getopt.h"
 
 #include "isolationtester.h"
 
-extern int	optind;
-
 #define PREP_WAITING "isolationtester_waiting"
 
 /*
diff --git a/src/timezone/zic.c b/src/timezone/zic.c
index a399d1f0f19..cda704266ad 100644
--- a/src/timezone/zic.c
+++ b/src/timezone/zic.c
@@ -8,15 +8,11 @@
 
 #include "postgres_fe.h"
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 #include <limits.h>
 #include <locale.h>
 #include <time.h>
 
-extern int	optind;
-extern char *optarg;
+#include "pg_getopt.h"
 
 #include "private.h"
 #include "pgtz.h"
-- 
GitLab