Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * Command line option processing facilities for frontend code
4 : *
5 : * Portions Copyright (c) 1996-2026, 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 348 : handle_help_version_opts(int argc, char *argv[],
25 : const char *fixed_progname, help_handler hlp)
26 : {
27 348 : if (argc > 1)
28 : {
29 344 : if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
30 : {
31 11 : hlp(get_progname(argv[0]));
32 11 : exit(0);
33 : }
34 333 : if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
35 : {
36 29 : printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
37 29 : exit(0);
38 : }
39 : }
40 308 : }
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 246 : 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 246 : errno = 0;
58 246 : 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 247 : while (*endptr != '\0' && isspace((unsigned char) *endptr))
65 1 : endptr++;
66 :
67 246 : if (*endptr != '\0')
68 : {
69 6 : pg_log_error("invalid value \"%s\" for option %s",
70 : optarg, optname);
71 6 : return false;
72 : }
73 :
74 240 : if (errno == ERANGE || val < min_range || val > max_range)
75 : {
76 11 : pg_log_error("%s must be in range %d..%d",
77 : optname, min_range, max_range);
78 11 : return false;
79 : }
80 :
81 229 : if (result)
82 223 : *result = val;
83 229 : return true;
84 : }
85 :
86 : /*
87 : * Provide strictly harmonized handling of the --sync-method option.
88 : */
89 : bool
90 1 : parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method)
91 : {
92 1 : if (strcmp(optarg, "fsync") == 0)
93 0 : *sync_method = DATA_DIR_SYNC_METHOD_FSYNC;
94 1 : else if (strcmp(optarg, "syncfs") == 0)
95 : {
96 : #ifdef HAVE_SYNCFS
97 1 : *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 1 : return true;
111 : }
|