aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-09-01 00:09:42 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-09-01 00:09:42 +0000
commit0905e8aeebd141a311ddee9957f75b698e872370 (patch)
tree457c33ed6ab869c3af415e697dae5a4bfb8a64ba /src/backend/tcop/postgres.c
parent00e6a16d01683762c2f34eb4909fc739093ab3bf (diff)
downloadpostgresql-0905e8aeebd141a311ddee9957f75b698e872370.tar.gz
postgresql-0905e8aeebd141a311ddee9957f75b698e872370.zip
Move processing of startup-packet switches and GUC settings into InitPostgres,
to fix the problem that SetClientEncoding needs to be done before InitializeClientEncoding, as reported by Zdenek Kotala. We get at least the small consolation of being able to remove the bizarre API detail that had InitPostgres returning whether user is a superuser.
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c85
1 files changed, 9 insertions, 76 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index a3ed96689d7..75092fc4a45 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.571 2009/08/29 19:26:51 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.572 2009/09/01 00:09:42 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -2862,7 +2862,7 @@ get_stats_option_name(const char *arg)
* from the client's startup packet. The latter have the same syntax but
* may be restricted in what they can do.
*
- * argv[0] is the program name either way.
+ * argv[0] is ignored in either case (it's assumed to be the program name).
*
* ctx is PGC_POSTMASTER for secure options, PGC_BACKEND for insecure options
* coming from the client, or PGC_SUSET for insecure options coming from
@@ -2871,11 +2871,10 @@ get_stats_option_name(const char *arg)
* Returns the database name extracted from the command line, if any.
* ----------------------------------------------------------------
*/
-static const char *
+const char *
process_postgres_switches(int argc, char *argv[], GucContext ctx)
{
const char *dbname;
- const char *argv0 = argv[0];
bool secure = (ctx == PGC_POSTMASTER);
int errs = 0;
GucSource gucsource;
@@ -3073,13 +3072,13 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
ereport(FATAL,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid command-line arguments for server process"),
- errhint("Try \"%s --help\" for more information.", argv0)));
+ errhint("Try \"%s --help\" for more information.", progname)));
else
ereport(FATAL,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("%s: invalid command-line arguments",
- argv0),
- errhint("Try \"%s --help\" for more information.", argv0)));
+ progname),
+ errhint("Try \"%s --help\" for more information.", progname)));
}
if (argc - optind == 1)
@@ -3114,8 +3113,6 @@ int
PostgresMain(int argc, char *argv[], const char *username)
{
const char *dbname;
- bool am_superuser;
- GucContext ctx;
int firstchar;
char stack_base;
StringInfoData input_message;
@@ -3176,13 +3173,13 @@ PostgresMain(int argc, char *argv[], const char *username)
ereport(FATAL,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("%s: no database nor user name specified",
- argv[0])));
+ progname)));
}
/* Acquire configuration parameters, unless inherited from postmaster */
if (!IsUnderPostmaster)
{
- if (!SelectConfigFiles(userDoption, argv[0]))
+ if (!SelectConfigFiles(userDoption, progname))
proc_exit(1);
/* If timezone is not set, determine what the OS uses */
pg_timezone_initialize();
@@ -3314,7 +3311,7 @@ PostgresMain(int argc, char *argv[], const char *username)
* it inside InitPostgres() instead. In particular, anything that
* involves database access should be there, not here.
*/
- am_superuser = InitPostgres(dbname, InvalidOid, username, NULL);
+ InitPostgres(dbname, InvalidOid, username, NULL);
/*
* If the PostmasterContext is still around, recycle the space; we don't
@@ -3331,70 +3328,6 @@ PostgresMain(int argc, char *argv[], const char *username)
SetProcessingMode(NormalProcessing);
- set_ps_display("startup", false);
-
- /*
- * Now that we know if client is a superuser, we can try to apply any
- * command-line options passed in the startup packet.
- */
- ctx = am_superuser ? PGC_SUSET : PGC_BACKEND;
-
- if (MyProcPort != NULL &&
- MyProcPort->cmdline_options != NULL)
- {
- /*
- * The maximum possible number of commandline arguments that could
- * come from MyProcPort->cmdline_options is (strlen + 1) / 2; see
- * pg_split_opts().
- */
- char **av;
- int maxac;
- int ac;
-
- maxac = 2 + (strlen(MyProcPort->cmdline_options) + 1) / 2;
-
- av = (char **) palloc(maxac * sizeof(char *));
- ac = 0;
-
- av[ac++] = argv[0];
-
- /* Note this mangles MyProcPort->cmdline_options */
- pg_split_opts(av, &ac, MyProcPort->cmdline_options);
-
- av[ac] = NULL;
-
- Assert(ac < maxac);
-
- (void) process_postgres_switches(ac, av, ctx);
- }
-
- /*
- * Process any additional GUC variable settings passed in startup packet.
- * These are handled exactly like command-line variables.
- */
- if (MyProcPort != NULL)
- {
- ListCell *gucopts = list_head(MyProcPort->guc_options);
-
- while (gucopts)
- {
- char *name;
- char *value;
-
- name = lfirst(gucopts);
- gucopts = lnext(gucopts);
-
- value = lfirst(gucopts);
- gucopts = lnext(gucopts);
-
- SetConfigOption(name, value, ctx, PGC_S_CLIENT);
- }
- }
-
- /* Apply PostAuthDelay as soon as we've read all options */
- if (PostAuthDelay > 0)
- pg_usleep(PostAuthDelay * 1000000L);
-
/*
* Now all GUC states are fully set up. Report them to client if
* appropriate.