Zdenek Kotala píše v út 31. 03. 2009 v 21:25 +0200:
> Another possibility is to rewrite postgres(and pg_resetxlog) to use
> getopt_long() instead of getopt().
Attached patch rewrites postgres to use getopt_long instead of getopt.
Patch also removes configure part for Solaris related to getopt.
Zdenek
diff -Nrc pgsql_getopt.2ecfaec29a72/configure.in pgsql_getopt/configure.in
*** pgsql_getopt.2ecfaec29a72/configure.in 2009-04-05 23:12:35.718886756 +0200
--- pgsql_getopt/configure.in 2009-04-05 23:12:35.761770812 +0200
***************
*** 1276,1287 ****
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
- AC_LIBOBJ(getopt)
- fi
-
# Win32 support
if test "$PORTNAME" = "win32"; then
AC_REPLACE_FUNCS(gettimeofday)
--- 1276,1281 ----
diff -Nrc pgsql_getopt.2ecfaec29a72/src/backend/bootstrap/bootstrap.c pgsql_getopt/src/backend/bootstrap/bootstrap.c
*** pgsql_getopt.2ecfaec29a72/src/backend/bootstrap/bootstrap.c 2009-04-05 23:12:35.723955129 +0200
--- pgsql_getopt/src/backend/bootstrap/bootstrap.c 2009-04-05 23:12:35.762270558 +0200
***************
*** 17,25 ****
#include <time.h>
#include <unistd.h>
#include <signal.h>
! #ifdef HAVE_GETOPT_H
! #include <getopt.h>
! #endif
#include "access/genam.h"
#include "access/heapam.h"
--- 17,23 ----
#include <time.h>
#include <unistd.h>
#include <signal.h>
! #include "getopt_long.h"
#include "access/genam.h"
#include "access/heapam.h"
***************
*** 38,43 ****
--- 36,42 ----
#include "tcop/tcopprot.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
+ #include "utils/guc.h"
#include "utils/memutils.h"
#include "utils/ps_status.h"
#include "utils/tqual.h"
***************
*** 208,213 ****
--- 207,214 ----
int flag;
AuxProcType auxType = CheckerProcess;
char *userDoption = NULL;
+ struct option *optlist;
+ int optindex;
/*
* initialize globals
***************
*** 247,253 ****
argc--;
}
! while ((flag = getopt(argc, argv, "B:c:d:D:Fr:x:-:")) != -1)
{
switch (flag)
{
--- 248,256 ----
argc--;
}
! optlist = GetLongOptionList();
!
! while ((flag = getopt_long(argc, argv, "B:c:d:D:Fr:x:", optlist, &optindex)) != -1)
{
switch (flag)
{
***************
*** 280,286 ****
auxType = atoi(optarg);
break;
case 'c':
- case '-':
{
char *name,
*value;
--- 283,288 ----
***************
*** 288,293 ****
--- 290,296 ----
ParseLongOption(optarg, &name, &value);
if (!value)
{
+ free(optlist);
if (flag == '-')
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
***************
*** 306,311 ****
--- 309,317 ----
free(value);
break;
}
+ case 1 :
+ SetConfigOption(optlist[optindex].name, optarg, PGC_POSTMASTER, PGC_S_ARGV);
+ break;
default:
write_stderr("Try \"%s --help\" for more information.\n",
progname);
***************
*** 313,318 ****
--- 319,325 ----
break;
}
}
+ free(optlist);
if (argc != optind)
{
diff -Nrc pgsql_getopt.2ecfaec29a72/src/backend/postmaster/postmaster.c pgsql_getopt/src/backend/postmaster/postmaster.c
*** pgsql_getopt.2ecfaec29a72/src/backend/postmaster/postmaster.c 2009-04-05 23:12:35.729964754 +0200
--- pgsql_getopt/src/backend/postmaster/postmaster.c 2009-04-05 23:12:35.762704640 +0200
***************
*** 83,92 ****
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
!
! #ifdef HAVE_GETOPT_H
! #include <getopt.h>
! #endif
#ifdef USE_BONJOUR
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
--- 83,89 ----
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
! #include "getopt_long.h"
#ifdef USE_BONJOUR
#include <DNSServiceDiscovery/DNSServiceDiscovery.h>
***************
*** 116,121 ****
--- 113,119 ----
#include "tcop/tcopprot.h"
#include "utils/builtins.h"
#include "utils/datetime.h"
+ #include "utils/guc.h"
#include "utils/memutils.h"
#include "utils/ps_status.h"
***************
*** 463,468 ****
--- 461,468 ----
int status;
char *userDoption = NULL;
int i;
+ struct option *optlist;
+ int optindex;
MyProcPid = PostmasterPid = getpid();
***************
*** 506,517 ****
opterr = 1;
/*
* Parse command-line options. CAUTION: keep this in sync with
* tcop/postgres.c (the option sets should not conflict) and with the
* common help() function in main/main.c.
*/
! while ((opt = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
{
switch (opt)
{
--- 506,518 ----
opterr = 1;
+ optlist = GetLongOptionList();
/*
* Parse command-line options. CAUTION: keep this in sync with
* tcop/postgres.c (the option sets should not conflict) and with the
* common help() function in main/main.c.
*/
! while ((opt = getopt_long(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:", optlist, &optindex )) != -1)
{
switch (opt)
{
***************
*** 644,650 ****
break;
case 'c':
- case '-':
{
char *name,
*value;
--- 645,650 ----
***************
*** 671,676 ****
--- 671,680 ----
break;
}
+ case 1:
+ SetConfigOption(optlist[optindex].name, optarg, PGC_POSTMASTER, PGC_S_ARGV);
+ break;
+
default:
write_stderr("Try \"%s --help\" for more information.\n",
progname);
***************
*** 678,683 ****
--- 682,689 ----
}
}
+ free(optlist);
+
/*
* Postmaster accepts no non-option switch arguments.
*/
diff -Nrc pgsql_getopt.2ecfaec29a72/src/backend/tcop/postgres.c pgsql_getopt/src/backend/tcop/postgres.c
*** pgsql_getopt.2ecfaec29a72/src/backend/tcop/postgres.c 2009-04-05 23:12:35.739820636 +0200
--- pgsql_getopt/src/backend/tcop/postgres.c 2009-04-05 23:12:35.763135706 +0200
***************
*** 31,39 ****
#include <sys/time.h>
#include <sys/resource.h>
#endif
! #ifdef HAVE_GETOPT_H
! #include <getopt.h>
! #endif
#ifndef HAVE_GETRUSAGE
#include "rusagestub.h"
--- 31,37 ----
#include <sys/time.h>
#include <sys/resource.h>
#endif
! #include "getopt_long.h"
#ifndef HAVE_GETRUSAGE
#include "rusagestub.h"
***************
*** 69,74 ****
--- 67,73 ----
#include "utils/memutils.h"
#include "utils/ps_status.h"
#include "utils/snapmgr.h"
+ #include "utils/guc.h"
#include "mb/pg_wchar.h"
***************
*** 2859,2864 ****
--- 2858,2865 ----
StringInfoData input_message;
sigjmp_buf local_sigjmp_buf;
volatile bool send_ready_for_query = true;
+ struct option *optlist;
+ int optindex;
#define PendingConfigOption(name,val) \
(guc_names = lappend(guc_names, pstrdup(name)), \
***************
*** 2940,2946 ****
* postmaster/postmaster.c (the option sets should not conflict) and with
* the common help() function in main/main.c.
*/
! while ((flag = getopt(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:y:-:")) != -1)
{
switch (flag)
{
--- 2941,2949 ----
* postmaster/postmaster.c (the option sets should not conflict) and with
* the common help() function in main/main.c.
*/
! optlist = GetLongOptionList();
!
! while ((flag = getopt_long(argc, argv, "A:B:c:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:v:W:y:", optlist, &optindex)) != -1)
{
switch (flag)
{
***************
*** 3074,3080 ****
SetConfigOption("post_auth_delay", optarg, ctx, gucsource);
break;
-
case 'y':
/*
--- 3077,3082 ----
***************
*** 3092,3098 ****
break;
case 'c':
- case '-':
{
char *name,
*value;
--- 3094,3099 ----
***************
*** 3100,3105 ****
--- 3101,3107 ----
ParseLongOption(optarg, &name, &value);
if (!value)
{
+ free(optlist);
if (flag == '-')
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
***************
*** 3126,3136 ****
--- 3128,3150 ----
break;
}
+ case 1:
+ /*
+ * If a SUSET option, must postpone evaluation, unless we
+ * are still reading secure switches.
+ */
+ if (ctx == PGC_BACKEND && IsSuperuserConfigOption(optlist[optindex].name))
+ PendingConfigOption(optlist[optindex].name, optarg);
+ else
+ SetConfigOption(optlist[optindex].name, optarg, ctx, gucsource);
+ break;
+
default:
errs++;
break;
}
}
+ free(optlist);
/*
* Process any additional GUC variable settings passed in startup packet.
diff -Nrc pgsql_getopt.2ecfaec29a72/src/backend/utils/misc/guc.c pgsql_getopt/src/backend/utils/misc/guc.c
*** pgsql_getopt.2ecfaec29a72/src/backend/utils/misc/guc.c 2009-04-05 23:12:35.758577351 +0200
--- pgsql_getopt/src/backend/utils/misc/guc.c 2009-04-05 23:12:35.763797096 +0200
***************
*** 26,31 ****
--- 26,33 ----
#include <syslog.h>
#endif
+ #include "getopt_long.h"
+
#include "access/gin.h"
#include "access/transam.h"
#include "access/twophase.h"
***************
*** 6872,6877 ****
--- 6874,6904 ----
#endif /* EXEC_BACKEND */
+ struct option *
+ GetLongOptionList()
+ {
+ struct option *opt;
+ struct config_generic *conf;
+ int i;
+ int numOpts;
+
+ numOpts = GetNumConfigOptions();
+
+ opt = malloc( sizeof(struct option) * (numOpts + 1) );
+
+ for (i = 0; i < numOpts; i++)
+ {
+ conf = guc_variables[i];
+ opt[i].name = conf->name;
+ opt[i].has_arg = TRUE;
+ opt[i].flag = NULL;
+ opt[i].val = 1;
+ }
+
+ memset( &opt[numOpts], 0, sizeof(struct option) );
+ return opt;
+ }
+
/*
* A little "long argument" simulation, although not quite GNU
* compliant. Takes a string of the form "some-option=some value" and
diff -Nrc pgsql_getopt.2ecfaec29a72/src/include/utils/guc.h pgsql_getopt/src/include/utils/guc.h
*** pgsql_getopt.2ecfaec29a72/src/include/utils/guc.h 2009-04-05 23:12:35.759983257 +0200
--- pgsql_getopt/src/include/utils/guc.h 2009-04-05 23:12:35.764155507 +0200
***************
*** 256,261 ****
--- 256,262 ----
extern int NewGUCNestLevel(void);
extern void AtEOXact_GUC(bool isCommit, int nestLevel);
extern void BeginReportingGUCOptions(void);
+ extern struct option *GetLongOptionList();
extern void ParseLongOption(const char *string, char **name, char **value);
extern bool parse_int(const char *value, int *result, int flags,
const char **hintmsg);
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers