Skip to content

Commit e4ffa0d

Browse files
committed
Use our own getopt() on OpenBSD.
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
1 parent 4dff893 commit e4ffa0d

File tree

4 files changed

+21
-12
lines changed

4 files changed

+21
-12
lines changed

configure

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15617,9 +15617,9 @@ esac
1561715617

1561815618
fi
1561915619

15620-
# Solaris' getopt() doesn't do what we want for long options, so always use
15621-
# our version on that platform.
15622-
if test "$PORTNAME" = "solaris"; then
15620+
# On OpenBSD and Solaris, getopt() doesn't do what we want for long options
15621+
# (i.e., allow '-' as a flag character), so use our version on those platforms.
15622+
if test "$PORTNAME" = "openbsd" -o "$PORTNAME" = "solaris"; then
1562315623
case " $LIBOBJS " in
1562415624
*" getopt.$ac_objext "* ) ;;
1562515625
*) LIBOBJS="$LIBOBJS getopt.$ac_objext"

configure.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,9 +1717,9 @@ else
17171717
AC_LIBOBJ(getopt_long)
17181718
fi
17191719

1720-
# Solaris' getopt() doesn't do what we want for long options, so always use
1721-
# our version on that platform.
1722-
if test "$PORTNAME" = "solaris"; then
1720+
# On OpenBSD and Solaris, getopt() doesn't do what we want for long options
1721+
# (i.e., allow '-' as a flag character), so use our version on those platforms.
1722+
if test "$PORTNAME" = "openbsd" -o "$PORTNAME" = "solaris"; then
17231723
AC_LIBOBJ(getopt)
17241724
fi
17251725

src/include/pg_getopt.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
/*
2+
* Postgres files that use getopt(3) always include this file.
3+
* We must cope with three different scenarios:
4+
* 1. We're using the platform's getopt(), and we should just import the
5+
* appropriate declarations.
6+
* 2. The platform lacks getopt(), and we must declare everything.
7+
* 3. The platform has getopt(), but we're not using it because we don't
8+
* like its behavior. The declarations we make here must be compatible
9+
* with both the platform's getopt() and our src/port/getopt.c.
10+
*
211
* Portions Copyright (c) 1987, 1993, 1994
312
* The Regents of the University of California. All rights reserved.
413
*
@@ -39,6 +48,7 @@ extern int optopt;
3948
extern int optreset;
4049
#endif
4150

51+
/* Provide getopt() declaration if the platform doesn't have it */
4252
#ifndef HAVE_GETOPT
4353
extern int getopt(int nargc, char *const *nargv, const char *ostr);
4454
#endif

src/port/getopt.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
/* src/port/getopt.c */
22

3-
/* This is used by psql under Win32 */
4-
53
/*
64
* Copyright (c) 1987, 1993, 1994
75
* 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";
4038

4139

4240
/*
43-
* On some versions of Solaris, opterr and friends are defined in core libc
44-
* rather than in a separate getopt module. Define these variables only
45-
* if configure found they aren't there by default. (We assume that testing
46-
* opterr is sufficient for all of these.)
41+
* On OpenBSD and some versions of Solaris, opterr and friends are defined in
42+
* core libc rather than in a separate getopt module. Define these variables
43+
* only if configure found they aren't there by default; otherwise, this
44+
* module and its callers will just use libc's variables. (We assume that
45+
* testing opterr is sufficient for all of these.)
4746
*/
4847
#ifndef HAVE_INT_OPTERR
4948

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy