#include "config.h"
+#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
char *err = NULL;
unsigned long int uli;
+ while (isspace(*numstr))
+ numstr++;
+
+ if (*numstr == '-')
+ return -EINVAL;
+
errno = 0;
uli = strtoul(numstr, &err, 0);
- if (errno > 0)
+ if (errno == ERANGE && uli == ULONG_MAX)
return -errno;
- if (!err || err == numstr || *err != '\0')
+ if (err == numstr || *err != '\0')
return -EINVAL;
if (uli > UINT_MAX)
errno = 0;
sli = strtol(numstr, &err, 0);
- if (errno > 0)
+ if (errno == ERANGE && (sli == LONG_MAX || sli == LONG_MIN))
+ return -errno;
+
+ if (errno != 0 && sli == 0)
return -errno;
- if (!err || err == numstr || *err != '\0')
+ if (err == numstr || *err != '\0')
return -EINVAL;
- if (sli > INT_MAX)
+ if (sli > INT_MAX || sli < INT_MIN)
return -ERANGE;
*converted = (int)sli;
errno = 0;
sli = strtol(numstr, &err, 0);
- if (errno > 0)
+ if (errno == ERANGE && (sli == LONG_MAX || sli == LONG_MIN))
return -errno;
- if (!err || err == numstr || *err != '\0')
- return -EINVAL;
+ if (errno != 0 && sli == 0)
+ return -errno;
- if (sli > LONG_MAX)
- return -ERANGE;
+ if (err == numstr || *err != '\0')
+ return -EINVAL;
*converted = sli;
return 0;