diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2012-04-17 18:36:22 -0400 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2012-04-17 18:36:22 -0400 |
commit | 7bebb851920e74cda57b866ac2f64123b44323c5 (patch) | |
tree | 647db567a2a6dc2f866508f90e368de6e3d96d77 | |
parent | 67a48385b5671a815cd355bbf7375e2a3e594ba9 (diff) |
Don't override arguments set via options with positional arguments.
A number of utility programs were rather careless about paremeters
that can be set via both an option argument and a positional
argument. This leads to results which can violate the Principal
Of Least Astonishment. These changes refuse to use positional
arguments to override settings that have been made via positional
arguments. The changes are backpatched to all live branches.
-rw-r--r-- | src/bin/initdb/initdb.c | 7 | ||||
-rw-r--r-- | src/bin/scripts/clusterdb.c | 26 | ||||
-rw-r--r-- | src/bin/scripts/createlang.c | 14 | ||||
-rw-r--r-- | src/bin/scripts/droplang.c | 14 | ||||
-rw-r--r-- | src/bin/scripts/reindexdb.c | 25 | ||||
-rw-r--r-- | src/bin/scripts/vacuumdb.c | 27 |
6 files changed, 75 insertions, 38 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 32d47d8fc99..60d91a4e44c 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -2561,8 +2561,11 @@ main(int argc, char *argv[]) } - /* Non-option argument specifies data directory */ - if (optind < argc) + /* + * Non-option argument specifies data directory + * as long as it wasn't already specified with -D / --pgdata + */ + if (optind < argc && strlen(pg_data) == 0) { pg_data = xstrdup(argv[optind]); optind++; diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c index 5ad95167cce..9eb0252462b 100644 --- a/src/bin/scripts/clusterdb.c +++ b/src/bin/scripts/clusterdb.c @@ -97,18 +97,22 @@ main(int argc, char *argv[]) } } - switch (argc - optind) + /* + * Non-option argument specifies database name + * as long as it wasn't already specified with -d / --dbname + */ + if (optind < argc && dbname == NULL) { - case 0: - break; - case 1: - dbname = argv[optind]; - break; - default: - fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), - progname, argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); - exit(1); + dbname = argv[optind]; + optind++; + } + + if (optind < argc) + { + fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), + progname, argv[optind + 1]); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); } setup_cancel_handler(); diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c index eba45328052..0a006584061 100644 --- a/src/bin/scripts/createlang.c +++ b/src/bin/scripts/createlang.c @@ -87,14 +87,24 @@ main(int argc, char *argv[]) } } + /* + * We set dbname from positional arguments if it is not + * already set by option arguments -d. If not doing + * listlangs, positional dbname must follow positional + * langname. + */ + if (argc - optind > 0) { if (listlangs) - dbname = argv[optind++]; + { + if (dbname == NULL) + dbname = argv[optind++]; + } else { langname = argv[optind++]; - if (argc - optind > 0) + if (argc - optind > 0 && dbname == NULL) dbname = argv[optind++]; } } diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c index a4c1b62311a..b214b4ffbab 100644 --- a/src/bin/scripts/droplang.c +++ b/src/bin/scripts/droplang.c @@ -98,14 +98,24 @@ main(int argc, char *argv[]) } } + /* + * We set dbname from positional arguments if it is not + * already set by option arguments -d. If not doing + * listlangs, positional dbname must follow positional + * langname. + */ + if (argc - optind > 0) { if (listlangs) - dbname = argv[optind++]; + { + if (dbname == NULL) + dbname = argv[optind++]; + } else { langname = argv[optind++]; - if (argc - optind > 0) + if (argc - optind > 0 && dbname == NULL) dbname = argv[optind++]; } } diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index f94a964179a..9907750657d 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -112,17 +112,22 @@ main(int argc, char *argv[]) } } - switch (argc - optind) + /* + * Non-option argument specifies database name + * as long as it wasn't already specified with -d / --dbname + */ + if (optind < argc && dbname == NULL) { - case 0: - break; - case 1: - dbname = argv[optind]; - break; - default: - fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); - exit(1); + dbname = argv[optind]; + optind++; + } + + if (optind < argc) + { + fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), + progname, argv[optind + 1]); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); } setup_cancel_handler(); diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index 7f960a45595..22540eb29f3 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -114,18 +114,23 @@ main(int argc, char *argv[]) } } - switch (argc - optind) + + /* + * Non-option argument specifies database name + * as long as it wasn't already specified with -d / --dbname + */ + if (optind < argc && dbname == NULL) { - case 0: - break; - case 1: - dbname = argv[optind]; - break; - default: - fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), - progname, argv[optind + 1]); - fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); - exit(1); + dbname = argv[optind]; + optind++; + } + + if (optind < argc) + { + fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), + progname, argv[optind + 1]); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); } setup_cancel_handler(); |