]> 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:37:25 +0000 (18:37 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:37:25 +0000 (18:37 -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 7ca4c934318ab0531f3012eba1f6989ba4c11049..bbc7997930351d4180e5b68467d3b3d6d3974d31 100644 (file)
@@ -2563,8 +2563,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 c2b2020af78c5ef31584a5ba7f7792b9dd8005a0..8fe494a7527d7c445c7cd136deb4c8f157d8fd79 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 a36b39bdeea66f89c004a3efe65ee03e06e5492d..ff86ec5949f0d27ef41d5c1dd57c2631f8a0db90 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 b634506f0fb5a1a2df33a67c444f77447764196e..a7a9f3f283c9ae87cca92203e03095f4beab7d9f 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 9781b3eb0886a74315c893ff848c3b09282edd54..47fbcde1255caae1a41fc086c5c63e18c37abea5 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 0bac34954d4b6aaecb783af17aa8935f79269d44..ccf4b3153eda7f4a053a972e5c4a8779990a379d 100644 (file)
@@ -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)