diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2023-03-21 08:01:12 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2023-03-21 08:05:23 +0100 |
commit | 4c8044c04455fe87dadefa4f7c69bfe6cdbe3cc5 (patch) | |
tree | 9152af1fe0325daa557e002809ce2873ed799213 /src | |
parent | b797def5951fcd8eed2124b7316cc9027d6228cc (diff) | |
download | postgresql-4c8044c04455fe87dadefa4f7c69bfe6cdbe3cc5.tar.gz postgresql-4c8044c04455fe87dadefa4f7c69bfe6cdbe3cc5.zip |
pg_waldump: Allow hexadecimal values for -t/--timeline option
This makes it easier to specify values taken directly from WAL file
names.
The option parsing is arranged in the style of option_parse_int() (but
we need to parse unsigned int), to allow future refactoring in the
same manner.
Reviewed-by: Sébastien Lardière <sebastien@lardiere.net>
Discussion: https://www.postgresql.org/message-id/flat/8fef346e-2541-76c3-d768-6536ae052993@lardiere.net
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_waldump/pg_waldump.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 44b5c8726e6..8630000ef0b 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -13,6 +13,7 @@ #include "postgres.h" #include <dirent.h> +#include <limits.h> #include <signal.h> #include <sys/stat.h> #include <unistd.h> @@ -1007,12 +1008,40 @@ main(int argc, char **argv) private.startptr = (uint64) xlogid << 32 | xrecoff; break; case 't': - if (sscanf(optarg, "%u", &private.timeline) != 1) + + /* + * This is like option_parse_int() but needs to handle + * unsigned 32-bit int. Also, we accept both decimal and + * hexadecimal specifications here. + */ { - pg_log_error("invalid timeline specification: \"%s\"", optarg); - goto bad_argument; + char *endptr; + unsigned long val; + + errno = 0; + val = strtoul(optarg, &endptr, 0); + + while (*endptr != '\0' && isspace((unsigned char) *endptr)) + endptr++; + + if (*endptr != '\0') + { + pg_log_error("invalid value \"%s\" for option %s", + optarg, "-t/--timeline"); + goto bad_argument; + } + + if (errno == ERANGE || val < 1 || val > UINT_MAX) + { + pg_log_error("%s must be in range %u..%u", + "-t/--timeline", 1, UINT_MAX); + goto bad_argument; + } + + private.timeline = val; + + break; } - break; case 'w': config.filter_by_fpw = true; break; |