PostgreSQL Source Code  git master
option_utils.c
Go to the documentation of this file.
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 handle_help_version_opts(int argc, char *argv[],
25  const char *fixed_progname, help_handler hlp)
26 {
27  if (argc > 1)
28  {
29  if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
30  {
31  hlp(get_progname(argv[0]));
32  exit(0);
33  }
34  if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
35  {
36  printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
37  exit(0);
38  }
39  }
40 }
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 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  errno = 0;
58  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  while (*endptr != '\0' && isspace((unsigned char) *endptr))
65  endptr++;
66 
67  if (*endptr != '\0')
68  {
69  pg_log_error("invalid value \"%s\" for option %s",
70  optarg, optname);
71  return false;
72  }
73 
74  if (errno == ERANGE || val < min_range || val > max_range)
75  {
76  pg_log_error("%s must be in range %d..%d",
77  optname, min_range, max_range);
78  return false;
79  }
80 
81  if (result)
82  *result = val;
83  return true;
84 }
85 
86 /*
87  * Provide strictly harmonized handling of the --sync-method option.
88  */
89 bool
91 {
92  if (strcmp(optarg, "fsync") == 0)
94  else if (strcmp(optarg, "syncfs") == 0)
95  {
96 #ifdef HAVE_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  pg_log_error("unrecognized sync method: %s", optarg);
107  return false;
108  }
109 
110  return true;
111 }
DataDirSyncMethod
Definition: file_utils.h:28
@ DATA_DIR_SYNC_METHOD_SYNCFS
Definition: file_utils.h:30
@ DATA_DIR_SYNC_METHOD_FSYNC
Definition: file_utils.h:29
long val
Definition: informix.c:670
static DataDirSyncMethod sync_method
Definition: initdb.c:170
exit(1)
#define pg_log_error(...)
Definition: logging.h:106
bool option_parse_int(const char *optarg, const char *optname, int min_range, int max_range, int *result)
Definition: option_utils.c:50
void handle_help_version_opts(int argc, char *argv[], const char *fixed_progname, help_handler hlp)
Definition: option_utils.c:24
bool parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method)
Definition: option_utils.c:90
void(* help_handler)(const char *progname)
Definition: option_utils.h:19
PGDLLIMPORT char * optarg
Definition: getopt.c:52
const char * get_progname(const char *argv0)
Definition: path.c:574
#define printf(...)
Definition: port.h:244
int strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
Definition: string.c:51