aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_test_fsync/pg_test_fsync.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_test_fsync/pg_test_fsync.c')
-rw-r--r--src/bin/pg_test_fsync/pg_test_fsync.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
index 6e472931233..3eddd983c63 100644
--- a/src/bin/pg_test_fsync/pg_test_fsync.c
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -5,6 +5,7 @@
#include "postgres_fe.h"
+#include <limits.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
@@ -62,7 +63,7 @@ do { \
static const char *progname;
-static int secs_per_test = 5;
+static unsigned int secs_per_test = 5;
static int needs_unlink = 0;
static char full_buf[DEFAULT_XLOG_SEG_SIZE],
*buf,
@@ -148,6 +149,8 @@ handle_args(int argc, char *argv[])
int option; /* Command line option */
int optindex = 0; /* used by getopt_long */
+ unsigned long optval; /* used for option parsing */
+ char *endptr;
if (argc > 1)
{
@@ -173,7 +176,24 @@ handle_args(int argc, char *argv[])
break;
case 's':
- secs_per_test = atoi(optarg);
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+
+ if (endptr == optarg || *endptr != '\0' ||
+ errno != 0 || optval != (unsigned int) optval)
+ {
+ pg_log_error("invalid argument for option %s", "--secs-per-test");
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+ exit(1);
+ }
+
+ secs_per_test = (unsigned int) optval;
+ if (secs_per_test == 0)
+ {
+ pg_log_error("%s must be in range %u..%u",
+ "--secs-per-test", 1, UINT_MAX);
+ exit(1);
+ }
break;
default:
@@ -193,8 +213,8 @@ handle_args(int argc, char *argv[])
exit(1);
}
- printf(ngettext("%d second per test\n",
- "%d seconds per test\n",
+ printf(ngettext("%u second per test\n",
+ "%u seconds per test\n",
secs_per_test),
secs_per_test);
#if PG_O_DIRECT != 0