From: Sami Kerola Date: Tue, 24 May 2011 20:56:38 +0000 (+0200) Subject: lib: add strtoul_or_err() function X-Git-Tag: v2.20-rc1~212 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e53bc9604c14b10c34a1e8d057d2e741e8d7ea1b;p=thirdparty%2Futil-linux.git lib: add strtoul_or_err() function Signed-off-by: Sami Kerola Signed-off-by: Karel Zak --- diff --git a/include/strutils.h b/include/strutils.h index bbe2993854..aa5ea7cc8c 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -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); diff --git a/lib/strutils.c b/lib/strutils.c index 07010f32cb..e7a2454a03 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -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