postgresql/src/fe_utils/option_utils.c
Robert Haas a448e49bcb Revert 56-bit relfilenode change and follow-up commits.
There are still some alignment-related failures in the buildfarm,
which might or might not be able to be fixed quickly, but I've also
just realized that it increased the size of many WAL records by 4 bytes
because a block reference contains a RelFileLocator. The effect of that
hasn't been studied or discussed, so revert for now.
2022-09-28 09:55:28 -04:00

84 lines
1.9 KiB
C

/*-------------------------------------------------------------------------
*
* Command line option processing facilities for frontend code
*
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/fe_utils/option_utils.c
*
*-------------------------------------------------------------------------
*/
#include "postgres_fe.h"
#include "common/logging.h"
#include "common/string.h"
#include "fe_utils/option_utils.h"
/*
* Provide strictly harmonized handling of --help and --version
* options.
*/
void
handle_help_version_opts(int argc, char *argv[],
const char *fixed_progname, help_handler hlp)
{
if (argc > 1)
{
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
{
hlp(get_progname(argv[0]));
exit(0);
}
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
{
printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
exit(0);
}
}
}
/*
* option_parse_int
*
* Parse integer value for an option. If the parsing is successful, returns
* true and stores the result in *result if that's given; if parsing fails,
* returns false.
*/
bool
option_parse_int(const char *optarg, const char *optname,
int min_range, int max_range,
int *result)
{
char *endptr;
int val;
errno = 0;
val = strtoint(optarg, &endptr, 10);
/*
* Skip any trailing whitespace; if anything but whitespace remains before
* the terminating character, fail.
*/
while (*endptr != '\0' && isspace((unsigned char) *endptr))
endptr++;
if (*endptr != '\0')
{
pg_log_error("invalid value \"%s\" for option %s",
optarg, optname);
return false;
}
if (errno == ERANGE || val < min_range || val > max_range)
{
pg_log_error("%s must be in range %d..%d",
optname, min_range, max_range);
return false;
}
if (result)
*result = val;
return true;
}