]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib: add strtoul_or_err() function
authorSami Kerola <kerolasa@iki.fi>
Tue, 24 May 2011 20:56:38 +0000 (22:56 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 1 Jun 2011 07:57:43 +0000 (09:57 +0200)
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Signed-off-by: Karel Zak <kzak@redhat.com>
include/strutils.h
lib/strutils.c

index bbe2993854d978127dc2d02470a676ede16e0f8a..aa5ea7cc8c88cdb9297df7ca178950c03bac624b 100644 (file)
@@ -8,6 +8,7 @@
 extern int strtosize(const char *str, uintmax_t *res);
 extern long strtol_or_err(const char *str, const char *errmesg);
 extern long long strtoll_or_err(const char *str, const char *errmesg);
+extern unsigned long strtoul_or_err(const char *str, const char *errmesg);
 
 #ifndef HAVE_STRNLEN
 extern size_t strnlen(const char *s, size_t maxlen);
index 07010f32cbbbcf8b572bef5cdae4ea80d5dea5ce..e7a2454a03d9d6533acdc152e2265c12fbf4aeb3 100644 (file)
@@ -213,6 +213,30 @@ err:
                errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
        return 0;
 }
+/*
+ * same as strtoul(3) but exit on failure instead of returning crap
+ */
+unsigned long strtoul_or_err(const char *str, const char *errmesg)
+{
+       unsigned long num;
+       char *end = NULL;
+
+       if (str == NULL || *str == '\0')
+               goto err;
+       errno = 0;
+       num = strtoul(str, &end, 10);
+
+       if (errno || str == end || (end && *end))
+               goto err;
+
+       return num;
+err:
+       if (errno)
+               err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
+       else
+               errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
+       return 0;
+}
 
 /*
  * Converts stat->st_mode to ls(1)-like mode string. The size of "str" must