]> granicus.if.org Git - postgresql/commitdiff
pg_waldump: Fix invalid option handling
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 5 Jun 2019 20:55:16 +0000 (22:55 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Thu, 6 Jun 2019 08:14:25 +0000 (10:14 +0200)
Previously, running pg_waldump with an invalid option (pg_waldump
--foo) would print the help output and exit successfully.  This was
because it tried to process the option letter '?' as a normal option,
but that letter is used by getopt() to report an invalid option.

To fix, process help and version options separately, like we do
everywhere else.  Also add a basic test suite for pg_waldump and run
the basic option handling tests, which would have caught this.

src/bin/pg_waldump/.gitignore
src/bin/pg_waldump/Makefile
src/bin/pg_waldump/pg_waldump.c
src/bin/pg_waldump/t/001_basic.pl [new file with mode: 0644]

index 0013a93189c05db7a3d34352cf14109dde490f31..350d4927a6811dc32263a88fb347e490866f2272 100644 (file)
@@ -2,3 +2,6 @@
 # Source files copied from src/backend/access/rmgrdesc/
 /*desc.c
 /xlogreader.c
+
+# Generated by test suite
+/tmp_check/
index f5957bd75a6aef71beaa12e60b6260fffc0e642f..135979cef385ee84f3ed3b391ebb8cf72b7d8d86 100644 (file)
@@ -38,3 +38,10 @@ uninstall:
 
 clean distclean maintainer-clean:
        rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c
+       rm -rf tmp_check
+
+check:
+       $(prove_check)
+
+installcheck:
+       $(prove_installcheck)
index c40014d4834478bb612452234057bd9672b840e6..b95d467805a99c8d5e28fcdd58a8b81b8842f670 100644 (file)
@@ -806,6 +806,7 @@ usage(void)
        printf(_("  -z, --stats[=record]   show statistics instead of records\n"
                         "                         (optionally, show per-record statistics)\n"));
        printf(_("  -?, --help             show this help, then exit\n"));
+       printf(_("\nReport bugs to <pgsql-bugs@lists.postgresql.org>.\n"));
 }
 
 int
@@ -844,6 +845,20 @@ main(int argc, char **argv)
        set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_waldump"));
        progname = get_progname(argv[0]);
 
+       if (argc > 1)
+       {
+               if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+               {
+                       usage();
+                       exit(0);
+               }
+               if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+               {
+                       puts("pg_waldump (PostgreSQL) " PG_VERSION);
+                       exit(0);
+               }
+       }
+
        memset(&private, 0, sizeof(XLogDumpPrivate));
        memset(&config, 0, sizeof(XLogDumpConfig));
        memset(&stats, 0, sizeof(XLogDumpStats));
@@ -869,7 +884,7 @@ main(int argc, char **argv)
                goto bad_argument;
        }
 
-       while ((option = getopt_long(argc, argv, "be:?fn:p:r:s:t:Vx:z",
+       while ((option = getopt_long(argc, argv, "be:fn:p:r:s:t:x:z",
                                                                 long_options, &optindex)) != -1)
        {
                switch (option)
@@ -889,10 +904,6 @@ main(int argc, char **argv)
                        case 'f':
                                config.follow = true;
                                break;
-                       case '?':
-                               usage();
-                               exit(EXIT_SUCCESS);
-                               break;
                        case 'n':
                                if (sscanf(optarg, "%d", &config.stop_after_records) != 1)
                                {
@@ -947,10 +958,6 @@ main(int argc, char **argv)
                                        goto bad_argument;
                                }
                                break;
-                       case 'V':
-                               puts("pg_waldump (PostgreSQL) " PG_VERSION);
-                               exit(EXIT_SUCCESS);
-                               break;
                        case 'x':
                                if (sscanf(optarg, "%u", &config.filter_by_xid) != 1)
                                {
diff --git a/src/bin/pg_waldump/t/001_basic.pl b/src/bin/pg_waldump/t/001_basic.pl
new file mode 100644 (file)
index 0000000..5af0ce9
--- /dev/null
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+use TestLib;
+use Test::More tests => 8;
+
+program_help_ok('pg_waldump');
+program_version_ok('pg_waldump');
+program_options_handling_ok('pg_waldump');