Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * Command line option processing facilities for frontend code 4 : * 5 : * Portions Copyright (c) 1996-2024, 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 616 : handle_help_version_opts(int argc, char *argv[], 25 : const char *fixed_progname, help_handler hlp) 26 : { 27 616 : if (argc > 1) 28 : { 29 608 : if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) 30 : { 31 22 : hlp(get_progname(argv[0])); 32 22 : exit(0); 33 : } 34 586 : if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) 35 : { 36 40 : printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname); 37 40 : exit(0); 38 : } 39 : } 40 554 : } 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 418 : 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 418 : errno = 0; 58 418 : 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 420 : while (*endptr != '\0' && isspace((unsigned char) *endptr)) 65 2 : endptr++; 66 : 67 418 : if (*endptr != '\0') 68 : { 69 12 : pg_log_error("invalid value \"%s\" for option %s", 70 : optarg, optname); 71 12 : return false; 72 : } 73 : 74 406 : 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 384 : if (result) 82 372 : *result = val; 83 384 : return true; 84 : } 85 : 86 : /* 87 : * Provide strictly harmonized handling of the --sync-method option. 88 : */ 89 : bool 90 2 : parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method) 91 : { 92 2 : if (strcmp(optarg, "fsync") == 0) 93 0 : *sync_method = DATA_DIR_SYNC_METHOD_FSYNC; 94 2 : else if (strcmp(optarg, "syncfs") == 0) 95 : { 96 : #ifdef HAVE_SYNCFS 97 2 : *sync_method = DATA_DIR_SYNC_METHOD_SYNCFS; 98 : #else 99 : pg_log_error("this build does not support sync method \"%s\"", 100 : "syncfs"); 101 : return false; 102 : #endif 103 : } 104 : else 105 : { 106 0 : pg_log_error("unrecognized sync method: %s", optarg); 107 0 : return false; 108 : } 109 : 110 2 : return true; 111 : }