Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * Command line option processing facilities for frontend code 4 : * 5 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group 6 : * Portions Copyright (c) 1994, Regents of the University of California 7 : * 8 : * src/fe_utils/option_utils.c 9 : * 10 : *------------------------------------------------------------------------- 11 : */ 12 : 13 : #include "postgres_fe.h" 14 : 15 : #include "common/logging.h" 16 : #include "common/string.h" 17 : #include "fe_utils/option_utils.h" 18 : 19 : /* 20 : * Provide strictly harmonized handling of --help and --version 21 : * options. 22 : */ 23 : void 24 458 : handle_help_version_opts(int argc, char *argv[], 25 : const char *fixed_progname, help_handler hlp) 26 : { 27 458 : if (argc > 1) 28 : { 29 454 : if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) 30 : { 31 18 : hlp(get_progname(argv[0])); 32 18 : exit(0); 33 : } 34 436 : if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) 35 : { 36 22 : printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname); 37 22 : exit(0); 38 : } 39 : } 40 418 : } 41 : 42 : /* 43 : * option_parse_int 44 : * 45 : * Parse integer value for an option. If the parsing is successful, returns 46 : * true and stores the result in *result if that's given; if parsing fails, 47 : * returns false. 48 : */ 49 : bool 50 358 : option_parse_int(const char *optarg, const char *optname, 51 : int min_range, int max_range, 52 : int *result) 53 : { 54 : char *endptr; 55 : int val; 56 : 57 358 : errno = 0; 58 358 : val = strtoint(optarg, &endptr, 10); 59 : 60 : /* 61 : * Skip any trailing whitespace; if anything but whitespace remains before 62 : * the terminating character, fail. 63 : */ 64 360 : while (*endptr != '\0' && isspace((unsigned char) *endptr)) 65 2 : endptr++; 66 : 67 358 : if (*endptr != '\0') 68 : { 69 10 : pg_log_error("invalid value \"%s\" for option %s", 70 : optarg, optname); 71 10 : return false; 72 : } 73 : 74 348 : if (errno == ERANGE || val < min_range || val > max_range) 75 : { 76 22 : pg_log_error("%s must be in range %d..%d", 77 : optname, min_range, max_range); 78 22 : return false; 79 : } 80 : 81 326 : if (result) 82 314 : *result = val; 83 326 : return true; 84 : }