Don't override arguments set via options with positional arguments.
authorAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:30:34 +0000 (18:30 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:30:34 +0000 (18:30 -0400)
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.

src/bin/initdb/initdb.c
src/bin/scripts/clusterdb.c
src/bin/scripts/createlang.c
src/bin/scripts/droplang.c
src/bin/scripts/reindexdb.c
src/bin/scripts/vacuumdb.c

index 87a9c95430e953819393d1774974ef5eb345ff7c..303b0cf7560784cef55c23f147d51f34eda09b73 100644 (file)
@@ -2760,8 +2760,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++;
index b01f91c1d6e36e371d79cff862fb1cc96a124bb4..0f711e870b313a565fc4b6a1c387e705ec878db8 100644 (file)
@@ -112,18 +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();
index c8b927c6758fbae810153c797b0f5b61810bcf6b..cc671a49767dd7f0eb7610f5c37209e8141da9da 100644 (file)
@@ -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++];
                }
        }
index 66bc9664a5f6f5651c86669d456d8623b72ee027..47ec37f5e95464bc4519dd900266f08046b04338 100644 (file)
@@ -90,14 +90,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++];
                }
        }
index 54b478db60c98255923441ddcca3a31449f0655f..614a6885a0b944b4949d11b8bdd3dd0178dc9410 100644 (file)
@@ -122,17 +122,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();
index 1698c5f630b36864b943f37d7f650f0dadf76e0e..fe303ad8853aa9b3535681ee43eca23d1e96d8c9 100644 (file)
@@ -135,18 +135,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)