diff options
author | epochqwert <epoch@hacking.allowed.org> | 2015-06-12 22:26:31 -0500 |
---|---|---|
committer | epochqwert <epoch@hacking.allowed.org> | 2015-06-12 22:26:31 -0500 |
commit | a05876c9b860f1d5fa786746519ccb8b01db79e3 (patch) | |
tree | 8406bd3b42e8e3d7a3f2d56ad1396d62d8f4b1ac /src/bin/iplist2cidr.c | |
parent | 05f18ac5c65755e1dde4d4bd44575011310bc648 (diff) | |
download | misc-a05876c9b860f1d5fa786746519ccb8b01db79e3.tar.gz misc-a05876c9b860f1d5fa786746519ccb8b01db79e3.zip |
commit of half-finished things.
Diffstat (limited to 'src/bin/iplist2cidr.c')
-rw-r--r-- | src/bin/iplist2cidr.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/bin/iplist2cidr.c b/src/bin/iplist2cidr.c new file mode 100644 index 0000000..b3cc62c --- /dev/null +++ b/src/bin/iplist2cidr.c @@ -0,0 +1,79 @@ +#include <stdio.h> +#include <string.h> + +struct net { + unsigned int ip; + unsigned char cidr; +}; + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) + +int main(int argc,char *argv[]) { + short in; + int maxcidr; + int i=0,j=0,len=0; + struct net list[65536];//don't do more than a /16! + char ips[64];//why not? + char *cidrs; + while((in=fgetc(stdin)) != -1) { + if(in=='\n') { + ips[i]=0; + if((cidrs=strchr(ips,'/')) != 0) { + *cidrs=0; + cidrs++; + } + list[len].ip=htonl(inet_addr(ips)); + list[len].cidr=cidrs?atoi(cidrs):32; + i=0; + cidrs=0; + len++; + continue; + } + ips[i]=in; + i++; + if(i>63) { + printf("your have a line that is TOOO long. stick to IPv4.\n"); + return 0; + } + } + //!!!warning!!! inefficient algo ahead! + for(i=0;i<len;i++) { + for(j=0;j<len;j++) { + if(list[i].cidr == list[j].cidr) { + if((list[i].ip ^ list[j].ip) >> (32-list[i].cidr) == 1) { + list[i].cidr--; + list[j].cidr--; + list[i].ip &= (0xffffffff << (32-list[i].cidr)); + list[j].ip &= (0xffffffff << (32-list[j].cidr)); + i=-1;//start over! + j=-1;//start over! + continue; + } + } + if(list[i].ip == list[j].ip && list[i].cidr != list[j].cidr) { + list[i].cidr = min(list[i].cidr,list[j].cidr); + list[j].cidr = min(list[i].cidr,list[j].cidr); + i=-1;//start over! + j=-1;//start over! + continue; + } + maxcidr=min(list[i].cidr,list[j].cidr); + if(list[i].cidr != list[j].cidr) { + if(list[i].ip >> (32-maxcidr) == list[j].ip >> (32-maxcidr) ) { + list[i].cidr = min(list[i].cidr,list[j].cidr); + list[j].cidr = min(list[i].cidr,list[j].cidr); + list[i].ip &= (0xffffffff << (32-list[i].cidr)); + list[j].ip &= (0xffffffff << (32-list[j].cidr)); + i=-1;//start over! + j=-1;//start over! + continue; + } + } + } + } + for(i=0;i<len;i++) { + printf("%d.%d.%d.%d/%d\n",list[i].ip>>24&255,list[i].ip>>16&255,list[i].ip>>8&255,list[i].ip&255,list[i].cidr); + } + return 0; +} |