repo: iptools
action: blob
revision: 
path_from: iplist2cidr.c
revision_from: refs/heads/master:
path_to: 
revision_to: 
git.thebackupbox.net
iptools
git clone git://git.thebackupbox.net/iptools

blob of:

iptools

/ iplist2cidr.c

blob_plain of this file

refs/heads/master:/iplist2cidr.c

 #include 
 #include 
 #include 
 #include 

 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> (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>24&255,list[i].ip>>16&255,list[i].ip>>8&255,list[i].ip&255,list[i].cidr);
  }
  return 0;
 }