diff options
-rw-r--r-- | src/backend/main/main.c | 2 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 9 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 45 | ||||
-rw-r--r-- | src/backend/utils/init/postinit.c | 2 | ||||
-rw-r--r-- | src/include/tcop/tcopprot.h | 7 |
5 files changed, 31 insertions, 34 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 8d9cb9428df..2eee3ef72ae 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -194,7 +194,7 @@ main(int argc, char *argv[]) exit(GucInfoMain()); if (argc > 1 && strcmp(argv[1], "--single") == 0) - exit(PostgresMain(argc, argv, get_current_username(progname))); + exit(PostgresMain(argc, argv, NULL, get_current_username(progname))); exit(PostmasterMain(argc, argv)); } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index f11ce227b4f..873ae4a2c4a 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3571,7 +3571,7 @@ BackendRun(Port *port) * from ExtraOptions is (strlen(ExtraOptions) + 1) / 2; see * pg_split_opts(). */ - maxac = 5; /* for fixed args supplied below */ + maxac = 2; /* for fixed args supplied below */ maxac += (strlen(ExtraOptions) + 1) / 2; av = (char **) MemoryContextAlloc(TopMemoryContext, @@ -3587,11 +3587,6 @@ BackendRun(Port *port) */ pg_split_opts(av, &ac, ExtraOptions); - /* - * Tell the backend which database to use. - */ - av[ac++] = port->database_name; - av[ac] = NULL; Assert(ac < maxac); @@ -3614,7 +3609,7 @@ BackendRun(Port *port) */ MemoryContextSwitchTo(TopMemoryContext); - return (PostgresMain(ac, av, port->user_name)); + return PostgresMain(ac, av, port->database_name, port->user_name); } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index dda82358eb6..ad33ae079bd 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3256,13 +3256,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; @@ -3303,7 +3304,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 'D': @@ -3316,7 +3318,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'E': - EchoQuery = true; + if (secure) + EchoQuery = true; break; case 'e': @@ -3341,7 +3344,8 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) break; case 'j': - UseNewLine = 0; + if (secure) + UseNewLine = 0; break; case 'k': @@ -3456,10 +3460,12 @@ 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 || argc - optind > 1 || (argc != optind && !secure)) + if (!errs && dbname && *dbname == NULL && argc - optind >= 1) + *dbname = strdup(argv[optind++]); + + if (errs || argc != optind) { /* spell the error message a bit differently depending on context */ if (IsUnderPostmaster) @@ -3475,11 +3481,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) errhint("Try \"%s --help\" for more information.", progname))); } - if (argc - optind == 1) - dbname = strdup(argv[optind]); - else - dbname = NULL; - /* * Reset getopt(3) library so that it will work correctly in subprocesses * or when this function is called a second time with another array. @@ -3488,8 +3489,6 @@ process_postgres_switches(int argc, char *argv[], GucContext ctx) #ifdef HAVE_INT_OPTRESET optreset = 1; /* some systems need this too */ #endif - - return dbname; } @@ -3499,14 +3498,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. * ---------------------------------------------------------------- */ int -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; @@ -3553,7 +3554,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) diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index efb48d92ec2..f8d8626a92c 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -912,7 +912,7 @@ process_startup_options(Port *port, bool am_superuser) Assert(ac < maxac); - (void) process_postgres_switches(ac, av, gucctx); + (void) process_postgres_switches(ac, av, gucctx, NULL); } /* diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index d5192d98558..31dee4e4f48 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -68,9 +68,10 @@ extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from S * handler */ extern void prepare_for_client_read(void); extern void client_read_ended(void); -extern const char *process_postgres_switches(int argc, char *argv[], - GucContext ctx); -extern int PostgresMain(int argc, char *argv[], const char *username); +extern void process_postgres_switches(int argc, char *argv[], + GucContext ctx, const char **dbname); +extern int PostgresMain(int argc, char *argv[], + const char *dbname, const char *username); extern long get_stack_depth_rlimit(void); extern void ResetUsage(void); extern void ShowUsage(const char *title); |