logo

utils-cidr

utilities to manipulate CIDR ip-ranges git clone https://anongit.hacktivis.me/git/utils-cidr.git
commit: 2197d645dc0374208a65d8ea43a64d4cdff057af
parent f7230898c5138753810d4a660e66ad21c74fa9d4
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sat, 18 Oct 2025 04:20:34 +0200

cidr2list: trim spaces after getline rather than in str_inet4

This way lines containing only spaces are skipped, and spaces within
an address is invalid.

Diffstat:

Mcidr2list.c27+++++++++++++++++----------
Mtest.sh2+-
2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/cidr2list.c b/cidr2list.c @@ -67,15 +67,14 @@ str_inet4(const char *str, size_t size, struct inet4_cidr *res) break; } - if(isspace(str[i])) continue; - fprintf(stderr, "cird2list: error: Invalid IPv4 address, found '%c' (0x%X)\n", str[i], str[i]); return false; } if(di != 3) { - fprintf(stderr, "cird2list: error: Invalid IPv4 address, found %d dots, expected 3: %s\n", di, str); + fprintf( + stderr, "cird2list: error: Invalid IPv4 address, found %d dots, expected 3: %s\n", di, str); return false; } @@ -109,13 +108,13 @@ str_inet4(const char *str, size_t size, struct inet4_cidr *res) int main(void) { - char *line = NULL; - size_t linelen = 0; + char *buf = NULL; + size_t buflen = 0; while(true) { errno = 0; - ssize_t nread = getline(&line, &linelen, stdin); + ssize_t nread = getline(&buf, &buflen, stdin); if(nread < 0) { if(errno == 0) break; @@ -124,12 +123,20 @@ main(void) return 1; } - if(line[nread - 1] == '\n') line[--nread] = '\0'; + char *line = buf; + size_t linelen = nread; + + // ltrim + while(line - buf < nread && isspace(*line)) + line++, linelen--; + // rtrim + for(int i = linelen - 1; (i > 0) && isspace(line[i]); i--) + line[--linelen] = '\0'; - if(nread == 0) continue; + if(linelen <= 0) continue; struct inet4_cidr addr; - if(!str_inet4(line, (size_t)nread, &addr)) return 1; + if(!str_inet4(line, linelen, &addr)) return 1; uint32_t start = addr.addr & addr.nmask; #if 0 @@ -149,6 +156,6 @@ main(void) } } - free(line); + free(buf); return 0; } diff --git a/test.sh b/test.sh @@ -29,4 +29,4 @@ t --input='192.168.0.43/31' 192.168.0.43/31 '192.168.0.42 t --input=192.168.0.42 nocidr '192.168.0.42 ' -t_cmd empty_lines 4 lines '' 192.168.0.42/31 '' 192.168.0.69/31 '' +t_cmd empty_lines 4 lines ' ' 192.168.0.42/31 ' ' 192.168.0.69/31 ''