]> granicus.if.org Git - postgresql/commitdiff
Use our own getopt() on OpenBSD.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 18 Jan 2019 20:06:26 +0000 (15:06 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 18 Jan 2019 20:06:26 +0000 (15:06 -0500)
Recent OpenBSD (at least 5.9 and up) has a version of getopt(3)
that will not cope with the "-:" spec we use to accept double-dash
options in postgres.c and postmaster.c.  Admittedly, that's a hack
because POSIX only requires getopt() to allow alphanumeric option
characters.  I have no desire to find another way, however, so
let's just do what we were already doing on Solaris: force use
of our own src/port/getopt.c implementation.

In passing, improve some of the comments around said implementation.

Per buildfarm and local testing.  Back-patch to all supported branches.

Discussion: https://postgr.es/m/30197.1547835700@sss.pgh.pa.us

configure
configure.in
src/include/pg_getopt.h
src/port/getopt.c

index 5e4204ae93022439d7343868681dda8ddd97af7a..67ba8b677ac4e066d0e75a6b13fac0c3a0429291 100755 (executable)
--- a/configure
+++ b/configure
@@ -15912,9 +15912,9 @@ esac
 
 fi
 
-# Solaris' getopt() doesn't do what we want for long options, so always use
-# our version on that platform.
-if test "$PORTNAME" = "solaris"; then
+# On OpenBSD and Solaris, getopt() doesn't do what we want for long options
+# (i.e., allow '-' as a flag character), so use our version on those platforms.
+if test "$PORTNAME" = "openbsd" -o "$PORTNAME" = "solaris"; then
   case " $LIBOBJS " in
   *" getopt.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS getopt.$ac_objext"
index 774ebe391f3e754228b8948372afa6f26d763472..0fc0fb3cfe383026916f89854cd58193c1ed340e 100644 (file)
@@ -1738,9 +1738,9 @@ else
   AC_LIBOBJ(getopt_long)
 fi
 
-# Solaris' getopt() doesn't do what we want for long options, so always use
-# our version on that platform.
-if test "$PORTNAME" = "solaris"; then
+# On OpenBSD and Solaris, getopt() doesn't do what we want for long options
+# (i.e., allow '-' as a flag character), so use our version on those platforms.
+if test "$PORTNAME" = "openbsd" -o "$PORTNAME" = "solaris"; then
   AC_LIBOBJ(getopt)
 fi
 
index bb5d2344401bc00e92d96a27d2465cedb59194cb..639a1613c1370ca802958065b69d405a867c2640 100644 (file)
@@ -1,4 +1,13 @@
 /*
+ * Postgres files that use getopt(3) always include this file.
+ * We must cope with three different scenarios:
+ * 1. We're using the platform's getopt(), and we should just import the
+ *    appropriate declarations.
+ * 2. The platform lacks getopt(), and we must declare everything.
+ * 3. The platform has getopt(), but we're not using it because we don't
+ *    like its behavior.  The declarations we make here must be compatible
+ *    with both the platform's getopt() and our src/port/getopt.c.
+ *
  * Portions Copyright (c) 1987, 1993, 1994
  * The Regents of the University of California.  All rights reserved.
  *
@@ -39,6 +48,7 @@ extern int    optopt;
 extern int     optreset;
 #endif
 
+/* Provide getopt() declaration if the platform doesn't have it */
 #ifndef HAVE_GETOPT
 extern int     getopt(int nargc, char *const *nargv, const char *ostr);
 #endif
index 10f4228d7c923d5fd460d6539063adaf48d38b1c..207c2836d354b9d66413b57a7ae7c632b66b02a9 100644 (file)
@@ -1,7 +1,5 @@
 /* src/port/getopt.c */
 
-/* This is used by psql under Win32 */
-
 /*
  * Copyright (c) 1987, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
@@ -40,10 +38,11 @@ static char sccsid[] = "@(#)getopt.c        8.3 (Berkeley) 4/27/95";
 
 
 /*
- * On some versions of Solaris, opterr and friends are defined in core libc
- * rather than in a separate getopt module.  Define these variables only
- * if configure found they aren't there by default.  (We assume that testing
- * opterr is sufficient for all of these.)
+ * On OpenBSD and some versions of Solaris, opterr and friends are defined in
+ * core libc rather than in a separate getopt module.  Define these variables
+ * only if configure found they aren't there by default; otherwise, this
+ * module and its callers will just use libc's variables.  (We assume that
+ * testing opterr is sufficient for all of these.)
  */
 #ifndef HAVE_INT_OPTERR