From f65eced25118aab29804debc4e0b9a67f4d043ad Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 5 Jun 2019 22:55:16 +0200 Subject: [PATCH] pg_waldump: Fix invalid option handling 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 | 3 +++ src/bin/pg_waldump/Makefile | 7 +++++++ src/bin/pg_waldump/pg_waldump.c | 25 ++++++++++++++++--------- src/bin/pg_waldump/t/001_basic.pl | 8 ++++++++ 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/bin/pg_waldump/t/001_basic.pl diff --git a/src/bin/pg_waldump/.gitignore b/src/bin/pg_waldump/.gitignore index 0013a93189..350d4927a6 100644 --- a/src/bin/pg_waldump/.gitignore +++ b/src/bin/pg_waldump/.gitignore @@ -2,3 +2,6 @@ # Source files copied from src/backend/access/rmgrdesc/ /*desc.c /xlogreader.c + +# Generated by test suite +/tmp_check/ diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile index f5957bd75a..135979cef3 100644 --- a/src/bin/pg_waldump/Makefile +++ b/src/bin/pg_waldump/Makefile @@ -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) diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index c40014d483..b95d467805 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -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 .\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 index 0000000000..5af0ce94fb --- /dev/null +++ b/src/bin/pg_waldump/t/001_basic.pl @@ -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'); -- 2.40.0