aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2020-09-06 12:40:15 +0000
committerrodri <rgl@antares-labs.eu>2020-09-06 12:40:15 +0000
commit6fb2c86045a74fa3c02ccd94f95d7f6344aefd9e (patch)
tree6c14f1f9bea09936bdb5b29f6c54509dddbbf34d
parent0e0598ccdd92079cf31f914d4e14749769cb8ba1 (diff)
downloadipcalc-6fb2c86045a74fa3c02ccd94f95d7f6344aefd9e.tar.gz
ipcalc-6fb2c86045a74fa3c02ccd94f95d7f6344aefd9e.tar.bz2
ipcalc-6fb2c86045a74fa3c02ccd94f95d7f6344aefd9e.zip
restrict input to correct dot-notation addresses and put a constraint on the cidr value.
-rw-r--r--main.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/main.c b/main.c
index 6cfd203..dc77019 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <ctype.h>
typedef struct IPNet IPNet;
@@ -61,6 +62,26 @@ countones(u32int addr)
return cnt;
}
+u32int
+getip4(char *s)
+{
+ u32int addr;
+ int octets;
+
+ addr = 0;
+ octets = 4;
+
+ do{
+ if(!isdigit(*s))
+ sysfatal("wrong ip address: expected a number");
+ addr |= strtoul(s, &s, 10) << --octets*8;
+ if(octets > 0 && *s != '.')
+ sysfatal("wrong ip address: expected a dot");
+ }while(*s++ && octets > 0);
+
+ return addr;
+}
+
void
usage(void)
{
@@ -73,7 +94,6 @@ main(int argc, char *argv[])
{
IPNet net;
u32int addr, mask;
- char *a, *m;
int cidr;
fmtinstall('I', Ifmt);
@@ -84,21 +104,13 @@ main(int argc, char *argv[])
if(argc != 2)
usage();
- a = argv[0];
- addr = strtoul(a, &a, 10) << 24;
- addr |= strtoul(++a, &a, 10) << 16;
- addr |= strtoul(++a, &a, 10) << 8;
- addr |= strtoul(++a, &a, 10);
- m = argv[1];
- if(strlen(m) <= 2){
- cidr = strtol(m, nil, 10);
+ addr = getip4(argv[0]);
+ if(strlen(argv[1]) <= 2){
+ cidr = strtol(argv[1], nil, 10);
+ assert(cidr > 0 && cidr <= 32);
mask = ~0 << (32-cidr);
- }else{
- mask = strtoul(m, &m, 10) << 24;
- mask |= strtoul(++m, &m, 10) << 16;
- mask |= strtoul(++m, &m, 10) << 8;
- mask |= strtoul(++m, &m, 10);
- }
+ }else
+ mask = getip4(argv[1]);
net.addr = addr&mask;
net.mask = mask;