Branch data 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 : 0 : handle_help_version_opts(int argc, char *argv[],
25 : : const char *fixed_progname, help_handler hlp)
26 : : {
27 [ # # ]: 0 : if (argc > 1)
28 : : {
29 [ # # ]: 0 : if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
30 : : {
31 : 0 : hlp(get_progname(argv[0]));
32 : 0 : exit(0);
33 : : }
34 [ # # ]: 0 : if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
35 : : {
36 : 0 : printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
37 : 0 : exit(0);
38 : : }
39 : 0 : }
40 : 0 : }
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 : 0 : option_parse_int(const char *optarg, const char *optname,
51 : : int min_range, int max_range,
52 : : int *result)
53 : : {
54 : 0 : char *endptr;
55 : 0 : int val;
56 : :
57 : 0 : errno = 0;
58 : 0 : 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 [ # # # # ]: 0 : while (*endptr != '\0' && isspace((unsigned char) *endptr))
65 : 0 : endptr++;
66 : :
67 [ # # ]: 0 : if (*endptr != '\0')
68 : : {
69 : 0 : pg_log_error("invalid value \"%s\" for option %s",
70 : : optarg, optname);
71 : 0 : return false;
72 : : }
73 : :
74 [ # # # # : 0 : if (errno == ERANGE || val < min_range || val > max_range)
# # ]
75 : : {
76 : 0 : pg_log_error("%s must be in range %d..%d",
77 : : optname, min_range, max_range);
78 : 0 : return false;
79 : : }
80 : :
81 [ # # ]: 0 : if (result)
82 : 0 : *result = val;
83 : 0 : return true;
84 : 0 : }
85 : :
86 : : /*
87 : : * Provide strictly harmonized handling of the --sync-method option.
88 : : */
89 : : bool
90 : 0 : parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method)
91 : : {
92 [ # # ]: 0 : if (strcmp(optarg, "fsync") == 0)
93 : 0 : *sync_method = DATA_DIR_SYNC_METHOD_FSYNC;
94 [ # # ]: 0 : else if (strcmp(optarg, "syncfs") == 0)
95 : : {
96 : : #ifdef HAVE_SYNCFS
97 : : *sync_method = DATA_DIR_SYNC_METHOD_SYNCFS;
98 : : #else
99 : 0 : pg_log_error("this build does not support sync method \"%s\"",
100 : : "syncfs");
101 : 0 : 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 : 0 : return true;
111 : 0 : }
|