Improve portability / performance

* `strtonum` is unique to OpenBSD - use `strtol` instead.
* Call `strnlen` once.
* Avoid int cast.
This commit is contained in:
0x1eef 2023-08-25 17:14:33 -03:00
parent 7e8e312e1b
commit 59108cc615

View file

@ -2,24 +2,34 @@
#include <string.h>
#include <stdlib.h>
#include <isinetaddr.h>
#include <errno.h>
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;
}