summaryrefslogtreecommitdiff
path: root/src/bin/scripts
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-04-17 18:37:25 -0400
committerAndrew Dunstan <andrew@dunslane.net>2012-04-17 18:37:25 -0400
commit156fac55c79e8c5e09972cf46d175024c0cedde9 (patch)
treedf42005c82f1d12b266b60a561a25a4ef4715d65 /src/bin/scripts
parent05504f11b0fdcaf2270edad27a776b01fc956e05 (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.
Diffstat (limited to 'src/bin/scripts')
-rw-r--r--src/bin/scripts/clusterdb.c26
-rw-r--r--src/bin/scripts/createlang.c14
-rw-r--r--src/bin/scripts/droplang.c14
-rw-r--r--src/bin/scripts/reindexdb.c25
-rw-r--r--src/bin/scripts/vacuumdb.c27
5 files changed, 70 insertions, 36 deletions
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
index c2b2020af78..8fe494a7527 100644
--- a/src/bin/scripts/clusterdb.c
+++ b/src/bin/scripts/clusterdb.c
@@ -106,18 +106,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 a36b39bdeea..ff86ec5949f 100644
--- a/src/bin/scripts/createlang.c
+++ b/src/bin/scripts/createlang.c
@@ -91,14 +91,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 b634506f0fb..a7a9f3f283c 100644
--- a/src/bin/scripts/droplang.c
+++ b/src/bin/scripts/droplang.c
@@ -102,14 +102,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 9781b3eb088..47fbcde1255 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -116,17 +116,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 0bac34954d4..ccf4b3153ed 100644
--- a/src/bin/scripts/vacuumdb.c
+++ b/src/bin/scripts/vacuumdb.c
@@ -129,18 +129,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);
}
if (analyze_only)