diff --git a/lib/libutil/expand_number.c b/lib/libutil/expand_number.c --- a/lib/libutil/expand_number.c +++ b/lib/libutil/expand_number.c @@ -33,10 +33,12 @@ #include #include #include -#include #include #include +#include +#undef expand_number + int expand_number(const char *buf, int64_t *num) { @@ -146,3 +148,19 @@ return (0); } + +int +expand_unsigned(const char *buf, uint64_t *nump) +{ + int64_t num; + int ret; + + if ((ret = expand_number(buf, &num)) < 0) + return (ret); + if (num < 0) { + errno = ERANGE; + return (-1); + } + *nump = (uint64_t)num; + return (0); +} diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h --- a/lib/libutil/libutil.h +++ b/lib/libutil/libutil.h @@ -88,7 +88,12 @@ __BEGIN_DECLS void clean_environment(const char * const *_white, const char * const *_more_white); +int expand_unsigned(const char *_buf, uint64_t *_num); int expand_number(const char *_buf, int64_t *_num); +#define expand_number(_buf, _num) \ + _Generic((_num), \ + uint64_t *: expand_number_unsigned, \ + default: expand_number)((_buf), (_num)) int extattr_namespace_to_string(int _attrnamespace, char **_string); int extattr_string_to_namespace(const char *_string, int *_attrnamespace); int flopen(const char *_path, int _flags, ...);