#include #include #include unsigned long str2ip(char*s) { char*sp,*sp1,*sp2; int n1,n2,n3,n4; sp=strchr(s,'.');if(!sp)return 0;sp++; sp1=strchr(sp,'.');if(!sp1)return 0;sp1++; sp2=strchr(sp1,'.');if(!sp2)return 0;sp2++; n1=atoi(s);n2=atoi(sp);n3=atoi(sp1);n4=atoi(sp2); return (n1<<24)+(n2<<16)+(n3<<8)+n4; } unsigned long str2mask(int n) { unsigned long l=0; while(n>0){l>>=1;l|=0x80000000;n--;} return l; } char*ip2str(unsigned long ip) { static char sip[32]; snprintf(sip,30,"%i.%i.%i.%i", (ip>>24)&0x000000FF, (ip>>16)&0x000000FF, (ip>>8)&0x000000FF, (ip)&0x000000FF); return sip; } void printmask2range(char*s) { char*sp; unsigned long ip; unsigned long mask,notmask; sp=strchr(s,'/');if(!sp){printf("Incorrect format.\n");return;}sp++; ip=str2ip(s); mask=str2mask(atoi(sp)); notmask=mask^0xFFFFFFFF; printf("%s",ip2str(ip & mask)); printf("-%s\n",ip2str(ip | notmask)); } void printrange2mask(char*s1,char*s2) { char*sp; unsigned long ip1,ip2,ipmask; unsigned long mask=0; ip1=str2ip(s1); ip2=str2ip(s2); ipmask=0x80000000; for(mask=0;mask<33;mask++) {if( (ip1 & ipmask) != (ip2 & ipmask) )break; ipmask>>=1; } ipmask=str2mask(mask); printf("%s",ip2str(ip1 & ipmask)); printf("/%i\n",mask); } void help() { printf( "Usage: ipdiffmask IP/mask\n" " ipdiffmask IP IP\n" "Converts between IP..IP and IP/bits network range representations.\n" ); } int main(int argc,char*argv[]) { if(argc<2){help();return 0;} if(argc>3){help();return 0;} if(!strcmp(argv[1],"-h")){help();return 0;} if(!strcmp(argv[1],"--help")){help();return 0;} if(argc==2){printmask2range(argv[1]);} else {printrange2mask(argv[1],argv[2]);} return 0; }