LCOV - code coverage report
Current view: top level - src/fe_utils - option_utils.c (source / functions) Hit Total Coverage
Test: PostgreSQL 18devel Lines: 28 31 90.3 %
Date: 2024-11-21 08:14:44 Functions: 3 3 100.0 %
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-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             : }

Generated by: LCOV version 1.14