Add isinetaddr4.c improvements
This commit is contained in:
parent
ee62519bb3
commit
ae035800d3
1 changed files with 23 additions and 35 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue