aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 587d065f1cc..f0783031808 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -3247,13 +3247,14 @@ get_stats_option_name(const char *arg)
* coming from the client, or PGC_SUSET for insecure options coming from
* a superuser client.
*
- * Returns the database name extracted from the command line, if any.
+ * If a database name is present in the command line arguments, it's
+ * returned into *dbname (this is allowed only if *dbname is initially NULL).
* ----------------------------------------------------------------
*/
-const char *
-process_postgres_switches(int argc, char *argv[], GucContext ctx)
+void
+process_postgres_switches(int argc, char *argv[], GucContext ctx,
+ const char **dbname)
{
- const char *dbname;
bool secure = (ctx == PGC_POSTMASTER);
int errs = 0;
GucSource gucsource;
@@ -3304,7 +3305,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
case 'b':
/* Undocumented flag used for binary upgrades */
- IsBinaryUpgrade = true;
+ if (secure)
+ IsBinaryUpgrade = true;
break;
case 'C':
@@ -3321,7 +3323,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
break;
case 'E':
- EchoQuery = true;
+ if (secure)
+ EchoQuery = true;
break;
case 'e':
@@ -3346,7 +3349,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
break;
case 'j':
- UseNewLine = 0;
+ if (secure)
+ UseNewLine = 0;
break;
case 'k':
@@ -3464,13 +3468,10 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
}
/*
- * Should be no more arguments except an optional database name, and
- * that's only in the secure case.
+ * Optional database name should be there only if *dbname is NULL.
*/
- if (!errs && secure && argc - optind >= 1)
- dbname = strdup(argv[optind++]);
- else
- dbname = NULL;
+ if (!errs && dbname && *dbname == NULL && argc - optind >= 1)
+ *dbname = strdup(argv[optind++]);
if (errs || argc != optind)
{
@@ -3499,8 +3500,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
#ifdef HAVE_INT_OPTRESET
optreset = 1; /* some systems need this too */
#endif
-
- return dbname;
}
@@ -3510,14 +3509,16 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx)
*
* argc/argv are the command line arguments to be used. (When being forked
* by the postmaster, these are not the original argv array of the process.)
- * username is the (possibly authenticated) PostgreSQL user name to be used
- * for the session.
+ * dbname is the name of the database to connect to, or NULL if the database
+ * name should be extracted from the command line arguments or defaulted.
+ * username is the PostgreSQL user name to be used for the session.
* ----------------------------------------------------------------
*/
void
-PostgresMain(int argc, char *argv[], const char *username)
+PostgresMain(int argc, char *argv[],
+ const char *dbname,
+ const char *username)
{
- const char *dbname;
int firstchar;
StringInfoData input_message;
sigjmp_buf local_sigjmp_buf;
@@ -3564,7 +3565,7 @@ PostgresMain(int argc, char *argv[], const char *username)
/*
* Parse command-line options.
*/
- dbname = process_postgres_switches(argc, argv, PGC_POSTMASTER);
+ process_postgres_switches(argc, argv, PGC_POSTMASTER, &dbname);
/* Must have gotten a database name, or have a default (the username) */
if (dbname == NULL)