]> granicus.if.org Git - postgresql/commitdiff
Don't override arguments set via options with positional arguments.
authorAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:36:59 +0000 (18:36 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:36:59 +0000 (18:36 -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 0febcf1fcfb451e630f6ede042cbae27205f8abb..34705eee3571e57914e1c038d0663b3e979db6a6 100644 (file)
@@ -2612,8 +2612,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 c690de36cc9a0fa20a7a1aa1fac9b8ff5da35f6e..30cdf0349995c51f8703fe115ba87d48cc9bc923 100644 (file)
@@ -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();
index d00cb63a8b01fa37702536ae4fc26f94da930415..05dd048af958fbe41a976fe9e030438e5aea30bd 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 7038e08b8af57bc79abe324cad52f1762b473b03..31ac98f4c8d03e6596e4a3b16acf4bb0801bc2c0 100644 (file)
@@ -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++];
                }
        }
index 3651707981c9d5d6ed5e6747db07a26025e3ab62..4e0d9ba0a071739154b4c9dd7e04397f93b4a5c3 100644 (file)
@@ -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();
index 13081b4fc0ef91a941ca10face766450316067eb..d3acbb5bb4847eba54ebf7306c28d8bedc778f16 100644 (file)
@@ -123,18 +123,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();