diff --git a/src/isinetaddr.c b/src/isinetaddr.c index 4de8483..87146af 100644 --- a/src/isinetaddr.c +++ b/src/isinetaddr.c @@ -2,24 +2,34 @@ #include #include #include +#include + +static +int inrange(char buf[4]) +{ + char *err; + long r; + errno = 0; + r = strtol(buf, &err, 10); + return *err == '\0' && errno == 0 && (r >= 0 && r <= 255); +} int isinetaddr(const char *str) { char buf[4]; - const char *err; int i = 0, j = 0, k = 0; + size_t len = strnlen(str, 16); - for(int l = 0; l < (int)strnlen(str, 16); l++) { + for(size_t l = 0; l < len; l++) { if (str[l] == '.') { - strtonum(buf, 0, 255, &err); - if (err != NULL) { - return 0; - } else { + if (inrange(buf)) { k = 0; j++; bzero(buf, 3); buf[3] = '\0'; + } else { + return 0; } } else if (isdigit(str[l])) { buf[k++] = str[l]; @@ -31,3 +41,4 @@ isinetaddr(const char *str) } return j == 3 && i <= 12 ? 1 : 0; } +