]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Don't override arguments set via options with positional arguments.
authorAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:36:22 +0000 (18:36 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:36:22 +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 32d47d8fc99eed5fe8eed746c8f738b47e78d4cc..60d91a4e44ceebd7b7deb3161982fa5cf171cdec 100644 (file)
@@ -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++;
index 5ad95167ccecea7705a566b543ae4d7876743ed5..9eb0252462b5ee609e86b4990408ab62eb67a1af 100644 (file)
@@ -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();
index eba45328052e672f4ad6a3e7b7744bcd675c9365..0a006584061990ef9204bf0bfde3b9ed71c0b671 100644 (file)
@@ -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++];
                }
        }
index a4c1b62311aa987aa0f0a57fe9e4ca3a6bc52a8d..b214b4ffbabd528acf0f82472b9e8dae3db0bb45 100644 (file)
@@ -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++];
                }
        }
index f94a964179a079f49ebbbd377b190b52c43b768b..9907750657dd9a564b6d90dda83fb40d13c565c1 100644 (file)
@@ -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();
index 7f960a4559543c085b50f632e234d2aa6ad3ce11..22540eb29f3219310fbc2e63b24ed802840f60f2 100644 (file)
@@ -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();