]> 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:42 +0000 (18:37 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Tue, 17 Apr 2012 22:37:42 +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 018cfdc1506d897354091cb46470ce26a11b90a1..09d505f2f789f52fe5325069049fd8cbff6a8375 100644 (file)
@@ -2644,8 +2644,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 f4c317ae149fc80abaea4fbb0a9c4fd06f5696a4..624886e5c9e1d7753e2ec07ba75f7a926a149817 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 c2153db630eec757c063385037417f0796f77530..a98fad5918e67a2323fb466c528f1629bf4c8094 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 7fadee0d51374e2a9ff78c1ee481a20e4b32b62e..22237dff4a16da99acc293dbe2050324429f24ad 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 53fff01a74b32b7f8c96966c1b9df16b03c5b1bd..f9272fecc39639dbda8d208714cf99207eabd4aa 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 7457e6d3046cd256fbf0b81448afc73e7f9059db..a93541e06ffbd83cf22e1187c2eccb233e9c8483 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)