LCOV - code coverage report
Current view: top level - src/fe_utils - option_utils.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 90.3 % 31 28
Test Date: 2026-03-01 19:14:57 Functions: 100.0 % 3 3
Legend: Lines:     hit not hit

            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              : }
        

Generated by: LCOV version 2.0-1