]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: assume 64-bit time_t
authorKarel Zak <kzak@redhat.com>
Thu, 6 May 2021 09:06:45 +0000 (11:06 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 6 May 2021 09:06:45 +0000 (11:06 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
include/strutils.h
lib/strutils.c

index cb267e227d79b7f83ad87f1b17f40c3bb1734868..7969a84d0ccaa357f0fc34aa26e77d134c5ce650 100644 (file)
@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <stdio.h>
 #include <errno.h>
+#include <time.h>
 
 #include "c.h"
 
@@ -31,12 +32,14 @@ extern uint64_t strtou64_or_err(const char *str, const char *errmesg);
 extern uint64_t strtox64_or_err(const char *str, const char *errmesg);
 
 extern double strtod_or_err(const char *str, const char *errmesg);
+extern long double strtold_or_err(const char *str, const char *errmesg);
 
 extern long strtol_or_err(const char *str, const char *errmesg);
 extern unsigned long strtoul_or_err(const char *str, const char *errmesg);
 
 extern void strtotimeval_or_err(const char *str, struct timeval *tv,
                const char *errmesg);
+extern time_t strtotime_or_err(const char *str, const char *errmesg);
 
 extern int isdigit_strend(const char *str, const char **end);
 #define isdigit_string(_s)     isdigit_strend(_s, NULL)
index bf60aed5124fe03b651bfb905e9170832574a462..5b5e686aa0c31b0cea891951a8e88557a54e0874 100644 (file)
@@ -459,6 +459,27 @@ err:
        errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
 }
 
+long double strtold_or_err(const char *str, const char *errmesg)
+{
+       double num;
+       char *end = NULL;
+
+       errno = 0;
+       if (str == NULL || *str == '\0')
+               goto err;
+       num = strtold(str, &end);
+
+       if (errno || str == end || (end && *end))
+               goto err;
+
+       return num;
+err:
+       if (errno == ERANGE)
+               err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+
+       errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+}
+
 long strtol_or_err(const char *str, const char *errmesg)
 {
        long num;
@@ -517,11 +538,19 @@ uintmax_t strtosize_or_err(const char *str, const char *errmesg)
 
 void strtotimeval_or_err(const char *str, struct timeval *tv, const char *errmesg)
 {
-       double user_input;
+       long double user_input;
 
-       user_input = strtod_or_err(str, errmesg);
+       user_input = strtold_or_err(str, errmesg);
        tv->tv_sec = (time_t) user_input;
-       tv->tv_usec = (long)((user_input - tv->tv_sec) * 1000000);
+       tv->tv_usec = (suseconds_t)((user_input - tv->tv_sec) * 1000000);
+}
+
+time_t strtotime_or_err(const char *str, const char *errmesg)
+{
+       int64_t user_input;
+
+       user_input = strtos64_or_err(str, errmesg);
+       return (time_t) user_input;
 }
 
 /*