/
githubmirror
/
postgres
Обзор
Документация
Войти
/
githubmirror
/
postgres
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/fe_utils/option_utils.c
146 строк
3 KB
Tom Lane
Pre-beta mechanical code beautification, step 1: run pgindent.
13 май 2026, 17:34
13 май 2026, 17:34
020794e
Код
Авторство
О чём код?
/*------------------------------------------------------------------------- * * Command line option processing facilities for frontend code * * Portions Copyright (c) 1996-2026, 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; } /* * Provide strictly harmonized handling of the --sync-method option. */ bool parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method) { if (strcmp(optarg, "fsync") == 0) *sync_method = DATA_DIR_SYNC_METHOD_FSYNC; else if (strcmp(optarg, "syncfs") == 0) { #ifdef HAVE_SYNCFS *sync_method = DATA_DIR_SYNC_METHOD_SYNCFS; #else pg_log_error("this build does not support sync method \"%s\"", "syncfs"); return false; #endif } else { pg_log_error("unrecognized sync method: %s", optarg); return false; } return true; } /* * Fail with appropriate error if 2 or more of the specified options are set. * The first parameter is the number of arguments. Following that is an * arbitrary number of bool/string pairs. The bool indicates whether the * option is set, and the string is used for the error message. Note that only * the first pair of enabled options we find are reported. * * Don't call this directly. Use the check_mut_excl_opts() macro in * option_utils.h, which is the exact same except it doesn't take the first * parameter (it discovers the number of arguments automagically). */ void check_mut_excl_opts_internal(int n, ...) { char *first = NULL; va_list args; Assert(n % 2 == 0); va_start(args, n); for (int i = 0; i < n; i += 2) { bool set = va_arg(args, int); char *opt = va_arg(args, char *); if (set && first) pg_fatal("options %s and %s cannot be used together", first, opt); if (set) first = opt; } va_end(args); }