summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut2019-06-05 20:55:16 +0000
committerPeter Eisentraut2019-06-06 08:14:25 +0000
commitf65eced25118aab29804debc4e0b9a67f4d043ad (patch)
tree38e42811d3f36c7e5a441ab76e5a5fb8b56b776f /src
parentcd96389d713787b025c84869ba417c6f2f008a86 (diff)
pg_waldump: Fix invalid option handlingHEADmaster
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.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_waldump/.gitignore3
-rw-r--r--src/bin/pg_waldump/Makefile7
-rw-r--r--src/bin/pg_waldump/pg_waldump.c25
-rw-r--r--src/bin/pg_waldump/t/001_basic.pl8
4 files changed, 34 insertions, 9 deletions
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 <[email protected]>.\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');