diff --git a/configure b/configure
index e0cea2f718cd67ed46881bf8eccb4f3f125ca204..e8c0341e18c10e3ae3fa4e27becb990a061d4f57 100755
--- a/configure
+++ b/configure
@@ -13199,9 +13199,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"
diff --git a/configure.in b/configure.in
index 084dd141408dfebe2d649d19b63bfac5c5c936e0..54ea8e9570ff42e61676b809dbafebffc780aee6 100644
--- a/configure.in
+++ b/configure.in
@@ -1587,9 +1587,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
 
diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h
index 531c265f7cd88cfbc2193238cd9628a6b776e660..a50bd2b0ef860788400b85acccb9869b78538929 100644
--- a/src/include/pg_getopt.h
+++ b/src/include/pg_getopt.h
@@ -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
diff --git a/src/port/getopt.c b/src/port/getopt.c
index f1ad93d7d6a99a592e555c999df1fbde2b09c540..56bfa94ed2347cb53e24de4e77afa1aaf208f095 100644
--- a/src/port/getopt.c
+++ b/src/port/getopt.c
@@ -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