Add isinetaddr4.c improvements

This commit is contained in:
0x1eef 2023-09-20 05:42:02 -03:00
parent ee62519bb3
commit ae035800d3

View file

@ -4,66 +4,54 @@
#include <isinetaddr.h>
#include <errno.h>
static int in_range(char buf[4], int min, int max);
static void register_octet(int *octets, char *buf, int *buflen);
static void register_digit(char digit, int *digits, char *buf, int *buflen);
static const int MAX_BUFLEN = 3;
static const int MAX_OCTETS = 4;
static const int MAX_DIGITLEN = 12;
static const int MAX_STRLEN = 16;
static const char SEP = '.';
static int in_range(char buf[MAX_BUFLEN]);
int
isinetaddr4(const char *str)
{
char buf[4];
char buf[MAX_BUFLEN + 1];
int digits = 0, octets = 1, buflen = 0;
size_t len = (str == NULL ? 0 : strnlen(str, 16));
size_t len = (str == NULL ? 0 : strnlen(str, MAX_STRLEN));
buf[MAX_BUFLEN] = '\0';
for (size_t l = 0; l < len; l++) {
if (str[l] == '.') {
if (str[l] == SEP) {
if (buflen == 0) {
return 0;
} else if (!in_range(buf, 0, 255)) {
} else if (!in_range(buf)) {
return 0;
} else {
register_octet(&octets, buf, &buflen);
buflen = 0;
bzero(buf, MAX_BUFLEN);
octets++;
}
} else if (isdigit(str[l])) {
if (buflen == 3) {
if (buflen == MAX_BUFLEN) {
return 0;
} else {
register_digit(str[l], &digits, buf, &buflen);
buf[buflen++] = str[l];
digits++;
}
} else {
return 0;
}
}
if (octets == 4) {
return buflen > 0 && digits <= 12 && in_range(buf, 0, 255);
if (octets == MAX_OCTETS) {
return digits <= MAX_DIGITLEN && buflen > 0 && in_range(buf);
} else {
return 0;
}
}
static int
in_range(char buf[4], int min, int max)
in_range(char buf[MAX_BUFLEN])
{
char *err;
long r;
errno = 0;
r = strtol(buf, &err, 10);
return *err == '\0' && errno == 0 && (r >= min && r <= max);
}
static void
register_octet(int *octets, char *buf, int *buflen)
{
*buflen = 0;
(*octets)++;
bzero(buf, 3);
buf[3] = '\0';
}
static void
register_digit(char digit, int *digits, char *buf, int *buflen)
{
buf[(*buflen)++] = digit;
buf[*buflen] = '\0';
(*digits)++;
int n = atoi(buf);
return n >= 0 && n <= 255;
}