From 59108cc6155ce1622f78556e5d3d0d50f6f04dd2 Mon Sep 17 00:00:00 2001 From: 0x1eef <0x1eef@protonmail.com> Date: Fri, 25 Aug 2023 17:14:33 -0300 Subject: [PATCH] Improve portability / performance * `strtonum` is unique to OpenBSD - use `strtol` instead. * Call `strnlen` once. * Avoid int cast. --- src/isinetaddr.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) 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; } +